Home | History | Annotate | Download | only in CodeGenCXX
      1 // RUN: %clang_cc1 %s -triple=thumbv7-apple-ios3.0 -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -o - -fexceptions | FileCheck %s
      2 
      3 // CHECK: @_ZZN5test74testEvE1x = internal global i32 0, align 4
      4 // CHECK: @_ZGVZN5test74testEvE1x = internal global i32 0
      5 // CHECK: @_ZZN5test84testEvE1x = internal global [[TEST8A:.*]] zeroinitializer, align 1
      6 // CHECK: @_ZGVZN5test84testEvE1x = internal global i32 0
      7 
      8 typedef typeof(sizeof(int)) size_t;
      9 
     10 class foo {
     11 public:
     12     foo();
     13     virtual ~foo();
     14 };
     15 
     16 class bar : public foo {
     17 public:
     18 	bar();
     19 };
     20 
     21 // The global dtor needs the right calling conv with -fno-use-cxa-atexit
     22 // rdar://7817590
     23 bar baz;
     24 
     25 // PR9593
     26 // Make sure atexit(3) is used for global dtors.
     27 
     28 // CHECK:      call [[BAR:%.*]]* @_ZN3barC1Ev(
     29 // CHECK-NEXT: call i32 @atexit(void ()* @__dtor_baz)
     30 
     31 // CHECK: define internal void @__dtor_baz()
     32 // CHECK: call [[BAR]]* @_ZN3barD1Ev([[BAR]]* @baz)
     33 
     34 // Destructors and constructors must return this.
     35 namespace test1 {
     36   void foo();
     37 
     38   struct A {
     39     A(int i) { foo(); }
     40     ~A() { foo(); }
     41     void bar() { foo(); }
     42   };
     43 
     44   // CHECK: define void @_ZN5test14testEv()
     45   void test() {
     46     // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1
     47     // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10)
     48     // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]])
     49     // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]])
     50     // CHECK: ret void
     51     A a = 10;
     52     a.bar();
     53   }
     54 
     55   // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]* %this, i32 %i) unnamed_addr
     56   // CHECK:   [[THIS:%.*]] = alloca [[A]]*, align 4
     57   // CHECK:   store [[A]]* {{.*}}, [[A]]** [[THIS]]
     58   // CHECK:   [[THIS1:%.*]] = load [[A]]** [[THIS]]
     59   // CHECK:   call [[A]]* @_ZN5test11AC2Ei(
     60   // CHECK:   ret [[A]]* [[THIS1]]
     61 
     62   // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]* %this) unnamed_addr
     63   // CHECK:   [[THIS:%.*]] = alloca [[A]]*, align 4
     64   // CHECK:   store [[A]]* {{.*}}, [[A]]** [[THIS]]
     65   // CHECK:   [[THIS1:%.*]] = load [[A]]** [[THIS]]
     66   // CHECK:   call [[A]]* @_ZN5test11AD2Ev(
     67   // CHECK:   ret [[A]]* [[THIS1]]
     68 }
     69 
     70 // Awkward virtual cases.
     71 namespace test2 {
     72   void foo();
     73 
     74   struct A {
     75     int x;
     76 
     77     A(int);
     78     virtual ~A() { foo(); }
     79   };
     80 
     81   struct B {
     82     int y;
     83     int z;
     84 
     85     B(int);
     86     virtual ~B() { foo(); }
     87   };
     88 
     89   struct C : A, virtual B {
     90     int q;
     91 
     92     C(int i) : A(i), B(i) { foo(); }
     93     ~C() { foo(); }
     94   };
     95 
     96   void test() {
     97     C c = 10;
     98   }
     99 
    100   // Tests at eof
    101 }
    102 
    103 namespace test3 {
    104   struct A {
    105     int x;
    106     ~A();
    107   };
    108 
    109   void a() {
    110     // CHECK: define void @_ZN5test31aEv()
    111     // CHECK: call noalias i8* @_Znam(i32 48)
    112     // CHECK: store i32 4
    113     // CHECK: store i32 10
    114     A *x = new A[10];
    115   }
    116 
    117   void b(int n) {
    118     // CHECK: define void @_ZN5test31bEi(
    119     // CHECK: [[N:%.*]] = load i32*
    120     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
    121     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
    122     // CHECK: [[OR:%.*]] = or i1
    123     // CHECK: [[SZ:%.*]] = select i1 [[OR]]
    124     // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
    125     // CHECK: store i32 4
    126     // CHECK: store i32 [[N]]
    127     A *x = new A[n];
    128   }
    129 
    130   void c() {
    131     // CHECK: define void @_ZN5test31cEv()
    132     // CHECK: call  noalias i8* @_Znam(i32 808)
    133     // CHECK: store i32 4
    134     // CHECK: store i32 200
    135     A (*x)[20] = new A[10][20];
    136   }
    137 
    138   void d(int n) {
    139     // CHECK: define void @_ZN5test31dEi(
    140     // CHECK: [[N:%.*]] = load i32*
    141     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80)
    142     // CHECK: [[NE:%.*]] = mul i32 [[N]], 20
    143     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
    144     // CHECK: [[SZ:%.*]] = select
    145     // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
    146     // CHECK: store i32 4
    147     // CHECK: store i32 [[NE]]
    148     A (*x)[20] = new A[n][20];
    149   }
    150 
    151   void e(A *x) {
    152     // CHECK: define void @_ZN5test31eEPNS_1AE(
    153     // CHECK: icmp eq {{.*}}, null
    154     // CHECK: getelementptr {{.*}}, i64 -8
    155     // CHECK: getelementptr {{.*}}, i64 4
    156     // CHECK: bitcast {{.*}} to i32*
    157     // CHECK: load
    158     // CHECK: invoke {{.*}} @_ZN5test31AD1Ev
    159     // CHECK: call void @_ZdaPv
    160     delete [] x;
    161   }
    162 
    163   void f(A (*x)[20]) {
    164     // CHECK: define void @_ZN5test31fEPA20_NS_1AE(
    165     // CHECK: icmp eq {{.*}}, null
    166     // CHECK: getelementptr {{.*}}, i64 -8
    167     // CHECK: getelementptr {{.*}}, i64 4
    168     // CHECK: bitcast {{.*}} to i32*
    169     // CHECK: load
    170     // CHECK: invoke {{.*}} @_ZN5test31AD1Ev
    171     // CHECK: call void @_ZdaPv
    172     delete [] x;
    173   }
    174 }
    175 
    176 namespace test4 {
    177   struct A {
    178     int x;
    179     void operator delete[](void *, size_t sz);
    180   };
    181 
    182   void a() {
    183     // CHECK: define void @_ZN5test41aEv()
    184     // CHECK: call noalias i8* @_Znam(i32 48)
    185     // CHECK: store i32 4
    186     // CHECK: store i32 10
    187     A *x = new A[10];
    188   }
    189 
    190   void b(int n) {
    191     // CHECK: define void @_ZN5test41bEi(
    192     // CHECK: [[N:%.*]] = load i32*
    193     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4)
    194     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
    195     // CHECK: [[SZ:%.*]] = select
    196     // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
    197     // CHECK: store i32 4
    198     // CHECK: store i32 [[N]]
    199     A *x = new A[n];
    200   }
    201 
    202   void c() {
    203     // CHECK: define void @_ZN5test41cEv()
    204     // CHECK: call  noalias i8* @_Znam(i32 808)
    205     // CHECK: store i32 4
    206     // CHECK: store i32 200
    207     A (*x)[20] = new A[10][20];
    208   }
    209 
    210   void d(int n) {
    211     // CHECK: define void @_ZN5test41dEi(
    212     // CHECK: [[N:%.*]] = load i32*
    213     // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80)
    214     // CHECK: [[NE:%.*]] = mul i32 [[N]], 20
    215     // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8)
    216     // CHECK: [[SZ:%.*]] = select
    217     // CHECK: call noalias i8* @_Znam(i32 [[SZ]])
    218     // CHECK: store i32 4
    219     // CHECK: store i32 [[NE]]
    220     A (*x)[20] = new A[n][20];
    221   }
    222 
    223   void e(A *x) {
    224     // CHECK: define void @_ZN5test41eEPNS_1AE(
    225     // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i64 -8
    226     // CHECK: getelementptr inbounds {{.*}}, i64 4
    227     // CHECK: bitcast
    228     // CHECK: [[T0:%.*]] = load i32*
    229     // CHECK: [[T1:%.*]] = mul i32 4, [[T0]]
    230     // CHECK: [[T2:%.*]] = add i32 [[T1]], 8
    231     // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]])
    232     delete [] x;
    233   }
    234 
    235   void f(A (*x)[20]) {
    236     // CHECK: define void @_ZN5test41fEPA20_NS_1AE(
    237     // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i64 -8
    238     // CHECK: getelementptr inbounds {{.*}}, i64 4
    239     // CHECK: bitcast
    240     // CHECK: [[T0:%.*]] = load i32*
    241     // CHECK: [[T1:%.*]] = mul i32 4, [[T0]]
    242     // CHECK: [[T2:%.*]] = add i32 [[T1]], 8
    243     // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]])
    244     delete [] x;
    245   }
    246 }
    247 
    248 // <rdar://problem/8386802>: don't crash
    249 namespace test5 {
    250   struct A {
    251     ~A();
    252   };
    253 
    254   // CHECK: define void @_ZN5test54testEPNS_1AE
    255   void test(A *a) {
    256     // CHECK:      [[PTR:%.*]] = alloca [[A:%.*]]*, align 4
    257     // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[PTR]], align 4
    258     // CHECK-NEXT: [[TMP:%.*]] = load [[A]]** [[PTR]], align 4
    259     // CHECK-NEXT: call [[A]]* @_ZN5test51AD1Ev([[A]]* [[TMP]])
    260     // CHECK-NEXT: ret void
    261     a->~A();
    262   }
    263 }
    264 
    265 namespace test6 {
    266   struct A {
    267     virtual ~A();
    268   };
    269 
    270   // CHECK: define void @_ZN5test64testEPNS_1AE
    271   void test(A *a) {
    272     // CHECK:      [[AVAR:%.*]] = alloca [[A:%.*]]*, align 4
    273     // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[AVAR]], align 4
    274     // CHECK-NEXT: [[V:%.*]] = load [[A]]** [[AVAR]], align 4
    275     // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq [[A]]* [[V]], null
    276     // CHECK-NEXT: br i1 [[ISNULL]]
    277     // CHECK:      [[T0:%.*]] = bitcast [[A]]* [[V]] to [[A]]* ([[A]]*)***
    278     // CHECK-NEXT: [[T1:%.*]] = load [[A]]* ([[A]]*)*** [[T0]]
    279     // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds [[A]]* ([[A]]*)** [[T1]], i64 1
    280     // CHECK-NEXT: [[T3:%.*]] = load [[A]]* ([[A]]*)** [[T2]]
    281     // CHECK-NEXT: call [[A]]* [[T3]]([[A]]* [[V]])
    282     // CHECK-NEXT: br label
    283     // CHECK:      ret void
    284     delete a;
    285   }
    286 }
    287 
    288 namespace test7 {
    289   int foo();
    290 
    291   // Static and guard tested at top of file
    292 
    293   // CHECK: define void @_ZN5test74testEv()
    294   void test() {
    295     // CHECK:      [[T0:%.*]] = load i32* @_ZGVZN5test74testEvE1x
    296     // CHECK-NEXT: [[T1:%.*]] = and i32 [[T0]], 1
    297     // CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
    298     // CHECK-NEXT: br i1 [[T2]]
    299     //   -> fallthrough, end
    300     // CHECK:      [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test74testEvE1x)
    301     // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0
    302     // CHECK-NEXT: br i1 [[T4]]
    303     //   -> fallthrough, end
    304     // CHECK:      [[INIT:%.*]] = invoke i32 @_ZN5test73fooEv()
    305     // CHECK:      store i32 [[INIT]], i32* @_ZZN5test74testEvE1x, align 4
    306     // CHECK-NEXT: call void @__cxa_guard_release(i32* @_ZGVZN5test74testEvE1x)
    307     // CHECK-NEXT: br label
    308     //   -> end
    309     // end:
    310     // CHECK:      ret void
    311     static int x = foo();
    312 
    313     // CHECK:      landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
    314     // CHECK-NEXT:   cleanup
    315     // CHECK:      call void @__cxa_guard_abort(i32* @_ZGVZN5test74testEvE1x)
    316     // CHECK:      resume { i8*, i32 }
    317   }
    318 }
    319 
    320 namespace test8 {
    321   struct A {
    322     A();
    323     ~A();
    324   };
    325 
    326   // Static and guard tested at top of file
    327 
    328   // CHECK: define void @_ZN5test84testEv()
    329   void test() {
    330     // CHECK:      [[T0:%.*]] = load i32* @_ZGVZN5test84testEvE1x
    331     // CHECK-NEXT: [[T1:%.*]] = and i32 [[T0]], 1
    332     // CHECK-NEXT: [[T2:%.*]] = icmp eq i32 [[T1]], 0
    333     // CHECK-NEXT: br i1 [[T2]]
    334     //   -> fallthrough, end
    335     // CHECK:      [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test84testEvE1x)
    336     // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0
    337     // CHECK-NEXT: br i1 [[T4]]
    338     //   -> fallthrough, end
    339     // CHECK:      [[INIT:%.*]] = invoke [[TEST8A]]* @_ZN5test81AC1Ev([[TEST8A]]* @_ZZN5test84testEvE1x)
    340 
    341     // FIXME: Here we register a global destructor that
    342     // unconditionally calls the destructor.  That's what we've always
    343     // done for -fno-use-cxa-atexit here, but that's really not
    344     // semantically correct at all.
    345 
    346     // CHECK:      call void @__cxa_guard_release(i32* @_ZGVZN5test84testEvE1x)
    347     // CHECK-NEXT: br label
    348     //   -> end
    349     // end:
    350     // CHECK:      ret void
    351     static A x;
    352 
    353     // CHECK:      landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
    354     // CHECK-NEXT:   cleanup
    355     // CHECK:      call void @__cxa_guard_abort(i32* @_ZGVZN5test84testEvE1x)
    356     // CHECK:      resume { i8*, i32 }
    357   }
    358 }
    359 
    360   // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev(
    361   // CHECK:   call [[C]]* @_ZN5test21CD1Ev(
    362   // CHECK:   ret [[C]]* undef
    363 
    364   // CHECK: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev(
    365   // CHECK:   call void @_ZN5test21CD0Ev(
    366   // CHECK:   ret void
    367 
    368 // CH_ECK: @_GLOBAL__D_a()
    369 // CH_ECK: call %class.bar* @_ZN3barD1Ev(%class.bar* @baz)
    370