arm.cpp revision 4c40d98ab7acf5f27fa89b17bd8fc0ef7683df37
1// RUN: %clang_cc1 %s -triple=thumbv7-apple-darwin3.0.0-iphoneos -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -o - -fexceptions | FileCheck %s 2 3class foo { 4public: 5 foo(); 6 virtual ~foo(); 7}; 8 9class bar : public foo { 10public: 11 bar(); 12}; 13 14// The global dtor needs the right calling conv with -fno-use-cxa-atexit 15// rdar://7817590 16// Checked at end of file. 17bar baz; 18 19// Destructors and constructors must return this. 20namespace test1 { 21 void foo(); 22 23 struct A { 24 A(int i) { foo(); } 25 ~A() { foo(); } 26 void bar() { foo(); } 27 }; 28 29 // CHECK: define void @_ZN5test14testEv() 30 void test() { 31 // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1 32 // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10) 33 // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]]) 34 // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]]) 35 // CHECK: ret void 36 A a = 10; 37 a.bar(); 38 } 39 40 // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]* 41 // CHECK: [[RET:%.*]] = alloca [[A]]*, align 4 42 // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4 43 // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]] 44 // CHECK: [[THIS1:%.*]] = load [[A]]** [[THIS]] 45 // CHECK: store [[A]]* [[THIS1]], [[A]]** [[RET]] 46 // CHECK: call [[A]]* @_ZN5test11AC2Ei( 47 // CHECK: [[THIS2:%.*]] = load [[A]]** [[RET]] 48 // CHECK: ret [[A]]* [[THIS2]] 49 50 // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]* 51 // CHECK: [[RET:%.*]] = alloca [[A]]*, align 4 52 // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4 53 // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]] 54 // CHECK: [[THIS1:%.*]] = load [[A]]** [[THIS]] 55 // CHECK: store [[A]]* [[THIS1]], [[A]]** [[RET]] 56 // CHECK: call [[A]]* @_ZN5test11AD2Ev( 57 // CHECK: [[THIS2:%.*]] = load [[A]]** [[RET]] 58 // CHECK: ret [[A]]* [[THIS2]] 59} 60 61// Awkward virtual cases. 62namespace test2 { 63 void foo(); 64 65 struct A { 66 int x; 67 68 A(int); 69 virtual ~A() { foo(); } 70 }; 71 72 struct B { 73 int y; 74 int z; 75 76 B(int); 77 virtual ~B() { foo(); } 78 }; 79 80 struct C : A, virtual B { 81 int q; 82 83 C(int i) : A(i), B(i) { foo(); } 84 ~C() { foo(); } 85 }; 86 87 void test() { 88 C c = 10; 89 } 90 91 // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev( 92 // CHECK: call [[C]]* @_ZN5test21CD1Ev( 93 // CHECK: ret [[C]]* undef 94 95 // CHECK: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev( 96 // CHECK: call void @_ZN5test21CD0Ev( 97 // CHECK: ret void 98} 99 100// CHECK: @_GLOBAL__D_a() 101// CHECK: call %class.bar* @_ZN3barD1Ev(%class.bar* @baz) 102