forked from OSchip/llvm-project
CodeGen: Allow annotations on globals in non-zero address space
Summary: Attribute annotations are recorded in a special global composite variable that points to annotation strings and the annotated objects. As a restriction of the LLVM IR type system, those pointers are all pointers to address space 0, so let's insert an addrspacecast when the annotated global is in a non-0 address space. Since this addrspacecast is only reachable from the global annotations object, this should allow us to represent annotations on all globals regardless of which addrspacecasts are usually legal for the target. Reviewers: rjmccall Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D71208
This commit is contained in:
parent
5ceb36b212
commit
f21c081b78
|
@ -2212,9 +2212,15 @@ llvm::Constant *CodeGenModule::EmitAnnotateAttr(llvm::GlobalValue *GV,
|
|||
*UnitGV = EmitAnnotationUnit(L),
|
||||
*LineNoCst = EmitAnnotationLineNo(L);
|
||||
|
||||
llvm::Constant *ASZeroGV = GV;
|
||||
if (GV->getAddressSpace() != 0) {
|
||||
ASZeroGV = llvm::ConstantExpr::getAddrSpaceCast(
|
||||
GV, GV->getValueType()->getPointerTo(0));
|
||||
}
|
||||
|
||||
// Create the ConstantStruct for the global annotation.
|
||||
llvm::Constant *Fields[4] = {
|
||||
llvm::ConstantExpr::getBitCast(GV, Int8PtrTy),
|
||||
llvm::ConstantExpr::getBitCast(ASZeroGV, Int8PtrTy),
|
||||
llvm::ConstantExpr::getBitCast(AnnoGV, Int8PtrTy),
|
||||
llvm::ConstantExpr::getBitCast(UnitGV, Int8PtrTy),
|
||||
LineNoCst
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
// RUN: FileCheck --check-prefix=A %s < %t1
|
||||
// RUN: FileCheck --check-prefix=BAR %s < %t1
|
||||
// RUN: FileCheck --check-prefix=FOOS %s < %t1
|
||||
// RUN: FileCheck --check-prefix=ADDRSPACE %s < %t1
|
||||
// END.
|
||||
|
||||
static __attribute((annotate("sfoo_0"))) __attribute((annotate("sfoo_1"))) char sfoo;
|
||||
|
@ -14,17 +15,19 @@ void __attribute((annotate("ann_a_0"))) __attribute((annotate("ann_a_1"))) a(cha
|
|||
sfoo = 0;
|
||||
}
|
||||
|
||||
__attribute((address_space(1))) __attribute__((annotate("addrspace1_ann"))) char addrspace1_var;
|
||||
|
||||
// FOOS: target triple
|
||||
// FOOS: private unnamed_addr constant [7 x i8] c"sfoo_{{.}}\00", section "llvm.metadata"
|
||||
// FOOS: private unnamed_addr constant [7 x i8] c"sfoo_{{.}}\00", section "llvm.metadata"
|
||||
// FOOS-NOT: sfoo_
|
||||
// FOOS: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 }] {{.*}}i8* @sfoo{{.*}}i8* @sfoo{{.*}}, section "llvm.metadata"
|
||||
// FOOS: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 }] {{.*}}i8* @sfoo{{.*}}i8* @sfoo{{.*}}, section "llvm.metadata"
|
||||
|
||||
// FOO: target triple
|
||||
// FOO: private unnamed_addr constant [6 x i8] c"foo_{{.}}\00", section "llvm.metadata"
|
||||
// FOO: private unnamed_addr constant [6 x i8] c"foo_{{.}}\00", section "llvm.metadata"
|
||||
// FOO-NOT: foo_
|
||||
// FOO: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 }] {{.*}}i8* @foo{{.*}}i8* @foo{{.*}}, section "llvm.metadata"
|
||||
// FOO: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 }] {{.*}}i8* @foo{{.*}}i8* @foo{{.*}}, section "llvm.metadata"
|
||||
|
||||
// A: target triple
|
||||
// A: private unnamed_addr constant [8 x i8] c"ann_a_{{.}}\00", section "llvm.metadata"
|
||||
|
@ -32,10 +35,13 @@ void __attribute((annotate("ann_a_0"))) __attribute((annotate("ann_a_1"))) a(cha
|
|||
// A: private unnamed_addr constant [8 x i8] c"ann_a_{{.}}\00", section "llvm.metadata"
|
||||
// A: private unnamed_addr constant [8 x i8] c"ann_a_{{.}}\00", section "llvm.metadata"
|
||||
// A-NOT: ann_a_
|
||||
// A: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 }] {{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}, section "llvm.metadata"
|
||||
// A: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 }] {{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}i8* bitcast (void (i8*)* @a to i8*){{.*}}, section "llvm.metadata"
|
||||
|
||||
// BAR: target triple
|
||||
// BAR: private unnamed_addr constant [6 x i8] c"bar_{{.}}\00", section "llvm.metadata"
|
||||
// BAR: private unnamed_addr constant [6 x i8] c"bar_{{.}}\00", section "llvm.metadata"
|
||||
// BAR-NOT: bar_
|
||||
// BAR: @llvm.global.annotations = appending global [10 x { i8*, i8*, i8*, i32 }] {{.*}}i8* @a.bar{{.*}}i8* @a.bar{{.*}}, section "llvm.metadata"
|
||||
// BAR: @llvm.global.annotations = appending global [11 x { i8*, i8*, i8*, i32 }] {{.*}}i8* @a.bar{{.*}}i8* @a.bar{{.*}}, section "llvm.metadata"
|
||||
|
||||
// ADDRSPACE: target triple
|
||||
// ADDRSPACE: @llvm.global.annotations = appending global {{.*}} addrspacecast (i8 addrspace(1)* @addrspace1_var to i8*), {{.*}}
|
||||
|
|
Loading…
Reference in New Issue