blob: daa0531e85d6dc8ac10d4eca5f0a37c997612f1f [file] [log] [blame]
Peter Collingbourned9546012015-06-19 02:30:43 +00001// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=NDIAG %s
2// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=DIAG --check-prefix=DIAG-ABORT %s
3// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -fsanitize-recover=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=ITANIUM --check-prefix=DIAG --check-prefix=DIAG-RECOVER %s
4// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -fsanitize=cfi-vcall -fsanitize-trap=cfi-vcall -emit-llvm -o - %s | FileCheck --check-prefix=CHECK --check-prefix=MS --check-prefix=NDIAG %s
5
6// MS: @[[VTA:[0-9]*]] {{.*}} comdat($"\01??_7A@@6B@")
7// MS: @[[VTB:[0-9]*]] {{.*}} comdat($"\01??_7B@@6B0@@")
8// MS: @[[VTAinB:[0-9]*]] {{.*}} comdat($"\01??_7B@@6BA@@@")
9// MS: @[[VTAinC:[0-9]*]] {{.*}} comdat($"\01??_7C@@6B@")
10// MS: @[[VTBinD:[0-9]*]] {{.*}} comdat($"\01??_7D@?A@@6BB@@@")
11// MS: @[[VTAinBinD:[0-9]*]] {{.*}} comdat($"\01??_7D@?A@@6BA@@@")
12// MS: @[[VTFA:[0-9]*]] {{.*}} comdat($"\01??_7FA@?1??foo@@YAXXZ@6B@")
Peter Collingbournea4ccff32015-02-20 20:30:56 +000013
14struct A {
15 A();
16 virtual void f();
17};
18
19struct B : virtual A {
20 B();
Peter Collingbourned9546012015-06-19 02:30:43 +000021 virtual void g();
22 virtual void h();
Peter Collingbournea4ccff32015-02-20 20:30:56 +000023};
24
25struct C : virtual A {
26 C();
27};
28
29namespace {
30
31struct D : B, C {
32 D();
33 virtual void f();
Peter Collingbourned9546012015-06-19 02:30:43 +000034 virtual void h();
Peter Collingbournea4ccff32015-02-20 20:30:56 +000035};
36
37}
38
39A::A() {}
40B::B() {}
41C::C() {}
42D::D() {}
43
44void A::f() {
45}
46
Peter Collingbourned9546012015-06-19 02:30:43 +000047void B::g() {
48}
49
Peter Collingbournea4ccff32015-02-20 20:30:56 +000050void D::f() {
51}
52
Peter Collingbourned9546012015-06-19 02:30:43 +000053void D::h() {
54}
55
Peter Collingbourne04dca772015-06-19 02:24:25 +000056// DIAG: @[[SRC:.*]] = private unnamed_addr constant [{{.*}} x i8] c"{{.*}}cfi-vcall.cpp\00", align 1
Peter Collingbourne6708c4a2015-06-19 01:51:54 +000057// DIAG: @[[TYPE:.*]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'A'\00" }
Peter Collingbourned9546012015-06-19 02:30:43 +000058// DIAG: @[[BADTYPESTATIC:.*]] = private unnamed_addr global { { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }*, i8 } { { [{{.*}} x i8]*, i32, i32 } { [{{.*}} x i8]* @[[SRC]], i32 [[@LINE+21]], i32 3 }, { i16, i16, [4 x i8] }* @[[TYPE]], i8 0 }
Peter Collingbourne6708c4a2015-06-19 01:51:54 +000059
Peter Collingbourned9546012015-06-19 02:30:43 +000060// ITANIUM: define void @_Z2afP1A
61// MS: define void @"\01?af@@YAXPEAUA@@@Z"
Peter Collingbournea4ccff32015-02-20 20:30:56 +000062void af(A *a) {
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +000063 // ITANIUM: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"_ZTS1A")
64 // MS: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"?AUA@@")
Peter Collingbourne6708c4a2015-06-19 01:51:54 +000065 // CHECK-NEXT: br i1 [[P]], label %[[CONTBB:[^ ,]*]], label %[[TRAPBB:[^ ,]*]]
Peter Collingbourned9546012015-06-19 02:30:43 +000066 // CHECK-NEXT: {{^$}}
Peter Collingbournea4ccff32015-02-20 20:30:56 +000067
68 // CHECK: [[TRAPBB]]
Peter Collingbourne6708c4a2015-06-19 01:51:54 +000069 // NDIAG-NEXT: call void @llvm.trap()
70 // NDIAG-NEXT: unreachable
71 // DIAG-NEXT: [[VTINT:%[^ ]*]] = ptrtoint i8* [[VT]] to i64
72 // DIAG-ABORT-NEXT: call void @__ubsan_handle_cfi_bad_type_abort(i8* bitcast ({{.*}} @[[BADTYPESTATIC]] to i8*), i64 [[VTINT]])
73 // DIAG-ABORT-NEXT: unreachable
74 // DIAG-RECOVER-NEXT: call void @__ubsan_handle_cfi_bad_type(i8* bitcast ({{.*}} @[[BADTYPESTATIC]] to i8*), i64 [[VTINT]])
75 // DIAG-RECOVER-NEXT: br label %[[CONTBB]]
Peter Collingbournea4ccff32015-02-20 20:30:56 +000076
77 // CHECK: [[CONTBB]]
78 // CHECK: call void %
79 a->f();
80}
81
Peter Collingbourned9546012015-06-19 02:30:43 +000082// ITANIUM: define internal void @_Z3df1PN12_GLOBAL__N_11DE
83// MS: define internal void @"\01?df1@@YAXPEAUD@?A@@@Z"
Peter Collingbourne915df992015-05-15 18:33:32 +000084void df1(D *d) {
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +000085 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]])
86 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"?AUA@@")
Peter Collingbournea4ccff32015-02-20 20:30:56 +000087 d->f();
88}
89
Peter Collingbourned9546012015-06-19 02:30:43 +000090// ITANIUM: define internal void @_Z3dg1PN12_GLOBAL__N_11DE
91// MS: define internal void @"\01?dg1@@YAXPEAUD@?A@@@Z"
92void dg1(D *d) {
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +000093 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTS1B")
94 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"?AUB@@")
Peter Collingbourned9546012015-06-19 02:30:43 +000095 d->g();
96}
97
98// ITANIUM: define internal void @_Z3dh1PN12_GLOBAL__N_11DE
99// MS: define internal void @"\01?dh1@@YAXPEAUD@?A@@@Z"
100void dh1(D *d) {
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +0000101 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata ![[DTYPE]])
102 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata ![[DTYPE:[0-9]+]])
Peter Collingbourned9546012015-06-19 02:30:43 +0000103 d->h();
104}
105
106// ITANIUM: define internal void @_Z3df2PN12_GLOBAL__N_11DE
107// MS: define internal void @"\01?df2@@YAXPEAUD@?A@@@Z"
Peter Collingbourne915df992015-05-15 18:33:32 +0000108__attribute__((no_sanitize("cfi")))
109void df2(D *d) {
110 // CHECK-NOT: call i1 @llvm.bitset.test
111 d->f();
112}
113
Peter Collingbourned9546012015-06-19 02:30:43 +0000114// ITANIUM: define internal void @_Z3df3PN12_GLOBAL__N_11DE
115// MS: define internal void @"\01?df3@@YAXPEAUD@?A@@@Z"
Peter Collingbourne915df992015-05-15 18:33:32 +0000116__attribute__((no_sanitize("address"))) __attribute__((no_sanitize("cfi-vcall")))
117void df3(D *d) {
118 // CHECK-NOT: call i1 @llvm.bitset.test
119 d->f();
120}
121
Peter Collingbournea4ccff32015-02-20 20:30:56 +0000122D d;
123
124void foo() {
Peter Collingbourne915df992015-05-15 18:33:32 +0000125 df1(&d);
Peter Collingbourned9546012015-06-19 02:30:43 +0000126 dg1(&d);
127 dh1(&d);
Peter Collingbourne915df992015-05-15 18:33:32 +0000128 df2(&d);
129 df3(&d);
Peter Collingbourned9546012015-06-19 02:30:43 +0000130
131 struct FA : A {
132 void f() {}
133 } fa;
134 af(&fa);
Peter Collingbournea4ccff32015-02-20 20:30:56 +0000135}
136
Peter Collingbourne3d4114b2015-07-08 21:08:08 +0000137namespace test2 {
138
139struct A {
140 virtual void m_fn1();
141};
142struct B {
143 virtual void m_fn2();
144};
145struct C : B, A {};
146struct D : C {
147 void m_fn1();
148};
149
150// ITANIUM: define void @_ZN5test21fEPNS_1DE
151// MS: define void @"\01?f@test2@@YAXPEAUD@1@@Z"
152void f(D *d) {
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +0000153 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"_ZTSN5test21DE")
154 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"?AUA@test2@@")
Peter Collingbourne3d4114b2015-07-08 21:08:08 +0000155 d->m_fn1();
156}
157
158}
159
Peter Collingbourned9546012015-06-19 02:30:43 +0000160// Check for the expected number of elements (9 or 15 respectively).
161// MS: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){8}]]}
162// ITANIUM: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){14}]]}
163
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +0000164// ITANIUM-DAG: !{!"_ZTS1A", [3 x i8*]* @_ZTV1A, i64 16}
165// ITANIUM-DAG: !{!"_ZTS1A", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32}
166// ITANIUM-DAG: !{!"_ZTS1B", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32}
167// ITANIUM-DAG: !{!"_ZTS1A", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 64}
168// ITANIUM-DAG: !{!"_ZTS1C", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 32}
169// ITANIUM-DAG: !{!"_ZTS1A", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
170// ITANIUM-DAG: !{!"_ZTS1B", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
171// ITANIUM-DAG: !{!"_ZTS1C", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 88}
172// ITANIUM-DAG: !{![[DTYPE]], [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
173// ITANIUM-DAG: !{!"_ZTS1A", [7 x i8*]* @_ZTV1B, i64 32}
174// ITANIUM-DAG: !{!"_ZTS1B", [7 x i8*]* @_ZTV1B, i64 32}
175// ITANIUM-DAG: !{!"_ZTS1A", [5 x i8*]* @_ZTV1C, i64 32}
176// ITANIUM-DAG: !{!"_ZTS1C", [5 x i8*]* @_ZTV1C, i64 32}
177// ITANIUM-DAG: !{!"_ZTS1A", [3 x i8*]* @_ZTVZ3foovE2FA, i64 16}
178// ITANIUM-DAG: !{!{{[0-9]+}}, [3 x i8*]* @_ZTVZ3foovE2FA, i64 16}
Peter Collingbourned9546012015-06-19 02:30:43 +0000179
Peter Collingbourne2c7f7e32015-09-10 02:17:40 +0000180// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTA]], i64 8}
181// MS-DAG: !{!"?AUB@@", [3 x i8*]* @[[VTB]], i64 8}
182// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTAinB]], i64 8}
183// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTAinC]], i64 8}
184// MS-DAG: !{!"?AUB@@", [3 x i8*]* @[[VTBinD]], i64 8}
185// MS-DAG: !{![[DTYPE]], [3 x i8*]* @[[VTBinD]], i64 8}
186// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTAinBinD]], i64 8}
187// MS-DAG: !{!"?AUA@@", [2 x i8*]* @[[VTFA]], i64 8}
188// MS-DAG: !{!{{[0-9]+}}, [2 x i8*]* @[[VTFA]], i64 8}