1 | // RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -emit-llvm %s -fstrict-vtable-pointers -O1 -o - -disable-llvm-passes | FileCheck %s |
2 | |
3 | struct A { |
4 | virtual void foo(); |
5 | }; |
6 | |
7 | struct D : A { |
8 | void foo(); |
9 | }; |
10 | |
11 | // CHECK-LABEL: define void @_Z21testExternallyVisiblev() |
12 | void testExternallyVisible() { |
13 | A *a = new A; |
14 | |
15 | // CHECK: load {{.*}} !invariant.group ![[MD:[0-9]+]] |
16 | a->foo(); |
17 | |
18 | D *d = new D; |
19 | // CHECK: call void @_ZN1DC1Ev( |
20 | // CHECK: load {{.*}} !invariant.group ![[MD]] |
21 | d->foo(); |
22 | A *a2 = d; |
23 | // CHECK: load {{.*}} !invariant.group ![[MD]] |
24 | a2->foo(); |
25 | } |
26 | // CHECK-LABEL: {{^}}} |
27 | |
28 | namespace { |
29 | |
30 | struct B { |
31 | virtual void bar(); |
32 | }; |
33 | |
34 | struct C : B { |
35 | void bar(); |
36 | }; |
37 | |
38 | } |
39 | |
40 | // CHECK-LABEL: define void @_Z21testInternallyVisibleb( |
41 | void testInternallyVisible(bool p) { |
42 | B *b = new B; |
43 | // CHECK: = load {{.*}}, !invariant.group ![[MD]] |
44 | b->bar(); |
45 | |
46 | // CHECK: call void @_ZN12_GLOBAL__N_11CC1Ev( |
47 | C *c = new C; |
48 | // CHECK: = load {{.*}}, !invariant.group ![[MD]] |
49 | c->bar(); |
50 | } |
51 | |
52 | // Checking A::A() |
53 | // CHECK-LABEL: define linkonce_odr void @_ZN1AC2Ev( |
54 | // CHECK: store {{.*}}, !invariant.group ![[MD]] |
55 | // CHECK-LABEL: {{^}}} |
56 | |
57 | // Checking D::D() |
58 | // CHECK-LABEL: define linkonce_odr void @_ZN1DC2Ev( |
59 | // CHECK: = call i8* @llvm.launder.invariant.group.p0i8(i8* |
60 | // CHECK: call void @_ZN1AC2Ev(%struct.A* |
61 | // CHECK: store {{.*}} !invariant.group ![[MD]] |
62 | |
63 | // Checking B::B() |
64 | // CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11BC2Ev( |
65 | // CHECK: store {{.*}}, !invariant.group ![[MD]] |
66 | |
67 | // Checking C::C() |
68 | // CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11CC2Ev( |
69 | // CHECK: store {{.*}}, !invariant.group ![[MD]] |
70 | |
71 | // CHECK: ![[MD]] = !{} |
72 | |