mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 18:36:06 +00:00

When we have an annotated local variable after a function returns, we generate IR that fails verification with the error > Instruction referencing instruction not embedded in a basic block! And it means that bitcast referencing alloca doesn't have a parent basic block. Fix by checking if we are at an unreachable point and skip emitting annotations. This approach is similar to the way we emit variable initializer and debug info. rdar://problem/46200420 Reviewers: rjmccall Reviewed By: rjmccall Subscribers: aprantl, jkorous, dexonsmith, cfe-commits Differential Revision: https://reviews.llvm.org/D58147 llvm-svn: 355166
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
|
|
// END.
|
|
|
|
static long long llfoo;
|
|
static int intfoo;
|
|
static short shortfoo;
|
|
static char charfoo;
|
|
|
|
// CHECK: private unnamed_addr constant [13 x i8] {{.*}}annotation_a{{.*}} section "llvm.metadata"
|
|
// CHECK-NOT: {{.*}}annotation_a{{.*}}
|
|
|
|
static int foo(int a) {
|
|
return a + 1;
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
char barray[16];
|
|
char *b = (char *) __builtin_annotation((int)barray, "annotation_a");
|
|
// CHECK: ptrtoint i8* {{.*}} to i32
|
|
// CHECK-NEXT: call i32 @llvm.annotation.i32
|
|
// CHECK: inttoptr {{.*}} to i8*
|
|
|
|
int call = __builtin_annotation(foo(argc), "annotation_a");
|
|
// CHECK: call {{.*}} @foo
|
|
// CHECK: call i32 @llvm.annotation.i32
|
|
|
|
long long lla = __builtin_annotation(llfoo, "annotation_a");
|
|
// CHECK: call i64 @llvm.annotation.i64
|
|
|
|
int inta = __builtin_annotation(intfoo, "annotation_a");
|
|
// CHECK: load i32, i32* @intfoo
|
|
// CHECK-NEXT: call i32 @llvm.annotation.i32
|
|
// CHECK-NEXT: store
|
|
|
|
short shorta = __builtin_annotation(shortfoo, "annotation_a");
|
|
// CHECK: call i16 @llvm.annotation.i16
|
|
|
|
char chara = __builtin_annotation(charfoo, "annotation_a");
|
|
// CHECK: call i8 @llvm.annotation.i8
|
|
|
|
char **arg = (char**) __builtin_annotation((int) argv, "annotation_a");
|
|
// CHECK: ptrtoint i8** {{.*}} to
|
|
// CHECK: call i32 @llvm.annotation.i32
|
|
// CHECK: inttoptr {{.*}} to i8**
|
|
return 0;
|
|
|
|
int after_return = __builtin_annotation(argc, "annotation_a");
|
|
// CHECK-NOT: call i32 @llvm.annotation.i32
|
|
}
|