// 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 // 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 int &src(); int *sink(); extern "C" __complex float complex_src(); extern "C" __complex float *complex_sink(); // CHECK-LABEL: define void f1() { *sink() // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]] #line 100 = // src(); } struct foo { int i; int &j; __complex float k; foo(); }; // CHECK-LABEL: define foo::foo() : #line 200 i // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]] (src()), j // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]] (src()), k // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]] (complex_src()) { } // CHECK-LABEL: define {{.*}}f2{{.*}} void f2() { // CHECK: store float {{.*}} !dbg [[DBG_F2:!.*]] *complex_sink() #line 300 = // complex_src(); } // CHECK-LABEL: define void f3() { // CHECK: store float {{.*}} !dbg [[DBG_F3:!.*]] *complex_sink() #line 400 += // complex_src(); } // CHECK-LABEL: define void f4() { #line 500 auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]] = src(); } // CHECK-LABEL: define void f5() { #line 600 auto x // CHECK: store float {{.*}} !dbg [[DBG_F5:!.*]] = complex_src(); } struct agg { int i; }; agg agg_src(); // CHECK-LABEL: define void f6() { agg x; // CHECK: call void @llvm.memcpy{{.*}} !dbg [[DBG_F6:!.*]] x #line 700 = // agg_src(); } // CHECK-LABEL: define void f7() { int *src1(); int src2(); #line 800 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F7:!.*]] src1())[src2()]; } // CHECK-LABEL: define void f8() { int src1[1]; int src2(); #line 900 int x = ( // CHECK: load {{.*}} !dbg [[DBG_F8:!.*]] src1)[src2()]; } // CHECK-LABEL: define void f9(int i) { int src1[1][i]; int src2(); #line 1000 auto x = ( // CHECK: getelementptr {{.*}} !dbg [[DBG_F9:!.*]] src1)[src2()]; } inline void *operator new(decltype(sizeof(1)), void *p) noexcept { return p; } // CHECK-LABEL: define void f10() { void *void_src(); ( // CHECK: store {{.*}} !dbg [[DBG_F10_STORE:!.*]] #line 1100 new (void_src()) int(src())); } // noexcept just to simplify the codegen a bit void fn() noexcept(true); struct bar { bar(); // noexcept(false) to convolute the global dtor ~bar() noexcept(false); }; // global ctor cleanup // CHECK-LABEL: define // CHECK: invoke{{ }} // CHECK: invoke{{ }} // CHECK: to label {{.*}}, !dbg [[DBG_GLBL_CTOR_B:!.*]] // terminate caller // CHECK-LABEL: define // global dtor cleanup // CHECK-LABEL: define // CHECK: invoke{{ }} // CHECK: invoke{{ }} // CHECK: to label {{.*}}, !dbg [[DBG_GLBL_DTOR_B:!.*]] #line 1200 bar b[1] = { // (fn(), // bar())}; // CHECK-LABEL: define __complex double f11() { __complex double f; // CHECK: store {{.*}} !dbg [[DBG_F11:!.*]] #line 1300 return f; } // CHECK-LABEL: define void f12() { int f12_1(); void f12_2(int = f12_1()); // CHECK: call {{.*}}{{(signext )?}}i32 {{.*}} !dbg [[DBG_F12:!.*]] #line 1400 f12_2(); } // CHECK-LABEL: define void f13() { // CHECK: call {{.*}} !dbg [[DBG_F13:!.*]] #define F13_IMPL 1, src() 1, #line 1500 F13_IMPL; } struct f14_impl { f14_impl(int); }; // CHECK-LABEL: define struct f14_use { // CHECK: call {{.*}}f14_impl{{.*}}, !dbg [[DBG_F14_CTOR_CALL:![0-9]*]] #line 1600 f14_impl v{// 1}; f14_use(); }; f14_use::f14_use() = default; // CHECK-LABEL: define // CHECK-LABEL: define void func(foo); void f15(foo *f) { func( // CHECK: getelementptr {{.*}}, !dbg [[DBG_F15:![0-9]*]] #line 1700 f[3]); } // CHECK-LABEL: define void f16(__complex float f) { __complex float g = // // CHECK: add {{.*}}, !dbg [[DBG_F16:![0-9]*]] #line 1800 f + 1; } // CHECK-LABEL: define void f17(int *x) { 1, // CHECK: getelementptr {{.*}}, !dbg [[DBG_F17:![0-9]*]] #line 1900 x[1]; } // CHECK-LABEL: define void f18(int a, int b) { // CHECK: icmp {{.*}}, !dbg [[DBG_F18_1:![0-9]*]] // CHECK: br {{.*}}, !dbg [[DBG_F18_2:![0-9]*]] #line 2000 if (a // && // b) ; } // CHECK-LABEL: define void f19(int a, int b) { // CHECK: icmp {{.*}}, !dbg [[DBG_F19_1:![0-9]*]] // CHECK: br {{.*}}, !dbg [[DBG_F19_2:![0-9]*]] #line 2100 if (a // || // b) ; } // CHECK-LABEL: define void f20(int a, int b, int c) { // CHECK: icmp {{.*}}, !dbg [[DBG_F20_1:![0-9]*]] // FIXME: Conditional operator's exprloc should be the '?' not the start of the // expression, then this would go in the right place. (but adding getExprLoc to // the ConditionalOperator breaks the ARC migration tool - need to investigate // further). // CHECK: br {{.*}}, !dbg [[DBG_F20_1]] #line 2200 if (a // ? // b : c) ; } // CHECK-LABEL: define int f21_a(int = 0); void f21_b(int = f21_a()); void f21() { // CHECK: call {{.*}}f21_b{{.*}}, !dbg [[DBG_F21:![0-9]*]] #line 2300 f21_b(); } // CHECK-LABEL: define struct f22_dtor { ~f22_dtor(); }; void f22() { { f22_dtor f; src(); // CHECK: invoke {{.*}}src // CHECK: call {{.*}}, !dbg [[DBG_F22:![0-9]*]] // CHECK: call {{.*}}, !dbg [[DBG_F22]] #line 2400 } } // CHECK-LABEL: define struct f23_struct { }; f23_struct f23_a(); void f23_b(f23_struct = f23_a()); void f23() { // CHECK: call {{.*}}f23_a{{.*}}, !dbg [[DBG_F23:![0-9]*]] #line 2500 f23_b(); } // CHECK-LABEL: define void f24_a(__complex float = complex_src()); void f24() { // CHECK: call {{.*}}complex_src{{.*}}, !dbg [[DBG_F24:![0-9]*]] #line 2600 f24_a(); } // CHECK: [[DBG_F1]] = !DILocation(line: 100, // CHECK: [[DBG_FOO_VALUE]] = !DILocation(line: 200, // CHECK: [[DBG_FOO_REF]] = !DILocation(line: 202, // CHECK: [[DBG_FOO_COMPLEX]] = !DILocation(line: 204, // CHECK: [[DBG_F2]] = !DILocation(line: 300, // CHECK: [[DBG_F3]] = !DILocation(line: 400, // CHECK: [[DBG_F4]] = !DILocation(line: 500, // CHECK: [[DBG_F5]] = !DILocation(line: 600, // CHECK: [[DBG_F6]] = !DILocation(line: 700, // CHECK: [[DBG_F7]] = !DILocation(line: 800, // CHECK: [[DBG_F8]] = !DILocation(line: 900, // CHECK: [[DBG_F9]] = !DILocation(line: 1000, // CHECK: [[DBG_F10_STORE]] = !DILocation(line: 1100, // CHECK: [[DBG_GLBL_CTOR_B]] = !DILocation(line: 1200, // CHECK: [[DBG_GLBL_DTOR_B]] = !DILocation(line: 1200, // CHECK: [[DBG_F11]] = !DILocation(line: 1300, // CHECK: [[DBG_F12]] = !DILocation(line: 1400, // CHECK: [[DBG_F13]] = !DILocation(line: 1500, // CHECK: [[DBG_F14_CTOR_CALL]] = !DILocation(line: 1600, // CHECK: [[DBG_F15]] = !DILocation(line: 1700, // CHECK: [[DBG_F16]] = !DILocation(line: 1800, // CHECK: [[DBG_F17]] = !DILocation(line: 1900, // CHECK: [[DBG_F18_1]] = !DILocation(line: 2000, // CHECK: [[DBG_F18_2]] = !DILocation(line: 2001, // CHECK: [[DBG_F19_1]] = !DILocation(line: 2100, // CHECK: [[DBG_F19_2]] = !DILocation(line: 2101, // CHECK: [[DBG_F20_1]] = !DILocation(line: 2200, // CHECK: [[DBG_F23]] = !DILocation(line: 2500, // CHECK: [[DBG_F24]] = !DILocation(line: 2600,