1 // RUN: %clang_cc1 -w -debug-info-kind=line-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - -triple %itanium_abi_triple | FileCheck %s 2 // RUN: %clang_cc1 -w -debug-info-kind=line-tables-only -std=c++11 -fexceptions -fcxx-exceptions -S -emit-llvm %s -o - -triple i686-linux-gnu | FileCheck %s 3 4 int &src(); 5 int *sink(); 6 extern "C" __complex float complex_src(); 7 extern "C" __complex float *complex_sink(); 8 9 // CHECK-LABEL: define 10 void f1() { 11 *sink() 12 // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]] 13 #line 100 14 = // 15 src(); 16 } 17 18 struct foo { 19 int i; 20 int &j; 21 __complex float k; 22 foo(); 23 }; 24 25 // CHECK-LABEL: define 26 foo::foo() 27 : 28 #line 200 29 i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]] 30 (src()), 31 j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]] 32 (src()), 33 k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]] 34 (complex_src()) { 35 } 36 37 // CHECK-LABEL: define {{.*}}f2{{.*}} 38 void f2() { 39 // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]] 40 *complex_sink() 41 #line 300 42 = // 43 complex_src(); 44 } 45 46 // CHECK-LABEL: define 47 void f3() { 48 // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]] 49 *complex_sink() 50 #line 400 51 += // 52 complex_src(); 53 } 54 55 // CHECK-LABEL: define 56 void f4() { 57 #line 500 58 auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]] 59 = src(); 60 } 61 62 // CHECK-LABEL: define 63 void f5() { 64 #line 600 65 auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]] 66 = complex_src(); 67 } 68 69 struct agg { int i; }; 70 agg agg_src(); 71 72 // CHECK-LABEL: define 73 void f6() { 74 agg x; 75 // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]] 76 x 77 #line 700 78 = // 79 agg_src(); 80 } 81 82 // CHECK-LABEL: define 83 void f7() { 84 int *src1(); 85 int src2(); 86 #line 800 87 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]] 88 src1())[src2()]; 89 } 90 91 // CHECK-LABEL: define 92 void f8() { 93 int src1[1]; 94 int src2(); 95 #line 900 96 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]] 97 src1)[src2()]; 98 } 99 100 // CHECK-LABEL: define 101 void f9(int i) { 102 int src1[1][i]; 103 int src2(); 104 #line 1000 105 auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]] 106 src1)[src2()]; 107 } 108 109 inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; } 110 111 // CHECK-LABEL: define 112 void f10() { 113 void *void_src(); 114 ( 115 // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]] 116 #line 1100 117 new (void_src()) int(src())); 118 } 119 120 // noexcept just to simplify the codegen a bit 121 void fn() noexcept(true); 122 123 struct bar { 124 bar(); 125 // noexcept(false) to convolute the global dtor 126 ~bar() noexcept(false); 127 }; 128 // global ctor cleanup 129 // CHECK-LABEL: define 130 // CHECK: invoke{{ }} 131 // CHECK: invoke{{ }} 132 // CHECK: to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]] 133 134 // terminate caller 135 // CHECK-LABEL: define 136 137 // global dtor cleanup 138 // CHECK-LABEL: define 139 // CHECK: invoke{{ }} 140 // CHECK: invoke{{ }} 141 // CHECK: to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]] 142 #line 1200 143 bar b[1] = { // 144 (fn(), // 145 bar())}; 146 147 // CHECK-LABEL: define 148 __complex double f11() { 149 __complex double f; 150 // CHECK: store {{.*}} !dbg [[DBG_F11:!.*]] 151 #line 1300 152 return f; 153 } 154 155 // CHECK-LABEL: define 156 void f12() { 157 int f12_1(); 158 void f12_2(int = f12_1()); 159 // CHECK: call {{.*}}{{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]] 160 #line 1400 161 f12_2(); 162 } 163 164 // CHECK-LABEL: define 165 void f13() { 166 // CHECK: call {{.*}} !dbg [[DBG_F13:!.*]] 167 #define F13_IMPL 1, src() 168 1, 169 #line 1500 170 F13_IMPL; 171 } 172 173 struct f14_impl { 174 f14_impl(int); 175 }; 176 177 // CHECK-LABEL: define 178 struct f14_use { 179 // CHECK: call {{.*}}f14_impl{{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]] 180 #line 1600 181 f14_impl v{// 182 1}; 183 f14_use(); 184 }; 185 186 f14_use::f14_use() = default; 187 188 // CHECK-LABEL: define 189 // CHECK-LABEL: define 190 void func(foo); 191 void f15(foo *f) { 192 func( 193 // CHECK: getelementptr {{.*}}, !dbg [[DBG_F15:![0-9]*]] 194 #line 1700 195 f[3]); 196 } 197 198 // CHECK-LABEL: define 199 void f16(__complex float f) { 200 __complex float g = // 201 // CHECK: add {{.*}}, !dbg [[DBG_F16:![0-9]*]] 202 #line 1800 203 f + 1; 204 } 205 206 // CHECK-LABEL: define 207 void f17(int *x) { 208 1, 209 // CHECK: getelementptr {{.*}}, !dbg [[DBG_F17:![0-9]*]] 210 #line 1900 211 x[1]; 212 } 213 214 // CHECK-LABEL: define 215 void f18(int a, int b) { 216 // CHECK: icmp {{.*}}, !dbg [[DBG_F18_1:![0-9]*]] 217 // CHECK: br {{.*}}, !dbg [[DBG_F18_2:![0-9]*]] 218 #line 2000 219 if (a // 220 && // 221 b) 222 ; 223 } 224 225 // CHECK-LABEL: define 226 void f19(int a, int b) { 227 // CHECK: icmp {{.*}}, !dbg [[DBG_F19_1:![0-9]*]] 228 // CHECK: br {{.*}}, !dbg [[DBG_F19_2:![0-9]*]] 229 #line 2100 230 if (a // 231 || // 232 b) 233 ; 234 } 235 236 // CHECK-LABEL: define 237 void f20(int a, int b, int c) { 238 // CHECK: icmp {{.*}}, !dbg [[DBG_F20_1:![0-9]*]] 239 // FIXME: Conditional operator's exprloc should be the '?' not the start of the 240 // expression, then this would go in the right place. (but adding getExprLoc to 241 // the ConditionalOperator breaks the ARC migration tool - need to investigate 242 // further). 243 // CHECK: br {{.*}}, !dbg [[DBG_F20_1]] 244 #line 2200 245 if (a // 246 ? // 247 b : c) 248 ; 249 } 250 251 // CHECK-LABEL: define 252 int f21_a(int = 0); 253 void f21_b(int = f21_a()); 254 void f21() { 255 // CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]] 256 #line 2300 257 f21_b(); 258 } 259 260 // CHECK-LABEL: define 261 struct f22_dtor { 262 ~f22_dtor(); 263 }; 264 void f22() { 265 { 266 f22_dtor f; 267 src(); 268 // CHECK: invoke {{.*}}src 269 // CHECK: call {{.*}}, !dbg [[DBG_F22:![0-9]*]] 270 // CHECK: call {{.*}}, !dbg [[DBG_F22]] 271 #line 2400 272 } 273 } 274 275 // CHECK-LABEL: define 276 struct f23_struct { 277 }; 278 f23_struct f23_a(); 279 void f23_b(f23_struct = f23_a()); 280 void f23() { 281 // CHECK: call {{.*}}f23_a{{.*}}, !dbg [[DBG_F23:![0-9]*]] 282 #line 2500 283 f23_b(); 284 } 285 286 // CHECK-LABEL: define 287 void f24_a(__complex float = complex_src()); 288 void f24() { 289 // CHECK: call {{.*}}complex_src{{.*}}, !dbg [[DBG_F24:![0-9]*]] 290 #line 2600 291 f24_a(); 292 } 293 294 // CHECK: [[DBG_F1]] = !DILocation(line: 100, 295 // CHECK: [[DBG_FOO_VALUE]] = !DILocation(line: 200, 296 // CHECK: [[DBG_FOO_REF]] = !DILocation(line: 202, 297 // CHECK: [[DBG_FOO_COMPLEX]] = !DILocation(line: 204, 298 // CHECK: [[DBG_F2]] = !DILocation(line: 300, 299 // CHECK: [[DBG_F3]] = !DILocation(line: 400, 300 // CHECK: [[DBG_F4]] = !DILocation(line: 500, 301 // CHECK: [[DBG_F5]] = !DILocation(line: 600, 302 // CHECK: [[DBG_F6]] = !DILocation(line: 700, 303 // CHECK: [[DBG_F7]] = !DILocation(line: 800, 304 // CHECK: [[DBG_F8]] = !DILocation(line: 900, 305 // CHECK: [[DBG_F9]] = !DILocation(line: 1000, 306 // CHECK: [[DBG_F10_STORE]] = !DILocation(line: 1100, 307 // CHECK: [[DBG_GLBL_CTOR_B]] = !DILocation(line: 1200, 308 // CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 1200, 309 // CHECK: [[DBG_F11]] = !DILocation(line: 1300, 310 // CHECK: [[DBG_F12]] = !DILocation(line: 1400, 311 // CHECK: [[DBG_F13]] = !DILocation(line: 1500, 312 // CHECK: [[DBG_F14_CTOR_CALL]] = !DILocation(line: 1600, 313 // CHECK: [[DBG_F15]] = !DILocation(line: 1700, 314 // CHECK: [[DBG_F16]] = !DILocation(line: 1800, 315 // CHECK: [[DBG_F17]] = !DILocation(line: 1900, 316 // CHECK: [[DBG_F18_1]] = !DILocation(line: 2000, 317 // CHECK: [[DBG_F18_2]] = !DILocation(line: 2001, 318 // CHECK: [[DBG_F19_1]] = !DILocation(line: 2100, 319 // CHECK: [[DBG_F19_2]] = !DILocation(line: 2101, 320 // CHECK: [[DBG_F20_1]] = !DILocation(line: 2200, 321 // CHECK: [[DBG_F23]] = !DILocation(line: 2500, 322 // CHECK: [[DBG_F24]] = !DILocation(line: 2600, 323