Hi, On 30 Sep 18:53, Ilya Verbin wrote: > This patch creates 2 vectors with decls: offload_funcs and offload_vars. > libgomp will use addresses from these arrays to look up offloaded code. > > During the compilation they are outputted to: > * binary __gnu_offload_funcs/vars sections, or using > targetm.record_offload_symbol hook for PTX.
In some cases LTO may optimize out a global variable, declared as target, but it still will be referenced from the offload table, that will cause a linking error. Here is the example: #pragma omp declare target int G; #pragma omp end declare target int main () { int res = 0; #pragma omp target map(alloc: G) map(from: res) { G = 1; res = G; } return res; } $ gcc -fopenmp -flto -O1 test.c xxx.ltrans0.ltrans.o:.offload_var_table.3973: error: undefined reference to 'G' This issue can be resolved by forcing output of such variables. Is this fix ok? Should I add a testcase? diff --git a/gcc/varpool.c b/gcc/varpool.c index 0526b7f..db28c2a 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -175,6 +175,7 @@ varpool_node::get_create (tree decl) g->have_offload = true; if (!in_lto_p) vec_safe_push (offload_vars, decl); + node->force_output = 1; #endif } Thanks, -- Ilya