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'.