https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100059
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |vries at gcc dot gnu.org --- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> --- For #pragma omp declare target link(a,c,b,i) the vars are walked in reverse order (= in normal order of 'offload_vars'): * In a.xnvptx-none.mkoffload.s: ------------ //:FUNC_MAP "main$_omp_fn$0" //:VAR_MAP "i$linkptr" // BEGIN GLOBAL VAR DEF: i$linkptr .visible .global .align 8 .u64 i$linkptr[1]; //:VAR_MAP "b$linkptr" // BEGIN GLOBAL VAR DEF: b$linkptr .visible .global .align 8 .u64 b$linkptr[1]; //:VAR_MAP "c$linkptr" // BEGIN GLOBAL VAR DEF: c$linkptr .visible .global .align 8 .u64 c$linkptr[1]; //:VAR_MAP "a$linkptr" // BEGIN GLOBAL VAR DEF: a$linkptr .visible .global .align 8 .u64 a$linkptr[1]; // BEGIN GLOBAL FUNCTION DECL: gomp_nvptx_main ------------ So far so good. However, after: nvptx-none/bin/as -m sm_35 -o ./a.xnvptx-none.mkoffload.o ./a.xnvptx-none.mkoffload.s the 'a.xnvptx-none.mkoffload.o' contains: ---------------- // BEGIN GLOBAL VAR DECL: __nvptx_uni .extern .shared .u32 __nvptx_uni[32]; //:VAR_MAP "b$linkptr" // BEGIN GLOBAL VAR DEF: b$linkptr .visible .global .align 8 .u64 b$linkptr[1]; //:FUNC_MAP "main$_omp_fn$0" //:VAR_MAP "i$linkptr" // BEGIN GLOBAL VAR DEF: i$linkptr .visible .global .align 8 .u64 i$linkptr[1]; //:VAR_MAP "c$linkptr" // BEGIN GLOBAL VAR DEF: c$linkptr .visible .global .align 8 .u64 c$linkptr[1]; //:VAR_MAP "a$linkptr" // BEGIN GLOBAL VAR DEF: a$linkptr .visible .global .align 8 .u64 a$linkptr[1]; // BEGIN GLOBAL FUNCTION DEF: update ---------------- Namely: 'b' and 'i' swapped the order! The problem seems to be the misplaced: //:FUNC_MAP "main$_omp_fn$0"