r223726 - DebugInfo: Correctly identify the location of C++ member initializer list elements
Kostya Serebryany
kcc at google.com
Tue Dec 9 14:45:04 PST 2014
Thanks!
At least the simple test case works now.
On Mon, Dec 8, 2014 at 4:32 PM, David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Mon Dec 8 18:32:22 2014
> New Revision: 223726
>
> URL: http://llvm.org/viewvc/llvm-project?rev=223726&view=rev
> Log:
> DebugInfo: Correctly identify the location of C++ member initializer list
> elements
>
> This particularly helps the fidelity of ASan reports (which can occur
> even in these examples - if, for example, one uses placement new over a
> buffer of insufficient size - now ASan will correctly identify which
> member's initialization went over the end of the buffer).
>
> This doesn't cover all types of members - more coming.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGClass.cpp
> cfe/trunk/lib/CodeGen/CGDecl.cpp
> cfe/trunk/lib/CodeGen/CGExpr.cpp
> cfe/trunk/lib/CodeGen/CodeGenFunction.h
> cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=223726&r1=223725&r2=223726&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Mon Dec 8 18:32:22 2014
> @@ -597,17 +597,19 @@ static void EmitMemberInitializer(CodeGe
> ArrayRef<VarDecl *> ArrayIndexes;
> if (MemberInit->getNumArrayIndices())
> ArrayIndexes = MemberInit->getArrayIndexes();
> - CGF.EmitInitializerForField(Field, LHS, MemberInit->getInit(),
> ArrayIndexes);
> + CGF.EmitInitializerForField(Field, LHS, MemberInit->getInit(),
> ArrayIndexes,
> + MemberInit->getMemberLocation());
> }
>
> -void CodeGenFunction::EmitInitializerForField(FieldDecl *Field,
> - LValue LHS, Expr *Init,
> - ArrayRef<VarDecl *>
> ArrayIndexes) {
> +void CodeGenFunction::EmitInitializerForField(FieldDecl *Field, LValue
> LHS,
> + Expr *Init,
> + ArrayRef<VarDecl *>
> ArrayIndexes,
> + SourceLocation DbgLoc) {
> QualType FieldType = Field->getType();
> switch (getEvaluationKind(FieldType)) {
> case TEK_Scalar:
> if (LHS.isSimple()) {
> - EmitExprAsInit(Init, Field, LHS, false);
> + EmitExprAsInit(Init, Field, LHS, false, DbgLoc);
> } else {
> RValue RHS = RValue::get(EmitScalarExpr(Init));
> EmitStoreThroughLValue(RHS, LHS);
>
> Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=223726&r1=223725&r2=223726&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Mon Dec 8 18:32:22 2014
> @@ -596,16 +596,15 @@ static void drillIntoBlockVariable(CodeG
> lvalue.setAddress(CGF.BuildBlockByrefAddress(lvalue.getAddress(), var));
> }
>
> -void CodeGenFunction::EmitScalarInit(const Expr *init,
> - const ValueDecl *D,
> - LValue lvalue,
> - bool capturedByInit) {
> +void CodeGenFunction::EmitScalarInit(const Expr *init, const ValueDecl *D,
> + LValue lvalue, bool capturedByInit,
> + SourceLocation DbgLoc) {
> Qualifiers::ObjCLifetime lifetime = lvalue.getObjCLifetime();
> if (!lifetime) {
> llvm::Value *value = EmitScalarExpr(init);
> if (capturedByInit)
> drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
> - EmitStoreThroughLValue(RValue::get(value), lvalue, true);
> + EmitStoreThroughLValue(RValue::get(value), lvalue, true, DbgLoc);
> return;
> }
>
> @@ -1192,22 +1191,21 @@ void CodeGenFunction::EmitAutoVarInit(co
> /// \param alignment the alignment of the address
> /// \param capturedByInit true if the variable is a __block variable
> /// whose address is potentially changed by the initializer
> -void CodeGenFunction::EmitExprAsInit(const Expr *init,
> - const ValueDecl *D,
> - LValue lvalue,
> - bool capturedByInit) {
> +void CodeGenFunction::EmitExprAsInit(const Expr *init, const ValueDecl *D,
> + LValue lvalue, bool capturedByInit,
> + SourceLocation DbgLoc) {
> QualType type = D->getType();
>
> if (type->isReferenceType()) {
> RValue rvalue = EmitReferenceBindingToExpr(init);
> if (capturedByInit)
> drillIntoBlockVariable(*this, lvalue, cast<VarDecl>(D));
> - EmitStoreThroughLValue(rvalue, lvalue, true);
> + EmitStoreThroughLValue(rvalue, lvalue, true, DbgLoc);
> return;
> }
> switch (getEvaluationKind(type)) {
> case TEK_Scalar:
> - EmitScalarInit(init, D, lvalue, capturedByInit);
> + EmitScalarInit(init, D, lvalue, capturedByInit, DbgLoc);
> return;
> case TEK_Complex: {
> ComplexPairTy complex = EmitComplexExpr(init);
>
> Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=223726&r1=223725&r2=223726&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGExpr.cpp Mon Dec 8 18:32:22 2014
> @@ -1437,7 +1437,11 @@ RValue CodeGenFunction::EmitLoadOfGlobal
> /// lvalue, where both are guaranteed to the have the same type, and that
> type
> /// is 'Ty'.
> void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst,
> - bool isInit) {
> + bool isInit,
> + SourceLocation DbgLoc) {
> + if (auto *DI = getDebugInfo())
> + DI->EmitLocation(Builder, DbgLoc);
> +
> if (!Dst.isSimple()) {
> if (Dst.isVectorElt()) {
> // Read/modify/write the vector, inserting the new element.
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=223726&r1=223725&r2=223726&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Dec 8 18:32:22 2014
> @@ -1299,7 +1299,8 @@ public:
> FunctionArgList &Args);
>
> void EmitInitializerForField(FieldDecl *Field, LValue LHS, Expr *Init,
> - ArrayRef<VarDecl *> ArrayIndexes);
> + ArrayRef<VarDecl *> ArrayIndexes,
> + SourceLocation DbgLoc = SourceLocation());
>
> /// InitializeVTablePointer - Initialize the vtable pointer of the given
> /// subobject.
> @@ -1543,8 +1544,9 @@ 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);
> + void EmitExprAsInit(const Expr *init, const ValueDecl *D, LValue lvalue,
> + bool capturedByInit,
> + SourceLocation DbgLoc = SourceLocation());
>
> /// hasVolatileMember - returns true if aggregate type has a volatile
> /// member.
> @@ -1830,8 +1832,9 @@ public:
> /// This function can be called with a null (unreachable) insert point.
> void EmitVarDecl(const VarDecl &D);
>
> - void EmitScalarInit(const Expr *init, const ValueDecl *D,
> - LValue lvalue, bool capturedByInit);
> + void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue,
> + bool capturedByInit,
> + SourceLocation DbgLoc = SourceLocation());
> void EmitScalarInit(llvm::Value *init, LValue lvalue);
>
> typedef void SpecialInitFn(CodeGenFunction &Init, const VarDecl &D,
> @@ -2150,7 +2153,8 @@ public:
> /// EmitStoreThroughLValue - Store the specified rvalue into the
> specified
> /// lvalue, where both are guaranteed to the have the same type, and
> that type
> /// is 'Ty'.
> - void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false);
> + void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit = false,
> + SourceLocation DbgLoc = SourceLocation());
> void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst);
> void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst);
>
>
> Modified: cfe/trunk/test/CodeGenCXX/debug-info-line.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-line.cpp?rev=223726&r1=223725&r2=223726&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-line.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-line.cpp Mon Dec 8 18:32:22 2014
> @@ -1,26 +1,33 @@
> // RUN: %clang_cc1 -g -std=c++11 -S -emit-llvm %s -o - | FileCheck %s
>
> -int src(); int* sink();
> +int &src(); int* sink();
>
> 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
> - (
> - )
> - +
> - 3
> - )
> - =
> - src
> - (
> - )
> - +
> - 42
> - ;
> - // CHECK: store {{.*}}, !dbg [[DBG1:!.*]]
> + sink() = src();
> + // CHECK: store {{.*}}, !dbg [[DBG_F1:!.*]]
> }
>
> -// CHECK: [[DBG1]] = metadata !{i32 100, {{.*}}
> +struct foo {
> + int i;
> + int &j;
> + foo();
> +};
> +
> +foo::foo()
> + :
> +#line 200
> + i
> + (src()),
> + j
> + (src())
> + // CHECK: store i32 {{.*}} !dbg [[DBG_FOO_VALUE:!.*]]
> + // CHECK: store i32* {{.*}} !dbg [[DBG_FOO_REF:!.*]]
> +{
> +}
> +
> +// CHECK: [[DBG_F1]] = metadata !{i32 100,
> +// CHECK: [[DBG_FOO_VALUE]] = metadata !{i32 200,
> +// CHECK: [[DBG_FOO_REF]] = metadata !{i32 202,
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20141209/6993c08d/attachment.html>
More information about the cfe-commits
mailing list