From 02782efcfdc1645c8f9fbd778c837ac6a8e1bf6f Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 9 Dec 2014 22:04:13 +0000 Subject: [PATCH] DebugInfo: Correct the location of initializations of auto. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@223839 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGBlocks.cpp | 5 ++++- lib/CodeGen/CGDecl.cpp | 2 +- lib/CodeGen/CodeGenFunction.h | 3 +-- test/CodeGenCXX/debug-info-line.cpp | 8 ++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index be3a5bf6e1..bdb3eaf549 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -869,9 +869,12 @@ llvm::Value *CodeGenFunction::EmitBlockLiteral(const CGBlockInfo &blockInfo) { ImplicitCastExpr l2r(ImplicitCastExpr::OnStack, type, CK_LValueToRValue, &declRef, VK_RValue); + // FIXME: Pass a specific location for the expr init so that the store is + // attributed to a reasonable location - otherwise it may be attributed to + // locations of subexpressions in the initialization. EmitExprAsInit(&l2r, &blockFieldPseudoVar, MakeAddrLValue(blockField, type, align), - /*captured by init*/ false); + /*captured by init*/ false, SourceLocation()); } // Activate the cleanup if layout pushed one. diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 97da9ef307..b754a39366 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -1126,7 +1126,7 @@ void CodeGenFunction::EmitAutoVarInit(const AutoVarEmission &emission) { if (!constant) { LValue lv = MakeAddrLValue(Loc, type, alignment); lv.setNonGC(true); - return EmitExprAsInit(Init, &D, lv, capturedByInit); + return EmitExprAsInit(Init, &D, lv, capturedByInit, D.getLocation()); } if (!emission.IsConstantAggregate) { diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index a80a199512..bfef0c9a8d 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -1545,8 +1545,7 @@ public: /// EmitExprAsInit - Emits the code necessary to initialize a /// location in memory with the given initializer. void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue lvalue, - bool capturedByInit, - SourceLocation DbgLoc = SourceLocation()); + bool capturedByInit, SourceLocation DbgLoc); /// hasVolatileMember - returns true if aggregate type has a volatile /// member. diff --git a/test/CodeGenCXX/debug-info-line.cpp b/test/CodeGenCXX/debug-info-line.cpp index f87a24c5b3..8bf30e4853 100644 --- a/test/CodeGenCXX/debug-info-line.cpp +++ b/test/CodeGenCXX/debug-info-line.cpp @@ -50,9 +50,17 @@ void f3() { complex_sink() += complex_src(); } +// CHECK-LABEL: define +void f4() { +#line 500 + auto x // CHECK: store {{.*}} !dbg [[DBG_F4:!.*]] + = src(); +} + // CHECK: [[DBG_F1]] = metadata !{i32 100, // CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200, // CHECK: [[DBG_FOO_REF]] = metadata !{i32 202, // CHECK: [[DBG_FOO_COMPLEX]] = metadata !{i32 204, // CHECK: [[DBG_F2]] = metadata !{i32 300, // CHECK: [[DBG_F3]] = metadata !{i32 400, +// CHECK: [[DBG_F4]] = metadata !{i32 500, -- 2.40.0