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.  */

Reply via email to