summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHal Finkel <hfinkel@anl.gov>2016-05-25 22:08:27 +0000
committerHal Finkel <hfinkel@anl.gov>2016-05-25 22:08:27 +0000
commitec264b2935ed8cc0fe535b4eef06f50552977cab (patch)
tree8d08a9fa42f16b1a3d969e4e0db72692f5a50f1f
parentc0d04a2567c22631595bed8092bc042bb91ea4ee (diff)
downloadbcm5719-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.h8
-rw-r--r--clang/test/CodeGenCXX/debug-info-member-call.cpp24
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,
+
OpenPOWER on IntegriCloud