From: Nicolai Hähnle Date: Wed, 5 Jun 2019 19:35:30 +0000 (+0200) Subject: CodeGen: Allow annotations on globals in non-zero address space X-Git-Tag: llvmorg-11-init~2444 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f21c081b78ec7a83a79137c65edd58874b262761;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index d3d3df8..3805eae 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -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 diff --git a/clang/test/CodeGen/annotations-global.c b/clang/test/CodeGen/annotations-global.c index 2782525..117469d 100644 --- a/clang/test/CodeGen/annotations-global.c +++ b/clang/test/CodeGen/annotations-global.c @@ -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*), {{.*}}