https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109128

--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> ---
Minor observations (unrelated to this bug but should be fixed. separately or
together):

- '@' file in lto-wrapper.cc's compile_offload_image's fork_execute call is
always the same. (Matters if there is more than one offloading target
configured)

- The sections ".gnu.offload_funcs" and ".gnu.offload_vars" are 'wx' but they
could be 'x' (i.e. read only as the function addresses do not need to be
written to). → TREE_READONLY (funcs_decl) = 1; (same for 'vars_decl').

* * *

Tried the following, but it did not help – 'ld' does not import any symbol from
the 'libone.a' library – neither before nor after the patch; not did
-no-as-needed help and -Wl,--print-gc-sections does not show any discarded
sections.


diff --git a/gcc/omp-offload.cc b/gcc/omp-offload.cc
index 3bd144e9ccf..e1b22729994 100644
--- a/gcc/omp-offload.cc
+++ b/gcc/omp-offload.cc
@@ -437,0 +438,13 @@ omp_finish_file (void)
+      TREE_READONLY (funcs_decl) = 1;
+      TREE_READONLY (vars_decl) = 1;
+#ifndef ACCEL_COMPILER
+      if (SUPPORTS_SHF_GNU_RETAIN)
+       {
+         DECL_ATTRIBUTES (funcs_decl) = tree_cons (get_identifier ("retain"),
+                                                   NULL_TREE, NULL_TREE);
+         DECL_ATTRIBUTES (vars_decl) = tree_cons (get_identifier ("retain"),
+                                                  NULL_TREE, NULL_TREE);
+       }
+      else
+       sorry ("support for %<SHF_GNU_RETAIN%> required for offloading");
+#endif
diff --git a/libgcc/offloadstuff.c b/libgcc/offloadstuff.c
index 4e1c4d41dd5..59e191c5e19 100644
--- a/libgcc/offloadstuff.c
+++ b/libgcc/offloadstuff.c
@@ -51 +51 @@ const void *const __offload_func_table[0]
-  __attribute__ ((__used__, visibility ("hidden"),
+  __attribute__ ((__used__, visibility ("hidden"), retain,
@@ -54 +54 @@ const void *const __offload_var_table[0]
-  __attribute__ ((__used__, visibility ("hidden"),
+  __attribute__ ((__used__, visibility ("hidden"), retain,
@@ -60 +60 @@ const void *const __offload_funcs_end[0]
-  __attribute__ ((__used__, visibility ("hidden"),
+  __attribute__ ((__used__, visibility ("hidden"), retrain,
@@ -63 +63 @@ const void *const __offload_vars_end[0]
-  __attribute__ ((__used__, visibility ("hidden"),
+  __attribute__ ((__used__, visibility ("hidden"), retrain,


* * *

What's interesting is the file -foffload-objects=a.ofldlist - produced by
lto-plugin:

* If there is a common block in 'one.f90' (and via module use also in
'two.f90'), the a.ofldlist file contains both 'two.o' and the ./libone.a@0xc0
library.

* But if there is no common block in 'one.f90' (and hence also not in
'two.f90'), the a.ofldlist file contains only 'two.o'.

Reply via email to