From 631b3bcb22b9a21e0a0c7644c845e35761567138 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Fri, 21 Mar 2014 21:01:58 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204517 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGDebugInfo.cpp | 5 ++++- test/CodeGenCXX/linetable-fnbegin.cpp | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/CodeGenCXX/linetable-fnbegin.cpp diff --git a/lib/CodeGen/CGDebugInfo.cpp b/lib/CodeGen/CGDebugInfo.cpp index cfc94430bd..1a3089a14b 100644 --- a/lib/CodeGen/CGDebugInfo.cpp +++ b/lib/CodeGen/CGDebugInfo.cpp @@ -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 index 0000000000..8f8e4c9c78 --- /dev/null +++ b/test/CodeGenCXX/linetable-fnbegin.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -emit-llvm -g %s -o - | FileCheck %s +// Test that the line table info for Foo::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 +class Foo { +public: + int bar(); +}; +# 21 "./template.hpp" +template +int Foo::bar() { +} +int main (int argc, const char * argv[]) +{ + Foo f; + f.bar(); +} -- 2.50.1