blob: 333c7bd1f1604e4810d8025d8d8a5841671cf788 [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 Collingbourned9546012015-06-19 02:30:43 +000063 // ITANIUM: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"1A")
64 // MS: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* [[VT:%[^ ]*]], metadata !"A@@")
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 Collingbourned9546012015-06-19 02:30:43 +000085 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"[{{.*}}cfi-vcall.cpp]N12_GLOBAL__N_11DE")
86 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"A@@")
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) {
93 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1B")
94 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"B@@")
95 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) {
101 // ITANIUM: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"[{{.*}}cfi-vcall.cpp]N12_GLOBAL__N_11DE")
102 // MS: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"[{{.*}}cfi-vcall.cpp]D@?A@@")
103 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 Collingbourned9546012015-06-19 02:30:43 +0000137// Check for the expected number of elements (9 or 15 respectively).
138// MS: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){8}]]}
139// ITANIUM: !llvm.bitsets = !{[[X:[^,]*(,[^,]*){14}]]}
140
141// ITANIUM-DAG: !{!"1A", [3 x i8*]* @_ZTV1A, i64 16}
142// ITANIUM-DAG: !{!"1A", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32}
143// ITANIUM-DAG: !{!"1B", [7 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32}
144// ITANIUM-DAG: !{!"1A", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 64}
145// ITANIUM-DAG: !{!"1C", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 32}
146// ITANIUM-DAG: !{!"1A", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
147// ITANIUM-DAG: !{!"1B", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
148// ITANIUM-DAG: !{!"1C", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 88}
149// ITANIUM-DAG: !{!"[{{.*}}cfi-vcall.cpp]N12_GLOBAL__N_11DE", [12 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
150// ITANIUM-DAG: !{!"1A", [7 x i8*]* @_ZTV1B, i64 32}
151// ITANIUM-DAG: !{!"1B", [7 x i8*]* @_ZTV1B, i64 32}
152// ITANIUM-DAG: !{!"1A", [5 x i8*]* @_ZTV1C, i64 32}
153// ITANIUM-DAG: !{!"1C", [5 x i8*]* @_ZTV1C, i64 32}
154// ITANIUM-DAG: !{!"1A", [3 x i8*]* @_ZTVZ3foovE2FA, i64 16}
155// ITANIUM-DAG: !{!"[{{.*}}cfi-vcall.cpp]Z3foovE2FA", [3 x i8*]* @_ZTVZ3foovE2FA, i64 16}
156
157// MS-DAG: !{!"A@@", [2 x i8*]* @[[VTA]], i64 8}
158// MS-DAG: !{!"B@@", [3 x i8*]* @[[VTB]], i64 8}
159// MS-DAG: !{!"A@@", [2 x i8*]* @[[VTAinB]], i64 8}
160// MS-DAG: !{!"A@@", [2 x i8*]* @[[VTAinC]], i64 8}
161// MS-DAG: !{!"B@@", [3 x i8*]* @[[VTBinD]], i64 8}
162// MS-DAG: !{!"[{{.*}}cfi-vcall.cpp]D@?A@@", [3 x i8*]* @[[VTBinD]], i64 8}
163// MS-DAG: !{!"A@@", [2 x i8*]* @[[VTAinBinD]], i64 8}
164// MS-DAG: !{!"A@@", [2 x i8*]* @[[VTFA]], i64 8}
165// MS-DAG: !{!"[{{.*}}cfi-vcall.cpp]FA@?1??foo@@YAXXZ@", [2 x i8*]* @[[VTFA]], i64 8}