From: David Blaikie Date: Tue, 9 Dec 2014 21:10:43 +0000 (+0000) Subject: DebugInfo: Accurate location information for complex assignment X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=397f35ac5b3d26c582106c716703b9d279577edd;p=clang DebugInfo: Accurate location information for complex assignment git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223828 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExprComplex.cpp b/lib/CodeGen/CGExprComplex.cpp index f3493bfbbe..7b7da17a3f 100644 --- a/lib/CodeGen/CGExprComplex.cpp +++ b/lib/CodeGen/CGExprComplex.cpp @@ -82,7 +82,7 @@ public: /// EmitStoreOfComplex - Store the specified real/imag parts into the /// specified value pointer. void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit, - SourceLocation DbgLoc = SourceLocation()); + SourceLocation DbgLoc); /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType. ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType, @@ -869,7 +869,8 @@ EmitCompoundAssignLValue(const CompoundAssignOperator *E, // Truncate the result and store it into the LHS lvalue. if (LHSTy->isAnyComplexType()) { ComplexPairTy ResVal = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy); - EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false); + // FIXME + EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false, SourceLocation()); Val = RValue::getComplex(ResVal); } else { llvm::Value *ResVal = @@ -914,8 +915,7 @@ LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E, LValue LHS = CGF.EmitLValue(E->getLHS()); // Store the result value into the LHS lvalue. - // FIXME - EmitStoreOfComplex(Val, LHS, /*isInit*/ false); + EmitStoreOfComplex(Val, LHS, /*isInit*/ false, E->getLocStart()); return LHS; } diff --git a/test/CodeGenCXX/debug-info-line.cpp b/test/CodeGenCXX/debug-info-line.cpp index 8f4e080bdc..c8e98cbc67 100644 --- a/test/CodeGenCXX/debug-info-line.cpp +++ b/test/CodeGenCXX/debug-info-line.cpp @@ -1,14 +1,16 @@ // RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s int &src(); -int* sink(); +int *sink(); __complex float complex_src(); +__complex float *complex_sink(); +// CHECK-LABEL: define void f1() { #line 100 * // The store for the assignment should be attributed to the start of the - // assignment expression here, regardless of the location of subexpressions. - sink() = src(); + // assignment expression here, regardless of the location of subexpressions. + sink() = src(); // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]] } @@ -19,22 +21,27 @@ struct foo { foo(); }; +// CHECK-LABEL: define foo::foo() - : + : #line 200 - i - (src()), - // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]] - j - (src()), - // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]] - k - (complex_src()) - // CHECK: store float {{.*}} !dbg [[DBG_FOO_COMPLEX:!.*]] -{ + 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 +void f2() { +#line 300 + * // CHECK: store float {{.*}} !dbg [[DBG_F2_COMPLEX:!.*]] + complex_sink() = complex_src(); } // CHECK: [[DBG_F1]] = metadata !{i32 100, // CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200, -// CHECK: [[DBG_FOO_REF]] = metadata !{i32 203, -// CHECK: [[DBG_FOO_COMPLEX]] = metadata !{i32 206, +// CHECK: [[DBG_FOO_REF]] = metadata !{i32 202, +// CHECK: [[DBG_FOO_COMPLEX]] = metadata !{i32 204, +// CHECK: [[DBG_F2_COMPLEX]] = metadata !{i32 300,