diff options
author | Hal Finkel <hfinkel@anl.gov> | 2016-05-25 22:08:27 +0000 |
---|---|---|
committer | Hal Finkel <hfinkel@anl.gov> | 2016-05-25 22:08:27 +0000 |
commit | ec264b2935ed8cc0fe535b4eef06f50552977cab (patch) | |
tree | 8d08a9fa42f16b1a3d969e4e0db72692f5a50f1f | |
parent | c0d04a2567c22631595bed8092bc042bb91ea4ee (diff) | |
download | bcm5719-llvm-ec264b2935ed8cc0fe535b4eef06f50552977cab.tar.gz bcm5719-llvm-ec264b2935ed8cc0fe535b4eef06f50552977cab.zip |
[CGDebugInfo] 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 makes sure that the debug info for calls
points to the call (not the start of the expression providing the object on
which the member function is being called).
For example, given this:
f->foo()->bar();
we don't want both calls to point to the 'f', but rather to the 'foo()' and
the 'bar()'.
Fixes PR27567.
Differential Revision: http://reviews.llvm.org/D19708
llvm-svn: 270775
-rw-r--r-- | clang/include/clang/AST/ExprCXX.h | 8 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/debug-info-member-call.cpp | 24 |
2 files changed, 32 insertions, 0 deletions
diff --git a/clang/include/clang/AST/ExprCXX.h b/clang/include/clang/AST/ExprCXX.h index f4f653f4bb6..41b6758bdc7 100644 --- a/clang/include/clang/AST/ExprCXX.h +++ b/clang/include/clang/AST/ExprCXX.h @@ -143,6 +143,14 @@ public: /// 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; } diff --git a/clang/test/CodeGenCXX/debug-info-member-call.cpp b/clang/test/CodeGenCXX/debug-info-member-call.cpp new file mode 100644 index 00000000000..3b5adb8e4b8 --- /dev/null +++ b/clang/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, + |