[clang] [clang][CodeGen] Stop overriding GlobalVariable's default address space (PR #222367)

Marcos Maronas via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 10 03:16:55 PDT 2026


https://github.com/maarquitos14 updated https://github.com/llvm/llvm-project/pull/222367

>From 67a71220d5012326cd99ef035aba3bb397bccc88 Mon Sep 17 00:00:00 2001
From: Marcos Maronas <mmaronas at amd.com>
Date: Wed, 9 Sep 2026 10:35:44 -0500
Subject: [PATCH 1/2] [clang][CodeGen] Stop overriding GlobalVariable's default
 address space

---
 clang/include/clang/CodeGen/ConstantInitBuilder.h  | 14 +++++++-------
 clang/lib/CodeGen/ConstantInitBuilder.cpp          | 11 ++++-------
 .../cxx0x-initializer-stdinitializerlist.cpp       |  3 ++-
 .../OpenMP/amdgcn_target_global_constructor.cpp    |  4 ++--
 4 files changed, 15 insertions(+), 17 deletions(-)

diff --git a/clang/include/clang/CodeGen/ConstantInitBuilder.h b/clang/include/clang/CodeGen/ConstantInitBuilder.h
index 28d4764b6d60b..70a6ac323ccec 100644
--- a/clang/include/clang/CodeGen/ConstantInitBuilder.h
+++ b/clang/include/clang/CodeGen/ConstantInitBuilder.h
@@ -22,6 +22,7 @@
 #include "clang/AST/CharUnits.h"
 #include "clang/CodeGen/ConstantInitFuture.h"
 
+#include <optional>
 #include <vector>
 
 namespace clang {
@@ -77,13 +78,12 @@ class ConstantInitBuilderBase {
   }
 
 private:
-  llvm::GlobalVariable *createGlobal(llvm::Constant *initializer,
-                                     const llvm::Twine &name,
-                                     CharUnits alignment,
-                                     bool constant = false,
-                                     llvm::GlobalValue::LinkageTypes linkage
-                                       = llvm::GlobalValue::InternalLinkage,
-                                     unsigned addressSpace = 0);
+  llvm::GlobalVariable *
+  createGlobal(llvm::Constant *initializer, const llvm::Twine &name,
+               CharUnits alignment, bool constant = false,
+               llvm::GlobalValue::LinkageTypes linkage =
+                   llvm::GlobalValue::InternalLinkage,
+               std::optional<unsigned> addressSpace = std::nullopt);
 
   ConstantInitFuture createFuture(llvm::Constant *initializer);
 
diff --git a/clang/lib/CodeGen/ConstantInitBuilder.cpp b/clang/lib/CodeGen/ConstantInitBuilder.cpp
index 7b3e7aea0f647..d26209e18afa6 100644
--- a/clang/lib/CodeGen/ConstantInitBuilder.cpp
+++ b/clang/lib/CodeGen/ConstantInitBuilder.cpp
@@ -63,13 +63,10 @@ inline ConstantInitFuture::ConstantInitFuture(ConstantInitBuilderBase *builder)
   assert(builder->Buffer[0] != nullptr);
 }
 
-llvm::GlobalVariable *
-ConstantInitBuilderBase::createGlobal(llvm::Constant *initializer,
-                                      const llvm::Twine &name,
-                                      CharUnits alignment,
-                                      bool constant,
-                                      llvm::GlobalValue::LinkageTypes linkage,
-                                      unsigned addressSpace) {
+llvm::GlobalVariable *ConstantInitBuilderBase::createGlobal(
+    llvm::Constant *initializer, const llvm::Twine &name, CharUnits alignment,
+    bool constant, llvm::GlobalValue::LinkageTypes linkage,
+    std::optional<unsigned> addressSpace) {
   auto GV = new llvm::GlobalVariable(CGM.getModule(),
                                      initializer->getType(),
                                      constant,
diff --git a/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp
index 393c53a6d2538..17e96e53514d5 100644
--- a/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp
+++ b/clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp
@@ -90,7 +90,8 @@ std::initializer_list<int> thread_local x = {1, 2, 3, 4};
 // AMDGCN: @[[REFTMP1:.*]] = private addrspace(4) constant [2 x i32] [i32 42, i32 43], align 4
 // AMDGCN: @[[REFTMP2:.*]] = private addrspace(4) constant [3 x %{{.*}}] [%{{.*}} { i32 1 }, %{{.*}} { i32 2 }, %{{.*}} { i32 3 }], align 4
 
-// CHECK: appending global
+// X86: appending global
+// AMDGCN: appending addrspace(1) global
 
 // thread_local initializer:
 // X86-LABEL: define internal void @__cxx_global_var_init
diff --git a/clang/test/OpenMP/amdgcn_target_global_constructor.cpp b/clang/test/OpenMP/amdgcn_target_global_constructor.cpp
index 7f3dc4c6e63fd..ad41344fc45fb 100644
--- a/clang/test/OpenMP/amdgcn_target_global_constructor.cpp
+++ b/clang/test/OpenMP/amdgcn_target_global_constructor.cpp
@@ -27,8 +27,8 @@ S A;
 // CHECK: @__omp_rtl_assume_no_thread_state = weak_odr hidden addrspace(1) constant i32 0
 // CHECK: @__omp_rtl_assume_no_nested_parallelism = weak_odr hidden addrspace(1) constant i32 0
 // CHECK: @A = addrspace(1) global %struct.S zeroinitializer, align 4
-// CHECK: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_amdgcn_target_global_constructor.cpp, ptr null }]
-// CHECK: @llvm.global_dtors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__dtor_A, ptr null }]
+// CHECK: @llvm.global_ctors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_amdgcn_target_global_constructor.cpp, ptr null }]
+// CHECK: @llvm.global_dtors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__dtor_A, ptr null }]
 //.
 // CHECK-LABEL: define {{[^@]+}}@__cxx_global_var_init
 // CHECK-SAME: () #[[ATTR0:[0-9]+]] {

>From 1d73905f82536075364e7e4b560459696097b036 Mon Sep 17 00:00:00 2001
From: Marcos Maronas <mmaronas at amd.com>
Date: Wed, 9 Sep 2026 12:36:53 -0500
Subject: [PATCH 2/2] Verify with spirv triple.

---
 clang/test/CodeGenCXX/constructor-attr.cpp | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/clang/test/CodeGenCXX/constructor-attr.cpp b/clang/test/CodeGenCXX/constructor-attr.cpp
index d73b661f1ec40..4dc7d7304b13e 100644
--- a/clang/test/CodeGenCXX/constructor-attr.cpp
+++ b/clang/test/CodeGenCXX/constructor-attr.cpp
@@ -1,6 +1,10 @@
-// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s
+// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,ITANIUM
+// RUN: %clang_cc1 -triple spirv64 -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,SPIRV
 
-// CHECK: @llvm.global_ctors
+// The structor list is an ordinary global, so it lands in the target's default
+// globals address space (the datalayout "G" specifier), not address space 0.
+// ITANIUM: @llvm.global_ctors = appending global
+// SPIRV: @llvm.global_ctors = appending addrspace(1) global
 // CHECK-SAME: i32 65535, ptr @_ZN3Foo3fooEv
 // CHECK-SAME: i32 101, ptr @_Z22template_dependent_cxxILi101EEvv
 // CHECK-SAME: i32 102, ptr @_Z22template_dependent_gnuILi102EEvv



More information about the cfe-commits mailing list