r204517 - CGDebugInfo: At the end of EmitFunctionStart, Initialize PrevLoc to the

Adrian Prantl aprantl at apple.com
Fri Mar 21 14:01:58 PDT 2014


Author: adrian
Date: Fri Mar 21 16:01:58 2014
New Revision: 204517

URL: http://llvm.org/viewvc/llvm-project?rev=204517&view=rev
Log:
CGDebugInfo: At the end of EmitFunctionStart, Initialize PrevLoc to the
location that the next call emitLocation() would default to. Otherwise
setLocation() may wrongly believe that the current source file didn't
change, when in fact it did.

Added:
    cfe/trunk/test/CodeGenCXX/linetable-fnbegin.cpp
Modified:
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp

Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=204517&r1=204516&r2=204517&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Mar 21 16:01:58 2014
@@ -2577,9 +2577,12 @@ void CGDebugInfo::EmitFunctionStart(Glob
   if (HasDecl)
     DeclCache.insert(std::make_pair(D->getCanonicalDecl(), llvm::WeakVH(SP)));
 
-  // Push function on region stack.
+  // Push the function onto the lexical block stack.
   llvm::MDNode *SPN = SP;
   LexicalBlockStack.push_back(SPN);
+  // Initialize PrevLoc to the location of the function header.
+  PrevLoc = Loc;
+
   if (HasDecl)
     RegionMap[D] = llvm::WeakVH(SP);
 }

Added: cfe/trunk/test/CodeGenCXX/linetable-fnbegin.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/linetable-fnbegin.cpp?rev=204517&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/linetable-fnbegin.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/linetable-fnbegin.cpp Fri Mar 21 16:01:58 2014
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -emit-llvm -g %s -o - | FileCheck %s
+// Test that the line table info for Foo<T>::bar() is pointing to the
+// right header file.
+// CHECK: define{{.*}} @_ZN3FooIiE3barEv
+// CHECK-NOT: define
+// CHECK: ret {{.*}}, !dbg ![[DBG:.*]]
+// CHECK: ![[HPP:.*]] = metadata !{metadata !"./template.hpp",
+// CHECK:![[BLOCK:.*]] = metadata !{{{.*}}, metadata ![[HPP]], {{.*}}} ; [ DW_TAG_lexical_block ]
+// CHECK: [[DBG]] = metadata !{i32 23, i32 0, metadata ![[BLOCK]], null}
+# 1 "./template.h" 1
+template <typename T>
+class Foo {
+public:
+ int bar();
+};
+# 21 "./template.hpp"
+template <typename T>
+int Foo<T>::bar() {
+}
+int main (int argc, const char * argv[])
+{
+  Foo<int> f;
+  f.bar();
+}





More information about the cfe-commits mailing list