[PATCH] D19708: [CGDebugInfo] Generate debug info for member calls in the context of the callee expression

Eric Christopher via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 29 09:35:41 PDT 2016


Seems a much more principled solution yes.

On Fri, Apr 29, 2016, 9:19 AM Hal Finkel <hfinkel at anl.gov> wrote:

> hfinkel updated this revision to Diff 55610.
> hfinkel added a comment.
>
> Use David's suggested approach: Modify the preferred expression location
> for member calls. If the callee has a valid location (not all do), then use
> that. Otherwise, fall back to the starting location. This seems to cleanly
> fix the debug-info problem.
>
>
> http://reviews.llvm.org/D19708
>
> Files:
>   include/clang/AST/ExprCXX.h
>   test/CodeGenCXX/debug-info-member-call.cpp
>
> Index: test/CodeGenCXX/debug-info-member-call.cpp
> ===================================================================
> --- /dev/null
> +++ test/CodeGenCXX/debug-info-member-call.cpp
> @@ -0,0 +1,24 @@
> +// RUN: %clang_cc1 -triple x86_64-unknown_unknown -emit-llvm
> -debug-info-kind=standalone -dwarf-column-info %s -o - | FileCheck %s
> +void ext();
> +
> +struct Bar {
> +  void bar() { ext(); }
> +};
> +
> +struct Foo {
> +  Bar *b;
> +
> +  Bar *foo() { return b; }
> +};
> +
> +void test(Foo *f) {
> +  f->foo()->bar();
> +}
> +
> +// CHECK-LABEL: @_Z4testP3Foo
> +// CHECK: call {{.*}} @_ZN3Foo3fooEv{{.*}}, !dbg ![[CALL1LOC:.*]]
> +// CHECK: call void @_ZN3Bar3barEv{{.*}}, !dbg ![[CALL2LOC:.*]]
> +
> +// CHECK: ![[CALL1LOC]] = !DILocation(line: [[LINE:[0-9]+]], column: 6,
> +// CHECK: ![[CALL2LOC]] = !DILocation(line: [[LINE]], column: 13,
> +
> Index: include/clang/AST/ExprCXX.h
> ===================================================================
> --- include/clang/AST/ExprCXX.h
> +++ include/clang/AST/ExprCXX.h
> @@ -145,6 +145,14 @@
>    /// FIXME: Returns 0 for member pointer call exprs.
>    CXXRecordDecl *getRecordDecl() const;
>
> +  SourceLocation getExprLoc() const LLVM_READONLY {
> +    SourceLocation CLoc = getCallee()->getExprLoc();
> +    if (CLoc.isValid())
> +      return CLoc;
> +
> +    return getLocStart();
> +  }
> +
>    static bool classof(const Stmt *T) {
>      return T->getStmtClass() == CXXMemberCallExprClass;
>    }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160429/6e255a95/attachment.html>


More information about the cfe-commits mailing list