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

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Fri Apr 29 14:52:26 PDT 2016


You could simplify the test case further, down to just:

struct foo { void bar(); };
void f(foo *f) {
  f->bar();
}

and check that the call instruction has the desired column (or if you want
a test that doesn't depend on column info (you can force it on with a flag,
but we might vary whether it's on by default based on target, etc, I'm not
sure) you could put 'bar();' on a separate line from 'f->' and check the
call was on the second line and not the first).

Richard might be able to tell us whether there's a preferred place for a
test for a change like this - should it be a debug info test, a diagnostic
test, or perhaps just an ast dump test?

Perhaps a test for the case where there is no valid callee would be good?
Where does that come up - call through a member function pointer?

On Fri, Apr 29, 2016 at 9:19 AM, Hal Finkel via cfe-commits <
cfe-commits at lists.llvm.org> 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;
>    }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160429/1f0acf49/attachment.html>


More information about the cfe-commits mailing list