[Lldb-commits] [lldb] r174476 - <rdar://problem/11109570>

Greg Clayton gclayton at apple.com
Tue Feb 5 16:38:25 PST 2013


Author: gclayton
Date: Tue Feb  5 18:38:25 2013
New Revision: 174476

URL: http://llvm.org/viewvc/llvm-project?rev=174476&view=rev
Log:
<rdar://problem/11109570>

The first part of the fix for having LLDB handle LTO debugging when the DWARF is in the .o files. This part separates the object file's modules into a separate cache map that maps unique C strings for the N_OSO path to the ModuleSP since one object file might be mentioned more than once in LTO binaries.


Modified:
    lldb/trunk/include/lldb/Symbol/ObjectFile.h
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
    lldb/trunk/source/Symbol/ObjectFile.cpp

Modified: lldb/trunk/include/lldb/Symbol/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ObjectFile.h?rev=174476&r1=174475&r2=174476&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ObjectFile.h (original)
+++ lldb/trunk/include/lldb/Symbol/ObjectFile.h Tue Feb  5 18:38:25 2013
@@ -204,7 +204,8 @@ public:
     static bool
     SplitArchivePathWithObject (const char *path_with_object,
                                 lldb_private::FileSpec &archive_file,
-                                lldb_private::ConstString &archive_object);
+                                lldb_private::ConstString &archive_object,
+                                bool must_exist);
 
     //------------------------------------------------------------------
     /// Gets the address size in bytes for the current object file.

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp?rev=174476&r1=174475&r2=174476&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Tue Feb  5 18:38:25 2013
@@ -48,11 +48,23 @@ public:
         m_exe_module_wp (exe_module_sp),
         m_cu_idx (cu_idx)
     {
+        LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
+        if (log)
+            log->Printf("%p: DebugMapModule::DebugMapModule (exe_module=%p, cu_idx=%u, oso_path='%s/%s', object_name='%s')",
+                        this,
+                        exe_module_sp.get(),
+                        cu_idx,
+                        file_spec.GetDirectory().GetCString(),
+                        file_spec.GetFilename().GetCString(),
+                        object_name ? object_name->GetCString() : "");
     }
 
     virtual
     ~DebugMapModule ()
     {
+        LogSP log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
+        if (log)
+            log->Printf("%p: DebugMapModule::~DebugMapModule ()", this);
     }
 
     virtual ObjectFile *
@@ -73,147 +85,150 @@ public:
                     SymbolFileDWARFDebugMap *exe_symfile = (SymbolFileDWARFDebugMap *)exe_sym_vendor->GetSymbolFile();
                     if (exe_symfile)
                     {
-                        SymbolFileDWARFDebugMap::CompileUnitInfo *comp_unit_info = exe_symfile->GetCompUnitInfo (this);
-                        if (comp_unit_info)
+                        std::vector<SymbolFileDWARFDebugMap::CompileUnitInfo *> cu_infos;
+                        if (exe_symfile->GetCompUnitInfosForModule(this, cu_infos))
                         {
-                            // Set the ID of the symbol file DWARF to the index of the OSO
-                            // shifted left by 32 bits to provide a unique prefix for any
-                            // UserID's that get created in the symbol file.
-                            //comp_unit_info->exe_sections_sp.reset(new SectionList);
-                            
-                            Symtab *exe_symtab = exe_objfile->GetSymtab();
-                            ModuleSP oso_module_sp (oso_objfile->GetModule());
-                            Symtab *oso_symtab = oso_objfile->GetSymtab();
-                            //#define DEBUG_OSO_DMAP    // Do not check in with this defined...
+                            for (auto comp_unit_info : cu_infos)
+                            {
+                                // Set the ID of the symbol file DWARF to the index of the OSO
+                                // shifted left by 32 bits to provide a unique prefix for any
+                                // UserID's that get created in the symbol file.
+                                //comp_unit_info->exe_sections_sp.reset(new SectionList);
+                                
+                                Symtab *exe_symtab = exe_objfile->GetSymtab();
+                                ModuleSP oso_module_sp (oso_objfile->GetModule());
+                                Symtab *oso_symtab = oso_objfile->GetSymtab();
+                                //#define DEBUG_OSO_DMAP    // Do not check in with this defined...
 #if defined(DEBUG_OSO_DMAP)
-                            StreamFile s(stdout);
-                            s << "OSO symtab:\n";
-                            oso_symtab->Dump(&s, NULL);
-                            s << "OSO sections before:\n";
-                            oso_objfile->GetSectionList()->Dump(&s, NULL, true);
+                                StreamFile s(stdout);
+                                s << "OSO symtab:\n";
+                                oso_symtab->Dump(&s, NULL);
+                                s << "OSO sections before:\n";
+                                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
 #endif
                     
-                            ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
-                            //SectionList *oso_sections = oso_objfile->Sections();
-                            // Now we need to make sections that map from zero based object
-                            // file addresses to where things eneded up in the main executable.
-
-                            assert (comp_unit_info->first_symbol_index != UINT32_MAX);
-                            // End index is one past the last valid symbol index
-                            const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
-                            uint32_t sect_id = 0x10000;
-                            for (uint32_t idx = comp_unit_info->first_symbol_index + 2; // Skip the N_SO and N_OSO
-                                 idx < oso_end_idx;
-                                 ++idx)
-                            {
-                                Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
-                                if (exe_symbol)
+                                ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
+                                //SectionList *oso_sections = oso_objfile->Sections();
+                                // Now we need to make sections that map from zero based object
+                                // file addresses to where things eneded up in the main executable.
+
+                                assert (comp_unit_info->first_symbol_index != UINT32_MAX);
+                                // End index is one past the last valid symbol index
+                                const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1;
+                                uint32_t sect_id = 0x10000;
+                                for (uint32_t idx = comp_unit_info->first_symbol_index + 2; // Skip the N_SO and N_OSO
+                                     idx < oso_end_idx;
+                                     ++idx)
                                 {
-                                    if (exe_symbol->IsDebug() == false)
-                                        continue;
-                                    
-                                    switch (exe_symbol->GetType())
+                                    Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx);
+                                    if (exe_symbol)
                                     {
-                                        default:
-                                            break;
-                                            
-                                        case eSymbolTypeCode:
+                                        if (exe_symbol->IsDebug() == false)
+                                            continue;
+                                        
+                                        switch (exe_symbol->GetType())
                                         {
-                                            // For each N_FUN, or function that we run into in the debug map
-                                            // we make a new section that we add to the sections found in the
-                                            // .o file. This new section has the file address set to what the
-                                            // addresses are in the .o file, and the load address is adjusted
-                                            // to match where it ended up in the final executable! We do this
-                                            // before we parse any dwarf info so that when it goes get parsed
-                                            // all section/offset addresses that get registered will resolve
-                                            // correctly to the new addresses in the main executable.
-                                            
-                                            // First we find the original symbol in the .o file's symbol table
-                                            Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
-                                            if (oso_fun_symbol)
+                                            default:
+                                                break;
+                                                
+                                            case eSymbolTypeCode:
                                             {
-                                                // If we found the symbol, then we
-                                                SectionSP exe_fun_section (exe_symbol->GetAddress().GetSection());
-                                                SectionSP oso_fun_section (oso_fun_symbol->GetAddress().GetSection());
-                                                if (oso_fun_section)
+                                                // For each N_FUN, or function that we run into in the debug map
+                                                // we make a new section that we add to the sections found in the
+                                                // .o file. This new section has the file address set to what the
+                                                // addresses are in the .o file, and the load address is adjusted
+                                                // to match where it ended up in the final executable! We do this
+                                                // before we parse any dwarf info so that when it goes get parsed
+                                                // all section/offset addresses that get registered will resolve
+                                                // correctly to the new addresses in the main executable.
+                                                
+                                                // First we find the original symbol in the .o file's symbol table
+                                                Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny);
+                                                if (oso_fun_symbol)
                                                 {
-                                                    // Now we create a section that we will add as a child of the
-                                                    // section in which the .o symbol (the N_FUN) exists.
-                                                    
-                                                    // We use the exe_symbol size because the one in the .o file
-                                                    // will just be a symbol with no size, and the exe_symbol
-                                                    // size will reflect any size changes (ppc has been known to
-                                                    // shrink function sizes when it gets rid of jump islands that
-                                                    // aren't needed anymore).
-                                                    SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddress().GetSection(),
-                                                                                               oso_module_sp,                         // Module (the .o file)
-                                                                                               sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
-                                                                                               exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
-                                                                                               eSectionTypeDebug,
-                                                                                               oso_fun_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
-                                                                                               exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
-                                                                                               0, 0, 0));
-                                                    
-                                                    oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
-                                                                                           exe_symbol->GetAddress().GetFileAddress() - exe_fun_section->GetFileAddress());
-                                                    oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
+                                                    // If we found the symbol, then we
+                                                    SectionSP exe_fun_section (exe_symbol->GetAddress().GetSection());
+                                                    SectionSP oso_fun_section (oso_fun_symbol->GetAddress().GetSection());
+                                                    if (oso_fun_section)
+                                                    {
+                                                        // Now we create a section that we will add as a child of the
+                                                        // section in which the .o symbol (the N_FUN) exists.
+                                                        
+                                                        // We use the exe_symbol size because the one in the .o file
+                                                        // will just be a symbol with no size, and the exe_symbol
+                                                        // size will reflect any size changes (ppc has been known to
+                                                        // shrink function sizes when it gets rid of jump islands that
+                                                        // aren't needed anymore).
+                                                        SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddress().GetSection(),
+                                                                                                   oso_module_sp,                         // Module (the .o file)
+                                                                                                   sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
+                                                                                                   exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
+                                                                                                   eSectionTypeDebug,
+                                                                                                   oso_fun_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
+                                                                                                   exe_symbol->GetByteSize(),          // File size (we need the size from the executable)
+                                                                                                   0, 0, 0));
+                                                        
+                                                        oso_fun_section_sp->SetLinkedLocation (exe_fun_section,
+                                                                                               exe_symbol->GetAddress().GetFileAddress() - exe_fun_section->GetFileAddress());
+                                                        oso_fun_section->GetChildren().AddSection(oso_fun_section_sp);
+                                                    }
                                                 }
                                             }
-                                        }
-                                            break;
-                                            
-                                        case eSymbolTypeData:
-                                        {
-                                            // For each N_GSYM we remap the address for the global by making
-                                            // a new section that we add to the sections found in the .o file.
-                                            // This new section has the file address set to what the
-                                            // addresses are in the .o file, and the load address is adjusted
-                                            // to match where it ended up in the final executable! We do this
-                                            // before we parse any dwarf info so that when it goes get parsed
-                                            // all section/offset addresses that get registered will resolve
-                                            // correctly to the new addresses in the main executable. We
-                                            // initially set the section size to be 1 byte, but will need to
-                                            // fix up these addresses further after all globals have been
-                                            // parsed to span the gaps, or we can find the global variable
-                                            // sizes from the DWARF info as we are parsing.
-                                            
-                                            // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
-                                            Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(),
-                                                                                                                  eSymbolTypeData,
-                                                                                                                  Symtab::eDebugNo,
-                                                                                                                  Symtab::eVisibilityAny);
-                                            
-                                            if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() && oso_gsym_symbol->ValueIsAddress())
+                                                break;
+                                                
+                                            case eSymbolTypeData:
                                             {
-                                                // If we found the symbol, then we
-                                                SectionSP exe_gsym_section (exe_symbol->GetAddress().GetSection());
-                                                SectionSP oso_gsym_section (oso_gsym_symbol->GetAddress().GetSection());
-                                                if (oso_gsym_section)
+                                                // For each N_GSYM we remap the address for the global by making
+                                                // a new section that we add to the sections found in the .o file.
+                                                // This new section has the file address set to what the
+                                                // addresses are in the .o file, and the load address is adjusted
+                                                // to match where it ended up in the final executable! We do this
+                                                // before we parse any dwarf info so that when it goes get parsed
+                                                // all section/offset addresses that get registered will resolve
+                                                // correctly to the new addresses in the main executable. We
+                                                // initially set the section size to be 1 byte, but will need to
+                                                // fix up these addresses further after all globals have been
+                                                // parsed to span the gaps, or we can find the global variable
+                                                // sizes from the DWARF info as we are parsing.
+                                                
+                                                // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file
+                                                Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(),
+                                                                                                                      eSymbolTypeData,
+                                                                                                                      Symtab::eDebugNo,
+                                                                                                                      Symtab::eVisibilityAny);
+                                                
+                                                if (exe_symbol && oso_gsym_symbol && exe_symbol->ValueIsAddress() && oso_gsym_symbol->ValueIsAddress())
                                                 {
-                                                    SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddress().GetSection(),
-                                                                                                oso_module_sp,                         // Module (the .o file)
-                                                                                                sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
-                                                                                                exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
-                                                                                                eSectionTypeDebug,
-                                                                                                oso_gsym_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
-                                                                                                1,                                   // We don't know the size of the global, just do the main address for now.
-                                                                                                0, 0, 0));
-                                                    
-                                                    oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
-                                                                                            exe_symbol->GetAddress().GetFileAddress() - exe_gsym_section->GetFileAddress());
-                                                    oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
+                                                    // If we found the symbol, then we
+                                                    SectionSP exe_gsym_section (exe_symbol->GetAddress().GetSection());
+                                                    SectionSP oso_gsym_section (oso_gsym_symbol->GetAddress().GetSection());
+                                                    if (oso_gsym_section)
+                                                    {
+                                                        SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddress().GetSection(),
+                                                                                                    oso_module_sp,                         // Module (the .o file)
+                                                                                                    sect_id++,                          // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs
+                                                                                                    exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated!
+                                                                                                    eSectionTypeDebug,
+                                                                                                    oso_gsym_symbol->GetAddress().GetOffset(),  // File VM address offset in the current section
+                                                                                                    1,                                   // We don't know the size of the global, just do the main address for now.
+                                                                                                    0, 0, 0));
+                                                        
+                                                        oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section,
+                                                                                                exe_symbol->GetAddress().GetFileAddress() - exe_gsym_section->GetFileAddress());
+                                                        oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp);
+                                                    }
                                                 }
                                             }
+                                                break;
                                         }
-                                            break;
                                     }
                                 }
+                                oso_objfile->GetSectionList()->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches
+    #if defined(DEBUG_OSO_DMAP)
+                                s << "OSO sections after:\n";
+                                oso_objfile->GetSectionList()->Dump(&s, NULL, true);
+    #endif
                             }
-                            oso_objfile->GetSectionList()->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches
-#if defined(DEBUG_OSO_DMAP)
-                            s << "OSO sections after:\n";
-                            oso_objfile->GetSectionList()->Dump(&s, NULL, true);
-#endif
                         }
                     }
                 }
@@ -390,8 +405,9 @@ SymbolFileDWARFDebugMap::InitOSO()
 
             for (uint32_t i=0; i<oso_index_count; ++i)
             {
+                const uint32_t so_idx = oso_indexes[i] - 1;
                 const uint32_t oso_idx = oso_indexes[i];
-                const Symbol *so_symbol = symtab->SymbolAtIndex(oso_idx - 1);
+                const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx);
                 const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx);
                 if (so_symbol &&
                     oso_symbol &&
@@ -399,7 +415,7 @@ SymbolFileDWARFDebugMap::InitOSO()
                     oso_symbol->GetType() == eSymbolTypeObjectFile)
                 {
                     m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(), true);
-                    m_compile_unit_infos[i].oso_file.SetFile(oso_symbol->GetName().AsCString(), true);
+                    m_compile_unit_infos[i].oso_path = oso_symbol->GetName();
                     uint32_t sibling_idx = so_symbol->GetSiblingIndex();
                     // The sibling index can't be less that or equal to the current index "i"
                     if (sibling_idx <= i)
@@ -409,8 +425,8 @@ SymbolFileDWARFDebugMap::InitOSO()
                     else
                     {
                         const Symbol* last_symbol = symtab->SymbolAtIndex (sibling_idx - 1);
-                        m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(so_symbol);
-                        m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(last_symbol);
+                        m_compile_unit_infos[i].first_symbol_index = so_idx;
+                        m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1;
                         m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID();
                         m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID();
                         
@@ -446,37 +462,48 @@ SymbolFileDWARFDebugMap::GetModuleByOSOI
 Module *
 SymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info)
 {
-    if (comp_unit_info->oso_module_sp.get() == NULL && comp_unit_info->symbol_file_supported)
+    if (!comp_unit_info->oso_sp)
     {
-        if (!comp_unit_info->oso_file.Exists())
+        auto pos = m_oso_map.find (comp_unit_info->oso_path);
+        if (pos != m_oso_map.end())
         {
-            char path[PATH_MAX*2];
-            comp_unit_info->oso_file.GetPath(path, sizeof(path));
-            if (ObjectFile::SplitArchivePathWithObject (path,
-                                                        comp_unit_info->oso_file,
-                                                        comp_unit_info->oso_object))
-            {
-                comp_unit_info->oso_file.GetPath(path, sizeof(path));
-                //printf ("resolved archive '%s' and object '%s'\n", path, comp_unit_info->oso_object.GetCString());
-            }
-            else
+            comp_unit_info->oso_sp = pos->second;
+        }
+        else
+        {
+            comp_unit_info->oso_sp.reset (new OSOInfo());
+            m_oso_map[comp_unit_info->oso_path] = comp_unit_info->oso_sp;
+            const char *oso_path = comp_unit_info->oso_path.GetCString();
+            FileSpec oso_file (oso_path, true);
+            ConstString oso_object;
+            if (!oso_file.Exists())
             {
-                comp_unit_info->symbol_file_supported = false;
-                return NULL;
+                const bool must_exist = true;
+
+                if (!ObjectFile::SplitArchivePathWithObject (oso_path,
+                                                             oso_file,
+                                                             oso_object,
+                                                             must_exist))
+                {
+                    comp_unit_info->oso_sp->symbol_file_supported = false;
+                    return NULL;
+                }
             }
+            // Always create a new module for .o files. Why? Because we
+            // use the debug map, to add new sections to each .o file and
+            // even though a .o file might not have changed, the sections
+            // that get added to the .o file can change.
+            comp_unit_info->oso_sp->module_sp.reset (new DebugMapModule (GetObjectFile()->GetModule(),
+                                                                         GetCompUnitInfoIndex(comp_unit_info),
+                                                                         oso_file,
+                                                                         m_obj_file->GetModule()->GetArchitecture(),
+                                                                         oso_object ? &oso_object : NULL,
+                                                                         0));
         }
-        // Always create a new module for .o files. Why? Because we
-        // use the debug map, to add new sections to each .o file and
-        // even though a .o file might not have changed, the sections
-        // that get added to the .o file can change.
-        comp_unit_info->oso_module_sp.reset (new DebugMapModule (GetObjectFile()->GetModule(),
-                                                                 GetCompUnitInfoIndex(comp_unit_info),
-                                                                 comp_unit_info->oso_file,
-                                                                 m_obj_file->GetModule()->GetArchitecture(),
-                                                                 comp_unit_info->oso_object ? &comp_unit_info->oso_object : NULL,
-                                                                 0));
     }
-    return comp_unit_info->oso_module_sp.get();
+    if (comp_unit_info->oso_sp)
+        return comp_unit_info->oso_sp->module_sp.get();
+    return NULL;
 }
 
 
@@ -610,8 +637,8 @@ SymbolFileDWARFDebugMap::ParseCompileUni
 
     if (cu_idx < cu_count)
     {
-        if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL &&
-            m_compile_unit_infos[cu_idx].symbol_file_supported)
+        Module *oso_module = GetModuleByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
+        if (oso_module)
         {
             FileSpec so_file_spec;
             if (GetFileSpecForSO (cu_idx, so_file_spec))
@@ -623,31 +650,31 @@ SymbolFileDWARFDebugMap::ParseCompileUni
                      // zero in each .o file since each .o file can only have
                      // one compile unit for now.
                     lldb::user_id_t cu_id = 0;
-                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset (new CompileUnit (oso_module->shared_from_this(),
+                    m_compile_unit_infos[cu_idx].compile_unit_sp.reset (new CompileUnit (oso_module->shared_from_this(),
                                                                                              NULL,
                                                                                              so_file_spec,
                                                                                              cu_id,
                                                                                              eLanguageTypeUnknown));
                 }
 
-                if (!m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+                if (!m_compile_unit_infos[cu_idx].compile_unit_sp)
                 {
-                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
+                    m_compile_unit_infos[cu_idx].compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(),
                                                                                             NULL,
                                                                                             so_file_spec,
                                                                                             cu_idx,
                                                                                             eLanguageTypeUnknown));
                 }
             
-                if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+                if (m_compile_unit_infos[cu_idx].compile_unit_sp)
                 {
                     // Let our symbol vendor know about this compile unit
                     m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (cu_idx,
-                                                                                       m_compile_unit_infos[cu_idx].oso_compile_unit_sp);
+                                                                                       m_compile_unit_infos[cu_idx].compile_unit_sp);
                 }
             }
         }
-        comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp;
+        comp_unit_sp = m_compile_unit_infos[cu_idx].compile_unit_sp;
     }
 
     return comp_unit_sp;
@@ -659,23 +686,23 @@ SymbolFileDWARFDebugMap::GetCompUnitInfo
     const uint32_t cu_count = GetNumCompileUnits();
     for (uint32_t i=0; i<cu_count; ++i)
     {
-        if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get())
+        if (sc.comp_unit == m_compile_unit_infos[i].compile_unit_sp.get())
             return &m_compile_unit_infos[i];
     }
     return NULL;
 }
 
 
-SymbolFileDWARFDebugMap::CompileUnitInfo *
-SymbolFileDWARFDebugMap::GetCompUnitInfo (const lldb_private::Module *module)
+size_t
+SymbolFileDWARFDebugMap::GetCompUnitInfosForModule (const lldb_private::Module *module, std::vector<CompileUnitInfo *>& cu_infos)
 {
     const uint32_t cu_count = GetNumCompileUnits();
     for (uint32_t i=0; i<cu_count; ++i)
     {
-        if (module == m_compile_unit_infos[i].oso_module_sp.get())
-            return &m_compile_unit_infos[i];
+        if (module == GetModuleByCompUnitInfo (&m_compile_unit_infos[i]))
+            cu_infos.push_back (&m_compile_unit_infos[i]);
     }
-    return NULL;
+    return cu_infos.size();
 }
 
 lldb::LanguageType
@@ -1269,10 +1296,10 @@ SymbolFileDWARFDebugMap::GetCompileUnit
             SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
             if (oso_symfile == oso_dwarf)
             {
-                if (!m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
-                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp = ParseCompileUnitAtIndex (cu_idx);
+                if (!m_compile_unit_infos[cu_idx].compile_unit_sp)
+                    m_compile_unit_infos[cu_idx].compile_unit_sp = ParseCompileUnitAtIndex (cu_idx);
 
-                return m_compile_unit_infos[cu_idx].oso_compile_unit_sp;
+                return m_compile_unit_infos[cu_idx].compile_unit_sp;
             }
         }
     }
@@ -1292,13 +1319,13 @@ SymbolFileDWARFDebugMap::SetCompileUnit
             SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]);
             if (oso_symfile == oso_dwarf)
             {
-                if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp)
+                if (m_compile_unit_infos[cu_idx].compile_unit_sp)
                 {
-                    assert (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == cu_sp.get());
+                    assert (m_compile_unit_infos[cu_idx].compile_unit_sp.get() == cu_sp.get());
                 }
                 else
                 {
-                    m_compile_unit_infos[cu_idx].oso_compile_unit_sp = cu_sp;
+                    m_compile_unit_infos[cu_idx].compile_unit_sp = cu_sp;
                     m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp);
                 }
             }

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h?rev=174476&r1=174475&r2=174476&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h Tue Feb  5 18:38:25 2013
@@ -129,41 +129,43 @@ protected:
 
     friend class SymbolFileDWARF;
     friend class DebugMapModule;
+    struct OSOInfo
+    {
+        lldb::ModuleSP module_sp;
+        bool symbol_file_supported;
+        
+        OSOInfo() :
+            module_sp (),
+            symbol_file_supported (true)
+        {
+        }
+    };
+    
+    typedef STD_SHARED_PTR(OSOInfo) OSOInfoSP;
+
     //------------------------------------------------------------------
     // Class specific types
     //------------------------------------------------------------------
     struct CompileUnitInfo
     {
         lldb_private::FileSpec so_file;
-        lldb_private::FileSpec oso_file;
-        lldb_private::ConstString oso_object; // for archives this will be the .o file in the "oso_file"
-//        lldb_private::Symbol *so_symbol;
-//        lldb_private::Symbol *oso_symbol;
-//        lldb_private::Symbol *last_symbol;
+        lldb_private::ConstString oso_path;
+        OSOInfoSP oso_sp;
+        lldb::CompUnitSP compile_unit_sp;
         uint32_t first_symbol_index;
         uint32_t last_symbol_index;
         uint32_t first_symbol_id;
         uint32_t last_symbol_id;
-        lldb::ModuleSP oso_module_sp;
-        lldb::CompUnitSP oso_compile_unit_sp;
-//        SymbolFileDWARF *oso_symfile;
-        bool symbol_file_supported;
 
         CompileUnitInfo() :
             so_file (),
-            oso_file (),
-            oso_object (),
-//            so_symbol (NULL),
-//            oso_symbol (NULL),
-//            last_symbol (NULL),
+            oso_path (),
+            oso_sp (),
+            compile_unit_sp (),
             first_symbol_index (UINT32_MAX),
             last_symbol_index (UINT32_MAX),
             first_symbol_id (UINT32_MAX),
-            last_symbol_id (UINT32_MAX),
-            oso_module_sp (),
-            oso_compile_unit_sp (),
-//            oso_symfile (NULL),
-            symbol_file_supported (true)
+            last_symbol_id (UINT32_MAX)
         {
         }
     };
@@ -185,8 +187,9 @@ protected:
     CompileUnitInfo *
     GetCompUnitInfo (const lldb_private::SymbolContext& sc);
 
-    CompileUnitInfo *
-    GetCompUnitInfo (const lldb_private::Module *oso_module);
+    size_t
+    GetCompUnitInfosForModule (const lldb_private::Module *oso_module,
+                               std::vector<CompileUnitInfo *>& cu_infos);
     
     lldb_private::Module *
     GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info);
@@ -262,6 +265,7 @@ protected:
     std::vector<CompileUnitInfo> m_compile_unit_infos;
     std::vector<uint32_t> m_func_indexes;   // Sorted by address
     std::vector<uint32_t> m_glob_indexes;
+    std::map<lldb_private::ConstString, OSOInfoSP> m_oso_map;
     UniqueDWARFASTTypeMap m_unique_ast_type_map;
     lldb_private::LazyBool m_supports_DW_AT_APPLE_objc_complete_type;
 };

Modified: lldb/trunk/source/Symbol/ObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ObjectFile.cpp?rev=174476&r1=174475&r2=174476&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ObjectFile.cpp (original)
+++ lldb/trunk/source/Symbol/ObjectFile.cpp Tue Feb  5 18:38:25 2013
@@ -55,7 +55,8 @@ ObjectFile::FindPlugin (const lldb::Modu
 
                 FileSpec archive_file;
                 ConstString archive_object;
-                if (ObjectFile::SplitArchivePathWithObject (path_with_object, archive_file, archive_object))
+                const bool must_exist = true;
+                if (ObjectFile::SplitArchivePathWithObject (path_with_object, archive_file, archive_object, must_exist))
                 {
                     file_size = archive_file.GetByteSize();
                     if (file_size > 0)
@@ -449,7 +450,7 @@ ObjectFile::MemoryMapSectionData (const
 
 
 bool
-ObjectFile::SplitArchivePathWithObject (const char *path_with_object, FileSpec &archive_file, ConstString &archive_object)
+ObjectFile::SplitArchivePathWithObject (const char *path_with_object, FileSpec &archive_file, ConstString &archive_object, bool must_exist)
 {
     RegularExpression g_object_regex("(.*)\\(([^\\)]+)\\)$");
     if (g_object_regex.Execute (path_with_object, 2))
@@ -461,6 +462,8 @@ ObjectFile::SplitArchivePathWithObject (
         {
             archive_file.SetFile (path.c_str(), false);
             archive_object.SetCString(obj.c_str());
+            if (must_exist && !archive_file.Exists())
+                return false;
             return true;
         }
     }





More information about the lldb-commits mailing list