Skip to content

Commit bf2f577

Browse files
authored
[Clang] Make the AS of llvm.compiler.used & llvm.used elements addrspace(0) (#164432)
By convention the AS of the elements of `llvm.compiler.used` & `llvm.used` is 0. However, the AS of `CGM.Int8PtrTy` is not always 0. This leaves some LLVM helpers (`appendToUsed/appendToCompilerUsed/removeFromUsedLists`) unusable. This patch makes the AS of the elements of these variables to be 0. This PR is related to llvm/llvm-project#162660
1 parent 5256db3 commit bf2f577

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3331,18 +3331,18 @@ static void emitUsed(CodeGenModule &CGM, StringRef Name,
33313331
if (List.empty())
33323332
return;
33333333

3334+
llvm::PointerType *UnqualPtr =
3335+
llvm::PointerType::getUnqual(CGM.getLLVMContext());
3336+
33343337
// Convert List to what ConstantArray needs.
33353338
SmallVector<llvm::Constant*, 8> UsedArray;
33363339
UsedArray.resize(List.size());
33373340
for (unsigned i = 0, e = List.size(); i != e; ++i) {
3338-
UsedArray[i] =
3339-
llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3340-
cast<llvm::Constant>(&*List[i]), CGM.Int8PtrTy);
3341+
UsedArray[i] = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3342+
cast<llvm::Constant>(&*List[i]), UnqualPtr);
33413343
}
33423344

3343-
if (UsedArray.empty())
3344-
return;
3345-
llvm::ArrayType *ATy = llvm::ArrayType::get(CGM.Int8PtrTy, UsedArray.size());
3345+
llvm::ArrayType *ATy = llvm::ArrayType::get(UnqualPtr, UsedArray.size());
33463346

33473347
auto *GV = new llvm::GlobalVariable(
33483348
CGM.getModule(), ATy, false, llvm::GlobalValue::AppendingLinkage,

clang/test/CodeGen/embed-bitcode-marker-with-nonzero-as.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@
33

44
// CHECK: @llvm.embedded.module = private addrspace(1) constant [0 x i8] zeroinitializer, section ".llvmbc", align 1
55
// CHECK-NEXT: @llvm.cmdline = private addrspace(1) constant [{{[0-9]+}} x i8] c"{{.*}}", section ".llvmcmd", align 1
6-
// CHECK-NEXT: @llvm.compiler.used = appending addrspace(1) global [5 x ptr addrspace(4)] [ptr addrspace(4) addrspacecast (ptr addrspace(1) @foo.managed to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @foo to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @llvm.embedded.module to ptr addrspace(4)), ptr addrspace(4) addrspacecast (ptr addrspace(1) @llvm.cmdline to ptr addrspace(4))], section "llvm.metadata"
6+
// CHECK-NEXT: @llvm.compiler.used = appending addrspace(1) global [5 x ptr] [ptr addrspacecast (ptr addrspace(1) @foo.managed to ptr), ptr addrspacecast (ptr addrspace(1) @foo to ptr), ptr addrspacecast (ptr addrspace(1) @__hip_cuid_ to ptr), ptr addrspacecast (ptr addrspace(1) @llvm.embedded.module to ptr), ptr addrspacecast (ptr addrspace(1) @llvm.cmdline to ptr)], section "llvm.metadata"
77

88
__attribute__((managed)) int foo = 42;
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
// RUN: %clang_cc1 -x c -triple x86_64-- -emit-llvm -x c %s -o - \
2+
// RUN: | FileCheck %s --check-prefix=X86
3+
// RUN: %clang_cc1 -x c -triple amdgcn-amd-amdhsa -emit-llvm -x c %s -o - \
4+
// RUN: | FileCheck %s --check-prefix=AMDGCN
5+
// RUN: %clang_cc1 -x c -triple spirv64-- -emit-llvm -x c %s -o - \
6+
// RUN: | FileCheck %s --check-prefix=SPIRV
7+
// RUN: %clang_cc1 -x c -triple spirv64-amd-amdhsa -emit-llvm -x c %s -o - \
8+
// RUN: | FileCheck %s --check-prefix=SPIRV_AMD
9+
// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple x86_64-- -emit-llvm -x c %s -o - \
10+
// RUN: | FileCheck %s --check-prefix=X86
11+
// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple amdgcn-amd-amdhsa -emit-llvm -x c %s -o - \
12+
// RUN: | FileCheck %s --check-prefix=AMDGCN
13+
// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple spirv64-- -emit-llvm -x c %s -o - \
14+
// RUN: | FileCheck %s --check-prefix=SPIRV_CL
15+
// RUN: %clang_cc1 -x cl -cl-std=CL1.2 -triple spirv64-amd-amdhsa -emit-llvm -x c %s -o - \
16+
// RUN: | FileCheck %s --check-prefix=SPIRV_AMD_CL
17+
// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple x86_64-- -emit-llvm -x c %s -o - \
18+
// RUN: | FileCheck %s --check-prefix=X86
19+
// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple amdgcn-amd-amdhsa -emit-llvm -x c %s -o - \
20+
// RUN: | FileCheck %s --check-prefix=AMDGCN
21+
// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple spirv64-- -emit-llvm -x c %s -o - \
22+
// RUN: | FileCheck %s --check-prefix=SPIRV_CL
23+
// RUN: %clang_cc1 -x cl -cl-std=CL2.0 -triple spirv64-amd-amdhsa -emit-llvm -x c %s -o - \
24+
// RUN: | FileCheck %s --check-prefix=SPIRV_AMD_CL
25+
26+
#ifndef __OPENCL_C_VERSION__
27+
#define __constant const
28+
#endif
29+
30+
static __constant __attribute__((__used__)) int foo = 42;
31+
32+
33+
// X86: @foo = internal constant i32 42
34+
// X86: @llvm.compiler.used = appending global [2 x ptr] [ptr @foo, ptr @bar], section "llvm.metadata"
35+
//
36+
// AMDGCN: @foo = internal addrspace(4) constant i32 42
37+
// AMDGCN: @llvm.compiler.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(4) @foo to ptr), ptr @bar], section "llvm.metadata"
38+
//
39+
// SPIRV: @foo = internal constant i32 42
40+
// SPIRV: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr @foo, ptr @bar], section "llvm.metadata"
41+
//
42+
// SPIRV_CL: @foo = internal addrspace(2) constant i32 42
43+
// SPIRV_CL: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(2) @foo to ptr), ptr @bar], section "llvm.metadata"
44+
//
45+
// SPIRV_AMD: @foo = internal addrspace(1) constant i32 42
46+
// SPIRV_AMD: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(1) @foo to ptr), ptr addrspacecast (ptr addrspace(4) @bar to ptr)], section "llvm.metadata"
47+
//
48+
// SPIRV_AMD_CL: @foo = internal addrspace(2) constant i32 42
49+
// SPIRV_AMD_CL: @llvm.used = appending addrspace(1) global [2 x ptr] [ptr addrspacecast (ptr addrspace(2) @foo to ptr), ptr addrspacecast (ptr addrspace(4) @bar to ptr)], section "llvm.metadata"
50+
//
51+
// X86: define internal void @bar() #{{[0-9]}} {
52+
//
53+
// AMDGCN: define internal void @bar() #{{[0-9]}} {
54+
//
55+
// SPIRV: define internal spir_func void @bar() #{{[0-9]}} {
56+
//
57+
// SPIRV_CL: define internal spir_func void @bar() #{{[0-9]}} {
58+
//
59+
// SPIRV_AMD: define internal spir_func void @bar() addrspace(4) #{{[0-9]}} {
60+
//
61+
// SPIRV_AMD_CL: define internal spir_func void @bar() addrspace(4) #{{[0-9]}} {
62+
//
63+
static void __attribute__((__used__)) bar() {
64+
}

0 commit comments

Comments
 (0)