Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 %s -triple=thumbv7-apple-ios6.0 -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -std=gnu++98 -o - -fexceptions | FileCheck -check-prefix=CHECK -check-prefix=CHECK98 %s |
| 2 | // RUN: %clang_cc1 %s -triple=thumbv7-apple-ios6.0 -fno-use-cxa-atexit -target-abi apcs-gnu -emit-llvm -std=gnu++11 -o - -fexceptions | FileCheck -check-prefix=CHECK -check-prefix=CHECK11 %s |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 3 | |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 4 | // CHECK: @_ZZN5test74testEvE1x = internal global i32 0, align 4 |
| 5 | // CHECK: @_ZGVZN5test74testEvE1x = internal global i32 0 |
| 6 | // CHECK: @_ZZN5test84testEvE1x = internal global [[TEST8A:.*]] zeroinitializer, align 1 |
| 7 | // CHECK: @_ZGVZN5test84testEvE1x = internal global i32 0 |
| 8 | |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 9 | typedef typeof(sizeof(int)) size_t; |
Chris Lattner | 5e8416a | 2010-04-26 20:35:54 +0000 | [diff] [blame] | 10 | |
| 11 | class foo { |
| 12 | public: |
| 13 | foo(); |
| 14 | virtual ~foo(); |
| 15 | }; |
| 16 | |
| 17 | class bar : public foo { |
| 18 | public: |
| 19 | bar(); |
| 20 | }; |
| 21 | |
| 22 | // The global dtor needs the right calling conv with -fno-use-cxa-atexit |
| 23 | // rdar://7817590 |
| 24 | bar baz; |
| 25 | |
John McCall | 76cc43a | 2012-04-06 18:21:06 +0000 | [diff] [blame] | 26 | // PR9593 |
| 27 | // Make sure atexit(3) is used for global dtors. |
| 28 | |
| 29 | // CHECK: call [[BAR:%.*]]* @_ZN3barC1Ev( |
| 30 | // CHECK-NEXT: call i32 @atexit(void ()* @__dtor_baz) |
| 31 | |
Nico Weber | 3bf77c5 | 2014-05-07 16:25:32 +0000 | [diff] [blame] | 32 | // CHECK-NOT: @_GLOBAL__D_a() |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 33 | // CHECK-LABEL: define internal void @__dtor_baz() |
John McCall | 76cc43a | 2012-04-06 18:21:06 +0000 | [diff] [blame] | 34 | // CHECK: call [[BAR]]* @_ZN3barD1Ev([[BAR]]* @baz) |
| 35 | |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 36 | // Destructors and constructors must return this. |
| 37 | namespace test1 { |
| 38 | void foo(); |
| 39 | |
| 40 | struct A { |
| 41 | A(int i) { foo(); } |
| 42 | ~A() { foo(); } |
| 43 | void bar() { foo(); } |
| 44 | }; |
| 45 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 46 | // CHECK-LABEL: define void @_ZN5test14testEv() |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 47 | void test() { |
| 48 | // CHECK: [[AV:%.*]] = alloca [[A:%.*]], align 1 |
| 49 | // CHECK: call [[A]]* @_ZN5test11AC1Ei([[A]]* [[AV]], i32 10) |
| 50 | // CHECK: invoke void @_ZN5test11A3barEv([[A]]* [[AV]]) |
| 51 | // CHECK: call [[A]]* @_ZN5test11AD1Ev([[A]]* [[AV]]) |
| 52 | // CHECK: ret void |
| 53 | A a = 10; |
| 54 | a.bar(); |
| 55 | } |
| 56 | |
Stephen Lin | 9dc6eef | 2013-06-30 20:40:16 +0000 | [diff] [blame] | 57 | // CHECK: define linkonce_odr [[A]]* @_ZN5test11AC1Ei([[A]]* returned %this, i32 %i) unnamed_addr |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 58 | // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4 |
| 59 | // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]] |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 60 | // CHECK: [[THIS1:%.*]] = load [[A]]*, [[A]]** [[THIS]] |
Stephen Lin | 9dc6eef | 2013-06-30 20:40:16 +0000 | [diff] [blame] | 61 | // CHECK: {{%.*}} = call [[A]]* @_ZN5test11AC2Ei( |
| 62 | // CHECK: ret [[A]]* [[THIS1]] |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 63 | |
Stephen Lin | 9dc6eef | 2013-06-30 20:40:16 +0000 | [diff] [blame] | 64 | // CHECK: define linkonce_odr [[A]]* @_ZN5test11AD1Ev([[A]]* returned %this) unnamed_addr |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 65 | // CHECK: [[THIS:%.*]] = alloca [[A]]*, align 4 |
| 66 | // CHECK: store [[A]]* {{.*}}, [[A]]** [[THIS]] |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 67 | // CHECK: [[THIS1:%.*]] = load [[A]]*, [[A]]** [[THIS]] |
Stephen Lin | 9dc6eef | 2013-06-30 20:40:16 +0000 | [diff] [blame] | 68 | // CHECK: {{%.*}} = call [[A]]* @_ZN5test11AD2Ev( |
| 69 | // CHECK: ret [[A]]* [[THIS1]] |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 70 | } |
| 71 | |
| 72 | // Awkward virtual cases. |
| 73 | namespace test2 { |
| 74 | void foo(); |
| 75 | |
| 76 | struct A { |
| 77 | int x; |
| 78 | |
| 79 | A(int); |
| 80 | virtual ~A() { foo(); } |
| 81 | }; |
| 82 | |
| 83 | struct B { |
| 84 | int y; |
| 85 | int z; |
| 86 | |
| 87 | B(int); |
| 88 | virtual ~B() { foo(); } |
| 89 | }; |
| 90 | |
| 91 | struct C : A, virtual B { |
| 92 | int q; |
| 93 | |
| 94 | C(int i) : A(i), B(i) { foo(); } |
| 95 | ~C() { foo(); } |
| 96 | }; |
| 97 | |
| 98 | void test() { |
| 99 | C c = 10; |
| 100 | } |
| 101 | |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 102 | // Tests at eof |
| 103 | } |
| 104 | |
| 105 | namespace test3 { |
| 106 | struct A { |
| 107 | int x; |
| 108 | ~A(); |
| 109 | }; |
| 110 | |
| 111 | void a() { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 112 | // CHECK-LABEL: define void @_ZN5test31aEv() |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 113 | // CHECK: call i8* @_Znam(i32 48) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 114 | // CHECK: store i32 4 |
| 115 | // CHECK: store i32 10 |
| 116 | A *x = new A[10]; |
| 117 | } |
| 118 | |
| 119 | void b(int n) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 120 | // CHECK-LABEL: define void @_ZN5test31bEi( |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 121 | // CHECK: [[N:%.*]] = load i32, i32* |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 122 | // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4) |
| 123 | // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) |
Eli Friedman | db42a3e | 2011-04-09 19:54:33 +0000 | [diff] [blame] | 124 | // CHECK: [[OR:%.*]] = or i1 |
| 125 | // CHECK: [[SZ:%.*]] = select i1 [[OR]] |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 126 | // CHECK: call i8* @_Znam(i32 [[SZ]]) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 127 | // CHECK: store i32 4 |
| 128 | // CHECK: store i32 [[N]] |
| 129 | A *x = new A[n]; |
| 130 | } |
| 131 | |
| 132 | void c() { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 133 | // CHECK-LABEL: define void @_ZN5test31cEv() |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 134 | // CHECK: call i8* @_Znam(i32 808) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 135 | // CHECK: store i32 4 |
| 136 | // CHECK: store i32 200 |
| 137 | A (*x)[20] = new A[10][20]; |
| 138 | } |
| 139 | |
| 140 | void d(int n) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 141 | // CHECK-LABEL: define void @_ZN5test31dEi( |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 142 | // CHECK: [[N:%.*]] = load i32, i32* |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 143 | // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80) |
John McCall | 036f2f6 | 2011-05-15 07:14:44 +0000 | [diff] [blame] | 144 | // CHECK: [[NE:%.*]] = mul i32 [[N]], 20 |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 145 | // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) |
| 146 | // CHECK: [[SZ:%.*]] = select |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 147 | // CHECK: call i8* @_Znam(i32 [[SZ]]) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 148 | // CHECK: store i32 4 |
| 149 | // CHECK: store i32 [[NE]] |
| 150 | A (*x)[20] = new A[n][20]; |
| 151 | } |
| 152 | |
| 153 | void e(A *x) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 154 | // CHECK-LABEL: define void @_ZN5test31eEPNS_1AE( |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 155 | // CHECK: icmp eq {{.*}}, null |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 156 | // CHECK: getelementptr {{.*}}, i32 -8 |
| 157 | // CHECK: getelementptr {{.*}}, i32 4 |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 158 | // CHECK: bitcast {{.*}} to i32* |
| 159 | // CHECK: load |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 160 | // CHECK98: invoke {{.*}} @_ZN5test31AD1Ev |
| 161 | // CHECK11: call {{.*}} @_ZN5test31AD1Ev |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 162 | // CHECK: call void @_ZdaPv |
| 163 | delete [] x; |
| 164 | } |
| 165 | |
| 166 | void f(A (*x)[20]) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 167 | // CHECK-LABEL: define void @_ZN5test31fEPA20_NS_1AE( |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 168 | // CHECK: icmp eq {{.*}}, null |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 169 | // CHECK: getelementptr {{.*}}, i32 -8 |
| 170 | // CHECK: getelementptr {{.*}}, i32 4 |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 171 | // CHECK: bitcast {{.*}} to i32* |
| 172 | // CHECK: load |
Charles Li | fad0241 | 2017-01-09 18:24:16 +0000 | [diff] [blame] | 173 | // CHECK98: invoke {{.*}} @_ZN5test31AD1Ev |
| 174 | // CHECK11: call {{.*}} @_ZN5test31AD1Ev |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 175 | // CHECK: call void @_ZdaPv |
| 176 | delete [] x; |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | namespace test4 { |
| 181 | struct A { |
| 182 | int x; |
| 183 | void operator delete[](void *, size_t sz); |
| 184 | }; |
| 185 | |
| 186 | void a() { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 187 | // CHECK-LABEL: define void @_ZN5test41aEv() |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 188 | // CHECK: call i8* @_Znam(i32 48) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 189 | // CHECK: store i32 4 |
| 190 | // CHECK: store i32 10 |
| 191 | A *x = new A[10]; |
| 192 | } |
| 193 | |
| 194 | void b(int n) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 195 | // CHECK-LABEL: define void @_ZN5test41bEi( |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 196 | // CHECK: [[N:%.*]] = load i32, i32* |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 197 | // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 4) |
| 198 | // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) |
| 199 | // CHECK: [[SZ:%.*]] = select |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 200 | // CHECK: call i8* @_Znam(i32 [[SZ]]) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 201 | // CHECK: store i32 4 |
| 202 | // CHECK: store i32 [[N]] |
| 203 | A *x = new A[n]; |
| 204 | } |
| 205 | |
| 206 | void c() { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 207 | // CHECK-LABEL: define void @_ZN5test41cEv() |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 208 | // CHECK: call i8* @_Znam(i32 808) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 209 | // CHECK: store i32 4 |
| 210 | // CHECK: store i32 200 |
| 211 | A (*x)[20] = new A[10][20]; |
| 212 | } |
| 213 | |
| 214 | void d(int n) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 215 | // CHECK-LABEL: define void @_ZN5test41dEi( |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 216 | // CHECK: [[N:%.*]] = load i32, i32* |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 217 | // CHECK: @llvm.umul.with.overflow.i32(i32 [[N]], i32 80) |
John McCall | 036f2f6 | 2011-05-15 07:14:44 +0000 | [diff] [blame] | 218 | // CHECK: [[NE:%.*]] = mul i32 [[N]], 20 |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 219 | // CHECK: @llvm.uadd.with.overflow.i32(i32 {{.*}}, i32 8) |
| 220 | // CHECK: [[SZ:%.*]] = select |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 221 | // CHECK: call i8* @_Znam(i32 [[SZ]]) |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 222 | // CHECK: store i32 4 |
| 223 | // CHECK: store i32 [[NE]] |
| 224 | A (*x)[20] = new A[n][20]; |
| 225 | } |
| 226 | |
| 227 | void e(A *x) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 228 | // CHECK-LABEL: define void @_ZN5test41eEPNS_1AE( |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 229 | // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i32 -8 |
| 230 | // CHECK: getelementptr inbounds {{.*}}, i32 4 |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 231 | // CHECK: bitcast |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 232 | // CHECK: [[T0:%.*]] = load i32, i32* |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 233 | // CHECK: [[T1:%.*]] = mul i32 4, [[T0]] |
| 234 | // CHECK: [[T2:%.*]] = add i32 [[T1]], 8 |
| 235 | // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]]) |
| 236 | delete [] x; |
| 237 | } |
| 238 | |
| 239 | void f(A (*x)[20]) { |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 240 | // CHECK-LABEL: define void @_ZN5test41fEPA20_NS_1AE( |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 241 | // CHECK: [[ALLOC:%.*]] = getelementptr inbounds {{.*}}, i32 -8 |
| 242 | // CHECK: getelementptr inbounds {{.*}}, i32 4 |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 243 | // CHECK: bitcast |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 244 | // CHECK: [[T0:%.*]] = load i32, i32* |
John McCall | 8ed55a5 | 2010-09-02 09:58:18 +0000 | [diff] [blame] | 245 | // CHECK: [[T1:%.*]] = mul i32 4, [[T0]] |
| 246 | // CHECK: [[T2:%.*]] = add i32 [[T1]], 8 |
| 247 | // CHECK: call void @_ZN5test41AdaEPvm(i8* [[ALLOC]], i32 [[T2]]) |
| 248 | delete [] x; |
| 249 | } |
| 250 | } |
| 251 | |
John McCall | 0d635f5 | 2010-09-03 01:26:39 +0000 | [diff] [blame] | 252 | // <rdar://problem/8386802>: don't crash |
| 253 | namespace test5 { |
| 254 | struct A { |
| 255 | ~A(); |
| 256 | }; |
| 257 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 258 | // CHECK-LABEL: define void @_ZN5test54testEPNS_1AE |
John McCall | 0d635f5 | 2010-09-03 01:26:39 +0000 | [diff] [blame] | 259 | void test(A *a) { |
| 260 | // CHECK: [[PTR:%.*]] = alloca [[A:%.*]]*, align 4 |
| 261 | // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[PTR]], align 4 |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 262 | // CHECK-NEXT: [[TMP:%.*]] = load [[A]]*, [[A]]** [[PTR]], align 4 |
John McCall | 0d635f5 | 2010-09-03 01:26:39 +0000 | [diff] [blame] | 263 | // CHECK-NEXT: call [[A]]* @_ZN5test51AD1Ev([[A]]* [[TMP]]) |
| 264 | // CHECK-NEXT: ret void |
| 265 | a->~A(); |
| 266 | } |
| 267 | } |
| 268 | |
| 269 | namespace test6 { |
| 270 | struct A { |
| 271 | virtual ~A(); |
| 272 | }; |
| 273 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 274 | // CHECK-LABEL: define void @_ZN5test64testEPNS_1AE |
John McCall | 0d635f5 | 2010-09-03 01:26:39 +0000 | [diff] [blame] | 275 | void test(A *a) { |
| 276 | // CHECK: [[AVAR:%.*]] = alloca [[A:%.*]]*, align 4 |
| 277 | // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[AVAR]], align 4 |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 278 | // CHECK-NEXT: [[V:%.*]] = load [[A]]*, [[A]]** [[AVAR]], align 4 |
John McCall | 0d635f5 | 2010-09-03 01:26:39 +0000 | [diff] [blame] | 279 | // CHECK-NEXT: [[ISNULL:%.*]] = icmp eq [[A]]* [[V]], null |
| 280 | // CHECK-NEXT: br i1 [[ISNULL]] |
Timur Iskhodzhanov | d619711 | 2013-02-15 14:45:22 +0000 | [diff] [blame] | 281 | // CHECK: [[T0:%.*]] = bitcast [[A]]* [[V]] to void ([[A]]*)*** |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 282 | // CHECK-NEXT: [[T1:%.*]] = load void ([[A]]*)**, void ([[A]]*)*** [[T0]] |
David Blaikie | 218b783 | 2015-02-27 19:18:17 +0000 | [diff] [blame] | 283 | // CHECK-NEXT: [[T2:%.*]] = getelementptr inbounds void ([[A]]*)*, void ([[A]]*)** [[T1]], i64 1 |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 284 | // CHECK-NEXT: [[T3:%.*]] = load void ([[A]]*)*, void ([[A]]*)** [[T2]] |
Timur Iskhodzhanov | d619711 | 2013-02-15 14:45:22 +0000 | [diff] [blame] | 285 | // CHECK-NEXT: call void [[T3]]([[A]]* [[V]]) |
John McCall | 0d635f5 | 2010-09-03 01:26:39 +0000 | [diff] [blame] | 286 | // CHECK-NEXT: br label |
| 287 | // CHECK: ret void |
| 288 | delete a; |
| 289 | } |
| 290 | } |
| 291 | |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 292 | namespace test7 { |
| 293 | int foo(); |
| 294 | |
| 295 | // Static and guard tested at top of file |
| 296 | |
David Majnemer | fcbdb6e | 2015-06-17 20:53:19 +0000 | [diff] [blame] | 297 | // CHECK-LABEL: define void @_ZN5test74testEv() {{.*}} personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 298 | void test() { |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 299 | // CHECK: [[T0:%.*]] = load atomic i8, i8* bitcast (i32* @_ZGVZN5test74testEvE1x to i8*) acquire, align 4 |
Justin Bogner | 0cbb6d8 | 2014-04-23 01:50:10 +0000 | [diff] [blame] | 300 | // CHECK-NEXT: [[T1:%.*]] = and i8 [[T0]], 1 |
| 301 | // CHECK-NEXT: [[T2:%.*]] = icmp eq i8 [[T1]], 0 |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 302 | // CHECK-NEXT: br i1 [[T2]] |
| 303 | // -> fallthrough, end |
| 304 | // CHECK: [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test74testEvE1x) |
| 305 | // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0 |
| 306 | // CHECK-NEXT: br i1 [[T4]] |
| 307 | // -> fallthrough, end |
| 308 | // CHECK: [[INIT:%.*]] = invoke i32 @_ZN5test73fooEv() |
| 309 | // CHECK: store i32 [[INIT]], i32* @_ZZN5test74testEvE1x, align 4 |
| 310 | // CHECK-NEXT: call void @__cxa_guard_release(i32* @_ZGVZN5test74testEvE1x) |
| 311 | // CHECK-NEXT: br label |
| 312 | // -> end |
| 313 | // end: |
| 314 | // CHECK: ret void |
| 315 | static int x = foo(); |
| 316 | |
David Majnemer | fcbdb6e | 2015-06-17 20:53:19 +0000 | [diff] [blame] | 317 | // CHECK: landingpad { i8*, i32 } |
Bill Wendling | f0724e8 | 2011-09-19 20:31:14 +0000 | [diff] [blame] | 318 | // CHECK-NEXT: cleanup |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 319 | // CHECK: call void @__cxa_guard_abort(i32* @_ZGVZN5test74testEvE1x) |
Bill Wendling | f0724e8 | 2011-09-19 20:31:14 +0000 | [diff] [blame] | 320 | // CHECK: resume { i8*, i32 } |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 321 | } |
| 322 | } |
| 323 | |
| 324 | namespace test8 { |
| 325 | struct A { |
| 326 | A(); |
| 327 | ~A(); |
| 328 | }; |
| 329 | |
| 330 | // Static and guard tested at top of file |
| 331 | |
David Majnemer | fcbdb6e | 2015-06-17 20:53:19 +0000 | [diff] [blame] | 332 | // CHECK-LABEL: define void @_ZN5test84testEv() {{.*}} personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 333 | void test() { |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 334 | // CHECK: [[T0:%.*]] = load atomic i8, i8* bitcast (i32* @_ZGVZN5test84testEvE1x to i8*) acquire, align 4 |
Justin Bogner | 0cbb6d8 | 2014-04-23 01:50:10 +0000 | [diff] [blame] | 335 | // CHECK-NEXT: [[T1:%.*]] = and i8 [[T0]], 1 |
| 336 | // CHECK-NEXT: [[T2:%.*]] = icmp eq i8 [[T1]], 0 |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 337 | // CHECK-NEXT: br i1 [[T2]] |
| 338 | // -> fallthrough, end |
| 339 | // CHECK: [[T3:%.*]] = call i32 @__cxa_guard_acquire(i32* @_ZGVZN5test84testEvE1x) |
| 340 | // CHECK-NEXT: [[T4:%.*]] = icmp ne i32 [[T3]], 0 |
| 341 | // CHECK-NEXT: br i1 [[T4]] |
| 342 | // -> fallthrough, end |
| 343 | // CHECK: [[INIT:%.*]] = invoke [[TEST8A]]* @_ZN5test81AC1Ev([[TEST8A]]* @_ZZN5test84testEvE1x) |
| 344 | |
| 345 | // FIXME: Here we register a global destructor that |
| 346 | // unconditionally calls the destructor. That's what we've always |
| 347 | // done for -fno-use-cxa-atexit here, but that's really not |
| 348 | // semantically correct at all. |
| 349 | |
| 350 | // CHECK: call void @__cxa_guard_release(i32* @_ZGVZN5test84testEvE1x) |
| 351 | // CHECK-NEXT: br label |
| 352 | // -> end |
| 353 | // end: |
| 354 | // CHECK: ret void |
| 355 | static A x; |
| 356 | |
David Majnemer | fcbdb6e | 2015-06-17 20:53:19 +0000 | [diff] [blame] | 357 | // CHECK: landingpad { i8*, i32 } |
Bill Wendling | f0724e8 | 2011-09-19 20:31:14 +0000 | [diff] [blame] | 358 | // CHECK-NEXT: cleanup |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 359 | // CHECK: call void @__cxa_guard_abort(i32* @_ZGVZN5test84testEvE1x) |
Bill Wendling | f0724e8 | 2011-09-19 20:31:14 +0000 | [diff] [blame] | 360 | // CHECK: resume { i8*, i32 } |
John McCall | 68ff037 | 2010-09-08 01:44:27 +0000 | [diff] [blame] | 361 | } |
| 362 | } |
| 363 | |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 364 | // rdar://12836470 |
| 365 | // Use a larger-than-mandated array cookie when allocating an |
| 366 | // array whose type is overaligned. |
| 367 | namespace test9 { |
| 368 | class __attribute__((aligned(16))) A { |
| 369 | float data[4]; |
| 370 | public: |
| 371 | A(); |
| 372 | ~A(); |
| 373 | }; |
| 374 | |
| 375 | A *testNew(unsigned n) { |
| 376 | return new A[n]; |
| 377 | } |
| 378 | // CHECK: define [[TEST9:%.*]]* @_ZN5test97testNewEj(i32 |
| 379 | // CHECK: [[N_VAR:%.*]] = alloca i32, align 4 |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 380 | // CHECK: [[N:%.*]] = load i32, i32* [[N_VAR]], align 4 |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 381 | // CHECK-NEXT: [[T0:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[N]], i32 16) |
| 382 | // CHECK-NEXT: [[O0:%.*]] = extractvalue { i32, i1 } [[T0]], 1 |
| 383 | // CHECK-NEXT: [[T1:%.*]] = extractvalue { i32, i1 } [[T0]], 0 |
| 384 | // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 16) |
| 385 | // CHECK-NEXT: [[O1:%.*]] = extractvalue { i32, i1 } [[T2]], 1 |
| 386 | // CHECK-NEXT: [[OVERFLOW:%.*]] = or i1 [[O0]], [[O1]] |
| 387 | // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0 |
| 388 | // CHECK-NEXT: [[T4:%.*]] = select i1 [[OVERFLOW]], i32 -1, i32 [[T3]] |
Richard Smith | 351241c | 2016-04-07 21:46:12 +0000 | [diff] [blame] | 389 | // CHECK-NEXT: [[ALLOC:%.*]] = call i8* @_Znam(i32 [[T4]]) |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 390 | // CHECK-NEXT: [[T0:%.*]] = bitcast i8* [[ALLOC]] to i32* |
| 391 | // CHECK-NEXT: store i32 16, i32* [[T0]] |
David Blaikie | 218b783 | 2015-02-27 19:18:17 +0000 | [diff] [blame] | 392 | // CHECK-NEXT: [[T1:%.*]] = getelementptr inbounds i32, i32* [[T0]], i32 1 |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 393 | // CHECK-NEXT: store i32 [[N]], i32* [[T1]] |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 394 | // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i32 16 |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 395 | // CHECK-NEXT: bitcast i8* [[T0]] to [[TEST9]]* |
| 396 | // Array allocation follows. |
| 397 | |
| 398 | void testDelete(A *array) { |
| 399 | delete[] array; |
| 400 | } |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 401 | // CHECK-LABEL: define void @_ZN5test910testDeleteEPNS_1AE( |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 402 | // CHECK: [[BEGIN:%.*]] = load [[TEST9]]*, [[TEST9]]** |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 403 | // CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], null |
| 404 | // CHECK-NEXT: br i1 [[T0]], |
| 405 | // CHECK: [[T0:%.*]] = bitcast [[TEST9]]* [[BEGIN]] to i8* |
John McCall | 7f416cc | 2015-09-08 08:05:57 +0000 | [diff] [blame] | 406 | // CHECK-NEXT: [[ALLOC:%.*]] = getelementptr inbounds i8, i8* [[T0]], i32 -16 |
| 407 | // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds i8, i8* [[ALLOC]], i32 4 |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 408 | // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to i32* |
David Blaikie | a953f28 | 2015-02-27 21:19:58 +0000 | [diff] [blame] | 409 | // CHECK-NEXT: [[N:%.*]] = load i32, i32* [[T1]] |
David Blaikie | 218b783 | 2015-02-27 19:18:17 +0000 | [diff] [blame] | 410 | // CHECK-NEXT: [[END:%.*]] = getelementptr inbounds [[TEST9]], [[TEST9]]* [[BEGIN]], i32 [[N]] |
John McCall | c19c706 | 2013-01-25 23:36:19 +0000 | [diff] [blame] | 411 | // CHECK-NEXT: [[T0:%.*]] = icmp eq [[TEST9]]* [[BEGIN]], [[END]] |
| 412 | // CHECK-NEXT: br i1 [[T0]], |
| 413 | // Array deallocation follows. |
| 414 | } |
| 415 | |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 416 | // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev( |
| 417 | // CHECK: call [[C]]* @_ZN5test21CD1Ev( |
| 418 | // CHECK: ret [[C]]* undef |
| 419 | |
Stephen Lin | 4362261 | 2013-08-15 06:47:53 +0000 | [diff] [blame] | 420 | // CHECK-LABEL: define linkonce_odr void @_ZTv0_n12_N5test21CD0Ev( |
John McCall | 5d865c32 | 2010-08-31 07:33:07 +0000 | [diff] [blame] | 421 | // CHECK: call void @_ZN5test21CD0Ev( |
| 422 | // CHECK: ret void |