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