Clang Project

clang_source_code/test/CodeGenCXX/invariant.group-for-vptrs.cpp
1// RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -emit-llvm %s -fstrict-vtable-pointers -O1 -o - -disable-llvm-passes | FileCheck %s
2
3struct A {
4  virtual void foo();
5};
6
7struct D : A {
8  void foo();
9};
10
11// CHECK-LABEL: define void @_Z21testExternallyVisiblev()
12void 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
28namespace {
29
30struct B {
31  virtual void bar();
32};
33
34struct C : B {
35  void bar();
36};
37
38}
39
40// CHECK-LABEL: define void @_Z21testInternallyVisibleb(
41void 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