Skip to content

Commit e36f9ea

Browse files
committed
[Clang] Make the AS of llvm.compiler.used & llvm.used elements addrspace(0) (llvm#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#162660
1 parent 27cda2d commit e36f9ea

File tree

3 files changed

+70
-9
lines changed

3 files changed

+70
-9
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3335,21 +3335,18 @@ static void emitUsed(CodeGenModule &CGM, StringRef Name,
33353335
if (List.empty())
33363336
return;
33373337

3338+
llvm::PointerType *UnqualPtr =
3339+
llvm::PointerType::getUnqual(CGM.getLLVMContext());
3340+
33383341
// Convert List to what ConstantArray needs.
33393342
SmallVector<llvm::Constant*, 8> UsedArray;
33403343
UsedArray.resize(List.size());
33413344
for (unsigned i = 0, e = List.size(); i != e; ++i) {
33423345
UsedArray[i] = llvm::ConstantExpr::getPointerBitCastOrAddrSpaceCast(
3343-
cast<llvm::Constant>(&*List[i]),
3344-
CGM.getTarget().getTriple().isAMDGCN() ?
3345-
llvm::PointerType::getUnqual(CGM.getLLVMContext()) :
3346-
CGM.Int8PtrTy);
3346+
cast<llvm::Constant>(&*List[i]), UnqualPtr);
33473347
}
33483348

3349-
if (UsedArray.empty())
3350-
return;
3351-
llvm::ArrayType *ATy = llvm::ArrayType::get(UsedArray.front()->getType(),
3352-
UsedArray.size());
3349+
llvm::ArrayType *ATy = llvm::ArrayType::get(UnqualPtr, UsedArray.size());
33533350

33543351
auto *GV = new llvm::GlobalVariable(
33553352
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
@@ -2,6 +2,6 @@
22
// RUN: | FileCheck %s --check-prefix=CHECK
33
// CHECK: @llvm.embedded.module = private addrspace(1) constant [0 x i8] zeroinitializer, section ".llvmbc", align 1
44
// CHECK-NEXT: @llvm.cmdline = private addrspace(1) constant [{{[0-9]+}} x i8] c"{{.*}}", section ".llvmcmd", align 1
5-
// 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"
5+
// 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"
66

77
__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)