labath created this revision.
labath added reviewers: tberghammer, clayborg.
labath added a subscriber: lldb-commits.

In case of Dwo, DIERef stores a compile unit offset in the main object file, 
and not in the dwo.
The implementation of SymbolFileDWARFDwo::GetDIE inherited from SymbolFileDWARF 
tried to lookup
the compilation unit in the DWO based on the main object file offset (and 
failed). I change the
implementation to verify the DIERef indeed references compile unit belonging to 
this dwo and then
lookup the die based on the die offset alone.

Includes a couple of fixes for mismatched struct/class tags.

http://reviews.llvm.org/D18646

Files:
  source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
  source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
  source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
  source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h

Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
@@ -38,6 +38,9 @@
     lldb_private::TypeSystem*
     GetTypeSystemForLanguage(lldb::LanguageType language) override;
 
+    DWARFDIE
+    GetDIE(const DIERef &die_ref) override;
+
     std::unique_ptr<SymbolFileDWARFDwo>
     GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const 
DWARFDebugInfoEntry &cu_die) override
     {
Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
@@ -129,3 +129,10 @@
 {
     return GetBaseSymbolFile()->GetTypeSystemForLanguage(language);
 }
+
+DWARFDIE
+SymbolFileDWARFDwo::GetDIE(const DIERef &die_ref)
+{
+    assert(m_base_dwarf_cu->GetOffset() == die_ref.cu_offset);
+    return DebugInfo()->GetDIEForDIEOffset(die_ref.die_offset);
+}
Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -108,7 +108,7 @@
     };
 
     friend class DebugMapModule;
-    friend class DIERef;
+    friend struct DIERef;
     friend class DWARFASTParserClang;
     friend class DWARFCompileUnit;
     friend class SymbolFileDWARF;
Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -68,7 +68,7 @@
     friend class SymbolFileDWARFDebugMap;
     friend class SymbolFileDWARFDwo;
     friend class DebugMapModule;
-    friend class DIERef;
+    friend struct DIERef;
     friend class DWARFCompileUnit;
     friend class DWARFDIE;
     friend class DWARFASTParserClang;
@@ -326,7 +326,7 @@
     lldb::ModuleSP
     GetDWOModule (lldb_private::ConstString name);
 
-    DWARFDIE
+    virtual DWARFDIE
     GetDIE(const DIERef &die_ref);
 
     virtual std::unique_ptr<SymbolFileDWARFDwo>


Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
@@ -38,6 +38,9 @@
     lldb_private::TypeSystem*
     GetTypeSystemForLanguage(lldb::LanguageType language) override;
 
+    DWARFDIE
+    GetDIE(const DIERef &die_ref) override;
+
     std::unique_ptr<SymbolFileDWARFDwo>
     GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) override
     {
Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.cpp
@@ -129,3 +129,10 @@
 {
     return GetBaseSymbolFile()->GetTypeSystemForLanguage(language);
 }
+
+DWARFDIE
+SymbolFileDWARFDwo::GetDIE(const DIERef &die_ref)
+{
+    assert(m_base_dwarf_cu->GetOffset() == die_ref.cu_offset);
+    return DebugInfo()->GetDIEForDIEOffset(die_ref.die_offset);
+}
Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
@@ -108,7 +108,7 @@
     };
 
     friend class DebugMapModule;
-    friend class DIERef;
+    friend struct DIERef;
     friend class DWARFASTParserClang;
     friend class DWARFCompileUnit;
     friend class SymbolFileDWARF;
Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
===================================================================
--- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -68,7 +68,7 @@
     friend class SymbolFileDWARFDebugMap;
     friend class SymbolFileDWARFDwo;
     friend class DebugMapModule;
-    friend class DIERef;
+    friend struct DIERef;
     friend class DWARFCompileUnit;
     friend class DWARFDIE;
     friend class DWARFASTParserClang;
@@ -326,7 +326,7 @@
     lldb::ModuleSP
     GetDWOModule (lldb_private::ConstString name);
 
-    DWARFDIE
+    virtual DWARFDIE
     GetDIE(const DIERef &die_ref);
 
     virtual std::unique_ptr<SymbolFileDWARFDwo>
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to