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

Reply via email to