diff options
author | David Blaikie <dblaikie@gmail.com> | 2014-05-25 18:11:35 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2014-05-25 18:11:35 +0000 |
commit | cec37248b2fb801d43718c810faa1736a1c95b60 (patch) | |
tree | 54f3e6deb3a190ce32d5878705d9ff884b60fea4 | |
parent | 7e79a350b58a1e40d090e5ec3dc5cb339358ed5a (diff) | |
download | llvm-cec37248b2fb801d43718c810faa1736a1c95b60.tar.gz llvm-cec37248b2fb801d43718c810faa1736a1c95b60.tar.bz2 llvm-cec37248b2fb801d43718c810faa1736a1c95b60.tar.xz |
DebugInfo: Fix inlining with #file directives a little harder
Seems my previous fix was insufficient - we were still not adding the
inlined function to the abstract scope list. Which meant it wasn't
flagged as inline, didn't have nested lexical scopes in the abstract
definition, and didn't have abstract variables - so the inlined variable
didn't reference an abstract variable, instead being described
completely inline.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209602 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/LexicalScopes.cpp | 10 | ||||
-rw-r--r-- | test/DebugInfo/inline-scopes.ll | 3 |
2 files changed, 8 insertions, 5 deletions
diff --git a/lib/CodeGen/LexicalScopes.cpp b/lib/CodeGen/LexicalScopes.cpp index d965968fb4..d12c234bf3 100644 --- a/lib/CodeGen/LexicalScopes.cpp +++ b/lib/CodeGen/LexicalScopes.cpp @@ -210,21 +210,21 @@ LexicalScope *LexicalScopes::getOrCreateAbstractScope(const MDNode *N) { DIDescriptor Scope(N); if (Scope.isLexicalBlockFile()) Scope = DILexicalBlockFile(Scope).getScope(); - auto I = AbstractScopeMap.find(N); + auto I = AbstractScopeMap.find(Scope); if (I != AbstractScopeMap.end()) return &I->second; LexicalScope *Parent = nullptr; if (Scope.isLexicalBlock()) { - DILexicalBlock DB(N); + DILexicalBlock DB(Scope); DIDescriptor ParentDesc = DB.getContext(); Parent = getOrCreateAbstractScope(ParentDesc); } I = AbstractScopeMap.emplace(std::piecewise_construct, - std::forward_as_tuple(N), - std::forward_as_tuple(Parent, DIDescriptor(N), + std::forward_as_tuple(Scope), + std::forward_as_tuple(Parent, Scope, nullptr, true)).first; - if (DIDescriptor(N).isSubprogram()) + if (Scope.isSubprogram()) AbstractScopesList.push_back(&I->second); return &I->second; } diff --git a/test/DebugInfo/inline-scopes.ll b/test/DebugInfo/inline-scopes.ll index 310b0404f8..36c073516c 100644 --- a/test/DebugInfo/inline-scopes.ll +++ b/test/DebugInfo/inline-scopes.ll @@ -32,6 +32,9 @@ ; Ensure that file changes don't interfere with creating inlined subroutines. ; (see the line directive inside 'f2' in thesource) ; CHECK: DW_TAG_inlined_subroutine +; CHECK: DW_TAG_variable +; CHECK-NOT: DW_TAG +; CHECK: DW_AT_abstract_origin ; Function Attrs: uwtable define i32 @main() #0 { |