Author: Marcos Maronas Date: 2026-09-10T14:17:54+01:00 New Revision: 8be8161a037daf2417c669336b777e986d0fc21f
URL: https://github.com/llvm/llvm-project/commit/8be8161a037daf2417c669336b777e986d0fc21f DIFF: https://github.com/llvm/llvm-project/commit/8be8161a037daf2417c669336b777e986d0fc21f.diff LOG: [clang][CodeGen] Stop overriding GlobalVariable's default address space (#222367) 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). Added: Modified: clang/include/clang/CodeGen/ConstantInitBuilder.h clang/lib/CodeGen/ConstantInitBuilder.cpp clang/test/CodeGenCXX/constructor-attr.cpp clang/test/CodeGenCXX/cxx0x-initializer-stdinitializerlist.cpp clang/test/OpenMP/amdgcn_target_global_constructor.cpp Removed: ################################################################################ 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/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 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]+]] { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
