]> granicus.if.org Git - clang/commitdiff
CGDebugInfo: At the end of EmitFunctionStart, Initialize PrevLoc to the
authorAdrian Prantl <aprantl@apple.com>
Fri, 21 Mar 2014 21:01:58 +0000 (21:01 +0000)
committerAdrian Prantl <aprantl@apple.com>
Fri, 21 Mar 2014 21:01:58 +0000 (21:01 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204517 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGDebugInfo.cpp
test/CodeGenCXX/linetable-fnbegin.cpp [new file with mode: 0644]

index cfc94430bdfd12f05f938f6c605617bbe9d5716f..1a3089a14b2dc2a7b2316d67f702246bf9c93289 100644 (file)
@@ -2577,9 +2577,12 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
   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);
 }
diff --git a/test/CodeGenCXX/linetable-fnbegin.cpp b/test/CodeGenCXX/linetable-fnbegin.cpp
new file mode 100644 (file)
index 0000000..8f8e4c9
--- /dev/null
@@ -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();
+}