blob: b0f79d9ec0ea9846a623b914b31305ead12c6050 [file] [log] [blame]
Peter Collingbourne1a7488a2015-04-02 00:23:30 +00001// RUN: %clang_cc1 -triple x86_64-unknown-linux -fsanitize=cfi-vcall -emit-llvm -o - %s | FileCheck %s
Peter Collingbournea4ccff32015-02-20 20:30:56 +00002
3struct A {
4 A();
5 virtual void f();
6};
7
8struct B : virtual A {
9 B();
10};
11
12struct C : virtual A {
13 C();
14};
15
16namespace {
17
18struct D : B, C {
19 D();
20 virtual void f();
21};
22
23}
24
25A::A() {}
26B::B() {}
27C::C() {}
28D::D() {}
29
30void A::f() {
31}
32
33void D::f() {
34}
35
36// CHECK: define void @_Z2afP1A
37void af(A *a) {
38 // CHECK: [[P:%[^ ]*]] = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"1A")
39 // CHECK-NEXT: br i1 [[P]], label %[[CONTBB:[^ ]*]], label %[[TRAPBB:[^ ]*]]
40
41 // CHECK: [[TRAPBB]]
42 // CHECK-NEXT: call void @llvm.trap()
43 // CHECK-NEXT: unreachable
44
45 // CHECK: [[CONTBB]]
46 // CHECK: call void %
47 a->f();
48}
49
Peter Collingbourne915df992015-05-15 18:33:32 +000050// CHECK: define internal void @_Z3df1PN12_GLOBAL__N_11DE
51void df1(D *d) {
Peter Collingbourne1a7488a2015-04-02 00:23:30 +000052 // CHECK: {{%[^ ]*}} = call i1 @llvm.bitset.test(i8* {{%[^ ]*}}, metadata !"[{{.*}}cfi-vcall.cpp]N12_GLOBAL__N_11DE")
Peter Collingbournea4ccff32015-02-20 20:30:56 +000053 d->f();
54}
55
Peter Collingbourne915df992015-05-15 18:33:32 +000056// CHECK: define internal void @_Z3df2PN12_GLOBAL__N_11DE
57__attribute__((no_sanitize("cfi")))
58void df2(D *d) {
59 // CHECK-NOT: call i1 @llvm.bitset.test
60 d->f();
61}
62
63// CHECK: define internal void @_Z3df3PN12_GLOBAL__N_11DE
64__attribute__((no_sanitize("address"))) __attribute__((no_sanitize("cfi-vcall")))
65void df3(D *d) {
66 // CHECK-NOT: call i1 @llvm.bitset.test
67 d->f();
68}
69
Peter Collingbournea4ccff32015-02-20 20:30:56 +000070D d;
71
72void foo() {
Peter Collingbourne915df992015-05-15 18:33:32 +000073 df1(&d);
74 df2(&d);
75 df3(&d);
Peter Collingbournea4ccff32015-02-20 20:30:56 +000076}
77
78// CHECK-DAG: !{!"1A", [3 x i8*]* @_ZTV1A, i64 16}
79// CHECK-DAG: !{!"1A", [5 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32}
80// CHECK-DAG: !{!"1B", [5 x i8*]* @_ZTCN12_GLOBAL__N_11DE0_1B, i64 32}
81// CHECK-DAG: !{!"1A", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 64}
82// CHECK-DAG: !{!"1C", [9 x i8*]* @_ZTCN12_GLOBAL__N_11DE8_1C, i64 32}
83// CHECK-DAG: !{!"1A", [10 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
84// CHECK-DAG: !{!"1B", [10 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
85// CHECK-DAG: !{!"1C", [10 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 72}
Peter Collingbourne1a7488a2015-04-02 00:23:30 +000086// CHECK-DAG: !{!"[{{.*}}cfi-vcall.cpp]N12_GLOBAL__N_11DE", [10 x i8*]* @_ZTVN12_GLOBAL__N_11DE, i64 32}
Peter Collingbournea4ccff32015-02-20 20:30:56 +000087// CHECK-DAG: !{!"1A", [5 x i8*]* @_ZTV1B, i64 32}
88// CHECK-DAG: !{!"1B", [5 x i8*]* @_ZTV1B, i64 32}
89// CHECK-DAG: !{!"1A", [5 x i8*]* @_ZTV1C, i64 32}
90// CHECK-DAG: !{!"1C", [5 x i8*]* @_ZTV1C, i64 32}