From 4c3e25d380b946374cb7d47616dddf4bb854fb5e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 4 Jan 2023 16:21:56 +0100 Subject: [PATCH] [Annotation2Metadata] Support opaque pointers Strip pointer casts instead of matching specific constant expressions. --- llvm/lib/Transforms/IPO/Annotation2Metadata.cpp | 11 +----- llvm/test/Transforms/Util/annotation2metadata.ll | 48 ++++++++++++------------ 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/llvm/lib/Transforms/IPO/Annotation2Metadata.cpp b/llvm/lib/Transforms/IPO/Annotation2Metadata.cpp index 5ca4e24..6cc0454 100644 --- a/llvm/lib/Transforms/IPO/Annotation2Metadata.cpp +++ b/llvm/lib/Transforms/IPO/Annotation2Metadata.cpp @@ -47,20 +47,13 @@ static bool convertAnnotation2Metadata(Module &M) { auto *OpC = dyn_cast(&Op); if (!OpC || OpC->getNumOperands() != 4) continue; - auto *StrGEP = dyn_cast(OpC->getOperand(1)); - if (!StrGEP || StrGEP->getNumOperands() < 2) - continue; - auto *StrC = dyn_cast(StrGEP->getOperand(0)); + auto *StrC = dyn_cast(OpC->getOperand(1)->stripPointerCasts()); if (!StrC) continue; auto *StrData = dyn_cast(StrC->getOperand(0)); if (!StrData) continue; - // Look through bitcast. - auto *Bitcast = dyn_cast(OpC->getOperand(0)); - if (!Bitcast || Bitcast->getOpcode() != Instruction::BitCast) - continue; - auto *Fn = dyn_cast(Bitcast->getOperand(0)); + auto *Fn = dyn_cast(OpC->getOperand(0)->stripPointerCasts()); if (!Fn) continue; diff --git a/llvm/test/Transforms/Util/annotation2metadata.ll b/llvm/test/Transforms/Util/annotation2metadata.ll index 35ec3e7..b4c70d2 100644 --- a/llvm/test/Transforms/Util/annotation2metadata.ll +++ b/llvm/test/Transforms/Util/annotation2metadata.ll @@ -4,55 +4,55 @@ @.str = private unnamed_addr constant [10 x i8] c"_remarks1\00", section "llvm.metadata" @.str.1 = private unnamed_addr constant [6 x i8] c"ann.c\00", section "llvm.metadata" @.str.2 = private unnamed_addr constant [10 x i8] c"_remarks2\00", section "llvm.metadata" -@llvm.global.annotations = appending global [8 x { i8*, i8*, i8*, i32 }] [ - { i8*, i8*, i8*, i32 } { i8* bitcast (void (float*)* @test1 to i8*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i32 2 }, - { i8*, i8*, i8*, i32 } { i8* bitcast (void (float*)* @test1 to i8*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i32 2 }, - { i8*, i8*, i8*, i32 } { i8* bitcast (void (float*)* @test3 to i8*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i8* undef, i32 4 }, ; Invalid entry, make sure we do not crash. - { i8*, i8*, i8*, i32 } { i8* bitcast (void (float*)* @test3 to i8*), i8* undef, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i32 4 }, ; Invalid entry, make sure we do not crash. - { i8*, i8*, i8*, i32 } { i8* undef, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i32 4 }, ; Invalid entry, make sure we do not crash. - { i8*, i8*, i8*, i32 } { i8* bitcast (void (float*)* undef to i8*), i8* undef, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i32 4 }, ; Invalid entry, make sure we do not crash. - { i8*, i8*, i8*, i32 } { i8* undef, i8* undef, i8* undef, i32 300 }, ; Invalid entry, make sure we do not crash. - { i8*, i8*, i8*, i32 } { i8* bitcast (void (float*)* @test3 to i8*), i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i32 0, i32 0), i32 4 } +@llvm.global.annotations = appending global [8 x { ptr, ptr, ptr, i32 }] [ + { ptr, ptr, ptr, i32 } { ptr @test1, ptr @.str, ptr @.str.1, i32 2 }, + { ptr, ptr, ptr, i32 } { ptr @test1, ptr @.str.2, ptr @.str.1, i32 2 }, + { ptr, ptr, ptr, i32 } { ptr @test3, ptr @.str, ptr undef, i32 4 }, ; Invalid entry, make sure we do not crash. + { ptr, ptr, ptr, i32 } { ptr @test3, ptr undef, ptr @.str.1, i32 4 }, ; Invalid entry, make sure we do not crash. + { ptr, ptr, ptr, i32 } { ptr undef, ptr @.str, ptr @.str.1, i32 4 }, ; Invalid entry, make sure we do not crash. + { ptr, ptr, ptr, i32 } { ptr undef, ptr undef, ptr @.str.1, i32 4 }, ; Invalid entry, make sure we do not crash. + { ptr, ptr, ptr, i32 } { ptr undef, ptr undef, ptr undef, i32 300 }, ; Invalid entry, make sure we do not crash. + { ptr, ptr, ptr, i32 } { ptr @test3, ptr @.str, ptr @.str.1, i32 4 } ], section "llvm.metadata" -define void @test1(float* %a) { +define void @test1(ptr %a) { ; CHECK-LABEL: @test1( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8, !annotation [[GROUP1:!.+]] -; CHECK-NEXT: store float* [[A:%.*]], float** [[A_ADDR]], align 8, !annotation [[GROUP1]] +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !annotation [[GROUP1:!.+]] +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !annotation [[GROUP1]] ; CHECK-NEXT: ret void, !annotation [[GROUP1]] ; entry: - %a.addr = alloca float*, align 8 - store float* %a, float** %a.addr, align 8 + %a.addr = alloca ptr, align 8 + store ptr %a, ptr %a.addr, align 8 ret void } -define void @test2(float* %a) { +define void @test2(ptr %a) { ; CHECK-LABEL: @test2( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8 -; CHECK-NEXT: store float* [[A:%.*]], float** [[A_ADDR]], align 8 +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8 +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8 ; CHECK-NEXT: ret void ; entry: - %a.addr = alloca float*, align 8 - store float* %a, float** %a.addr, align 8 + %a.addr = alloca ptr, align 8 + store ptr %a, ptr %a.addr, align 8 ret void } -define void @test3(float* %a) { +define void @test3(ptr %a) { ; CHECK-LABEL: @test3( ; CHECK-NEXT: entry: -; CHECK-NEXT: [[A_ADDR:%.*]] = alloca float*, align 8, !annotation [[GROUP2:!.+]] -; CHECK-NEXT: store float* [[A:%.*]], float** [[A_ADDR]], align 8, !annotation [[GROUP2]] +; CHECK-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8, !annotation [[GROUP2:!.+]] +; CHECK-NEXT: store ptr [[A:%.*]], ptr [[A_ADDR]], align 8, !annotation [[GROUP2]] ; CHECK-NEXT: ret void, !annotation [[GROUP2]] ; entry: - %a.addr = alloca float*, align 8 - store float* %a, float** %a.addr, align 8 + %a.addr = alloca ptr, align 8 + store ptr %a, ptr %a.addr, align 8 ret void } -- 2.7.4