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

via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 9 08:47:41 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Marcos Maronas (maarquitos14)

<details>
<summary>Changes</summary>

The `GlobalVariable` constructor used by `createGlobal` receives a `std::optional<unsigned> AddressSpace` that, when unspecified, falls back to `M.getDataLayout().getDefaultGlobalsAddressSpace()`. However, `createGlobal`'s `AddressSpace` arg was a bare `unsigned` defaulting to 0. By doing that, it was effectively overriding the `GlobalVariable`'s constructor fallback with 0. On targets whose default globals address space is not 0 (AMDGPU, SPIR/SPIR-V), this emitted `@<!-- -->llvm.global_ctors/dtors` in address space 0 causing some issues (see https://github.com/ROCm/SPIRV-LLVM-Translator/issues/293).

---
Full diff: https://github.com/llvm/llvm-project/pull/222367.diff


4 Files Affected:

- (modified) clang/include/clang/CodeGen/ConstantInitBuilder.h (+3-1) 
- (modified) clang/lib/CodeGen/ConstantInitBuilder.cpp (+1-1) 
- (modified) clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp (+2-1) 
- (modified) clang/test/OpenMP/amdgcn_target_global_constructor.cpp (+2-2) 


``````````diff
diff --git a/clang/include/clang/CodeGen/ConstantInitBuilder.h b/clang/include/clang/CodeGen/ConstantInitBuilder.h
index 28d4764b6d60b..3575c0181ecf4 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 {
@@ -83,7 +84,8 @@ class ConstantInitBuilderBase {
                                      bool constant = false,
                                      llvm::GlobalValue::LinkageTypes linkage
                                        = llvm::GlobalValue::InternalLinkage,
-                                     unsigned addressSpace = 0);
+                                     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..81675492a2f65 100644
--- a/clang/lib/CodeGen/ConstantInitBuilder.cpp
+++ b/clang/lib/CodeGen/ConstantInitBuilder.cpp
@@ -69,7 +69,7 @@ ConstantInitBuilderBase::createGlobal(llvm::Constant *initializer,
                                       CharUnits alignment,
                                       bool constant,
                                       llvm::GlobalValue::LinkageTypes linkage,
-                                      unsigned addressSpace) {
+                                      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]+]] {

``````````

</details>


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


More information about the cfe-commits mailing list