https://gcc.gnu.org/g:89b2fa7a74ef1f7b8f0f8f1abc3bbc412d59302a
commit r17-4363-g89b2fa7a74ef1f7b8f0f8f1abc3bbc412d59302a Author: Tobias Burnus <[email protected]> Date: Wed Sep 16 15:34:34 2026 +0200 lto.cc: OpenMP's offload_handle_link_vars - fix for global variables (2/2) [PR127273] Commit r12-7776-g1002a7ace111d7 LTO: Fixes for renaming issues with offload/OpenMP [PR104285] moved the call to offload_handle_link_vars after the renaming of same-named static variables happened. However, it missed to remove the original call - such that the function is always called twice, walking the same node twice. In offload_handle_link_vars, the call to varpool_node::finalize_decl should be be after FOR_EACH_VARIABLE avoid modifying the varpool while walking it. (Albeit new items get appended to the front such that '->next' walks are not affected by added items in the current implementation.) [See r17-4073-ga6310d58aac505 for (1/2).] gcc/lto/ChangeLog: PR middle-end/127273 * lto.cc (offload_handle_link_vars): Remove has-value-expr check; store link vars and processing them after walking the varpool. (lto_main): Remove duplicated offload_handle_link_vars call. Diff: --- gcc/lto/lto.cc | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/gcc/lto/lto.cc b/gcc/lto/lto.cc index d22827bbcc0a..3a6fe0a961d9 100644 --- a/gcc/lto/lto.cc +++ b/gcc/lto/lto.cc @@ -482,27 +482,29 @@ static void offload_handle_link_vars (void) { #ifdef ACCEL_COMPILER + size_t i; varpool_node *var; + auto_vec <varpool_node *>temp_link_vars; FOR_EACH_VARIABLE (var) if (lookup_attribute ("omp declare target link", DECL_ATTRIBUTES (var->decl))) - { - if (DECL_HAS_VALUE_EXPR_P (var->decl)) - continue; - tree type = build_pointer_type (TREE_TYPE (var->decl)); - tree link_ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL, + temp_link_vars.safe_push (var); + FOR_EACH_VEC_ELT (temp_link_vars, i, var) + { + tree type = build_pointer_type (TREE_TYPE (var->decl)); + tree link_ptr_var = build_decl (UNKNOWN_LOCATION, VAR_DECL, clone_function_name (var->decl, "linkptr"), type); - TREE_USED (link_ptr_var) = 1; - TREE_STATIC (link_ptr_var) = 1; - TREE_PUBLIC (link_ptr_var) = TREE_PUBLIC (var->decl); - DECL_ARTIFICIAL (link_ptr_var) = 1; - SET_DECL_ASSEMBLER_NAME (link_ptr_var, DECL_NAME (link_ptr_var)); - SET_DECL_VALUE_EXPR (var->decl, build_simple_mem_ref (link_ptr_var)); - DECL_HAS_VALUE_EXPR_P (var->decl) = 1; - varpool_node::finalize_decl (link_ptr_var); - varpool_node::get (link_ptr_var)->force_output = var->force_output; - } + TREE_USED (link_ptr_var) = 1; + TREE_STATIC (link_ptr_var) = 1; + TREE_PUBLIC (link_ptr_var) = TREE_PUBLIC (var->decl); + DECL_ARTIFICIAL (link_ptr_var) = 1; + SET_DECL_ASSEMBLER_NAME (link_ptr_var, DECL_NAME (link_ptr_var)); + SET_DECL_VALUE_EXPR (var->decl, build_simple_mem_ref (link_ptr_var)); + DECL_HAS_VALUE_EXPR_P (var->decl) = 1; + varpool_node::finalize_decl (link_ptr_var); + varpool_node::get (link_ptr_var)->force_output = var->force_output; + } #endif } @@ -694,8 +696,6 @@ lto_main (void) if (!seen_error ()) { - offload_handle_link_vars (); - /* If WPA is enabled analyze the whole call graph and create an optimization plan. Otherwise, read in all the function bodies and continue with optimization. */
