Author: Arseniy Obolenskiy
Date: 2026-10-21T06:11:59+02:00
New Revision: 81dca70621b80b5dbf7cbd6ec889fbaa0419c4df

URL: 
https://github.com/llvm/llvm-project/commit/81dca70621b80b5dbf7cbd6ec889fbaa0419c4df
DIFF: 
https://github.com/llvm/llvm-project/commit/81dca70621b80b5dbf7cbd6ec889fbaa0419c4df.diff

LOG: [CIR][SPIR-V] Use the program address space for global ctors and dtors 
(#233927)

llvm.global_ctors and llvm.global_dtors entries used addrspace(0)
pointers, which asserted on targets with a non-zero program address
space

Added: 
    

Modified: 
    clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
    clang/test/CIR/CodeGen/global-ctor-dtor.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp 
b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 88acf1a5ba945..417d629be68b9 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -4452,7 +4452,9 @@ static void buildCtorDtorList(
 
   // Create a global array llvm.global_ctors with element type of
   // struct { i32, ptr, ptr }
-  auto ctorPFTy = mlir::LLVM::LLVMPointerType::get(builder.getContext());
+  cir::CIRDataLayout cirDataLayout(module);
+  auto ctorPFTy = mlir::LLVM::LLVMPointerType::get(
+      builder.getContext(), cirDataLayout.getProgramAddressSpace());
   llvm::SmallVector<mlir::Type> ctorStructFields;
   ctorStructFields.push_back(builder.getI32Type());
   ctorStructFields.push_back(ctorPFTy);

diff  --git a/clang/test/CIR/CodeGen/global-ctor-dtor.cpp 
b/clang/test/CIR/CodeGen/global-ctor-dtor.cpp
index e58261ebf5446..4d51a5154035c 100644
--- a/clang/test/CIR/CodeGen/global-ctor-dtor.cpp
+++ b/clang/test/CIR/CodeGen/global-ctor-dtor.cpp
@@ -6,6 +6,10 @@
 // RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s
 // RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -emit-llvm %s 
-o %t.ll
 // RUN: FileCheck --check-prefix=OGCG --input-file=%t.ll %s
+// RUN: %clang_cc1 -std=c++20 -triple spirv64-amd-amdhsa -fclangir -emit-llvm 
%s -o - | FileCheck %s --check-prefix=LLVM-AS4
+// RUN: %clang_cc1 -std=c++20 -triple spirv64-amd-amdhsa -emit-llvm %s -o - | 
FileCheck %s --check-prefix=OGCG-AS4
+// RUN: %clang_cc1 -std=c++20 -triple spirv64-intel -fclangir -emit-llvm %s -o 
- | FileCheck %s --check-prefix=LLVM-AS9
+// RUN: %clang_cc1 -std=c++20 -triple spirv64-intel -emit-llvm %s -o - | 
FileCheck %s --check-prefix=OGCG-AS9
 
 extern int bar();
 void foo(void) __attribute__((constructor));
@@ -43,3 +47,15 @@ void foo4(void) {
 
 // OGCG: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, 
ptr, ptr } { i32 65535, ptr @_Z3foov, ptr null }, { i32, ptr, ptr } { i32 777, 
ptr @_Z4foo2v, ptr null }]
 // OGCG: @llvm.global_dtors = appending global [2 x { i32, ptr, ptr }] [{ i32, 
ptr, ptr } { i32 65535, ptr @_Z4foo3v, ptr null }, { i32, ptr, ptr } { i32 789, 
ptr @_Z4foo4v, ptr null }]
+
+// LLVM-AS4: @llvm.global_ctors = appending global [2 x { i32, ptr 
addrspace(4), ptr addrspace(4) }] [{ i32, ptr addrspace(4), ptr addrspace(4) } 
{ i32 65535, ptr addrspace(4) @_Z3foov, ptr addrspace(4) null }, { i32, ptr 
addrspace(4), ptr addrspace(4) } { i32 777, ptr addrspace(4) @_Z4foo2v, ptr 
addrspace(4) null }]
+// LLVM-AS4: @llvm.global_dtors = appending global [2 x { i32, ptr 
addrspace(4), ptr addrspace(4) }] [{ i32, ptr addrspace(4), ptr addrspace(4) } 
{ i32 65535, ptr addrspace(4) @_Z4foo3v, ptr addrspace(4) null }, { i32, ptr 
addrspace(4), ptr addrspace(4) } { i32 789, ptr addrspace(4) @_Z4foo4v, ptr 
addrspace(4) null }]
+
+// OGCG-AS4: @llvm.global_ctors = appending addrspace(1) global [2 x { i32, 
ptr addrspace(4), ptr addrspace(4) }] [{ i32, ptr addrspace(4), ptr 
addrspace(4) } { i32 65535, ptr addrspace(4) @_Z3foov, ptr addrspace(4) null }, 
{ i32, ptr addrspace(4), ptr addrspace(4) } { i32 777, ptr addrspace(4) 
@_Z4foo2v, ptr addrspace(4) null }]
+// OGCG-AS4: @llvm.global_dtors = appending addrspace(1) global [2 x { i32, 
ptr addrspace(4), ptr addrspace(4) }] [{ i32, ptr addrspace(4), ptr 
addrspace(4) } { i32 65535, ptr addrspace(4) @_Z4foo3v, ptr addrspace(4) null 
}, { i32, ptr addrspace(4), ptr addrspace(4) } { i32 789, ptr addrspace(4) 
@_Z4foo4v, ptr addrspace(4) null }]
+
+// LLVM-AS9: @llvm.global_ctors = appending global [2 x { i32, ptr 
addrspace(9), ptr addrspace(9) }] [{ i32, ptr addrspace(9), ptr addrspace(9) } 
{ i32 65535, ptr addrspace(9) @_Z3foov, ptr addrspace(9) null }, { i32, ptr 
addrspace(9), ptr addrspace(9) } { i32 777, ptr addrspace(9) @_Z4foo2v, ptr 
addrspace(9) null }]
+// LLVM-AS9: @llvm.global_dtors = appending global [2 x { i32, ptr 
addrspace(9), ptr addrspace(9) }] [{ i32, ptr addrspace(9), ptr addrspace(9) } 
{ i32 65535, ptr addrspace(9) @_Z4foo3v, ptr addrspace(9) null }, { i32, ptr 
addrspace(9), ptr addrspace(9) } { i32 789, ptr addrspace(9) @_Z4foo4v, ptr 
addrspace(9) null }]
+
+// OGCG-AS9: @llvm.global_ctors = appending addrspace(1) global [2 x { i32, 
ptr addrspace(9), ptr addrspace(9) }] [{ i32, ptr addrspace(9), ptr 
addrspace(9) } { i32 65535, ptr addrspace(9) @_Z3foov, ptr addrspace(9) null }, 
{ i32, ptr addrspace(9), ptr addrspace(9) } { i32 777, ptr addrspace(9) 
@_Z4foo2v, ptr addrspace(9) null }]
+// OGCG-AS9: @llvm.global_dtors = appending addrspace(1) global [2 x { i32, 
ptr addrspace(9), ptr addrspace(9) }] [{ i32, ptr addrspace(9), ptr 
addrspace(9) } { i32 65535, ptr addrspace(9) @_Z4foo3v, ptr addrspace(9) null 
}, { i32, ptr addrspace(9), ptr addrspace(9) } { i32 789, ptr addrspace(9) 
@_Z4foo4v, ptr addrspace(9) null }]


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to