Hi,

We have a problem with declare target variables in fortran modules, here is a
small reproducer:

+++++ share.f90:

module share
  integer :: var_x
!$omp declare target(var_x)
end module

+++++ test.f90:

  use share
  var_x = 10
!$omp target update to(var_x)
end

+++++

$ gfortran -fopenmp -c share.f90
$ gfortran -fopenmp -c test.f90
$ gfortran -fopenmp share.o test.o
$ ./a.out
libgomp: Duplicate node

+++++

This happens because the var_x is added into offload tables for both share.o and
test.o.  The patch below fixes this issue.  Regtested on x86_64-linux and
i686-linux.  However I'm not sure how to create a regression test, which would
compile 2 separate objects, and check run-time result.


diff --git a/gcc/varpool.c b/gcc/varpool.c
index 707f62f..5929d92 100644
--- a/gcc/varpool.c
+++ b/gcc/varpool.c
@@ -173,7 +173,7 @@ varpool_node::get_create (tree decl)
   node = varpool_node::create_empty ();
   node->decl = decl;
 
-  if ((flag_openacc || flag_openmp)
+  if ((flag_openacc || flag_openmp) && !DECL_EXTERNAL (decl)
       && lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)))
     {
       node->offloadable = 1;


Thanks,
  -- Ilya

Reply via email to