This revision was automatically updated to reflect the committed changes.
Closed by commit rL264729: Fix infinite recursion in DWO file parsing (authored 
by labath).

Changed prior to commit:
  http://reviews.llvm.org/D18547?vs=51896&id=51897#toc

Repository:
  rL LLVM

http://reviews.llvm.org/D18547

Files:
  lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
  lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
  lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
  lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h

Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
===================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDwo.h
@@ -38,6 +38,12 @@
     lldb_private::TypeSystem*
     GetTypeSystemForLanguage(lldb::LanguageType language) override;
 
+    std::unique_ptr<SymbolFileDWARFDwo>
+    GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die) override
+    {
+        return nullptr;
+    }
+
 protected:
     void
     LoadSectionData (lldb::SectionType sect_type, lldb_private::DWARFDataExtractor& data) override;
Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
===================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
@@ -58,6 +58,7 @@
 class DWARFDIECollection;
 class DWARFFormValue;
 class SymbolFileDWARFDebugMap;
+class SymbolFileDWARFDwo;
 
 #define DIE_IS_BEING_PARSED ((lldb_private::Type*)1)
 
@@ -329,6 +330,9 @@
     lldb::ModuleSP
     GetDWOModule (lldb_private::ConstString name);
 
+    virtual std::unique_ptr<SymbolFileDWARFDwo>
+    GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die);
+
 protected:
     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb_private::Type *> DIEToTypePtr;
     typedef llvm::DenseMap<const DWARFDebugInfoEntry *, lldb::VariableSP> DIEToVariableSP;
Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
===================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFCompileUnit.cpp
@@ -311,46 +311,12 @@
 {
     assert (m_die_array.empty() && "Compile unit DIE already added");
     AddDIE(die);
-    
-    DWARFDebugInfoEntry& cu_die = m_die_array.front();
-
-    const char* dwo_name = cu_die.GetAttributeValueAsString(m_dwarf2Data,
-                                                            this,
-                                                            DW_AT_GNU_dwo_name,
-                                                            nullptr);
-    if (!dwo_name)
-        return;
-
-    FileSpec dwo_file(dwo_name, true);
-    if (dwo_file.IsRelative())
-    {
-        const char* comp_dir = cu_die.GetAttributeValueAsString(m_dwarf2Data,
-                                                                this,
-                                                                DW_AT_comp_dir,
-                                                                nullptr);
-        if (!comp_dir)
-            return;
 
-        dwo_file.SetFile(comp_dir, true);
-        dwo_file.AppendPathComponent(dwo_name);
-    }
-
-    if (!dwo_file.Exists())
+    const DWARFDebugInfoEntry &cu_die = m_die_array.front();
+    std::unique_ptr<SymbolFileDWARFDwo> dwo_symbol_file = m_dwarf2Data->GetDwoSymbolFileForCompileUnit(*this, cu_die);
+    if (!dwo_symbol_file)
         return;
 
-    DataBufferSP dwo_file_data_sp;
-    lldb::offset_t dwo_file_data_offset = 0;
-    ObjectFileSP dwo_obj_file = ObjectFile::FindPlugin(m_dwarf2Data->GetObjectFile()->GetModule(),
-                                                       &dwo_file,
-                                                       0 /* file_offset */,
-                                                       dwo_file.GetByteSize(),
-                                                       dwo_file_data_sp,
-                                                       dwo_file_data_offset);
-    if (dwo_obj_file == nullptr)
-        return;
-
-    std::unique_ptr<SymbolFileDWARFDwo> dwo_symbol_file(new SymbolFileDWARFDwo(dwo_obj_file, this));
-
     DWARFCompileUnit* dwo_cu = dwo_symbol_file->GetCompileUnit();
     if (!dwo_cu)
         return; // Can't fetch the compile unit from the dwo file.
Index: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
===================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1763,6 +1763,38 @@
         return lldb::ModuleSP();
 }
 
+std::unique_ptr<SymbolFileDWARFDwo>
+SymbolFileDWARF::GetDwoSymbolFileForCompileUnit(DWARFCompileUnit &dwarf_cu, const DWARFDebugInfoEntry &cu_die)
+{
+    const char *dwo_name = cu_die.GetAttributeValueAsString(this, &dwarf_cu, DW_AT_GNU_dwo_name, nullptr);
+    if (!dwo_name)
+        return nullptr;
+
+    FileSpec dwo_file(dwo_name, true);
+    if (dwo_file.IsRelative())
+    {
+        const char *comp_dir = cu_die.GetAttributeValueAsString(this, &dwarf_cu, DW_AT_comp_dir, nullptr);
+        if (!comp_dir)
+            return nullptr;
+
+        dwo_file.SetFile(comp_dir, true);
+        dwo_file.AppendPathComponent(dwo_name);
+    }
+
+    if (!dwo_file.Exists())
+        return nullptr;
+
+    const lldb::offset_t file_offset = 0;
+    DataBufferSP dwo_file_data_sp;
+    lldb::offset_t dwo_file_data_offset = 0;
+    ObjectFileSP dwo_obj_file = ObjectFile::FindPlugin(GetObjectFile()->GetModule(), &dwo_file, file_offset,
+                                                       dwo_file.GetByteSize(), dwo_file_data_sp, dwo_file_data_offset);
+    if (dwo_obj_file == nullptr)
+        return nullptr;
+
+    return llvm::make_unique<SymbolFileDWARFDwo>(dwo_obj_file, &dwarf_cu);
+}
+
 void
 SymbolFileDWARF::UpdateExternalModuleListIfNeeded()
 {
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to