diff options
Diffstat (limited to 'clang/test/CodeGenCXX')
-rw-r--r-- | clang/test/CodeGenCXX/bitsets.cpp | 211 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cfi-blacklist.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cfi-cast.cpp | 28 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cfi-cross-dso.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cfi-icall.cpp | 9 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cfi-ms-rtti.cpp | 4 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/cfi-nvcall.cpp | 8 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/lto-visibility-inference.cpp (renamed from clang/test/CodeGenCXX/bitset-inference.cpp) | 50 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/type-metadata.cpp | 226 |
9 files changed, 283 insertions, 265 deletions
diff --git a/clang/test/CodeGenCXX/bitsets.cpp b/clang/test/CodeGenCXX/bitsets.cpp deleted file mode 100644 index 4d11f39b66b..00000000000 --- a/clang/test/CodeGenCXX/bitsets.cpp +++ /dev/null @@ -1,211 +0,0 @@ -// Tests for the cfi-vcall feature: -// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=ITANIUM --check-prefix=ITANIUM-NDIAG --check-prefix=NDIAG %s -// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=ITANIUM --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s -// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=ITANIUM --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s -// RUN: %clang_cc1 -flto -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=MS --check-prefix=NDIAG %s - -// Tests for the whole-program-vtables feature: -// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM %s -// RUN: %clang_cc1 -flto -triple x86_64-pc-windows-msvc -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=MS %s - -// MS: @[[VTA:[0-9]*]] {{.*}} comdat($"\01??_7A@@6B@") -// MS: @[[VTB:[0-9]*]] {{.*}} comdat($"\01??_7B@@6B0@@") -// MS: @[[VTAinB:[0-9]*]] {{.*}} comdat($"\01??_7B@@6BA@@@") -// MS: @[[VTAinC:[0-9]*]] {{.*}} comdat($"\01??_7C@@6B@") -// MS: @[[VTBinD:[0-9]*]] {{.*}} comdat($"\01??_7D@?A@@6BB@@@") -// MS: @[[VTAinBinD:[0-9]*]] {{.*}} comdat($"\01??_7D@?A@@6BA@@@") -// MS: @[[VTFA:[0-9]*]] {{.*}} comdat($"\01??_7FA@?1??foo@@YAXXZ@6B@") - -struct A { - A(); - virtual void f(); -}; - -struct B : virtual A { - B(); - virtual void g(); - virtual void h(); -}; - -struct C : virtual A { - C(); -}; - -namespace { - -struct D : B, C { - D(); - virtual void f(); - virtual void h(); -}; - -} - -A::A() {} -B::B() {} -C::C() {} -D::D() {} - -void A::f() { -} - -void B::g() { -} - -void D::f() { -} - -void D::h() { -} - -// DIAG: @[[SRC:.*]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*}}bitsets.cpp\00", align 1 -// DIAG: @[[TYPE:.*]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'A'\00" } -// DIAG: @[[BADTYPESTATIC:.*]] = private unnamed_addr global { i8, { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }* } { i8 0, { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 [[@LINE+24]], i32 3 }, { i16, i16, [4 x i8] }* @[[TYPE]] } - -// ITANIUM: define hidden void @_Z2afP1A -// MS: define void @"\01?af@@YAXPEAUA@@@Z" -void af(A *a) { - // ITANIUM: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"_ZTS1A") - // MS: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"?AUA@@") - // DIAG-NEXT: [[VTVALID0:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT]], metadata !"all-vtables") - // VTABLE-OPT: call void @llvm.assume(i1 [[P]]) - // CFI-NEXT: br i1 [[P]], label %[[CONTBB:[^ ,]*]], label %[[TRAPBB:[^ ,]*]] - // CFI-NEXT: {{^$}} - - // CFI: [[TRAPBB]] - // NDIAG-NEXT: call void @llvm.trap() - // NDIAG-NEXT: unreachable - // DIAG-NEXT: [[VTINT:%[^ ]*]] = ptrtoint i8* [[VT]] to i64 - // DIAG-NEXT: [[VTVALID:%[^ ]*]] = zext i1 [[VTVALID0]] to i64 - // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_check_fail_abort(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]]) - // DIAG-ABORT-NEXT: unreachable - // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_check_fail(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]]) - // DIAG-RECOVER-NEXT: br label %[[CONTBB]] - - // CFI: [[CONTBB]] - // CFI: call void % - a->f(); -} - -// ITANIUM: define internal void @_Z3df1PN12_GLOBAL__N_11DE -// MS: define internal void @"\01?df1@@YAXPEAUD@?A@@@Z" -void df1(D *d) { - // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]]) - // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"?AUA@@") - d->f(); -} - -// ITANIUM: define internal void @_Z3dg1PN12_GLOBAL__N_11DE -// MS: define internal void @"\01?dg1@@YAXPEAUD@?A@@@Z" -void dg1(D *d) { - // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") - // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"?AUB@@") - d->g(); -} - -// ITANIUM: define internal void @_Z3dh1PN12_GLOBAL__N_11DE -// MS: define internal void @"\01?dh1@@YAXPEAUD@?A@@@Z" -void dh1(D *d) { - // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata ![[DTYPE]]) - // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]]) - d->h(); -} - -// ITANIUM: define internal void @_Z3df2PN12_GLOBAL__N_11DE -// MS: define internal void @"\01?df2@@YAXPEAUD@?A@@@Z" -__attribute__((no_sanitize("cfi"))) -void df2(D *d) { - // CFI-NOT: call i1 @llvm.bitset.test - d->f(); -} - -// ITANIUM: define internal void @_Z3df3PN12_GLOBAL__N_11DE -// MS: define internal void @"\01?df3@@YAXPEAUD@?A@@@Z" -__attribute__((no_sanitize("address"))) __attribute__((no_sanitize("cfi-vcall"))) -void df3(D *d) { - // CFI-NOT: call i1 @llvm.bitset.test - d->f(); -} - -D d; - -void foo() { - df1(&d); - dg1(&d); - dh1(&d); - df2(&d); - df3(&d); - - struct FA : A { - void f() {} - } fa; - af(&fa); -} - -namespace test2 { - -struct A { - virtual void m_fn1(); -}; -struct B { - virtual void m_fn2(); -}; -struct C : B, A {}; -struct D : C { - void m_fn1(); -}; - -// ITANIUM: define hidden void @_ZN5test21fEPNS_1DE -// MS: define void @"\01?f@test2@@YAXPEAUD@1@@Z" -void f(D *d) { - // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTSN5test21DE") - // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"?AUA@test2@@") - d->m_fn1(); -} - -} - -// Check for the expected number of elements (15 or 23 respectively). -// MS-NDIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){9}]]} -// MS-DIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){15}]]} -// ITANIUM-NDIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){14}]]} -// ITANIUM-DIAG: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){23}]]} - -// ITANIUM-DAG: !{!"_ZTS1A", [3 x i8*]* @_ZTV1A, i64 16} -// ITANIUM-DIAG-DAG: !{!"all-vtables", [3 x i8*]* @_ZTV1A, i64 16} -// ITANIUM-DAG: !{!"_ZTS1A", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32} -// ITANIUM-DIAG-DAG: !{!"all-vtables", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32} -// ITANIUM-DAG: !{!"_ZTS1B", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32} -// ITANIUM-DAG: !{!"_ZTS1A", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 64} -// ITANIUM-DIAG-DAG: !{!"all-vtables", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 64} -// ITANIUM-DAG: !{!"_ZTS1C", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 32} -// ITANIUM-DAG: !{!"_ZTS1A", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32} -// ITANIUM-DIAG-DAG: !{!"all-vtables", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32} -// ITANIUM-DAG: !{!"_ZTS1B", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32} -// ITANIUM-DAG: !{!"_ZTS1C", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 88} -// ITANIUM-DIAG-DAG: !{!"all-vtables", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 88} -// ITANIUM-DAG: !{![[DTYPE]], [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32} -// ITANIUM-DAG: !{!"_ZTS1A", [7 x i8*]* @_ZTV1B, i64 32} -// ITANIUM-DIAG-DAG: !{!"all-vtables", [7 x i8*]* @_ZTV1B, i64 32} -// ITANIUM-DAG: !{!"_ZTS1B", [7 x i8*]* @_ZTV1B, i64 32} -// ITANIUM-DAG: !{!"_ZTS1A", [5 x i8*]* @_ZTV1C, i64 32} -// ITANIUM-DAG: !{!"_ZTS1C", [5 x i8*]* @_ZTV1C, i64 32} -// ITANIUM-DAG: !{!"_ZTS1A", [3 x i8*]* @_ZTVZ3foovE2FA, i64 16} -// ITANIUM-DAG: !{!{{[0-9]+}}, [3 x i8*]* @_ZTVZ3foovE2FA, i64 16} - -// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTA]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [2 x i8*]* @[[VTA]], i64 8} -// MS-DAG: !{!"?AUB@@", [3 x i8*]* @[[VTB]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [3 x i8*]* @[[VTB]], i64 8} -// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTAinB]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [2 x i8*]* @[[VTAinB]], i64 8} -// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTAinC]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [2 x i8*]* @[[VTAinC]], i64 8} -// MS-DAG: !{!"?AUB@@", [3 x i8*]* @[[VTBinD]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [3 x i8*]* @[[VTBinD]], i64 8} -// MS-DAG: !{![[DTYPE]], [3 x i8*]* @[[VTBinD]], i64 8} -// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTAinBinD]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [2 x i8*]* @[[VTAinBinD]], i64 8} -// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTFA]], i64 8} -// MS-DIAG-DAG: !{!"all-vtables", [2 x i8*]* @[[VTFA]], i64 8} -// MS-DAG: !{!{{[0-9]+}}, [2 x i8*]* @[[VTFA]], i64 8} diff --git a/clang/test/CodeGenCXX/cfi-blacklist.cpp b/clang/test/CodeGenCXX/cfi-blacklist.cpp index 38b9971c90e..af8a10601d2 100644 --- a/clang/test/CodeGenCXX/cfi-blacklist.cpp +++ b/clang/test/CodeGenCXX/cfi-blacklist.cpp @@ -15,15 +15,15 @@ struct S2 { } // CHECK: define{{.*}}s1f -// NOBL: llvm.bitset.test -// NOSTD: llvm.bitset.test +// NOBL: llvm.type.test +// NOSTD: llvm.type.test void s1f(S1 *s1) { s1->f(); } // CHECK: define{{.*}}s2f -// NOBL: llvm.bitset.test -// NOSTD-NOT: llvm.bitset.test +// NOBL: llvm.type.test +// NOSTD-NOT: llvm.type.test void s2f(std::S2 *s2) { s2->f(); } diff --git a/clang/test/CodeGenCXX/cfi-cast.cpp b/clang/test/CodeGenCXX/cfi-cast.cpp index 9fe87111b38..54641b52332 100644 --- a/clang/test/CodeGenCXX/cfi-cast.cpp +++ b/clang/test/CodeGenCXX/cfi-cast.cpp @@ -19,7 +19,7 @@ struct C : A {}; // CHECK-DCAST-LABEL: define hidden void @_Z3abpP1A void abp(A *a) { - // CHECK-DCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-DCAST: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") // CHECK-DCAST-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-DCAST: [[TRAPBB]] @@ -33,7 +33,7 @@ void abp(A *a) { // CHECK-DCAST-LABEL: define hidden void @_Z3abrR1A void abr(A &a) { - // CHECK-DCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-DCAST: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") // CHECK-DCAST-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-DCAST: [[TRAPBB]] @@ -47,7 +47,7 @@ void abr(A &a) { // CHECK-DCAST-LABEL: define hidden void @_Z4abrrO1A void abrr(A &&a) { - // CHECK-DCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-DCAST: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") // CHECK-DCAST-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-DCAST: [[TRAPBB]] @@ -61,7 +61,7 @@ void abrr(A &&a) { // CHECK-UCAST-LABEL: define hidden void @_Z3vbpPv void vbp(void *p) { - // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") // CHECK-UCAST-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-UCAST: [[TRAPBB]] @@ -75,7 +75,7 @@ void vbp(void *p) { // CHECK-UCAST-LABEL: define hidden void @_Z3vbrRc void vbr(char &r) { - // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") // CHECK-UCAST-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-UCAST: [[TRAPBB]] @@ -89,7 +89,7 @@ void vbr(char &r) { // CHECK-UCAST-LABEL: define hidden void @_Z4vbrrOc void vbrr(char &&r) { - // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-UCAST: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") // CHECK-UCAST-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ,]*]] // CHECK-UCAST: [[TRAPBB]] @@ -104,31 +104,31 @@ void vbrr(char &&r) { // CHECK-UCAST-LABEL: define hidden void @_Z3vcpPv // CHECK-UCAST-STRICT-LABEL: define hidden void @_Z3vcpPv void vcp(void *p) { - // CHECK-UCAST: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") - // CHECK-UCAST-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") + // CHECK-UCAST: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") + // CHECK-UCAST-STRICT: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") (void)static_cast<C*>(p); } // CHECK-UCAST-LABEL: define hidden void @_Z3bcpP1B // CHECK-UCAST-STRICT-LABEL: define hidden void @_Z3bcpP1B void bcp(B *p) { - // CHECK-UCAST: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") - // CHECK-UCAST-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") + // CHECK-UCAST: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") + // CHECK-UCAST-STRICT: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") (void)(C *)p; } // CHECK-UCAST-LABEL: define hidden void @_Z8bcp_callP1B // CHECK-UCAST-STRICT-LABEL: define hidden void @_Z8bcp_callP1B void bcp_call(B *p) { - // CHECK-UCAST: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") - // CHECK-UCAST-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") + // CHECK-UCAST: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") + // CHECK-UCAST-STRICT: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") ((C *)p)->f(); } // CHECK-UCAST-LABEL: define hidden i32 @_Z6a_callP1A // CHECK-UCAST-STRICT-LABEL: define hidden i32 @_Z6a_callP1A int a_call(A *a) { - // CHECK-UCAST-NOT: @llvm.bitset.test - // CHECK-UCAST-STRICT-NOT: @llvm.bitset.test + // CHECK-UCAST-NOT: @llvm.type.test + // CHECK-UCAST-STRICT-NOT: @llvm.type.test return a->i(); } diff --git a/clang/test/CodeGenCXX/cfi-cross-dso.cpp b/clang/test/CodeGenCXX/cfi-cross-dso.cpp index 84a6879e55f..d67927d4d2e 100644 --- a/clang/test/CodeGenCXX/cfi-cross-dso.cpp +++ b/clang/test/CodeGenCXX/cfi-cross-dso.cpp @@ -30,8 +30,8 @@ void g() { // CHECK: %[[VT:.*]] = load void (%struct.A*)**, void (%struct.A*)*** // CHECK: %[[VT2:.*]] = bitcast {{.*}}%[[VT]] to i8*, !nosanitize -// ITANIUM: %[[TEST:.*]] = call i1 @llvm.bitset.test(i8* %[[VT2]], metadata !"_ZTS1A"), !nosanitize -// MS: %[[TEST:.*]] = call i1 @llvm.bitset.test(i8* %[[VT2]], metadata !"?AUA@@"), !nosanitize +// ITANIUM: %[[TEST:.*]] = call i1 @llvm.type.test(i8* %[[VT2]], metadata !"_ZTS1A"), !nosanitize +// MS: %[[TEST:.*]] = call i1 @llvm.type.test(i8* %[[VT2]], metadata !"?AUA@@"), !nosanitize // CHECK: br i1 %[[TEST]], label %[[CONT:.*]], label %[[SLOW:.*]], {{.*}} !nosanitize // CHECK: [[SLOW]] // ITANIUM: call void @__cfi_slowpath_diag(i64 7004155349499253778, i8* %[[VT2]], {{.*}}) {{.*}} !nosanitize diff --git a/clang/test/CodeGenCXX/cfi-icall.cpp b/clang/test/CodeGenCXX/cfi-icall.cpp index eceb92a4421..c3c6ed309cc 100644 --- a/clang/test/CodeGenCXX/cfi-icall.cpp +++ b/clang/test/CodeGenCXX/cfi-icall.cpp @@ -15,9 +15,12 @@ void f(S *s) { void g() { void (*fp)(S *) = f; - // CHECK: call i1 @llvm.bitset.test(i8* {{.*}}, metadata ![[VOIDS:[0-9]+]]) + // CHECK: call i1 @llvm.type.test(i8* {{.*}}, metadata [[VOIDS:![0-9]+]]) fp(0); } -// ITANIUM: !{![[VOIDS]], void (%"struct.(anonymous namespace)::S"*)* @_ZN12_GLOBAL__N_11fEPNS_1SE, i64 0} -// MS: !{![[VOIDS]], void (%"struct.(anonymous namespace)::S"*)* @"\01?f@?A@@YAXPEAUS@?A@@@Z", i64 0} +// ITANIUM: define internal void @_ZN12_GLOBAL__N_11fEPNS_1SE({{.*}} !type [[TS:![0-9]+]] +// MS: define internal void @"\01?f@?A@@YAXPEAUS@?A@@@Z"({{.*}} !type [[TS:![0-9]+]] + +// CHECK: [[VOIDS]] = distinct !{} +// CHECK: [[TS]] = !{i64 0, [[VOIDS]]} diff --git a/clang/test/CodeGenCXX/cfi-ms-rtti.cpp b/clang/test/CodeGenCXX/cfi-ms-rtti.cpp index 12c9868ceee..fbebad4b1b8 100644 --- a/clang/test/CodeGenCXX/cfi-ms-rtti.cpp +++ b/clang/test/CodeGenCXX/cfi-ms-rtti.cpp @@ -8,5 +8,5 @@ struct A { A::A() {} -// RTTI: !{!"?AUA@@", [2 x i8*]* {{.*}}, i64 8} -// NO-RTTI: !{!"?AUA@@", [1 x i8*]* {{.*}}, i64 0} +// RTTI: !{i64 8, !"?AUA@@"} +// NO-RTTI: !{i64 0, !"?AUA@@"} diff --git a/clang/test/CodeGenCXX/cfi-nvcall.cpp b/clang/test/CodeGenCXX/cfi-nvcall.cpp index ea18e216f07..e968f05600c 100644 --- a/clang/test/CodeGenCXX/cfi-nvcall.cpp +++ b/clang/test/CodeGenCXX/cfi-nvcall.cpp @@ -17,8 +17,8 @@ struct C : A { // CHECK-LABEL: @bg // CHECK-STRICT-LABEL: @bg extern "C" void bg(B *b) { - // CHECK: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") - // CHECK-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // CHECK-STRICT: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") b->g(); } @@ -29,7 +29,7 @@ extern "C" void cg(C *c) { // In this case C's layout is the same as its base class, so we allow // c to be of type A in non-strict mode. - // CHECK: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") - // CHECK-STRICT: call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") + // CHECK: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1A") + // CHECK-STRICT: call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1C") c->g(); } diff --git a/clang/test/CodeGenCXX/bitset-inference.cpp b/clang/test/CodeGenCXX/lto-visibility-inference.cpp index d9528609ff2..8e57ef5e0b8 100644 --- a/clang/test/CodeGenCXX/bitset-inference.cpp +++ b/clang/test/CodeGenCXX/lto-visibility-inference.cpp @@ -67,41 +67,41 @@ struct C11 { void f(C1 *c1, C2 *c2, C3 *c3, C4 *c4, C5 *c5, C6 *c6, std::C7 *c7, std::C7::C8 *c8, stdext::C9 *c9, other::C10 *c10) { - // ITANIUM: bitset.test{{.*}}!"_ZTS2C1" - // MS: bitset.test{{.*}}!"?AUC1@@" + // ITANIUM: type.test{{.*}}!"_ZTS2C1" + // MS: type.test{{.*}}!"?AUC1@@" c1->f(); - // ITANIUM-NOT: bitset.test{{.*}}!"_ZTS2C2" - // MS: bitset.test{{.*}}!"?AUC2@@" + // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C2" + // MS: type.test{{.*}}!"?AUC2@@" c2->f(); - // ITANIUM: bitset.test{{.*}}!"_ZTS2C3" - // MS-NOT: bitset.test{{.*}}!"?AUC3@@" + // ITANIUM: type.test{{.*}}!"_ZTS2C3" + // MS-NOT: type.test{{.*}}!"?AUC3@@" c3->f(); - // ITANIUM: bitset.test{{.*}}!"_ZTS2C4" - // MS-NOT: bitset.test{{.*}}!"?AUC4@@" + // ITANIUM: type.test{{.*}}!"_ZTS2C4" + // MS-NOT: type.test{{.*}}!"?AUC4@@" c4->f(); - // ITANIUM-NOT: bitset.test{{.*}}!"_ZTS2C5" - // MS-NOT: bitset.test{{.*}}!"?AUC5@@" + // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C5" + // MS-NOT: type.test{{.*}}!"?AUC5@@" c5->f(); - // ITANIUM-NOT: bitset.test{{.*}}!"_ZTS2C6" - // MS-NOT: bitset.test{{.*}}!"?AUC6@@" + // ITANIUM-NOT: type.test{{.*}}!"_ZTS2C6" + // MS-NOT: type.test{{.*}}!"?AUC6@@" c6->f(); - // ITANIUM: bitset.test{{.*}}!"_ZTSSt2C7" - // MS-STD: bitset.test{{.*}}!"?AUC7@std@@" - // MS-NOSTD-NOT: bitset.test{{.*}}!"?AUC7@std@@" + // ITANIUM: type.test{{.*}}!"_ZTSSt2C7" + // MS-STD: type.test{{.*}}!"?AUC7@std@@" + // MS-NOSTD-NOT: type.test{{.*}}!"?AUC7@std@@" c7->f(); - // ITANIUM: bitset.test{{.*}}!"_ZTSNSt2C72C8E" - // MS-STD: bitset.test{{.*}}!"?AUC8@C7@std@@" - // MS-NOSTD-NOT: bitset.test{{.*}}!"?AUC8@C7@std@@" + // ITANIUM: type.test{{.*}}!"_ZTSNSt2C72C8E" + // MS-STD: type.test{{.*}}!"?AUC8@C7@std@@" + // MS-NOSTD-NOT: type.test{{.*}}!"?AUC8@C7@std@@" c8->f(); - // ITANIUM: bitset.test{{.*}}!"_ZTSN6stdext2C9E" - // MS-STD: bitset.test{{.*}}!"?AUC9@stdext@@" - // MS-NOSTD-NOT: bitset.test{{.*}}!"?AUC9@stdext@@" + // ITANIUM: type.test{{.*}}!"_ZTSN6stdext2C9E" + // MS-STD: type.test{{.*}}!"?AUC9@stdext@@" + // MS-NOSTD-NOT: type.test{{.*}}!"?AUC9@stdext@@" c9->f(); - // ITANIUM: bitset.test{{.*}}!"_ZTSN5other3C10E" - // MS: bitset.test{{.*}}!"?AUC10@other@@" + // ITANIUM: type.test{{.*}}!"_ZTSN5other3C10E" + // MS: type.test{{.*}}!"?AUC10@other@@" c10->f(); - // ITANIUM: bitset.test{{.*}}!{{[0-9]}} - // MS: bitset.test{{.*}}!{{[0-9]}} + // ITANIUM: type.test{{.*}}!{{[0-9]}} + // MS: type.test{{.*}}!{{[0-9]}} C11 *c11; c11->f(); } diff --git a/clang/test/CodeGenCXX/type-metadata.cpp b/clang/test/CodeGenCXX/type-metadata.cpp new file mode 100644 index 00000000000..f1edbd858c9 --- /dev/null +++ b/clang/test/CodeGenCXX/type-metadata.cpp @@ -0,0 +1,226 @@ +// Tests for the cfi-vcall feature: +// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=ITANIUM --check-prefix=ITANIUM-NDIAG --check-prefix=NDIAG %s +// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=ITANIUM --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-ABORT %s +// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=ITANIUM --check-prefix=ITANIUM-DIAG --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s +// RUN: %clang_cc1 -flto -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CFI --check-prefix=MS --check-prefix=NDIAG %s + +// Tests for the whole-program-vtables feature: +// RUN: %clang_cc1 -flto -triple x86_64-unknown-linux -fvisibility hidden -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=ITANIUM %s +// RUN: %clang_cc1 -flto -triple x86_64-pc-windows-msvc -fwhole-program-vtables -emit-llvm -o - %s | FileCheck --check-prefix=VTABLE-OPT --check-prefix=MS %s + +// ITANIUM: @_ZTV1A = {{[^!]*}}, !type [[A16:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL16:![0-9]+]] + +// ITANIUM: @_ZTV1B = {{[^!]*}}, !type [[A32:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL32:![0-9]+]] +// ITANIUM-SAME: !type [[B32:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] + +// ITANIUM: @_ZTV1C = {{[^!]*}}, !type [[A32]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] +// ITANIUM-SAME: !type [[C32:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] + +// DIAG: @[[SRC:.*]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*}}type-metadata.cpp\00", align 1 +// DIAG: @[[TYPE:.*]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'A'\00" } +// DIAG: @[[BADTYPESTATIC:.*]] = private unnamed_addr global { i8, { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }* } { i8 0, { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 123, i32 3 }, { i16, i16, [4 x i8] }* @[[TYPE]] } + +// ITANIUM: @_ZTVN12_GLOBAL__N_11DE = {{[^!]*}}, !type [[A32]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] +// ITANIUM-SAME: !type [[B32]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] +// ITANIUM-SAME: !type [[C88:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL88:![0-9]+]] +// ITANIUM-SAME: !type [[D32:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] + +// ITANIUM: @_ZTCN12_GLOBAL__N_11DE0_1B = {{[^!]*}}, !type [[A32]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] +// ITANIUM-SAME: !type [[B32]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] + +// ITANIUM: @_ZTCN12_GLOBAL__N_11DE8_1C = {{[^!]*}}, !type [[A64:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL64:![0-9]+]] +// ITANIUM-SAME: !type [[C32]] +// ITANIUM-DIAG-SAME: !type [[ALL32]] + +// ITANIUM: @_ZTVZ3foovE2FA = {{[^!]*}}, !type [[A16]] +// ITANIUM-DIAG-SAME: !type [[ALL16]] +// ITANIUM-SAME: !type [[FA16:![0-9]+]] +// ITANIUM-DIAG-SAME: !type [[ALL16]] + +// MS: comdat($"\01??_7A@@6B@"), !type [[A8:![0-9]+]] +// MS: comdat($"\01??_7B@@6B0@@"), !type [[B8:![0-9]+]] +// MS: comdat($"\01??_7B@@6BA@@@"), !type [[A8]] +// MS: comdat($"\01??_7C@@6B@"), !type [[A8]] +// MS: comdat($"\01??_7D@?A@@6BB@@@"), !type [[B8]], !type [[D8:![0-9]+]] +// MS: comdat($"\01??_7D@?A@@6BA@@@"), !type [[A8]] +// MS: comdat($"\01??_7FA@?1??foo@@YAXXZ@6B@"), !type [[A8]], !type [[FA8:![0-9]+]] + +struct A { + A(); + virtual void f(); +}; + +struct B : virtual A { + B(); + virtual void g(); + virtual void h(); +}; + +struct C : virtual A { + C(); +}; + +namespace { + +struct D : B, C { + D(); + virtual void f(); + virtual void h(); +}; + +} + +A::A() {} +B::B() {} +C::C() {} +D::D() {} + +void A::f() { +} + +void B::g() { +} + +void D::f() { +} + +void D::h() { +} + +// ITANIUM: define hidden void @_Z2afP1A +// MS: define void @"\01?af@@YAXPEAUA@@@Z" +void af(A *a) { + // ITANIUM: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* [[VT:%[^ ]*]], metadata !"_ZTS1A") + // MS: [[P:%[^ ]*]] = call i1 @llvm.type.test(i8* [[VT:%[^ ]*]], metadata !"?AUA@@") + // DIAG-NEXT: [[VTVALID0:%[^ ]*]] = call i1 @llvm.type.test(i8* [[VT]], metadata !"all-vtables") + // VTABLE-OPT: call void @llvm.assume(i1 [[P]]) + // CFI-NEXT: br i1 [[P]], label %[[CONTBB:[^ ,]*]], label %[[TRAPBB:[^ ,]*]] + // CFI-NEXT: {{^$}} + + // CFI: [[TRAPBB]] + // NDIAG-NEXT: call void @llvm.trap() + // NDIAG-NEXT: unreachable + // DIAG-NEXT: [[VTINT:%[^ ]*]] = ptrtoint i8* [[VT]] to i64 + // DIAG-NEXT: [[VTVALID:%[^ ]*]] = zext i1 [[VTVALID0]] to i64 + // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_check_fail_abort(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]]) + // DIAG-ABORT-NEXT: unreachable + // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_check_fail(i8* getelementptr inbounds ({{.*}} @[[BADTYPESTATIC]], i32 0, i32 0), i64 [[VTINT]], i64 [[VTVALID]]) + // DIAG-RECOVER-NEXT: br label %[[CONTBB]] + + // CFI: [[CONTBB]] + // CFI: call void % +#line 123 + a->f(); +} + +// ITANIUM: define internal void @_Z3df1PN12_GLOBAL__N_11DE +// MS: define internal void @"\01?df1@@YAXPEAUD@?A@@@Z" +void df1(D *d) { + // ITANIUM: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]]) + // MS: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"?AUA@@") + d->f(); +} + +// ITANIUM: define internal void @_Z3dg1PN12_GLOBAL__N_11DE +// MS: define internal void @"\01?dg1@@YAXPEAUD@?A@@@Z" +void dg1(D *d) { + // ITANIUM: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B") + // MS: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"?AUB@@") + d->g(); +} + +// ITANIUM: define internal void @_Z3dh1PN12_GLOBAL__N_11DE +// MS: define internal void @"\01?dh1@@YAXPEAUD@?A@@@Z" +void dh1(D *d) { + // ITANIUM: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata ![[DTYPE]]) + // MS: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]]) + d->h(); +} + +// ITANIUM: define internal void @_Z3df2PN12_GLOBAL__N_11DE +// MS: define internal void @"\01?df2@@YAXPEAUD@?A@@@Z" +__attribute__((no_sanitize("cfi"))) +void df2(D *d) { + // CFI-NOT: call i1 @llvm.type.test + d->f(); +} + +// ITANIUM: define internal void @_Z3df3PN12_GLOBAL__N_11DE +// MS: define internal void @"\01?df3@@YAXPEAUD@?A@@@Z" +__attribute__((no_sanitize("address"))) __attribute__((no_sanitize("cfi-vcall"))) +void df3(D *d) { + // CFI-NOT: call i1 @llvm.type.test + d->f(); +} + +D d; + +void foo() { + df1(&d); + dg1(&d); + dh1(&d); + df2(&d); + df3(&d); + + struct FA : A { + void f() {} + } fa; + af(&fa); +} + +namespace test2 { + +struct A { + virtual void m_fn1(); +}; +struct B { + virtual void m_fn2(); +}; +struct C : B, A {}; +struct D : C { + void m_fn1(); +}; + +// ITANIUM: define hidden void @_ZN5test21fEPNS_1DE +// MS: define void @"\01?f@test2@@YAXPEAUD@1@@Z" +void f(D *d) { + // ITANIUM: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"_ZTSN5test21DE") + // MS: {{%[^ ]*}} = call i1 @llvm.type.test(i8* {{%[^ ]*}}, metadata !"?AUA@test2@@") + d->m_fn1(); +} + +} + +// ITANIUM: [[A16]] = !{i64 16, !"_ZTS1A"} +// ITANIUM-DIAG: [[ALL16]] = !{i64 16, !"all-vtables"} +// ITANIUM: [[A32]] = !{i64 32, !"_ZTS1A"} +// ITANIUM-DIAG: [[ALL32]] = !{i64 32, !"all-vtables"} +// ITANIUM: [[B32]] = !{i64 32, !"_ZTS1B"} +// ITANIUM: [[C32]] = !{i64 32, !"_ZTS1C"} +// ITANIUM: [[C88]] = !{i64 88, !"_ZTS1C"} +// ITANIUM-DIAG: [[ALL88]] = !{i64 88, !"all-vtables"} +// ITANIUM: [[D32]] = !{i64 32, [[D_ID:![0-9]+]]} +// ITANIUM: [[D_ID]] = distinct !{} +// ITANIUM: [[A64]] = !{i64 64, !"_ZTS1A"} +// ITANIUM-DIAG: [[ALL64]] = !{i64 64, !"all-vtables"} +// ITANIUM: [[FA16]] = !{i64 16, [[FA_ID:![0-9]+]]} +// ITANIUM: [[FA_ID]] = distinct !{} + +// MS: [[A8]] = !{i64 8, !"?AUA@@"} +// MS: [[B8]] = !{i64 8, !"?AUB@@"} +// MS: [[D8]] = !{i64 8, [[D_ID:![0-9]+]]} +// MS: [[D_ID]] = distinct !{} +// MS: [[FA8]] = !{i64 8, [[FA_ID:![0-9]+]]} +// MS: [[FA_ID]] = distinct !{} |