Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 -triple=x86_64-pc-linux-gnu -emit-llvm %s -fstrict-vtable-pointers -O1 -o - -disable-llvm-optzns | 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 ![[A_MD:[0-9]+]]
     16   a->foo();
     17 
     18   D *d = new D;
     19   // CHECK: call void @_ZN1DC1Ev(
     20   // CHECK: load {{.*}} !invariant.group ![[D_MD:[0-9]+]]
     21   d->foo();
     22   A *a2 = d;
     23   // CHECK: load {{.*}} !invariant.group ![[A_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 ![[B_MD:[0-9]+]]
     44   b->bar();
     45 
     46   // CHECK: call void @_ZN12_GLOBAL__N_11CC1Ev(
     47   C *c = new C;
     48   // CHECK: = load {{.*}}, !invariant.group ![[C_MD:[0-9]+]]
     49   c->bar();
     50 }
     51 
     52 // Checking A::A()
     53 // CHECK-LABEL: define linkonce_odr void @_ZN1AC2Ev(
     54 // CHECK: store {{.*}}, !invariant.group ![[A_MD]]
     55 // CHECK-LABEL: }
     56 
     57 // Checking D::D()
     58 // CHECK-LABEL: define linkonce_odr void @_ZN1DC2Ev(
     59 // CHECK:  = call i8* @llvm.invariant.group.barrier(i8*
     60 // CHECK:  call void @_ZN1AC2Ev(%struct.A*
     61 // CHECK: store {{.*}} !invariant.group ![[D_MD]]
     62 
     63 // Checking B::B()
     64 // CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11BC2Ev(
     65 // CHECK:  store {{.*}}, !invariant.group ![[B_MD]]
     66 
     67 // Checking C::C()
     68 // CHECK-LABEL: define internal void @_ZN12_GLOBAL__N_11CC2Ev(
     69 // CHECK:  store {{.*}}, !invariant.group ![[C_MD]]
     70 
     71 // CHECK: ![[A_MD]] = !{!"_ZTS1A"}
     72 // CHECK: ![[D_MD]] = !{!"_ZTS1D"}
     73 // CHECK: ![[B_MD]] = distinct !{}
     74 // CHECK: ![[C_MD]] = distinct !{}
     75