[Lldb-commits] [lldb] r185366 - Split symbol support for ELF and Linux.

Michael Sartain mikesart at valvesoftware.com
Mon Jul 1 12:45:51 PDT 2013


Author: mikesart
Date: Mon Jul  1 14:45:50 2013
New Revision: 185366

URL: http://llvm.org/viewvc/llvm-project?rev=185366&view=rev
Log:
Split symbol support for ELF and Linux.

Added:
    lldb/trunk/source/Plugins/SymbolVendor/ELF/
    lldb/trunk/source/Plugins/SymbolVendor/ELF/CMakeLists.txt
    lldb/trunk/source/Plugins/SymbolVendor/ELF/Makefile
    lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
    lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h
Modified:
    lldb/trunk/include/lldb/Core/Module.h
    lldb/trunk/include/lldb/Core/Section.h
    lldb/trunk/include/lldb/Core/UUID.h
    lldb/trunk/include/lldb/Symbol/ObjectFile.h
    lldb/trunk/include/lldb/Symbol/SymbolVendor.h
    lldb/trunk/include/lldb/Target/Target.h
    lldb/trunk/include/lldb/lldb-enumerations.h
    lldb/trunk/lib/Makefile
    lldb/trunk/source/API/SBModule.cpp
    lldb/trunk/source/CMakeLists.txt
    lldb/trunk/source/Commands/CommandObjectTarget.cpp
    lldb/trunk/source/Core/Address.cpp
    lldb/trunk/source/Core/Module.cpp
    lldb/trunk/source/Core/Section.cpp
    lldb/trunk/source/Core/UUID.cpp
    lldb/trunk/source/Host/common/Symbols.cpp
    lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
    lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
    lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
    lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
    lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
    lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
    lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
    lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
    lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
    lldb/trunk/source/Plugins/SymbolVendor/CMakeLists.txt
    lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
    lldb/trunk/source/Symbol/Function.cpp
    lldb/trunk/source/Symbol/ObjectFile.cpp
    lldb/trunk/source/Symbol/Symbol.cpp
    lldb/trunk/source/Symbol/SymbolVendor.cpp
    lldb/trunk/source/Target/Target.cpp
    lldb/trunk/source/lldb.cpp

Modified: lldb/trunk/include/lldb/Core/Module.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Module.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Module.h (original)
+++ lldb/trunk/include/lldb/Core/Module.h Mon Jul  1 14:45:50 2013
@@ -45,7 +45,7 @@ class Module :
     public SymbolContextScope
 {
 public:
-	// Static functions that can track the lifetime of moodule objects.
+	// Static functions that can track the lifetime of module objects.
 	// This is handy because we might have Module objects that are in
 	// shared pointers that aren't in the global module list (from 
 	// ModuleList). If this is the case we need to know about it.
@@ -638,7 +638,21 @@ public:
     //------------------------------------------------------------------
     virtual ObjectFile *
     GetObjectFile ();
-    
+
+    //------------------------------------------------------------------
+    /// Get the unified section list for the module. This is the section
+    /// list created by the module's object file and any debug info and
+    /// symbol files created by the symbol vendor.
+    ///
+    /// If the symbol vendor has not been loaded yet, this function
+    /// will return the section list for the object file.
+    ///
+    /// @return
+    ///     Unified module section list.
+    //------------------------------------------------------------------
+    virtual SectionList *
+    GetUnifiedSectionList ();
+ 
     uint32_t
     GetVersion (uint32_t *versions, uint32_t num_versions);
 
@@ -986,6 +1000,7 @@ protected:
     std::unique_ptr<SymbolVendor> m_symfile_ap;   ///< A pointer to the symbol vendor for this module.
     ClangASTContext             m_ast;          ///< The AST context for this module.
     PathMappingList             m_source_mappings; ///< Module specific source remappings for when you have debug info for a module that doesn't match where the sources currently are
+    std::unique_ptr<lldb_private::SectionList> m_unified_sections_ap; ///< Unified section list for module.
 
     bool                        m_did_load_objfile:1,
                                 m_did_load_symbol_vendor:1,

Modified: lldb/trunk/include/lldb/Core/Section.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Section.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Section.h (original)
+++ lldb/trunk/include/lldb/Core/Section.h Mon Jul  1 14:45:50 2013
@@ -18,6 +18,7 @@
 #include "lldb/Core/RangeMap.h"
 #include "lldb/Core/UserID.h"
 #include "lldb/Core/VMRange.h"
+#include "lldb/Symbol/ObjectFile.h"
 #include <limits.h>
 
 namespace lldb_private {
@@ -33,6 +34,9 @@ public:
 
     ~SectionList();
 
+    bool
+    Copy (SectionList* dest_section_list);
+
     size_t
     AddSection (const lldb::SectionSP& section_sp);
 
@@ -77,6 +81,10 @@ public:
     bool
     ReplaceSection (lldb::user_id_t sect_id, const lldb::SectionSP& section_sp, uint32_t depth = UINT32_MAX);
 
+    // Warning, this can be slow as it's removing items from a std::vector.
+    bool
+    DeleteSection (size_t idx);
+
     lldb::SectionSP
     GetSectionAtIndex (size_t idx) const;
 
@@ -87,6 +95,13 @@ public:
     void
     Finalize ();
 
+    // Each time Finalize() is called with changes, revision id increments.
+    uint32_t
+    GetRevisionID() const
+    {
+        return m_revision_id;
+    }
+
     void
     Clear ()
     {
@@ -94,6 +109,8 @@ public:
     }
 
 protected:
+    bool        m_changed;
+    uint32_t    m_revision_id;
     collection  m_sections;
 };
 
@@ -107,6 +124,7 @@ class Section :
 public:
     // Create a root section (one that has no parent)
     Section (const lldb::ModuleSP &module_sp,
+             ObjectFile *obj_file,
              lldb::user_id_t sect_id,
              const ConstString &name,
              lldb::SectionType sect_type,
@@ -119,6 +137,7 @@ public:
     // Create a section that is a child of parent_section_sp
     Section (const lldb::SectionSP &parent_section_sp,    // NULL for top level sections, non-NULL for child sections
              const lldb::ModuleSP &module_sp,
+             ObjectFile *obj_file,
              lldb::user_id_t sect_id,
              const ConstString &name,
              lldb::SectionType sect_type,
@@ -271,8 +290,21 @@ public:
         m_children.Finalize();
     }
 
+    ObjectFile *
+    GetObjectFile ()
+    {
+        return m_obj_file;
+    }
+    const ObjectFile *
+    GetObjectFile () const 
+    {
+        return m_obj_file;
+    }
+
+
 protected:
 
+    ObjectFile      *m_obj_file;        // The object file that data for this section should be read from
     lldb::SectionType m_type;           // The type of this section
     lldb::SectionWP m_parent_wp;        // Weak pointer to parent section
     ConstString     m_name;             // Name of this section

Modified: lldb/trunk/include/lldb/Core/UUID.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/UUID.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/UUID.h (original)
+++ lldb/trunk/include/lldb/Core/UUID.h Mon Jul  1 14:45:50 2013
@@ -56,7 +56,7 @@ public:
     SetBytes (const void *uuid_bytes, uint32_t num_uuid_bytes = 16);
 
     std::string
-    GetAsString () const;
+    GetAsString (const char *separator = NULL) const;
 
     size_t
     SetFromCString (const char *c_str, uint32_t num_uuid_bytes = 16);

Modified: lldb/trunk/include/lldb/Symbol/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ObjectFile.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ObjectFile.h (original)
+++ lldb/trunk/include/lldb/Symbol/ObjectFile.h Mon Jul  1 14:45:50 2013
@@ -13,6 +13,7 @@
 #include "lldb/lldb-private.h"
 #include "lldb/Core/DataExtractor.h"
 #include "lldb/Host/FileSpec.h"
+#include "lldb/Core/FileSpecList.h"
 #include "lldb/Core/ModuleChild.h"
 #include "lldb/Core/PluginInterface.h"
 #include "lldb/Host/Endian.h"
@@ -78,7 +79,12 @@ public:
         eStrataKernel,
         eStrataRawImage
     } Strata;
-        
+
+    typedef enum
+    {
+        eSymtabFromUnifiedSectionList = 0x0001 /// Return symbol table from unified module section list
+    } SymtabFlags;
+
     //------------------------------------------------------------------
     /// Construct with a parent module, offset, and header data.
     ///
@@ -356,22 +362,30 @@ public:
     /// Symbol table parsing can be deferred by ObjectFile instances
     /// until this accessor is called the first time.
     ///
+    /// @param[in] flags
+    ///     eSymtabFromUnifiedSectionList: Whether to get symbol table
+    ///     for unified module section list, or object file.
+    ///
     /// @return
     ///     The symbol table for this object file.
     //------------------------------------------------------------------
     virtual Symtab *
-    GetSymtab () = 0;
+    GetSymtab (uint32_t flags = 0) = 0;
 
     //------------------------------------------------------------------
     /// Frees the symbol table.
     ///
     /// This function should only be used when an object file is
     ///
+    /// @param[in] flags
+    ///     eSymtabFromUnifiedSectionList: Whether to clear symbol table
+    ///     for unified module section list, or object file.
+    ///
     /// @return
     ///     The symbol table for this object file.
     //------------------------------------------------------------------
     virtual void
-    ClearSymtab ();
+    ClearSymtab (uint32_t flags = 0);
     
     //------------------------------------------------------------------
     /// Gets the UUID for this object file.
@@ -389,6 +403,21 @@ public:
     GetUUID (lldb_private::UUID* uuid) = 0;
 
     //------------------------------------------------------------------
+    /// Gets the symbol file spec list for this object file.
+    ///
+    /// If the object file format contains a debug symbol file link,
+    /// the values will be return in the FileSpecList.
+    ///
+    /// @return
+    ///     Returns filespeclist.
+    //------------------------------------------------------------------
+    virtual lldb_private::FileSpecList
+    GetDebugSymbolFilePaths()
+    {
+        return FileSpecList();
+    }
+
+    //------------------------------------------------------------------
     /// Gets whether endian swapping should occur when extracting data
     /// from this object file.
     ///
@@ -485,6 +514,7 @@ public:
     {
         return lldb::RegisterContextSP();
     }
+
     //------------------------------------------------------------------
     /// The object file should be able to calculate its type by looking
     /// at its file header and possibly the sections or other data in
@@ -501,6 +531,17 @@ public:
     CalculateType() = 0;
 
     //------------------------------------------------------------------
+    /// In cases where the type can't be calculated (elf files), this
+    /// routine allows someone to explicitly set it. As an example,
+    /// SymbolVendorELF uses this routine to set eTypeDebugInfo when
+    /// loading debug link files.
+    virtual void
+    SetType (Type type)
+    {
+        m_type = type;
+    }
+
+    //------------------------------------------------------------------
     /// The object file should be able to calculate the strata of the
     /// object file.
     ///
@@ -635,6 +676,8 @@ protected:
     const lldb::addr_t m_memory_addr;
     std::unique_ptr<lldb_private::SectionList> m_sections_ap;
     std::unique_ptr<lldb_private::Symtab> m_symtab_ap;
+    std::unique_ptr<lldb_private::Symtab> m_symtab_unified_ap; ///< Unified section list symbol table.
+    uint32_t m_symtab_unified_revisionid; ///< Unified section list symbol table revision id for when m_symtab_unified_ap was last modified.
     
     //------------------------------------------------------------------
     /// Sets the architecture for a module.  At present the architecture

Modified: lldb/trunk/include/lldb/Symbol/SymbolVendor.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/SymbolVendor.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/SymbolVendor.h (original)
+++ lldb/trunk/include/lldb/Symbol/SymbolVendor.h Mon Jul  1 14:45:50 2013
@@ -164,6 +164,14 @@ public:
         return m_sym_file_ap.get();
     }
 
+    // Get module unified section list symbol table.
+    virtual Symtab *
+    GetSymtab ();
+
+    // Clear module unified section list symbol table.
+    virtual void
+    ClearSymtab ();
+
     //------------------------------------------------------------------
     // PluginInterface protocol
     //------------------------------------------------------------------
@@ -184,7 +192,7 @@ protected:
     TypeList m_type_list; // Uniqued types for all parsers owned by this module
     CompileUnits m_compile_units; // The current compile units
     lldb::ObjectFileSP m_objfile_sp;    // Keep a reference to the object file in case it isn't the same as the module object file (debug symbols in a separate file)
-    std::unique_ptr<SymbolFile> m_sym_file_ap; // A single symbol file. Suclasses can add more of these if needed.
+    std::unique_ptr<SymbolFile> m_sym_file_ap; // A single symbol file. Subclasses can add more of these if needed.
 
 private:
     //------------------------------------------------------------------

Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Mon Jul  1 14:45:50 2013
@@ -118,6 +118,9 @@ public:
     
     FileSpecList &
     GetExecutableSearchPaths ();
+
+    FileSpecList &
+    GetDebugFileSearchPaths ();
     
     bool
     GetEnableSyntheticValue () const;
@@ -378,6 +381,9 @@ public:
     static FileSpecList
     GetDefaultExecutableSearchPaths ();
 
+    static FileSpecList
+    GetDefaultDebugFileSearchPaths ();
+
     static ArchSpec
     GetDefaultArchitecture ();
 

Modified: lldb/trunk/include/lldb/lldb-enumerations.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-enumerations.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-enumerations.h (original)
+++ lldb/trunk/include/lldb/lldb-enumerations.h Mon Jul  1 14:45:50 2013
@@ -515,6 +515,10 @@ namespace lldb {
         eSectionTypeDWARFAppleTypes,
         eSectionTypeDWARFAppleNamespaces,
         eSectionTypeDWARFAppleObjC,
+        eSectionTypeELFSymbolTable,       // Elf SHT_SYMTAB section
+        eSectionTypeELFDynamicSymbols,    // Elf SHT_DYNSYM section
+        eSectionTypeELFRelocationEntries, // Elf SHT_REL or SHT_REL section
+        eSectionTypeELFDynamicLinkInfo,   // Elf SHT_DYNAMIC section
         eSectionTypeEHFrame,
         eSectionTypeOther
         

Modified: lldb/trunk/lib/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lib/Makefile?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/lib/Makefile (original)
+++ lldb/trunk/lib/Makefile Mon Jul  1 14:45:50 2013
@@ -40,6 +40,7 @@ USEDLIBS = lldbAPI.a \
 	lldbPluginLanguageRuntimeObjCAppleObjCRuntime.a \
 	lldbPluginObjectContainerBSDArchive.a \
 	lldbPluginObjectFileELF.a \
+	lldbPluginSymbolVendorELF.a \
 	lldbPluginObjectFilePECOFF.a \
 	lldbPluginOperatingSystemPython.a \
 	lldbPluginPlatformGDBServer.a \

Modified: lldb/trunk/source/API/SBModule.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBModule.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/API/SBModule.cpp (original)
+++ lldb/trunk/source/API/SBModule.cpp Mon Jul  1 14:45:50 2013
@@ -300,19 +300,27 @@ SBModule::GetCompileUnitAtIndex (uint32_
     return sb_cu;
 }
 
+static Symtab *
+GetUnifiedSymbolTable (const lldb::ModuleSP& module_sp)
+{
+    if (module_sp)
+    {
+        SymbolVendor *symbols = module_sp->GetSymbolVendor();
+        if (symbols)
+            return symbols->GetSymtab();
+    }
+    return NULL;
+}
+
 size_t
 SBModule::GetNumSymbols ()
 {
     ModuleSP module_sp (GetSP ());
     if (module_sp)
     {
-        ObjectFile *obj_file = module_sp->GetObjectFile();
-        if (obj_file)
-        {
-            Symtab *symtab = obj_file->GetSymtab();
-            if (symtab)
-                return symtab->GetNumSymbols();
-        }
+        Symtab *symtab = GetUnifiedSymbolTable (module_sp);
+        if (symtab)
+            return symtab->GetNumSymbols();
     }
     return 0;
 }
@@ -322,16 +330,9 @@ SBModule::GetSymbolAtIndex (size_t idx)
 {
     SBSymbol sb_symbol;
     ModuleSP module_sp (GetSP ());
-    if (module_sp)
-    {
-        ObjectFile *obj_file = module_sp->GetObjectFile();
-        if (obj_file)
-        {
-            Symtab *symtab = obj_file->GetSymtab();
-            if (symtab)
-                sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx));
-        }
-    }
+    Symtab *symtab = GetUnifiedSymbolTable (module_sp);
+    if (symtab)
+        sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx));
     return sb_symbol;
 }
 
@@ -343,16 +344,9 @@ SBModule::FindSymbol (const char *name,
     if (name && name[0])
     {
         ModuleSP module_sp (GetSP ());
-        if (module_sp)
-        {
-            ObjectFile *obj_file = module_sp->GetObjectFile();
-            if (obj_file)
-            {
-                Symtab *symtab = obj_file->GetSymtab();
-                if (symtab)
-                    sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(ConstString(name), symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny));
-            }
-        }
+        Symtab *symtab = GetUnifiedSymbolTable (module_sp);
+        if (symtab)
+            sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(ConstString(name), symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny));
     }
     return sb_symbol;
 }
@@ -365,28 +359,21 @@ SBModule::FindSymbols (const char *name,
     if (name && name[0])
     {
         ModuleSP module_sp (GetSP ());
-        if (module_sp)
+        Symtab *symtab = GetUnifiedSymbolTable (module_sp);
+        if (symtab)
         {
-            ObjectFile *obj_file = module_sp->GetObjectFile();
-            if (obj_file)
+            std::vector<uint32_t> matching_symbol_indexes;
+            const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, matching_symbol_indexes);
+            if (num_matches)
             {
-                Symtab *symtab = obj_file->GetSymtab();
-                if (symtab)
+                SymbolContext sc;
+                sc.module_sp = module_sp;
+                SymbolContextList &sc_list = *sb_sc_list;
+                for (size_t i=0; i<num_matches; ++i)
                 {
-                    std::vector<uint32_t> matching_symbol_indexes;
-                    const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, matching_symbol_indexes);
-                    if (num_matches)
-                    {
-                        SymbolContext sc;
-                        sc.module_sp = module_sp;
-                        SymbolContextList &sc_list = *sb_sc_list;
-                        for (size_t i=0; i<num_matches; ++i)
-                        {
-                            sc.symbol = symtab->SymbolAtIndex (matching_symbol_indexes[i]);
-                            if (sc.symbol)
-                                sc_list.Append(sc);
-                        }
-                    }
+                    sc.symbol = symtab->SymbolAtIndex (matching_symbol_indexes[i]);
+                    if (sc.symbol)
+                        sc_list.Append(sc);
                 }
             }
         }
@@ -403,13 +390,11 @@ SBModule::GetNumSections ()
     ModuleSP module_sp (GetSP ());
     if (module_sp)
     {
-        ObjectFile *obj_file = module_sp->GetObjectFile();
-        if (obj_file)
-        {
-            SectionList *section_list = obj_file->GetSectionList ();
-            if (section_list)
-                return section_list->GetSize();
-        }
+        // Give the symbol vendor a chance to add to the unified section list.
+        module_sp->GetSymbolVendor();
+        SectionList *section_list = module_sp->GetUnifiedSectionList();
+        if (section_list)
+            return section_list->GetSize();
     }
     return 0;
 }
@@ -421,14 +406,12 @@ SBModule::GetSectionAtIndex (size_t idx)
     ModuleSP module_sp (GetSP ());
     if (module_sp)
     {
-        ObjectFile *obj_file = module_sp->GetObjectFile();
-        if (obj_file)
-        {
-            SectionList *section_list = obj_file->GetSectionList ();
+        // Give the symbol vendor a chance to add to the unified section list.
+        module_sp->GetSymbolVendor();
+        SectionList *section_list = module_sp->GetUnifiedSectionList ();
 
-            if (section_list)
-                sb_section.SetSP(section_list->GetSectionAtIndex (idx));
-        }
+        if (section_list)
+            sb_section.SetSP(section_list->GetSectionAtIndex (idx));
     }
     return sb_section;
 }
@@ -588,18 +571,16 @@ SBModule::FindSection (const char *sect_
     ModuleSP module_sp (GetSP ());
     if (sect_name && module_sp)
     {
-        ObjectFile *objfile = module_sp->GetObjectFile();
-        if (objfile)
-        {
-            SectionList *section_list = objfile->GetSectionList();
-            if (section_list)
+        // Give the symbol vendor a chance to add to the unified section list.
+        module_sp->GetSymbolVendor();
+        SectionList *section_list = module_sp->GetUnifiedSectionList();
+        if (section_list)
+        {
+            ConstString const_sect_name(sect_name);
+            SectionSP section_sp (section_list->FindSectionByName(const_sect_name));
+            if (section_sp)
             {
-                ConstString const_sect_name(sect_name);
-                SectionSP section_sp (section_list->FindSectionByName(const_sect_name));
-                if (section_sp)
-                {
-                    sb_section.SetSP (section_sp);
-                }
+                sb_section.SetSP (section_sp);
             }
         }
     }

Modified: lldb/trunk/source/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/CMakeLists.txt?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/CMakeLists.txt (original)
+++ lldb/trunk/source/CMakeLists.txt Mon Jul  1 14:45:50 2013
@@ -49,6 +49,7 @@ set( LLDB_USED_LIBS
   
   lldbPluginObjectFileMachO
   lldbPluginObjectFileELF
+  lldbPluginSymbolVendorELF
   lldbPluginObjectContainerBSDArchive
   lldbPluginObjectContainerMachOArchive
   lldbPluginProcessGDBRemote  

Modified: lldb/trunk/source/Commands/CommandObjectTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectTarget.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectTarget.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectTarget.cpp Mon Jul  1 14:45:50 2013
@@ -1438,10 +1438,10 @@ DumpModuleSymtab (CommandInterpreter &in
 {
     if (module)
     {
-        ObjectFile *objfile = module->GetObjectFile ();
-        if (objfile)
+        SymbolVendor *sym_vendor = module->GetSymbolVendor ();
+        if (sym_vendor)
         {
-            Symtab *symtab = objfile->GetSymtab();
+            Symtab *symtab = sym_vendor->GetSymtab();
             if (symtab)
                 symtab->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), sort_order);
         }
@@ -1453,19 +1453,15 @@ DumpModuleSections (CommandInterpreter &
 {
     if (module)
     {
-        ObjectFile *objfile = module->GetObjectFile ();
-        if (objfile)
+        SectionList *section_list = module->GetUnifiedSectionList();
+        if (section_list)
         {
-            SectionList *section_list = objfile->GetSectionList();
-            if (section_list)
-            {
-                strm.Printf ("Sections for '%s' (%s):\n",
-                             module->GetSpecificationDescription().c_str(),
-                             module->GetArchitecture().GetArchitectureName());
-                strm.IndentMore();
-                section_list->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), true, UINT32_MAX);
-                strm.IndentLess();
-            }
+            strm.Printf ("Sections for '%s' (%s):\n",
+                         module->GetSpecificationDescription().c_str(),
+                         module->GetArchitecture().GetArchitectureName());
+            strm.IndentMore();
+            section_list->Dump(&strm, interpreter.GetExecutionContext().GetTargetPtr(), true, UINT32_MAX);
+            strm.IndentLess();
         }
     }
 }
@@ -1569,10 +1565,10 @@ LookupSymbolInModule (CommandInterpreter
     {
         SymbolContext sc;
         
-        ObjectFile *objfile = module->GetObjectFile ();
-        if (objfile)
+        SymbolVendor *sym_vendor = module->GetSymbolVendor ();
+        if (sym_vendor)
         {
-            Symtab *symtab = objfile->GetSymtab();
+            Symtab *symtab = sym_vendor->GetSymtab();
             if (symtab)
             {
                 uint32_t i;

Modified: lldb/trunk/source/Core/Address.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Address.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Core/Address.cpp (original)
+++ lldb/trunk/source/Core/Address.cpp Mon Jul  1 14:45:50 2013
@@ -18,6 +18,7 @@
 #include "lldb/Target/ExecutionContext.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
+#include "lldb/Symbol/SymbolVendor.h"
 
 #include "llvm/ADT/Triple.h"
 
@@ -456,10 +457,10 @@ Address::Dump (Stream *s, ExecutionConte
                 case eSectionTypeData:
                     if (module_sp)
                     {
-                        ObjectFile *objfile = module_sp->GetObjectFile();
-                        if (objfile)
+                        SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
+                        if (sym_vendor)
                         {
-                            Symtab *symtab = objfile->GetSymtab();
+                            Symtab *symtab = sym_vendor->GetSymtab();
                             if (symtab)
                             {
                                 const addr_t file_Addr = GetFileAddress();
@@ -1023,7 +1024,11 @@ Address::GetAddressClass () const
     {
         ObjectFile *obj_file = module_sp->GetObjectFile();
         if (obj_file)
+        {
+            // Give the symbol vendor a chance to add to the unified section list.
+            module_sp->GetSymbolVendor();
             return obj_file->GetAddressClass (GetFileAddress());
+        }
     }
     return eAddressClassUnknown;
 }

Modified: lldb/trunk/source/Core/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Module.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Core/Module.cpp (original)
+++ lldb/trunk/source/Core/Module.cpp Mon Jul  1 14:45:50 2013
@@ -33,6 +33,7 @@
 #include "lldb/Target/ObjCLanguageRuntime.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
+#include "lldb/Symbol/SymbolFile.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -244,6 +245,7 @@ Module::~Module()
     // function calls back into this module object. The ordering is important
     // here because symbol files can require the module object file. So we tear
     // down the symbol file first, then the object file.
+    m_unified_sections_ap.reset();
     m_symfile_ap.reset();
     m_objfile_sp.reset();
 }
@@ -480,10 +482,10 @@ Module::ResolveSymbolContextForAddress (
         // Resolve the symbol if requested, but don't re-look it up if we've already found it.
         if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
         {
-            ObjectFile* ofile = GetObjectFile();
-            if (ofile)
+            SymbolVendor* sym_vendor = GetSymbolVendor();
+            if (sym_vendor)
             {
-                Symtab *symtab = ofile->GetSymtab();
+                Symtab *symtab = sym_vendor->GetSymtab();
                 if (symtab)
                 {
                     if (so_addr.IsSectionOffset())
@@ -613,6 +615,7 @@ Module::FindFunctions (const ConstString
                                               match_name_after_lookup);
         
         if (symbols)
+        {
             symbols->FindFunctions(lookup_name,
                                    namespace_decl,
                                    lookup_name_type_mask,
@@ -620,13 +623,10 @@ Module::FindFunctions (const ConstString
                                    append,
                                    sc_list);
         
-        // Now check our symbol table for symbols that are code symbols if requested
-        if (include_symbols)
-        {
-            ObjectFile *objfile = GetObjectFile();
-            if (objfile)
+            // Now check our symbol table for symbols that are code symbols if requested
+            if (include_symbols)
             {
-                Symtab *symtab = objfile->GetSymtab();
+                Symtab *symtab = symbols->GetSymtab();
                 if (symtab)
                     symtab->FindFunctionSymbols(lookup_name, lookup_name_type_mask, sc_list);
             }
@@ -652,20 +652,17 @@ Module::FindFunctions (const ConstString
                 ++i;
             }
         }
-        
     }
     else
     {
         if (symbols)
+        {
             symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
 
-        // Now check our symbol table for symbols that are code symbols if requested
-        if (include_symbols)
-        {
-            ObjectFile *objfile = GetObjectFile();
-            if (objfile)
+            // Now check our symbol table for symbols that are code symbols if requested
+            if (include_symbols)
             {
-                Symtab *symtab = objfile->GetSymtab();
+                Symtab *symtab = symbols->GetSymtab();
                 if (symtab)
                     symtab->FindFunctionSymbols(name, name_type_mask, sc_list);
             }
@@ -689,14 +686,13 @@ Module::FindFunctions (const RegularExpr
     
     SymbolVendor *symbols = GetSymbolVendor ();
     if (symbols)
-        symbols->FindFunctions(regex, include_inlines, append, sc_list);
-    // Now check our symbol table for symbols that are code symbols if requested
-    if (include_symbols)
     {
-        ObjectFile *objfile = GetObjectFile();
-        if (objfile)
+        symbols->FindFunctions(regex, include_inlines, append, sc_list);
+        
+        // Now check our symbol table for symbols that are code symbols if requested
+        if (include_symbols)
         {
-            Symtab *symtab = objfile->GetSymtab();
+            Symtab *symtab = symbols->GetSymtab();
             if (symtab)
             {
                 std::vector<uint32_t> symbol_indexes;
@@ -1067,13 +1063,12 @@ Module::Dump(Stream *s)
               m_object_name ? ")" : "");
 
     s->IndentMore();
+    
     ObjectFile *objfile = GetObjectFile ();
-
     if (objfile)
         objfile->Dump(s);
 
     SymbolVendor *symbols = GetSymbolVendor ();
-
     if (symbols)
         symbols->Dump(s);
 
@@ -1115,15 +1110,29 @@ Module::GetObjectFile()
                                                data_offset);
         if (m_objfile_sp)
         {
-			// Once we get the object file, update our module with the object file's 
-			// architecture since it might differ in vendor/os if some parts were
-			// unknown.
+            // Once we get the object file, update our module with the object file's 
+            // architecture since it might differ in vendor/os if some parts were
+            // unknown.
             m_objfile_sp->GetArchitecture (m_arch);
+
+            // Populate m_unified_sections_ap with sections from objfile.
+            SectionList *section_list = m_objfile_sp->GetSectionList();
+            if (section_list)
+            {
+                m_unified_sections_ap.reset(new SectionList());
+                section_list->Copy (m_unified_sections_ap.get());
+                m_unified_sections_ap->Finalize();
+            }
         }
     }
     return m_objfile_sp.get();
 }
 
+SectionList *
+Module::GetUnifiedSectionList()
+{
+    return m_unified_sections_ap.get();
+}
 
 const Symbol *
 Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
@@ -1132,10 +1141,10 @@ Module::FindFirstSymbolWithNameAndType (
                        "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
                        name.AsCString(),
                        symbol_type);
-    ObjectFile *objfile = GetObjectFile();
-    if (objfile)
+    SymbolVendor* sym_vendor = GetSymbolVendor();
+    if (sym_vendor)
     {
-        Symtab *symtab = objfile->GetSymtab();
+        Symtab *symtab = sym_vendor->GetSymtab();
         if (symtab)
             return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
     }
@@ -1170,10 +1179,10 @@ Module::FindFunctionSymbols (const Const
                        "Module::FindSymbolsFunctions (name = %s, mask = 0x%8.8x)",
                        name.AsCString(),
                        name_type_mask);
-    ObjectFile *objfile = GetObjectFile ();
-    if (objfile)
+    SymbolVendor* sym_vendor = GetSymbolVendor();
+    if (sym_vendor)
     {
-        Symtab *symtab = objfile->GetSymtab();
+        Symtab *symtab = sym_vendor->GetSymtab();
         if (symtab)
             return symtab->FindFunctionSymbols (name, name_type_mask, sc_list);
     }
@@ -1192,10 +1201,10 @@ Module::FindSymbolsWithNameAndType (cons
                        name.AsCString(),
                        symbol_type);
     const size_t initial_size = sc_list.GetSize();
-    ObjectFile *objfile = GetObjectFile ();
-    if (objfile)
+    SymbolVendor* sym_vendor = GetSymbolVendor();
+    if (sym_vendor)
     {
-        Symtab *symtab = objfile->GetSymtab();
+        Symtab *symtab = sym_vendor->GetSymtab();
         if (symtab)
         {
             std::vector<uint32_t> symbol_indexes;
@@ -1217,10 +1226,10 @@ Module::FindSymbolsMatchingRegExAndType
                        regex.GetText(),
                        symbol_type);
     const size_t initial_size = sc_list.GetSize();
-    ObjectFile *objfile = GetObjectFile ();
-    if (objfile)
+    SymbolVendor* sym_vendor = GetSymbolVendor();
+    if (sym_vendor)
     {
-        Symtab *symtab = objfile->GetSymtab();
+        Symtab *symtab = sym_vendor->GetSymtab();
         if (symtab)
         {
             std::vector<uint32_t> symbol_indexes;
@@ -1234,12 +1243,35 @@ Module::FindSymbolsMatchingRegExAndType
 void
 Module::SetSymbolFileFileSpec (const FileSpec &file)
 {
+    // Remove any sections in the unified section list that come from the current symbol vendor.
+    if (m_symfile_ap)
+    {
+        SectionList *section_list = GetUnifiedSectionList();
+        SymbolFile *symbol_file = m_symfile_ap->GetSymbolFile();
+        if (section_list && symbol_file)
+        {
+            ObjectFile *obj_file = symbol_file->GetObjectFile();
+            if (obj_file)
+            {
+                size_t num_sections = section_list->GetNumSections (0);
+                for (size_t idx = num_sections; idx > 0; --idx)
+                {
+                    lldb::SectionSP section_sp (section_list->GetSectionAtIndex (idx - 1));
+                    if (section_sp->GetObjectFile() == obj_file)
+                    {
+                        m_unified_sections_ap->DeleteSection (idx - 1);
+                    }
+                }
+                m_unified_sections_ap->Finalize();
+            }
+        }
+    }
+
     m_symfile_spec = file;
     m_symfile_ap.reset();
     m_did_load_symbol_vendor = false;
 }
 
-
 bool
 Module::IsExecutable ()
 {

Modified: lldb/trunk/source/Core/Section.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Section.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Core/Section.cpp (original)
+++ lldb/trunk/source/Core/Section.cpp Mon Jul  1 14:45:50 2013
@@ -16,6 +16,7 @@ using namespace lldb;
 using namespace lldb_private;
 
 Section::Section (const ModuleSP &module_sp,
+                  ObjectFile *obj_file,
                   user_id_t sect_id,
                   const ConstString &name,
                   SectionType sect_type,
@@ -27,6 +28,7 @@ Section::Section (const ModuleSP &module
     ModuleChild     (module_sp),
     UserID          (sect_id),
     Flags           (flags),
+    m_obj_file      (obj_file),
     m_type          (sect_type),
     m_parent_wp     (),
     m_name          (name),
@@ -45,6 +47,7 @@ Section::Section (const ModuleSP &module
 
 Section::Section (const lldb::SectionSP &parent_section_sp,
                   const ModuleSP &module_sp,
+                  ObjectFile *obj_file,
                   user_id_t sect_id,
                   const ConstString &name,
                   SectionType sect_type,
@@ -56,6 +59,7 @@ Section::Section (const lldb::SectionSP
     ModuleChild     (module_sp),
     UserID          (sect_id),
     Flags           (flags),
+    m_obj_file      (obj_file),
     m_type          (sect_type),
     m_parent_wp     (),
     m_name          (name),
@@ -242,13 +246,16 @@ Section::DumpName (Stream *s) const
     else
     {
         // The top most section prints the module basename
+        const char * name = NULL;
         ModuleSP module_sp (GetModule());
-        if (module_sp)
-        {
-            const char *module_basename = module_sp->GetFileSpec().GetFilename().AsCString();
-            if (module_basename && module_basename[0])
-                s->Printf("%s.", module_basename);
-        }
+        const FileSpec &file_spec = m_obj_file->GetFileSpec();
+
+        if (m_obj_file)
+            name = file_spec.GetFilename().AsCString();
+        if ((!name || !name[0]) && module_sp)
+            name = module_sp->GetFileSpec().GetFilename().AsCString();
+        if (name && name[0])
+            s->Printf("%s.", name);
     }
     m_name.Dump(s);
 }
@@ -285,6 +292,8 @@ Section::Slide (addr_t slide_amount, boo
 #pragma mark SectionList
 
 SectionList::SectionList () :
+    m_changed(false),
+    m_revision_id(0),
     m_sections()
 {
 }
@@ -294,15 +303,41 @@ SectionList::~SectionList ()
 {
 }
 
+bool
+SectionList::Copy (SectionList *dest_section_list)
+{
+    if (dest_section_list)
+    {
+        dest_section_list->m_sections = m_sections;
+        dest_section_list->m_changed = true;
+        return true;
+    }
+    return false;
+}
+
 size_t
 SectionList::AddSection (const lldb::SectionSP& section_sp)
 {
+    m_changed = true;
     assert (section_sp.get());
     size_t section_index = m_sections.size();
     m_sections.push_back(section_sp);
     return section_index;
 }
 
+// Warning, this can be slow as it's removing items from a std::vector.
+bool
+SectionList::DeleteSection (size_t idx)
+{
+    if (idx < m_sections.size())
+    {
+        m_changed = true;
+        m_sections.erase (m_sections.begin() + idx);
+        return true; 
+    }
+    return false;
+}
+
 size_t
 SectionList::FindSectionIndex (const Section* sect)
 {
@@ -325,11 +360,13 @@ SectionList::AddUniqueSection (const lld
 {
     size_t sect_idx = FindSectionIndex (sect_sp.get());
     if (sect_idx == UINT32_MAX)
+    {
+        m_changed = true;
         sect_idx = AddSection (sect_sp);
+    }
     return sect_idx;
 }
 
-
 bool
 SectionList::ReplaceSection (user_id_t sect_id, const lldb::SectionSP& sect_sp, uint32_t depth)
 {
@@ -338,6 +375,7 @@ SectionList::ReplaceSection (user_id_t s
     {
         if ((*sect_iter)->GetID() == sect_id)
         {
+            m_changed = true;
             *sect_iter = sect_sp;
             return true;
         }
@@ -350,7 +388,6 @@ SectionList::ReplaceSection (user_id_t s
     return false;
 }
 
-
 size_t
 SectionList::GetNumSections (uint32_t depth) const
 {
@@ -527,5 +564,10 @@ SectionList::Finalize ()
         
         sect->GetChildren().Finalize();
     }
-}
 
+    if (m_changed)
+    {
+        m_revision_id++;
+        m_changed = false;
+    }
+}

Modified: lldb/trunk/source/Core/UUID.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/UUID.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Core/UUID.cpp (original)
+++ lldb/trunk/source/Core/UUID.cpp Mon Jul  1 14:45:50 2013
@@ -67,20 +67,26 @@ UUID::GetBytes() const
 }
 
 std::string
-UUID::GetAsString () const
+UUID::GetAsString (const char *separator) const
 {
     std::string result;
-    char buf[64];
+    char buf[256];
+    if (!separator)
+        separator = "-";
     const uint8_t *u = (const uint8_t *)GetBytes();
     if (sizeof (buf) > (size_t)snprintf (buf,
                             sizeof (buf),
-                            "%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
-                            u[0],u[1],u[2],u[3],u[4],u[5],u[6],u[7],u[8],u[9],u[10],u[11],u[12],u[13],u[14],u[15]))
+                            "%2.2X%2.2X%2.2X%2.2X%s%2.2X%2.2X%s%2.2X%2.2X%s%2.2X%2.2X%s%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X",
+                            u[0],u[1],u[2],u[3],separator,
+                            u[4],u[5],separator,
+                            u[6],u[7],separator,
+                            u[8],u[9],separator,
+                            u[10],u[11],u[12],u[13],u[14],u[15]))
     {
         result.append (buf);
         if (m_num_uuid_bytes == 20)
         {
-            if (sizeof (buf) > (size_t)snprintf (buf, sizeof (buf), "-%2.2X%2.2X%2.2X%2.2X", u[16],u[17],u[18],u[19]))
+            if (sizeof (buf) > (size_t)snprintf (buf, sizeof (buf), "%s%2.2X%2.2X%2.2X%2.2X", separator,u[16],u[17],u[18],u[19]))
                 result.append (buf);
         }
     }

Modified: lldb/trunk/source/Host/common/Symbols.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Symbols.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/Symbols.cpp (original)
+++ lldb/trunk/source/Host/common/Symbols.cpp Mon Jul  1 14:45:50 2013
@@ -8,11 +8,21 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/Host/Symbols.h"
+#include "lldb/Core/ArchSpec.h"
+#include "lldb/Core/DataBuffer.h"
+#include "lldb/Core/DataExtractor.h"
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Core/Timer.h"
+#include "lldb/Core/UUID.h"
+#include "lldb/Symbol/ObjectFile.h"
+#include "lldb/Target/Target.h"
 
 using namespace lldb;
 using namespace lldb_private;
 
-#if !defined (__APPLE__)
+#if defined (__linux__)
 
 FileSpec
 Symbols::LocateExecutableObjectFile (const ModuleSpec &module_spec)
@@ -24,7 +34,80 @@ Symbols::LocateExecutableObjectFile (con
 FileSpec
 Symbols::LocateExecutableSymbolFile (const ModuleSpec &module_spec)
 {
-    // FIXME
+    const char *symbol_filename = module_spec.GetSymbolFileSpec().GetFilename().AsCString();
+    if (!symbol_filename || !symbol_filename[0])
+        return FileSpec();
+
+    FileSpecList debug_file_search_paths (Target::GetDefaultDebugFileSearchPaths());
+
+    // Add module directory.
+    const ConstString &file_dir = module_spec.GetFileSpec().GetDirectory();
+    debug_file_search_paths.AppendIfUnique (FileSpec(file_dir.AsCString("."), true));
+
+    // Add current working directory.
+    debug_file_search_paths.AppendIfUnique (FileSpec(".", true));
+
+    // Add /usr/lib/debug directory.
+    debug_file_search_paths.AppendIfUnique (FileSpec("/usr/lib/debug", true));
+
+    std::string uuid_str;
+    const UUID &module_uuid = module_spec.GetUUID();
+    if (module_uuid.IsValid())
+    {
+        // Some debug files are stored in the .build-id directory like this:
+        //   /usr/lib/debug/.build-id/ff/e7fe727889ad82bb153de2ad065b2189693315.debug
+        uuid_str = module_uuid.GetAsString("");
+        uuid_str.insert (2, 1, '/');
+        uuid_str = uuid_str + ".debug";
+    }
+
+    // Get full path to our module. Needed to check debug files like this:
+    //   /usr/lib/debug/usr/lib/libboost_date_time.so.1.46.1
+    std::string module_filename = module_spec.GetFileSpec().GetPath();
+
+    size_t num_directories = debug_file_search_paths.GetSize();
+    for (size_t idx = 0; idx < num_directories; ++idx)
+    {
+        FileSpec dirspec = debug_file_search_paths.GetFileSpecAtIndex (idx);
+        dirspec.ResolvePath();
+        if (!dirspec.Exists() || !dirspec.IsDirectory())
+            continue;
+
+        std::vector<std::string> files;
+        std::string dirname = dirspec.GetPath();
+
+        files.push_back (dirname + "/" + symbol_filename);
+        files.push_back (dirname + "/.debug/" + symbol_filename);
+        files.push_back (dirname + "/.build-id/" + uuid_str);
+        files.push_back (dirname + module_filename);
+
+        const uint32_t num_files = files.size();
+        for (size_t idx_file = 0; idx_file < num_files; ++idx_file)
+        {
+            const std::string &filename = files[idx_file];
+            FileSpec file_spec (filename.c_str(), true);
+
+            if (file_spec == module_spec.GetFileSpec())
+                continue;
+
+            if (file_spec.Exists())
+            {
+                lldb_private::ModuleSpecList specs;
+                const size_t num_specs = ObjectFile::GetModuleSpecifications (file_spec, 0, specs);
+                assert (num_specs <= 1 && "Symbol Vendor supports only a single architecture");
+                if (num_specs == 1)
+                {
+                    ModuleSpec mspec;
+                    if (specs.GetModuleSpecAtIndex (0, mspec))
+                    {
+                        if (mspec.GetUUID() == module_uuid)
+                            return file_spec;
+                    }
+                }
+            }
+        }
+    }
+
     return FileSpec();
 }
 
@@ -33,6 +116,7 @@ Symbols::FindSymbolFileInBundle (const F
                                  const lldb_private::UUID *uuid,
                                  const ArchSpec *arch)
 {
+    // FIXME
     return FileSpec();
 }
 
@@ -44,5 +128,36 @@ Symbols::DownloadObjectAndSymbolFile (Mo
     return false;
 }
 
+#elif !defined (__APPLE__)
+
+FileSpec
+Symbols::LocateExecutableObjectFile (const ModuleSpec &module_spec)
+{
+    // FIXME
+    return FileSpec();
+}
+
+FileSpec
+Symbols::LocateExecutableSymbolFile (const ModuleSpec &module_spec)
+{
+    // FIXME
+    return FileSpec();
+}
+
+FileSpec
+Symbols::FindSymbolFileInBundle (const FileSpec& symfile_bundle,
+                                 const lldb_private::UUID *uuid,
+                                 const ArchSpec *arch)
+{
+    return FileSpec();
+}
+
+bool
+Symbols::DownloadObjectAndSymbolFile (ModuleSpec &module_spec, bool force_lookup)
+{
+    // Fill in the module_spec.GetFileSpec() for the object file and/or the
+    // module_spec.GetSymbolFileSpec() for the debug symbols file.
+    return false;
+}
 
 #endif

Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Mon Jul  1 14:45:50 2013
@@ -262,13 +262,27 @@ ObjectFileELF::GetModuleSpecifications (
                 if (spec.GetArchitecture().IsValid())
                 {
                     // We could parse the ABI tag information (in .note, .notes, or .note.ABI-tag) to get the
-                    // machine information. However, we'd have to read a good bit of the rest of the file,
-                    // and this info isn't guaranteed to exist or be correct. More details here:
+                    // machine information. However, this info isn't guaranteed to exist or be correct. Details:
                     //  http://refspecs.linuxfoundation.org/LSB_1.2.0/gLSB/noteabitag.html
                     // Instead of passing potentially incorrect information down the pipeline, grab
                     // the host information and use it.
                     spec.GetArchitecture().GetTriple().setOSName (Host::GetOSString().GetCString());
                     spec.GetArchitecture().GetTriple().setVendorName(Host::GetVendorString().GetCString());
+
+                    // Try to get the UUID from the section list. Usually that's at the end, so
+                    // map the file in if we don't have it already.
+                    size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize;
+                    if (section_header_end > data_sp->GetByteSize())
+                    {
+                        data_sp = file.MemoryMapFileContents (file_offset, section_header_end);
+                        data.SetData(data_sp);
+                    }
+
+                    uint32_t gnu_debuglink_crc;
+                    std::string gnu_debuglink_file;
+                    SectionHeaderColl section_headers;
+                    GetSectionHeaderInfo(section_headers, data, header, spec.GetUUID(), gnu_debuglink_file, gnu_debuglink_crc);
+
                     specs.Append(spec);
                 }
             }
@@ -306,12 +320,13 @@ ObjectFileELF::ObjectFileELF (const lldb
     m_header(),
     m_program_headers(),
     m_section_headers(),
-    m_filespec_ap(),
-    m_shstr_data()
+    m_filespec_ap()
 {
     if (file)
         m_file = *file;
     ::memset(&m_header, 0, sizeof(m_header));
+    m_gnu_debuglink_crc = 0;
+    m_gnu_debuglink_file.clear();
 }
 
 ObjectFileELF::~ObjectFileELF()
@@ -359,18 +374,111 @@ ObjectFileELF::ParseHeader()
     return m_header.Parse(m_data, &offset);
 }
 
+/*
+ * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
+ *
+ *   COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
+ *   code or tables extracted from it, as desired without restriction.
+ */
+static uint32_t
+calc_gnu_debuglink_crc32(const void *buf, size_t size)
+{
+    static const uint32_t g_crc32_tab[] =
+    {
+        0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+        0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+        0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+        0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+        0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+        0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+        0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+        0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+        0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+        0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+        0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+        0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+        0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+        0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+        0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+        0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+        0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+        0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+        0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+        0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+        0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+        0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+        0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+        0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+        0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+        0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+        0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+        0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+        0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+        0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+        0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+        0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+        0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+        0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+        0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+        0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+        0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+        0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+        0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+        0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+        0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+        0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+        0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+    };    
+    const uint8_t *p = (const uint8_t *)buf;
+    uint32_t crc;
+
+    crc = ~0U;
+    while (size--)
+        crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
+    return crc ^ ~0U;
+}
+
 bool
 ObjectFileELF::GetUUID(lldb_private::UUID* uuid)
 {
+    // Need to parse the section list to get the UUIDs, so make sure that's been done.
+    if (!ParseSectionHeaders())
+        return false;
+
     if (m_uuid.IsValid())
     {
+        // We have the full build id uuid.
         *uuid = m_uuid;
         return true;
     }
-    // FIXME: Return MD5 sum here. See comment in ObjectFile.h.
+    else 
+    {
+        m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize());
+        if (m_gnu_debuglink_crc)
+        {
+            // Use 4 bytes of crc from the .gnu_debuglink section.
+            uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 };
+            uuid->SetBytes (uuidt, sizeof(uuidt));
+            return true;
+        }
+    }
+
     return false;
 }
 
+lldb_private::FileSpecList
+ObjectFileELF::GetDebugSymbolFilePaths()
+{
+    FileSpecList file_spec_list;
+
+    if (!m_gnu_debuglink_file.empty())
+    {
+        FileSpec file_spec (m_gnu_debuglink_file.c_str(), false);
+        file_spec_list.Append (file_spec);
+    }
+    return file_spec_list;
+}
+
 uint32_t
 ObjectFileELF::GetDependentModules(FileSpecList &files)
 {
@@ -416,7 +524,7 @@ ObjectFileELF::GetImageInfoAddress()
     if (!dynsym_id)
         return Address();
 
-    const ELFSectionHeader *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
+    const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
     if (!dynsym_hdr)
         return Address();
 
@@ -477,7 +585,7 @@ ObjectFileELF::ParseDependentModules()
 
     m_filespec_ap.reset(new FileSpecList());
 
-    if (!(ParseSectionHeaders() && GetSectionHeaderStringTable()))
+    if (!ParseSectionHeaders())
         return 0;
 
     // Locate the dynamic table.
@@ -574,75 +682,160 @@ ObjectFileELF::ParseProgramHeaders()
     return m_program_headers.size();
 }
 
+static bool
+ParseNoteGNUBuildID(DataExtractor &data, lldb_private::UUID &uuid)
+{
+    // Try to parse the note section (ie .note.gnu.build-id|.notes|.note|...) and get the build id.
+    // BuildID documentation: https://fedoraproject.org/wiki/Releases/FeatureBuildId
+    struct
+    {
+        uint32_t name_len;  // Length of note name
+        uint32_t desc_len;  // Length of note descriptor
+        uint32_t type;      // Type of note (1 is ABI_TAG, 3 is BUILD_ID)
+    } notehdr;
+    lldb::offset_t offset = 0;
+    static const uint32_t g_gnu_build_id = 3; // NT_GNU_BUILD_ID from elf.h
+
+    while (true)
+    {
+        if (data.GetU32 (&offset, &notehdr, 3) == NULL)
+            return false;
+
+        notehdr.name_len = llvm::RoundUpToAlignment (notehdr.name_len, 4);
+        notehdr.desc_len = llvm::RoundUpToAlignment (notehdr.desc_len, 4);
+
+        lldb::offset_t offset_next_note = offset + notehdr.name_len + notehdr.desc_len;
+
+        // 16 bytes is UUID|MD5, 20 bytes is SHA1
+        if ((notehdr.type == g_gnu_build_id) && (notehdr.name_len == 4) &&
+            (notehdr.desc_len == 16 || notehdr.desc_len == 20))
+        {
+            char name[4];
+            if (data.GetU8 (&offset, name, 4) == NULL)
+                return false;
+            if (!strcmp(name, "GNU"))
+            {
+                uint8_t uuidbuf[20]; 
+                if (data.GetU8 (&offset, &uuidbuf, notehdr.desc_len) == NULL)
+                    return false;
+                uuid.SetBytes (uuidbuf, notehdr.desc_len);
+                return true;
+            }
+        }
+        offset = offset_next_note;
+    }
+    return false;
+}
+
 //----------------------------------------------------------------------
-// ParseSectionHeaders
+// GetSectionHeaderInfo
 //----------------------------------------------------------------------
 size_t
-ObjectFileELF::ParseSectionHeaders()
+ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
+                                    lldb_private::DataExtractor &object_data,
+                                    const elf::ELFHeader &header,
+                                    lldb_private::UUID &uuid,
+                                    std::string &gnu_debuglink_file,
+                                    uint32_t &gnu_debuglink_crc)
 {
     // We have already parsed the section headers
-    if (!m_section_headers.empty())
-        return m_section_headers.size();
+    if (!section_headers.empty())
+        return section_headers.size();
 
     // If there are no section headers we are done.
-    if (m_header.e_shnum == 0)
+    if (header.e_shnum == 0)
         return 0;
 
-    m_section_headers.resize(m_header.e_shnum);
-    if (m_section_headers.size() != m_header.e_shnum)
+    section_headers.resize(header.e_shnum);
+    if (section_headers.size() != header.e_shnum)
         return 0;
 
-    const size_t sh_size = m_header.e_shnum * m_header.e_shentsize;
-    const elf_off sh_offset = m_header.e_shoff;
-    DataExtractor data;
-    if (GetData (sh_offset, sh_size, data) != sh_size)
+    const size_t sh_size = header.e_shnum * header.e_shentsize;
+    const elf_off sh_offset = header.e_shoff;
+    DataExtractor sh_data;
+    if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size)
         return 0;
 
     uint32_t idx;
     lldb::offset_t offset;
-    for (idx = 0, offset = 0; idx < m_header.e_shnum; ++idx)
+    for (idx = 0, offset = 0; idx < header.e_shnum; ++idx)
     {
-        if (m_section_headers[idx].Parse(data, &offset) == false)
+        if (section_headers[idx].Parse(sh_data, &offset) == false)
             break;
     }
-    if (idx < m_section_headers.size())
-        m_section_headers.resize(idx);
+    if (idx < section_headers.size())
+        section_headers.resize(idx);
 
-    return m_section_headers.size();
-}
-
-size_t
-ObjectFileELF::GetSectionHeaderStringTable()
-{
-    if (m_shstr_data.GetByteSize() == 0)
+    const unsigned strtab_idx = header.e_shstrndx;
+    if (strtab_idx && strtab_idx < section_headers.size())
     {
-        const unsigned strtab_idx = m_header.e_shstrndx;
+        const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
+        const size_t byte_size = sheader.sh_size;
+        const Elf64_Off offset = sheader.sh_offset;
+        lldb_private::DataExtractor shstr_data;
 
-        if (strtab_idx && strtab_idx < m_section_headers.size())
+        if (shstr_data.SetData (object_data, offset, byte_size) == byte_size)
         {
-            const ELFSectionHeader &sheader = m_section_headers[strtab_idx];
-            const size_t byte_size = sheader.sh_size;
-            const Elf64_Off offset = sheader.sh_offset;
-            m_shstr_data.SetData (m_data, offset, byte_size);
+            for (SectionHeaderCollIter I = section_headers.begin();
+                 I != section_headers.end(); ++I)
+            {
+                static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink");
+                const ELFSectionHeaderInfo &header = *I;
+                const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
+                ConstString name(shstr_data.PeekCStr(I->sh_name));
+
+                I->section_name = name;
+
+                if (name == g_sect_name_gnu_debuglink)
+                {
+                    DataExtractor data;
+                    if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
+                    {
+                        lldb::offset_t gnu_debuglink_offset = 0;
+                        gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset);
+                        gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4);
+                        data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
+                    }
+                }
 
-            if (m_shstr_data.GetByteSize() != byte_size)
-                return 0;
+                if (header.sh_type == SHT_NOTE && !uuid.IsValid())
+                {
+                    DataExtractor data;
+                    if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size))
+                    {
+                        ParseNoteGNUBuildID (data, uuid);
+                    }
+                }
+            }
+
+            return section_headers.size();
         }
     }
-    return m_shstr_data.GetByteSize();
+
+    section_headers.clear();
+    return 0;
+}
+
+//----------------------------------------------------------------------
+// ParseSectionHeaders
+//----------------------------------------------------------------------
+size_t
+ObjectFileELF::ParseSectionHeaders()
+{
+    return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc);
 }
 
 lldb::user_id_t
 ObjectFileELF::GetSectionIndexByName(const char *name)
 {
-    if (!(ParseSectionHeaders() && GetSectionHeaderStringTable()))
+    if (!ParseSectionHeaders())
         return 0;
 
     // Search the collection of section headers for one with a matching name.
     for (SectionHeaderCollIter I = m_section_headers.begin();
          I != m_section_headers.end(); ++I)
     {
-        const char *sectionName = m_shstr_data.PeekCStr(I->sh_name);
+        const char *sectionName = I->section_name.AsCString();
 
         if (!sectionName)
             return 0;
@@ -656,7 +849,7 @@ ObjectFileELF::GetSectionIndexByName(con
     return 0;
 }
 
-const elf::ELFSectionHeader *
+const ObjectFileELF::ELFSectionHeaderInfo *
 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id)
 {
     if (!ParseSectionHeaders() || !id)
@@ -668,67 +861,23 @@ ObjectFileELF::GetSectionHeaderByIndex(l
     return NULL;
 }
 
-static bool
-ParseNoteGNUBuildID(DataExtractor& data, lldb_private::UUID& uuid)
-{
-    // Try to parse the note section (ie .note.gnu.build-id|.notes|.note|...) and get the build id.
-    // BuildID documentation: https://fedoraproject.org/wiki/Releases/FeatureBuildId
-    struct
-    {
-        uint32_t name_len;  // Length of note name
-        uint32_t desc_len;  // Length of note descriptor
-        uint32_t type;      // Type of note (1 is ABI_TAG, 3 is BUILD_ID)
-    } notehdr;
-    lldb::offset_t offset = 0;
-    static const uint32_t g_gnu_build_id = 3; // NT_GNU_BUILD_ID from elf.h
-
-    while (true)
-    {
-        if (data.GetU32 (&offset, &notehdr, 3) == NULL)
-            return false;
-
-        notehdr.name_len = llvm::RoundUpToAlignment (notehdr.name_len, 4);
-        notehdr.desc_len = llvm::RoundUpToAlignment (notehdr.desc_len, 4);
-
-        lldb::offset_t offset_next_note = offset + notehdr.name_len + notehdr.desc_len;
 
-        // 16 bytes is UUID|MD5, 20 bytes is SHA1
-        if ((notehdr.type == g_gnu_build_id) && (notehdr.name_len == 4) &&
-            (notehdr.desc_len == 16 || notehdr.desc_len == 20))
-        {
-            char name[4];
-            if (data.GetU8 (&offset, name, 4) == NULL)
-                return false;
-            if (!strcmp(name, "GNU"))
-            {
-                uint8_t uuidbuf[20]; 
-                if (data.GetU8 (&offset, &uuidbuf, notehdr.desc_len) == NULL)
-                    return false;
-                uuid.SetBytes (uuidbuf, notehdr.desc_len);
-                return true;
-            }
-        }
-        offset = offset_next_note;
-    }
-    return false;
-}
- 
 SectionList *
 ObjectFileELF::GetSectionList()
 {
     if (m_sections_ap.get())
         return m_sections_ap.get();
 
-    if (ParseSectionHeaders() && GetSectionHeaderStringTable())
+    if (ParseSectionHeaders())
     {
         m_sections_ap.reset(new SectionList());
 
         for (SectionHeaderCollIter I = m_section_headers.begin();
              I != m_section_headers.end(); ++I)
         {
-            const ELFSectionHeader &header = *I;
+            const ELFSectionHeaderInfo &header = *I;
 
-            ConstString name(m_shstr_data.PeekCStr(header.sh_name));
+            ConstString& name = I->section_name;
             const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
             const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
 
@@ -753,7 +902,7 @@ ObjectFileELF::GetSectionList()
             SectionType sect_type = eSectionTypeOther;
 
             bool is_thread_specific = false;
-            
+
             if      (name == g_sect_name_text)                  sect_type = eSectionTypeCode;
             else if (name == g_sect_name_data)                  sect_type = eSectionTypeData;
             else if (name == g_sect_name_bss)                   sect_type = eSectionTypeZeroFill;
@@ -767,6 +916,19 @@ ObjectFileELF::GetSectionList()
                 sect_type = eSectionTypeZeroFill;   
                 is_thread_specific = true;   
             }
+            // .debug_abbrev – Abbreviations used in the .debug_info section
+            // .debug_aranges – Lookup table for mapping addresses to compilation units
+            // .debug_frame – Call frame information
+            // .debug_info – The core DWARF information section
+            // .debug_line – Line number information
+            // .debug_loc – Location lists used in DW_AT_location attributes
+            // .debug_macinfo – Macro information
+            // .debug_pubnames – Lookup table for mapping object and function names to compilation units
+            // .debug_pubtypes – Lookup table for mapping type names to compilation units
+            // .debug_ranges – Address ranges used in DW_AT_ranges attributes
+            // .debug_str – String table used in .debug_info
+            // MISSING? .debug-index http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
+            // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
             else if (name == g_sect_name_dwarf_debug_abbrev)    sect_type = eSectionTypeDWARFDebugAbbrev;
             else if (name == g_sect_name_dwarf_debug_aranges)   sect_type = eSectionTypeDWARFDebugAranges;
             else if (name == g_sect_name_dwarf_debug_frame)     sect_type = eSectionTypeDWARFDebugFrame;
@@ -779,20 +941,31 @@ ObjectFileELF::GetSectionList()
             else if (name == g_sect_name_dwarf_debug_ranges)    sect_type = eSectionTypeDWARFDebugRanges;
             else if (name == g_sect_name_dwarf_debug_str)       sect_type = eSectionTypeDWARFDebugStr;
             else if (name == g_sect_name_eh_frame)              sect_type = eSectionTypeEHFrame;
-            else if (header.sh_type == SHT_NOTE)
+
+            switch (header.sh_type)
             {
-                if (!m_uuid.IsValid())
-                {
-                    DataExtractor data;
-                    if (vm_size && (GetData (header.sh_offset, vm_size, data) == vm_size))
-                    {
-                        ParseNoteGNUBuildID (data, m_uuid);
-                    }
-                }
+                case SHT_SYMTAB:
+                    assert (sect_type == eSectionTypeOther);
+                    sect_type = eSectionTypeELFSymbolTable;
+                    break;
+                case SHT_DYNSYM:
+                    assert (sect_type == eSectionTypeOther);
+                    sect_type = eSectionTypeELFDynamicSymbols;
+                    break;
+                case SHT_RELA:
+                case SHT_REL:
+                    assert (sect_type == eSectionTypeOther);
+                    sect_type = eSectionTypeELFRelocationEntries;
+                    break;
+                case SHT_DYNAMIC:
+                    assert (sect_type == eSectionTypeOther);
+                    sect_type = eSectionTypeELFDynamicLinkInfo;
+                    break;
             }
-            
+
             SectionSP section_sp(new Section(
                 GetModule(),        // Module to which this section belongs.
+                this,               // ObjectFile to which this section belongs and should read section data from.
                 SectionIndex(I),    // Section ID.
                 name,               // Section name.
                 sect_type,          // Section type.
@@ -806,18 +979,18 @@ ObjectFileELF::GetSectionList()
                 section_sp->SetIsThreadSpecific (is_thread_specific);
             m_sections_ap->AddSection(section_sp);
         }
-        
+
         m_sections_ap->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches
     }
 
     return m_sections_ap.get();
 }
 
-static unsigned
-ParseSymbols(Symtab *symtab, 
+unsigned
+ObjectFileELF::ParseSymbols(Symtab *symtab, 
              user_id_t start_id,
              SectionList *section_list,
-             const ELFSectionHeader *symtab_shdr,
+             const ELFSectionHeaderInfo *symtab_shdr,
              const DataExtractor &symtab_data,
              const DataExtractor &strtab_data)
 {
@@ -936,6 +1109,29 @@ ParseSymbols(Symtab *symtab,
             }
         }
 
+        // If the symbol section we've found has no data (SHT_NOBITS), then check the module
+        // for the main object file and use the section there if it has data. This can happen
+        // if we're parsing the debug file and the it has no .text section, for example.
+        if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0))
+        {
+            ModuleSP module_sp(GetModule());
+            if (module_sp)
+            {
+                ObjectFile *obj_file = module_sp->GetObjectFile();
+                // Check if we've got a different object file than ourselves.
+                if (obj_file && (obj_file != this))
+                {
+                    const ConstString &sect_name = symbol_section_sp->GetName();
+                    SectionList *obj_file_section_list = obj_file->GetSectionList();
+                    lldb::SectionSP section_sp (obj_file_section_list->FindSectionByName (sect_name));
+                    if (section_sp && section_sp->GetFileSize())
+                    {
+                        symbol_section_sp = section_sp;
+                    }
+                }
+            }
+        }
+
         uint64_t symbol_value = symbol.st_value;
         if (symbol_section_sp)
             symbol_value -= symbol_section_sp->GetFileAddress();
@@ -963,18 +1159,17 @@ ParseSymbols(Symtab *symtab,
 }
 
 unsigned
-ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id,
-                                const ELFSectionHeader *symtab_hdr,
-                                user_id_t symtab_id)
+ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, user_id_t symtab_id)
 {
-    assert(symtab_hdr->sh_type == SHT_SYMTAB || 
-           symtab_hdr->sh_type == SHT_DYNSYM);
-
     // Parse in the section list if needed.
     SectionList *section_list = GetSectionList();
     if (!section_list)
         return 0;
 
+    const ELFSectionHeaderInfo *symtab_hdr = &m_section_headers[symtab_id - 1];
+    assert(symtab_hdr->sh_type == SHT_SYMTAB || 
+           symtab_hdr->sh_type == SHT_DYNSYM);
+
     // Section ID's are ones based.
     user_id_t strtab_id = symtab_hdr->sh_link + 1;
 
@@ -1040,10 +1235,6 @@ ObjectFileELF::FindDynamicSymbol(unsigne
     if (!ParseDynamicSymbols())
         return NULL;
 
-    SectionList *section_list = GetSectionList();
-    if (!section_list)
-        return 0;
-
     DynamicSymbolCollIter I = m_dynamic_symbols.begin();
     DynamicSymbolCollIter E = m_dynamic_symbols.end();
     for ( ; I != E; ++I)
@@ -1057,21 +1248,6 @@ ObjectFileELF::FindDynamicSymbol(unsigne
     return NULL;
 }
 
-Section *
-ObjectFileELF::PLTSection()
-{
-    const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
-    SectionList *section_list = GetSectionList();
-
-    if (symbol && section_list)
-    {
-        addr_t addr = symbol->d_ptr;
-        return section_list->FindSectionContainingFileAddress(addr).get();
-    }
-
-    return NULL;
-}
-
 unsigned
 ObjectFileELF::PLTRelocationType()
 {
@@ -1160,12 +1336,12 @@ ParsePLTRelocations(Symtab *symbol_table
 unsigned
 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table,
                                       user_id_t start_id,
-                                      const ELFSectionHeader *rel_hdr,
+                                      const ELFSectionHeaderInfo *rel_hdr,
                                       user_id_t rel_id)
 {
     assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
 
-    // The link field points to the asscoiated symbol table.  The info field
+    // The link field points to the associated symbol table.  The info field
     // points to the section holding the plt.
     user_id_t symtab_id = rel_hdr->sh_link;
     user_id_t plt_id = rel_hdr->sh_info;
@@ -1177,11 +1353,11 @@ ObjectFileELF::ParseTrampolineSymbols(Sy
     symtab_id++;
     plt_id++;
 
-    const ELFSectionHeader *plt_hdr = GetSectionHeaderByIndex(plt_id);
+    const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
     if (!plt_hdr)
         return 0;
 
-    const ELFSectionHeader *sym_hdr = GetSectionHeaderByIndex(symtab_id);
+    const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
     if (!sym_hdr)
         return 0;
 
@@ -1235,45 +1411,82 @@ ObjectFileELF::ParseTrampolineSymbols(Sy
 }
 
 Symtab *
-ObjectFileELF::GetSymtab()
+ObjectFileELF::GetSymtab(uint32_t flags)
 {
-    if (m_symtab_ap.get())
-        return m_symtab_ap.get();
+    ModuleSP module_sp(GetModule());
+    if (module_sp)
+    {
+        lldb_private::Mutex::Locker locker(module_sp->GetMutex());
+
+        bool from_unified_section_list = !!(flags & eSymtabFromUnifiedSectionList);
+        SectionList *section_list = from_unified_section_list ? module_sp->GetUnifiedSectionList() : GetSectionList();
+        if (!section_list)
+            return NULL;
+
+        // If we're doing the unified section list and it has been modified, then clear our
+        // cache and reload the symbols. If needed, we could check on only the sections that
+        // we use to create the symbol table...
+        std::unique_ptr<lldb_private::Symtab> &symtab_ap = from_unified_section_list ? m_symtab_unified_ap : m_symtab_ap;
+        if (from_unified_section_list && (m_symtab_unified_revisionid != section_list->GetRevisionID()))
+        {
+            symtab_ap.reset();
+            m_symtab_unified_revisionid = section_list->GetRevisionID();
+        }
+        else if (symtab_ap.get())
+        {
+            return symtab_ap.get();
+        }
 
-    Symtab *symbol_table = new Symtab(this);
-    m_symtab_ap.reset(symbol_table);
+        Symtab *symbol_table = new Symtab(this);
+        symtab_ap.reset(symbol_table);
 
-    Mutex::Locker locker(symbol_table->GetMutex());
-    
-    if (!(ParseSectionHeaders() && GetSectionHeaderStringTable()))
-        return symbol_table;
+        // Sharable objects and dynamic executables usually have 2 distinct symbol
+        // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller
+        // version of the symtab that only contains global symbols. The information found
+        // in the dynsym is therefore also found in the symtab, while the reverse is not
+        // necessarily true.
+        Section *section_sym = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get();
+        if (!section_sym)
+        {
+            // The symtab section is non-allocable and can be stripped, so if it doesn't exist
+            // then use the dynsym section which should always be there.
+            section_sym = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get();
+        }
 
-    // Locate and parse all linker symbol tables.
-    uint64_t symbol_id = 0;
-    for (SectionHeaderCollIter I = m_section_headers.begin();
-         I != m_section_headers.end(); ++I)
-    {
-        if (I->sh_type == SHT_SYMTAB || I->sh_type == SHT_DYNSYM)
+        uint64_t symbol_id = 0;
+        if (section_sym)
         {
-            const ELFSectionHeader &symtab_header = *I;
-            user_id_t section_id = SectionIndex(I);
-            symbol_id += ParseSymbolTable(symbol_table, symbol_id,
-                                          &symtab_header, section_id);
+            user_id_t section_id = section_sym->GetID();
+            ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(section_sym->GetObjectFile());
+
+            symbol_id += obj_file_elf->ParseSymbolTable (symbol_table, symbol_id, section_id);
         }
-    }
-    
-    // Synthesize trampoline symbols to help navigate the PLT.
-    Section *reloc_section = PLTSection();
-    if (reloc_section) 
-    {
-        user_id_t reloc_id = reloc_section->GetID();
-        const ELFSectionHeader *reloc_header = GetSectionHeaderByIndex(reloc_id);
-        assert(reloc_header);
 
-        ParseTrampolineSymbols(symbol_table, symbol_id, reloc_header, reloc_id);
-    }
+        Section *section = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get();
+        if (section)
+        {
+            ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(section->GetObjectFile());
 
-    return symbol_table;
+            // Synthesize trampoline symbols to help navigate the PLT.
+            const ELFDynamic *symbol = obj_file_elf->FindDynamicSymbol(DT_JMPREL);
+            if (symbol)
+            {
+                addr_t addr = symbol->d_ptr;
+                Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get();
+                if (reloc_section) 
+                {
+                    user_id_t reloc_id = reloc_section->GetID();
+                    const ELFSectionHeaderInfo *reloc_header = obj_file_elf->GetSectionHeaderByIndex(reloc_id);
+                    assert(reloc_header);
+
+                    obj_file_elf->ParseTrampolineSymbols(symbol_table, symbol_id, reloc_header, reloc_id);
+                }
+            }
+        }
+
+        return symbol_table;
+    }
+    return NULL;
 }
 
 //===----------------------------------------------------------------------===//
@@ -1472,7 +1685,7 @@ ObjectFileELF::DumpELFProgramHeaders(Str
 // Dump a single ELF section header to the specified output stream
 //----------------------------------------------------------------------
 void
-ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeader &sh)
+ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh)
 {
     s->Printf("%8.8x ", sh.sh_name);
     DumpELFSectionHeader_sh_type(s, sh.sh_type);
@@ -1540,7 +1753,7 @@ ObjectFileELF::DumpELFSectionHeader_sh_f
 void
 ObjectFileELF::DumpELFSectionHeaders(Stream *s)
 {
-    if (!(ParseSectionHeaders() && GetSectionHeaderStringTable()))
+    if (!ParseSectionHeaders())
         return;
 
     s->PutCString("Section Headers\n");
@@ -1557,7 +1770,7 @@ ObjectFileELF::DumpELFSectionHeaders(Str
     {
         s->Printf("[%2u] ", idx);
         ObjectFileELF::DumpELFSectionHeader(s, *I);
-        const char* section_name = m_shstr_data.PeekCStr(I->sh_name);
+        const char* section_name = I->section_name.AsCString("");
         if (section_name)
             *s << ' ' << section_name << "\n";
     }

Modified: lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h Mon Jul  1 14:45:50 2013
@@ -100,7 +100,7 @@ public:
     GetAddressByteSize() const;
 
     virtual lldb_private::Symtab *
-    GetSymtab();
+    GetSymtab(uint32_t flags = 0);
 
     virtual lldb_private::SectionList *
     GetSectionList();
@@ -114,6 +114,9 @@ public:
     virtual bool
     GetUUID(lldb_private::UUID* uuid);
 
+    virtual lldb_private::FileSpecList
+    GetDebugSymbolFilePaths();
+
     virtual uint32_t
     GetDependentModules(lldb_private::FileSpecList& files);
 
@@ -141,7 +144,11 @@ private:
     typedef ProgramHeaderColl::iterator         ProgramHeaderCollIter;
     typedef ProgramHeaderColl::const_iterator   ProgramHeaderCollConstIter;
 
-    typedef std::vector<elf::ELFSectionHeader>  SectionHeaderColl;
+    struct ELFSectionHeaderInfo : public elf::ELFSectionHeader
+    {
+        lldb_private::ConstString section_name;
+    };
+    typedef std::vector<ELFSectionHeaderInfo>   SectionHeaderColl;
     typedef SectionHeaderColl::iterator         SectionHeaderCollIter;
     typedef SectionHeaderColl::const_iterator   SectionHeaderCollConstIter;
 
@@ -155,9 +162,13 @@ private:
     /// ELF file header.
     elf::ELFHeader m_header;
 
-    /// ELF build ID
+    /// ELF build ID.
     lldb_private::UUID m_uuid;
 
+    /// ELF .gnu_debuglink file and crc data if available.
+    std::string m_gnu_debuglink_file;
+    uint32_t m_gnu_debuglink_crc;
+
     /// Collection of program headers.
     ProgramHeaderColl m_program_headers;
 
@@ -171,9 +182,6 @@ private:
     /// libraries) on which this object file depends.
     mutable std::unique_ptr<lldb_private::FileSpecList> m_filespec_ap;
 
-    /// Data extractor holding the string table used to resolve section names.
-    lldb_private::DataExtractor m_shstr_data;
-
     /// Cached value of the entry point for this module.
     lldb_private::Address  m_entry_point_address;
 
@@ -197,6 +205,15 @@ private:
     size_t
     ParseSectionHeaders();
 
+    /// Parses the elf section headers and returns the uuid, debug link name, crc.
+    static size_t
+    GetSectionHeaderInfo(SectionHeaderColl &section_headers,
+                         lldb_private::DataExtractor &data,
+                         const elf::ELFHeader &header,
+                         lldb_private::UUID &uuid,
+                         std::string &gnu_debuglink_file,
+                         uint32_t &gnu_debuglink_crc);
+
     /// Scans the dynamic section and locates all dependent modules (shared
     /// libraries) populating m_filespec_ap.  This method will compute the
     /// dependent module list only once.  Returns the number of dependent
@@ -215,23 +232,26 @@ private:
     unsigned
     ParseSymbolTable(lldb_private::Symtab *symbol_table,
                      lldb::user_id_t start_id,
-                     const elf::ELFSectionHeader *symtab_section,
                      lldb::user_id_t symtab_id);
 
+    /// Helper routine for ParseSymbolTable().
+    unsigned
+    ParseSymbols(lldb_private::Symtab *symbol_table, 
+                 lldb::user_id_t start_id,
+                 lldb_private::SectionList *section_list,
+                 const ELFSectionHeaderInfo *symtab_shdr,
+                 const lldb_private::DataExtractor &symtab_data,
+                 const lldb_private::DataExtractor &strtab_data);
+
     /// Scans the relocation entries and adds a set of artificial symbols to the
     /// given symbol table for each PLT slot.  Returns the number of symbols
     /// added.
     unsigned
     ParseTrampolineSymbols(lldb_private::Symtab *symbol_table, 
                            lldb::user_id_t start_id,
-                           const elf::ELFSectionHeader *rela_hdr,
+                           const ELFSectionHeaderInfo *rela_hdr,
                            lldb::user_id_t section_id);
 
-    /// Loads the section name string table into m_shstr_data.  Returns the
-    /// number of bytes constituting the table.
-    size_t
-    GetSectionHeaderStringTable();
-
     /// Utility method for looking up a section given its name.  Returns the
     /// index of the corresponding section or zero if no section with the given
     /// name can be found (note that section indices are always 1 based, and so
@@ -244,7 +264,7 @@ private:
     GetSectionIndexByType(unsigned type);
 
     /// Returns the section header with the given id or NULL.
-    const elf::ELFSectionHeader *
+    const ELFSectionHeaderInfo *
     GetSectionHeaderByIndex(lldb::user_id_t id);
 
     /// @name  ELF header dump routines
@@ -284,7 +304,7 @@ private:
 
     static void
     DumpELFSectionHeader(lldb_private::Stream *s, 
-                         const elf::ELFSectionHeader& sh);
+                         const ELFSectionHeaderInfo& sh);
 
     static void
     DumpELFSectionHeader_sh_type(lldb_private::Stream *s, 
@@ -302,9 +322,6 @@ private:
     const elf::ELFDynamic *
     FindDynamicSymbol(unsigned tag);
         
-    lldb_private::Section *
-    PLTSection();
-
     unsigned
     PLTRelocationType();
 };

Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Mon Jul  1 14:45:50 2013
@@ -838,6 +838,10 @@ ObjectFileMachO::GetAddressClass (lldb::
                     case eSectionTypeDWARFAppleObjC:
                         return eAddressClassDebug;
                     case eSectionTypeEHFrame:               return eAddressClassRuntime;
+                    case eSectionTypeELFSymbolTable:
+                    case eSectionTypeELFDynamicSymbols:
+                    case eSectionTypeELFRelocationEntries:
+                    case eSectionTypeELFDynamicLinkInfo:
                     case eSectionTypeOther:                 return eAddressClassUnknown;
                     }
                 }
@@ -891,7 +895,7 @@ ObjectFileMachO::GetAddressClass (lldb::
 }
 
 Symtab *
-ObjectFileMachO::GetSymtab()
+ObjectFileMachO::GetSymtab(uint32_t flags)
 {
     ModuleSP module_sp(GetModule());
     if (module_sp)
@@ -1033,6 +1037,7 @@ ObjectFileMachO::ParseSections ()
                     if (segment_name || is_core)
                     {
                         segment_sp.reset(new Section (module_sp,              // Module to which this section belongs
+                                                      this,                   // Object file to which this sections belongs
                                                       ++segID << 8,           // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible
                                                       segment_name,           // Name of this section
                                                       eSectionTypeContainer,  // This section is a container of other sections.
@@ -1129,7 +1134,8 @@ ObjectFileMachO::ParseSections ()
                             {
                                 // Create a fake section for the section's named segment
                                 segment_sp.reset(new Section (segment_sp,            // Parent section
-                                                              module_sp,           // Module to which this section belongs
+                                                              module_sp,             // Module to which this section belongs
+                                                              this,                  // Object file to which this section belongs
                                                               ++segID << 8,          // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible
                                                               segment_name,          // Name of this section
                                                               eSectionTypeContainer, // This section is a container of other sections.
@@ -1258,6 +1264,7 @@ ObjectFileMachO::ParseSections ()
 
                         SectionSP section_sp(new Section (segment_sp,
                                                           module_sp,
+                                                          this,
                                                           ++sectID,
                                                           section_name,
                                                           sect_type,

Modified: lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h Mon Jul  1 14:45:50 2013
@@ -102,7 +102,7 @@ public:
     GetAddressClass (lldb::addr_t file_addr);
 
     virtual lldb_private::Symtab *
-    GetSymtab();
+    GetSymtab(uint32_t flags = 0);
 
     virtual lldb_private::SectionList *
     GetSectionList();

Modified: lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp Mon Jul  1 14:45:50 2013
@@ -511,7 +511,7 @@ ObjectFilePECOFF::GetSectionName(std::st
 // GetNListSymtab
 //----------------------------------------------------------------------
 Symtab *
-ObjectFilePECOFF::GetSymtab()
+ObjectFilePECOFF::GetSymtab(uint32_t flags)
 {
     ModuleSP module_sp(GetModule());
     if (module_sp)
@@ -698,9 +698,10 @@ ObjectFilePECOFF::GetSectionList()
                 // Use a segment ID of the segment index shifted left by 8 so they
                 // never conflict with any of the sections.
                 SectionSP section_sp (new Section (module_sp,                    // Module to which this section belongs
+                                                   this,                         // Object file to which this section belongs
                                                    idx + 1,                      // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible
                                                    const_sect_name,              // Name of this section
-                                                   section_type,                    // This section is a container of other sections.
+                                                   section_type,                 // This section is a container of other sections.
                                                    m_coff_header_opt.image_base + m_sect_headers[idx].vmaddr,   // File VM address == addresses as they are found in the object file
                                                    m_sect_headers[idx].vmsize,   // VM size in bytes of this section
                                                    m_sect_headers[idx].offset,   // Offset to the data for this section in the file

Modified: lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h Mon Jul  1 14:45:50 2013
@@ -86,7 +86,7 @@ public:
 //    GetAddressClass (lldb::addr_t file_addr);
 //    
     virtual lldb_private::Symtab *
-    GetSymtab();
+    GetSymtab(uint32_t flags = 0);
     
     virtual lldb_private::SectionList *
     GetSectionList();

Modified: lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp (original)
+++ lldb/trunk/source/Plugins/Process/POSIX/ProcessPOSIX.cpp Mon Jul  1 14:45:50 2013
@@ -81,7 +81,7 @@ ProcessPOSIX::ProcessPOSIX(Target& targe
     // FIXME: Putting this code in the ctor and saving the byte order in a
     // member variable is a hack to avoid const qual issues in GetByteOrder.
 	lldb::ModuleSP module = GetTarget().GetExecutableModule();
-	if (module != NULL && module->GetObjectFile() != NULL)
+	if (module && module->GetObjectFile())
 		m_byte_order = module->GetObjectFile()->GetByteOrder();
 }
 

Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Mon Jul  1 14:45:50 2013
@@ -543,7 +543,7 @@ SymbolFileDWARF::InitializeObject()
     ModuleSP module_sp (m_obj_file->GetModule());
     if (module_sp)
     {
-        const SectionList *section_list = m_obj_file->GetSectionList();
+        const SectionList *section_list = module_sp->GetUnifiedSectionList();
 
         const Section* section = section_list->FindSectionByName(GetDWARFMachOSegmentName ()).get();
 
@@ -704,8 +704,9 @@ SymbolFileDWARF::GetCachedSectionData (u
 {
     if (m_flags.IsClear (got_flag))
     {
+        ModuleSP module_sp (m_obj_file->GetModule());
         m_flags.Set (got_flag);
-        const SectionList *section_list = m_obj_file->GetSectionList();
+        const SectionList *section_list = module_sp->GetUnifiedSectionList();
         if (section_list)
         {
             SectionSP section_sp (section_list->FindSectionByType(sect_type, true));
@@ -1054,7 +1055,8 @@ SymbolFileDWARF::ParseCompileUnitFunctio
         lldb::addr_t highest_func_addr = func_ranges.GetMaxRangeEnd (0);
         if (lowest_func_addr != LLDB_INVALID_ADDRESS && lowest_func_addr <= highest_func_addr)
         {
-            func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, m_obj_file->GetSectionList());
+            ModuleSP module_sp (m_obj_file->GetModule());
+            func_range.GetBaseAddress().ResolveAddressUsingFileSections (lowest_func_addr, module_sp->GetUnifiedSectionList());
             if (func_range.GetBaseAddress().IsValid())
                 func_range.SetByteSize(highest_func_addr - lowest_func_addr);
         }
@@ -4721,7 +4723,7 @@ SymbolFileDWARF::GetObjCClassSymbol (con
     Symbol *objc_class_symbol = NULL;
     if (m_obj_file)
     {
-        Symtab *symtab = m_obj_file->GetSymtab();
+        Symtab *symtab = m_obj_file->GetSymtab (ObjectFile::eSymtabFromUnifiedSectionList);
         if (symtab)
         {
             objc_class_symbol = symtab->FindFirstSymbolWithNameAndType (objc_class_name, 
@@ -7429,13 +7431,12 @@ SymbolFileDWARF::ParseVariableDIE
                         bool linked_oso_file_addr = false;
                         if (is_external && location_DW_OP_addr == 0)
                         {
-                            
                             // we have a possible uninitialized extern global
                             ConstString const_name(mangled ? mangled : name);
                             ObjectFile *debug_map_objfile = debug_map_symfile->GetObjectFile();
                             if (debug_map_objfile)
                             {
-                                Symtab *debug_map_symtab = debug_map_objfile->GetSymtab();
+                                Symtab *debug_map_symtab = debug_map_objfile->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
                                 if (debug_map_symtab)
                                 {
                                     Symbol *exe_symbol = debug_map_symtab->FindFirstSymbolWithNameAndType (const_name,

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=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp Mon Jul  1 14:45:50 2013
@@ -75,9 +75,9 @@ SymbolFileDWARFDebugMap::CompileUnitInfo
     {
         for (auto comp_unit_info : cu_infos)
         {
-            Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab();
+            Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
             ModuleSP oso_module_sp (oso_objfile->GetModule());
-            Symtab *oso_symtab = oso_objfile->GetSymtab();
+            Symtab *oso_symtab = oso_objfile->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
             
             ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction;
             //SectionList *oso_sections = oso_objfile->Sections();
@@ -169,7 +169,7 @@ SymbolFileDWARFDebugMap::CompileUnitInfo
             
             exe_symfile->FinalizeOSOFileRanges (this);
             // We don't need the symbols anymore for the .o files
-            oso_objfile->ClearSymtab();
+            oso_objfile->ClearSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
         }
     }
     return file_range_map;
@@ -330,7 +330,7 @@ SymbolFileDWARFDebugMap::InitOSO()
     // these files exist and also contain valid DWARF. If we get any of that
     // then we return the abilities of the first N_OSO's DWARF.
 
-    Symtab* symtab = m_obj_file->GetSymtab();
+    Symtab* symtab = m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
     if (symtab)
     {
         Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP));
@@ -777,7 +777,7 @@ uint32_t
 SymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc)
 {
     uint32_t resolved_flags = 0;
-    Symtab* symtab = m_obj_file->GetSymtab();
+    Symtab* symtab = m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
     if (symtab)
     {
         const addr_t exe_file_addr = exe_so_addr.GetFileAddress();

Modified: lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/Symtab/SymbolFileSymtab.cpp Mon Jul  1 14:45:50 2013
@@ -93,7 +93,7 @@ SymbolFileSymtab::CalculateAbilities ()
     uint32_t abilities = 0;
     if (m_obj_file)
     {
-        const Symtab *symtab = m_obj_file->GetSymtab();
+        const Symtab *symtab = m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
         if (symtab)
         {
             //----------------------------------------------------------------------
@@ -159,7 +159,7 @@ SymbolFileSymtab::ParseCompileUnitAtInde
     // the entire object file
     if (idx < m_source_indexes.size())
     {
-        const Symbol *cu_symbol = m_obj_file->GetSymtab()->SymbolAtIndex(m_source_indexes[idx]);
+        const Symbol *cu_symbol = m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList)->SymbolAtIndex(m_source_indexes[idx]);
         if (cu_symbol)
             cu_sp.reset(new CompileUnit (m_obj_file->GetModule(), NULL, cu_symbol->GetMangled().GetName().AsCString(), 0, eLanguageTypeUnknown));
     }
@@ -179,7 +179,7 @@ SymbolFileSymtab::ParseCompileUnitFuncti
     size_t num_added = 0;
     // We must at least have a valid compile unit
     assert (sc.comp_unit != NULL);
-    const Symtab *symtab = m_obj_file->GetSymtab();
+    const Symtab *symtab = m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
     const Symbol *curr_symbol = NULL;
     const Symbol *next_symbol = NULL;
 //  const char *prefix = m_obj_file->SymbolPrefix();
@@ -307,13 +307,13 @@ SymbolFileSymtab::FindNamespace (const S
 uint32_t
 SymbolFileSymtab::ResolveSymbolContext (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
 {
-    if (m_obj_file->GetSymtab() == NULL)
+    if (m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList) == NULL)
         return 0;
 
     uint32_t resolved_flags = 0;
     if (resolve_scope & eSymbolContextSymbol)
     {
-        sc.symbol = m_obj_file->GetSymtab()->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
+        sc.symbol = m_obj_file->GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList)->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
         if (sc.symbol)
             resolved_flags |= eSymbolContextSymbol;
     }

Modified: lldb/trunk/source/Plugins/SymbolVendor/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/CMakeLists.txt?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/SymbolVendor/CMakeLists.txt Mon Jul  1 14:45:50 2013
@@ -1,3 +1,5 @@
 if (CMAKE_SYSTEM_NAME MATCHES "Darwin")
   add_subdirectory(MacOSX)
 endif()
+
+add_subdirectory(ELF)

Added: lldb/trunk/source/Plugins/SymbolVendor/ELF/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/ELF/CMakeLists.txt?rev=185366&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/ELF/CMakeLists.txt (added)
+++ lldb/trunk/source/Plugins/SymbolVendor/ELF/CMakeLists.txt Mon Jul  1 14:45:50 2013
@@ -0,0 +1,5 @@
+set(LLVM_NO_RTTI 1)
+
+add_lldb_library(lldbPluginSymbolVendorELF
+  SymbolVendorELF.cpp
+  )

Added: lldb/trunk/source/Plugins/SymbolVendor/ELF/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/ELF/Makefile?rev=185366&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/ELF/Makefile (added)
+++ lldb/trunk/source/Plugins/SymbolVendor/ELF/Makefile Mon Jul  1 14:45:50 2013
@@ -0,0 +1,14 @@
+##===- source/Plugins/SymbolVendor/ELF/Makefile ---------*- Makefile -*-===##
+# 
+#                     The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+# 
+##===----------------------------------------------------------------------===##
+
+LLDB_LEVEL := ../../../..
+LIBRARYNAME := lldbPluginSymbolVendorELF
+BUILD_ARCHIVE = 1
+
+include $(LLDB_LEVEL)/Makefile

Added: lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp?rev=185366&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp (added)
+++ lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.cpp Mon Jul  1 14:45:50 2013
@@ -0,0 +1,200 @@
+//===-- SymbolVendorELF.cpp ----------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SymbolVendorELF.h"
+
+//#include <libxml/parser.h>
+// #include <libxml/tree.h>
+#include <string.h>
+
+// #include <AvailabilityMacros.h>
+
+#include "lldb/Core/Module.h"
+#include "lldb/Core/ModuleSpec.h"
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Core/Section.h"
+#include "lldb/Core/StreamString.h"
+#include "lldb/Core/Timer.h"
+#include "lldb/Host/Host.h"
+#include "lldb/Host/Symbols.h"
+#include "lldb/Symbol/ObjectFile.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//----------------------------------------------------------------------
+// SymbolVendorELF constructor
+//----------------------------------------------------------------------
+SymbolVendorELF::SymbolVendorELF(const lldb::ModuleSP &module_sp) :
+    SymbolVendor (module_sp)
+{
+}
+
+//----------------------------------------------------------------------
+// Destructor
+//----------------------------------------------------------------------
+SymbolVendorELF::~SymbolVendorELF()
+{
+}
+
+void
+SymbolVendorELF::Initialize()
+{
+    PluginManager::RegisterPlugin (GetPluginNameStatic(),
+                                   GetPluginDescriptionStatic(),
+                                   CreateInstance);
+}
+
+void
+SymbolVendorELF::Terminate()
+{
+    PluginManager::UnregisterPlugin (CreateInstance);
+}
+
+
+lldb_private::ConstString
+SymbolVendorELF::GetPluginNameStatic()
+{
+    static ConstString g_name("ELF");
+    return g_name;
+}
+
+const char *
+SymbolVendorELF::GetPluginDescriptionStatic()
+{
+    return "Symbol vendor for ELF that looks for dSYM files that match executables.";
+}
+
+
+
+//----------------------------------------------------------------------
+// CreateInstance
+//
+// Platforms can register a callback to use when creating symbol
+// vendors to allow for complex debug information file setups, and to
+// also allow for finding separate debug information files.
+//----------------------------------------------------------------------
+SymbolVendor*
+SymbolVendorELF::CreateInstance (const lldb::ModuleSP &module_sp, lldb_private::Stream *feedback_strm)
+{
+    if (!module_sp)
+        return NULL;
+
+    ObjectFile *obj_file = module_sp->GetObjectFile();
+    if (!obj_file)
+        return NULL;
+
+    static ConstString obj_file_elf("elf");
+    ConstString obj_name = obj_file->GetPluginName();
+    if (obj_name != obj_file_elf)
+        return NULL;
+
+    lldb_private::UUID uuid;
+    if (!obj_file->GetUUID (&uuid))
+        return NULL;
+
+    // Get the .gnu_debuglink file (if specified).
+    FileSpecList file_spec_list = obj_file->GetDebugSymbolFilePaths();
+
+    // If the module specified a filespec, use it first.
+    FileSpec debug_symbol_fspec (module_sp->GetSymbolFileFileSpec());
+    if (debug_symbol_fspec)
+        file_spec_list.Insert (0, debug_symbol_fspec);
+
+    // If we have no debug symbol files, then nothing to do.
+    if (file_spec_list.IsEmpty())
+        return NULL;
+
+    Timer scoped_timer (__PRETTY_FUNCTION__,
+                        "SymbolVendorELF::CreateInstance (module = %s)",
+                        module_sp->GetFileSpec().GetPath().c_str());
+
+    for (size_t idx = 0; idx < file_spec_list.GetSize(); ++idx)
+    {
+        ModuleSpec module_spec;
+        const FileSpec fspec = file_spec_list.GetFileSpecAtIndex (idx);
+
+        module_spec.GetFileSpec() = obj_file->GetFileSpec();
+        module_spec.GetFileSpec().ResolvePath();
+        module_spec.GetSymbolFileSpec() = fspec;
+        module_spec.GetUUID() = uuid;
+        FileSpec dsym_fspec = Symbols::LocateExecutableSymbolFile (module_spec);
+        if (dsym_fspec)
+        {
+            DataBufferSP dsym_file_data_sp;
+            lldb::offset_t dsym_file_data_offset = 0;
+            ObjectFileSP dsym_objfile_sp = ObjectFile::FindPlugin(module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp, dsym_file_data_offset);
+            if (dsym_objfile_sp)
+            {
+                // This objfile is for debugging purposes. Sadly, ObjectFileELF won't be able
+                // to figure this out consistently as the symbol file may not have stripped the
+                // code sections, etc.
+                dsym_objfile_sp->SetType (ObjectFile::eTypeDebugInfo);
+
+                SymbolVendorELF* symbol_vendor = new SymbolVendorELF(module_sp);
+                if (symbol_vendor)
+                {
+                    // Get the module unified section list and add our debug sections to that.
+                    SectionList *module_section_list = module_sp->GetUnifiedSectionList();
+                    SectionList *objfile_section_list = dsym_objfile_sp->GetSectionList();
+
+                    static const SectionType g_sections[] =
+                    {
+                        eSectionTypeDWARFDebugAranges,
+                        eSectionTypeDWARFDebugInfo,
+                        eSectionTypeDWARFDebugAbbrev,
+                        eSectionTypeDWARFDebugFrame,
+                        eSectionTypeDWARFDebugLine,
+                        eSectionTypeDWARFDebugStr,
+                        eSectionTypeDWARFDebugLoc,
+                        eSectionTypeDWARFDebugMacInfo,
+                        eSectionTypeDWARFDebugPubNames,
+                        eSectionTypeDWARFDebugPubTypes,
+                        eSectionTypeDWARFDebugRanges,
+                        eSectionTypeELFSymbolTable,
+                    };
+                    for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx)
+                    {
+                        SectionType section_type = g_sections[idx];
+                        SectionSP section_sp (objfile_section_list->FindSectionByType (section_type, true));
+                        if (section_sp)
+                        {
+                            SectionSP module_section_sp (module_section_list->FindSectionByType (section_type, true));
+                            if (module_section_sp)
+                                module_section_list->ReplaceSection (module_section_sp->GetID(), section_sp);
+                            else
+                                module_section_list->AddSection (section_sp);
+                        }
+                    }
+                    module_section_list->Finalize();
+
+                    symbol_vendor->AddSymbolFileRepresentation (dsym_objfile_sp);
+                    return symbol_vendor;
+                }
+            }
+        }
+    }
+    return NULL;
+}
+
+//------------------------------------------------------------------
+// PluginInterface protocol
+//------------------------------------------------------------------
+ConstString
+SymbolVendorELF::GetPluginName()
+{
+    return GetPluginNameStatic();
+}
+
+uint32_t
+SymbolVendorELF::GetPluginVersion()
+{
+    return 1;
+}
+

Added: lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h?rev=185366&view=auto
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h (added)
+++ lldb/trunk/source/Plugins/SymbolVendor/ELF/SymbolVendorELF.h Mon Jul  1 14:45:50 2013
@@ -0,0 +1,58 @@
+//===-- SymbolVendorELF.h ------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_SymbolVendorELF_h_
+#define liblldb_SymbolVendorELF_h_
+
+#include "lldb/lldb-private.h"
+#include "lldb/Symbol/SymbolVendor.h"
+
+class SymbolVendorELF : public lldb_private::SymbolVendor
+{
+public:
+    //------------------------------------------------------------------
+    // Static Functions
+    //------------------------------------------------------------------
+    static void
+    Initialize();
+
+    static void
+    Terminate();
+
+    static lldb_private::ConstString
+    GetPluginNameStatic();
+
+    static const char *
+    GetPluginDescriptionStatic();
+
+    static lldb_private::SymbolVendor*
+    CreateInstance (const lldb::ModuleSP &module_sp, lldb_private::Stream *feedback_strm);
+
+    //------------------------------------------------------------------
+    // Constructors and Destructors
+    //------------------------------------------------------------------
+    SymbolVendorELF (const lldb::ModuleSP &module_sp);
+
+    virtual
+    ~SymbolVendorELF();
+
+    //------------------------------------------------------------------
+    // PluginInterface protocol
+    //------------------------------------------------------------------
+    virtual lldb_private::ConstString
+    GetPluginName();
+
+    virtual uint32_t
+    GetPluginVersion();
+
+private:
+    DISALLOW_COPY_AND_ASSIGN (SymbolVendorELF);
+};
+
+#endif  // liblldb_SymbolVendorELF_h_

Modified: lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.cpp Mon Jul  1 14:45:50 2013
@@ -83,7 +83,7 @@ UUIDsMatch(Module *module, ObjectFile *o
     return false;
 }
 
-static void
+static bool
 ReplaceDSYMSectionsWithExecutableSections (ObjectFile *exec_objfile, ObjectFile *dsym_objfile)
 {
     // We need both the executable and the dSYM to live off of the
@@ -123,7 +123,9 @@ ReplaceDSYMSectionsWithExecutableSection
         }
         
         dsym_section_list->Finalize(); // Now that we're done adding sections, finalize to build fast-lookup caches
+        return true;
     }
+    return false;
 }
 
 void
@@ -169,6 +171,15 @@ SymbolVendorMacOSX::CreateInstance (cons
     if (!module_sp)
         return NULL;
 
+    ObjectFile * obj_file = module_sp->GetObjectFile();
+    if (!obj_file)
+        return NULL;
+    
+    static ConstString obj_file_macho("mach-o");
+    ConstString obj_name = obj_file->GetPluginName();
+    if (obj_name != obj_file_macho)
+        return NULL;
+
     Timer scoped_timer (__PRETTY_FUNCTION__,
                         "SymbolVendorMacOSX::CreateInstance (module = %s)",
                         module_sp->GetFileSpec().GetPath().c_str());
@@ -179,119 +190,115 @@ SymbolVendorMacOSX::CreateInstance (cons
         path[0] = '\0';
 
         // Try and locate the dSYM file on Mac OS X
-        ObjectFile * obj_file = module_sp->GetObjectFile();
-        if (obj_file)
-        {
-            Timer scoped_timer2 ("SymbolVendorMacOSX::CreateInstance () locate dSYM",
-                                 "SymbolVendorMacOSX::CreateInstance (module = %s) locate dSYM",
-                                 module_sp->GetFileSpec().GetPath().c_str());
-
-            // First check to see if the module has a symbol file in mind already.
-            // If it does, then we MUST use that.
-            FileSpec dsym_fspec (module_sp->GetSymbolFileFileSpec());
+        Timer scoped_timer2 ("SymbolVendorMacOSX::CreateInstance () locate dSYM",
+                             "SymbolVendorMacOSX::CreateInstance (module = %s) locate dSYM",
+                             module_sp->GetFileSpec().GetPath().c_str());
+
+        // First check to see if the module has a symbol file in mind already.
+        // If it does, then we MUST use that.
+        FileSpec dsym_fspec (module_sp->GetSymbolFileFileSpec());
             
-            ObjectFileSP dsym_objfile_sp;
-            if (!dsym_fspec)
-            {
-                // No symbol file was specified in the module, lets try and find
-                // one ourselves.
-                FileSpec file_spec = obj_file->GetFileSpec();
-                if (!file_spec)
-                    file_spec = module_sp->GetFileSpec();
+        ObjectFileSP dsym_objfile_sp;
+        if (!dsym_fspec)
+        {
+            // No symbol file was specified in the module, lets try and find
+            // one ourselves.
+            FileSpec file_spec = obj_file->GetFileSpec();
+            if (!file_spec)
+                file_spec = module_sp->GetFileSpec();
                 
-                ModuleSpec module_spec(file_spec, module_sp->GetArchitecture());
-                module_spec.GetUUID() = module_sp->GetUUID();
-                dsym_fspec = Symbols::LocateExecutableSymbolFile (module_spec);
-                if (module_spec.GetSourceMappingList().GetSize())
-                    module_sp->GetSourceMappingList().Append (module_spec.GetSourceMappingList (), true);
-            }
+            ModuleSpec module_spec(file_spec, module_sp->GetArchitecture());
+            module_spec.GetUUID() = module_sp->GetUUID();
+            dsym_fspec = Symbols::LocateExecutableSymbolFile (module_spec);
+            if (module_spec.GetSourceMappingList().GetSize())
+                module_sp->GetSourceMappingList().Append (module_spec.GetSourceMappingList (), true);
+        }
             
-            if (dsym_fspec)
+        if (dsym_fspec)
+        {
+            DataBufferSP dsym_file_data_sp;
+            lldb::offset_t dsym_file_data_offset = 0;
+            dsym_objfile_sp = ObjectFile::FindPlugin(module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp, dsym_file_data_offset);
+            if (UUIDsMatch(module_sp.get(), dsym_objfile_sp.get(), feedback_strm))
             {
-                DataBufferSP dsym_file_data_sp;
-                lldb::offset_t dsym_file_data_offset = 0;
-                dsym_objfile_sp = ObjectFile::FindPlugin(module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp, dsym_file_data_offset);
-                if (UUIDsMatch(module_sp.get(), dsym_objfile_sp.get(), feedback_strm))
+                char dsym_path[PATH_MAX];
+                if (module_sp->GetSourceMappingList().IsEmpty() && dsym_fspec.GetPath(dsym_path, sizeof(dsym_path)))
                 {
-                    char dsym_path[PATH_MAX];
-                    if (module_sp->GetSourceMappingList().IsEmpty() && dsym_fspec.GetPath(dsym_path, sizeof(dsym_path)))
+                    lldb_private::UUID dsym_uuid;
+                    if (dsym_objfile_sp->GetUUID(&dsym_uuid))
                     {
-                        lldb_private::UUID dsym_uuid;
-                        if (dsym_objfile_sp->GetUUID(&dsym_uuid))
+                        std::string uuid_str = dsym_uuid.GetAsString ();
+                        if (!uuid_str.empty())
                         {
-                            std::string uuid_str = dsym_uuid.GetAsString ();
-                            if (!uuid_str.empty())
+                            char *resources = strstr (dsym_path, "/Contents/Resources/");
+                            if (resources)
                             {
-                                char *resources = strstr (dsym_path, "/Contents/Resources/");
-                                if (resources)
+                                char dsym_uuid_plist_path[PATH_MAX];
+                                resources[strlen("/Contents/Resources/")] = '\0';
+                                snprintf(dsym_uuid_plist_path, sizeof(dsym_uuid_plist_path), "%s%s.plist", dsym_path, uuid_str.c_str());
+                                FileSpec dsym_uuid_plist_spec(dsym_uuid_plist_path, false);
+                                if (dsym_uuid_plist_spec.Exists())
                                 {
-                                    char dsym_uuid_plist_path[PATH_MAX];
-                                    resources[strlen("/Contents/Resources/")] = '\0';
-                                    snprintf(dsym_uuid_plist_path, sizeof(dsym_uuid_plist_path), "%s%s.plist", dsym_path, uuid_str.c_str());
-                                    FileSpec dsym_uuid_plist_spec(dsym_uuid_plist_path, false);
-                                    if (dsym_uuid_plist_spec.Exists())
+                                    xmlDoc *doc = ::xmlReadFile (dsym_uuid_plist_path, NULL, 0);
+                                    if (doc)
                                     {
-                                        xmlDoc *doc = ::xmlReadFile (dsym_uuid_plist_path, NULL, 0);
-                                        if (doc)
+                                        char DBGBuildSourcePath[PATH_MAX];
+                                        char DBGSourcePath[PATH_MAX];
+                                        DBGBuildSourcePath[0] = '\0';
+                                        DBGSourcePath[0] = '\0';
+                                        for (xmlNode *node = doc->children; node; node = node ? node->next : NULL)
                                         {
-                                            char DBGBuildSourcePath[PATH_MAX];
-                                            char DBGSourcePath[PATH_MAX];
-                                            DBGBuildSourcePath[0] = '\0';
-                                            DBGSourcePath[0] = '\0';
-                                            for (xmlNode *node = doc->children; node; node = node ? node->next : NULL)
+                                            if (node->type == XML_ELEMENT_NODE)
                                             {
-                                                if (node->type == XML_ELEMENT_NODE)
+                                                if (node->name && strcmp((const char*)node->name, "plist") == 0)
                                                 {
-                                                    if (node->name && strcmp((const char*)node->name, "plist") == 0)
+                                                    xmlNode *dict_node = node->children;
+                                                    while (dict_node && dict_node->type != XML_ELEMENT_NODE)
+                                                        dict_node = dict_node->next;
+                                                    if (dict_node && dict_node->name && strcmp((const char *)dict_node->name, "dict") == 0)
                                                     {
-                                                        xmlNode *dict_node = node->children;
-                                                        while (dict_node && dict_node->type != XML_ELEMENT_NODE)
-                                                            dict_node = dict_node->next;
-                                                        if (dict_node && dict_node->name && strcmp((const char *)dict_node->name, "dict") == 0)
+                                                        for (xmlNode *key_node = dict_node->children; key_node; key_node = key_node->next)
                                                         {
-                                                            for (xmlNode *key_node = dict_node->children; key_node; key_node = key_node->next)
+                                                            if (key_node && key_node->type == XML_ELEMENT_NODE && key_node->name)
                                                             {
-                                                                if (key_node && key_node->type == XML_ELEMENT_NODE && key_node->name)
+                                                                if (strcmp((const char *)key_node->name, "key") == 0)
                                                                 {
-                                                                    if (strcmp((const char *)key_node->name, "key") == 0)
+                                                                    const char *key_name = (const char *)::xmlNodeGetContent(key_node);
+                                                                    if (strcmp(key_name, "DBGBuildSourcePath") == 0)
                                                                     {
-                                                                        const char *key_name = (const char *)::xmlNodeGetContent(key_node);
-                                                                        if (strcmp(key_name, "DBGBuildSourcePath") == 0)
+                                                                        xmlNode *value_node = key_node->next;
+                                                                        while (value_node && value_node->type != XML_ELEMENT_NODE)
+                                                                            value_node = value_node->next;
+                                                                        if (value_node && value_node->name)
                                                                         {
-                                                                            xmlNode *value_node = key_node->next;
-                                                                            while (value_node && value_node->type != XML_ELEMENT_NODE)
-                                                                                value_node = value_node->next;
-                                                                            if (value_node && value_node->name)
+                                                                            if (strcmp((const char *)value_node->name, "string") == 0)
                                                                             {
-                                                                                if (strcmp((const char *)value_node->name, "string") == 0)
+                                                                                const char *node_content = (const char *)::xmlNodeGetContent(value_node);
+                                                                                if (node_content)
                                                                                 {
-                                                                                    const char *node_content = (const char *)::xmlNodeGetContent(value_node);
-                                                                                    if (node_content)
-                                                                                    {
-                                                                                        strncpy(DBGBuildSourcePath, node_content, sizeof(DBGBuildSourcePath));
-                                                                                    }
+                                                                                    strncpy(DBGBuildSourcePath, node_content, sizeof(DBGBuildSourcePath));
                                                                                 }
-                                                                                key_node = value_node;
                                                                             }
+                                                                            key_node = value_node;
                                                                         }
-                                                                        else if (strcmp(key_name, "DBGSourcePath") == 0)
+                                                                    }
+                                                                    else if (strcmp(key_name, "DBGSourcePath") == 0)
+                                                                    {
+                                                                        xmlNode *value_node = key_node->next;
+                                                                        while (value_node && value_node->type != XML_ELEMENT_NODE)
+                                                                            value_node = value_node->next;
+                                                                        if (value_node && value_node->name)
                                                                         {
-                                                                            xmlNode *value_node = key_node->next;
-                                                                            while (value_node && value_node->type != XML_ELEMENT_NODE)
-                                                                                value_node = value_node->next;
-                                                                            if (value_node && value_node->name)
+                                                                            if (strcmp((const char *)value_node->name, "string") == 0)
                                                                             {
-                                                                                if (strcmp((const char *)value_node->name, "string") == 0)
+                                                                                const char *node_content = (const char *)::xmlNodeGetContent(value_node);
+                                                                                if (node_content)
                                                                                 {
-                                                                                    const char *node_content = (const char *)::xmlNodeGetContent(value_node);
-                                                                                    if (node_content)
-                                                                                    {
-                                                                                        FileSpec resolved_source_path(node_content, true);
-                                                                                        resolved_source_path.GetPath(DBGSourcePath, sizeof(DBGSourcePath));
-                                                                                    }
+                                                                                    FileSpec resolved_source_path(node_content, true);
+                                                                                    resolved_source_path.GetPath(DBGSourcePath, sizeof(DBGSourcePath));
                                                                                 }
-                                                                                key_node = value_node;
                                                                             }
+                                                                            key_node = value_node;
                                                                         }
                                                                     }
                                                                 }
@@ -300,30 +307,39 @@ SymbolVendorMacOSX::CreateInstance (cons
                                                     }
                                                 }
                                             }
-                                            ::xmlFreeDoc (doc);
+                                        }
+                                        ::xmlFreeDoc (doc);
                                             
-                                            if (DBGBuildSourcePath[0] && DBGSourcePath[0])
-                                            {
-                                                module_sp->GetSourceMappingList().Append (ConstString(DBGBuildSourcePath), ConstString(DBGSourcePath), true);
-                                            }
+                                        if (DBGBuildSourcePath[0] && DBGSourcePath[0])
+                                        {
+                                            module_sp->GetSourceMappingList().Append (ConstString(DBGBuildSourcePath), ConstString(DBGSourcePath), true);
                                         }
                                     }
                                 }
                             }
                         }
                     }
+                }
 
-                    ReplaceDSYMSectionsWithExecutableSections (obj_file, dsym_objfile_sp.get());
-                    symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp);
-                    return symbol_vendor;
+                if (ReplaceDSYMSectionsWithExecutableSections (obj_file, dsym_objfile_sp.get()))
+                {
+                    SectionList *section_list = dsym_objfile_sp.get()->GetSectionList();
+                    if (section_list)
+                    {
+                        section_list->Copy (module_sp->GetUnifiedSectionList());
+                        section_list->Finalize ();
+                    }
                 }
-            }
 
-            // Just create our symbol vendor using the current objfile as this is either
-            // an executable with no dSYM (that we could locate), an executable with
-            // a dSYM that has a UUID that doesn't match.
-            symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this());
+                symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp);
+                return symbol_vendor;
+            }
         }
+
+        // Just create our symbol vendor using the current objfile as this is either
+        // an executable with no dSYM (that we could locate), an executable with
+        // a dSYM that has a UUID that doesn't match.
+        symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this());
     }
     return symbol_vendor;
 }

Modified: lldb/trunk/source/Symbol/Function.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Function.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Function.cpp (original)
+++ lldb/trunk/source/Symbol/Function.cpp Mon Jul  1 14:45:50 2013
@@ -568,9 +568,9 @@ Function::GetPrologueByteSize ()
                     // Check the first few instructions and look for one that has
                     // is_prologue_end set to true.
                     const uint32_t last_line_entry_idx = first_line_entry_idx + 6;
-                    LineEntry line_entry;
                     for (uint32_t idx = first_line_entry_idx + 1; idx < last_line_entry_idx; ++idx)
                     {
+                        LineEntry line_entry;
                         if (line_table->GetLineEntryAtIndex (idx, line_entry))
                         {
                             if (line_entry.is_prologue_end)
@@ -581,12 +581,31 @@ Function::GetPrologueByteSize ()
                         }
                     }
                 }
-                
+
                 // If we didn't find the end of the prologue in the line tables,
                 // then just use the end address of the first line table entry
                 if (prologue_end_file_addr == LLDB_INVALID_ADDRESS)
                 {
-                    prologue_end_file_addr = first_line_entry.range.GetBaseAddress().GetFileAddress() + first_line_entry.range.GetByteSize();
+                    // Check the first few instructions and look for one that has
+                    // a line number that's different than the first entry.
+                    const uint32_t last_line_entry_idx = first_line_entry_idx + 6;
+                    for (uint32_t idx = first_line_entry_idx + 1; idx < last_line_entry_idx; ++idx)
+                    {
+                        LineEntry line_entry;
+                        if (line_table->GetLineEntryAtIndex (idx, line_entry))
+                        {
+                            if (line_entry.line != first_line_entry.line)
+                            {
+                                prologue_end_file_addr = line_entry.range.GetBaseAddress().GetFileAddress();
+                                break;
+                            }
+                        }
+                    }
+
+                    if (prologue_end_file_addr == LLDB_INVALID_ADDRESS)
+                    {
+                        prologue_end_file_addr = first_line_entry.range.GetBaseAddress().GetFileAddress() + first_line_entry.range.GetByteSize();
+                    }
                 }
                 const addr_t func_start_file_addr = m_range.GetBaseAddress().GetFileAddress();
                 const addr_t func_end_file_addr = func_start_file_addr + m_range.GetByteSize();

Modified: lldb/trunk/source/Symbol/ObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ObjectFile.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ObjectFile.cpp (original)
+++ lldb/trunk/source/Symbol/ObjectFile.cpp Mon Jul  1 14:45:50 2013
@@ -244,7 +244,9 @@ ObjectFile::ObjectFile (const lldb::Modu
     m_process_wp(),
     m_memory_addr (LLDB_INVALID_ADDRESS),
     m_sections_ap (),
-    m_symtab_ap ()
+    m_symtab_ap (),
+    m_symtab_unified_ap (),
+    m_symtab_unified_revisionid (0)
 {
     if (file_spec_ptr)
         m_file = *file_spec_ptr;
@@ -291,7 +293,9 @@ ObjectFile::ObjectFile (const lldb::Modu
     m_process_wp (process_sp),
     m_memory_addr (header_addr),
     m_sections_ap (),
-    m_symtab_ap ()
+    m_symtab_ap (),
+    m_symtab_unified_ap (),
+    m_symtab_unified_revisionid (0)
 {
     if (header_data_sp)
         m_data.SetData (header_data_sp, 0, header_data_sp->GetByteSize());
@@ -327,7 +331,7 @@ ObjectFile::SetModulesArchitecture (cons
 AddressClass
 ObjectFile::GetAddressClass (addr_t file_addr)
 {
-    Symtab *symtab = GetSymtab();
+    Symtab *symtab = GetSymtab(ObjectFile::eSymtabFromUnifiedSectionList);
     if (symtab)
     {
         Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr);
@@ -374,6 +378,10 @@ ObjectFile::GetAddressClass (addr_t file
                     case eSectionTypeDWARFAppleObjC:
                         return eAddressClassDebug;
                     case eSectionTypeEHFrame:               return eAddressClassRuntime;
+                    case eSectionTypeELFSymbolTable:
+                    case eSectionTypeELFDynamicSymbols:
+                    case eSectionTypeELFRelocationEntries:
+                    case eSectionTypeELFDynamicLinkInfo:
                     case eSectionTypeOther:                 return eAddressClassUnknown;
                     }
                 }
@@ -453,6 +461,10 @@ ObjectFile::CopyData (off_t offset, size
 size_t
 ObjectFile::ReadSectionData (const Section *section, off_t section_offset, void *dst, size_t dst_len) const
 {
+    // If some other objectfile owns this data, pass this to them.
+    if (section->GetObjectFile() != this)
+        return section->GetObjectFile()->ReadSectionData (section, section_offset, dst, dst_len);
+
     if (IsInMemory())
     {
         ProcessSP process_sp (m_process_wp.lock());
@@ -498,6 +510,10 @@ ObjectFile::ReadSectionData (const Secti
 size_t
 ObjectFile::ReadSectionData (const Section *section, DataExtractor& section_data) const
 {
+    // If some other objectfile owns this data, pass this to them.
+    if (section->GetObjectFile() != this)
+        return section->GetObjectFile()->ReadSectionData (section, section_data);
+
     if (IsInMemory())
     {
         ProcessSP process_sp (m_process_wp.lock());
@@ -529,6 +545,10 @@ ObjectFile::ReadSectionData (const Secti
 size_t
 ObjectFile::MemoryMapSectionData (const Section *section, DataExtractor& section_data) const
 {
+    // If some other objectfile owns this data, pass this to them.
+    if (section->GetObjectFile() != this)
+        return section->GetObjectFile()->MemoryMapSectionData (section, section_data);
+
     if (IsInMemory())
     {
         return ReadSectionData (section, section_data);
@@ -566,19 +586,29 @@ ObjectFile::SplitArchivePathWithObject (
 }
 
 void
-ObjectFile::ClearSymtab ()
+ObjectFile::ClearSymtab (uint32_t flags)
 {
     ModuleSP module_sp(GetModule());
     if (module_sp)
     {
         lldb_private::Mutex::Locker locker(module_sp->GetMutex());
+        bool unified_section_list = !!(flags & ObjectFile::eSymtabFromUnifiedSectionList);
         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
         if (log)
         {
-            log->Printf ("%p ObjectFile::ClearSymtab () symtab = %p",
+            log->Printf ("%p ObjectFile::ClearSymtab (%s) symtab = %p",
                          this,
-                         m_symtab_ap.get());
+                         unified_section_list ? "unified" : "",
+                         unified_section_list ? m_symtab_unified_ap.get() : m_symtab_ap.get());
+        }
+        if (unified_section_list)
+        {
+            m_symtab_unified_ap.reset();
+            m_symtab_unified_revisionid = 0;
+        }
+        else
+        {
+            m_symtab_ap.reset();
         }
-        m_symtab_ap.reset();
     }
 }

Modified: lldb/trunk/source/Symbol/Symbol.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Symbol.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Symbol.cpp (original)
+++ lldb/trunk/source/Symbol/Symbol.cpp Mon Jul  1 14:45:50 2013
@@ -16,6 +16,7 @@
 #include "lldb/Symbol/Symtab.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Target/Target.h"
+#include "lldb/Symbol/SymbolVendor.h"
 
 using namespace lldb;
 using namespace lldb_private;
@@ -288,22 +289,59 @@ Symbol::GetPrologueByteSize ()
             m_type_data_resolved = true;
             ModuleSP module_sp (m_addr_range.GetBaseAddress().GetModule());
             SymbolContext sc;
-            if (module_sp && module_sp->ResolveSymbolContextForAddress (m_addr_range.GetBaseAddress(),
-                                                                        eSymbolContextLineEntry,
-                                                                        sc))
+            if (module_sp)
             {
-                m_type_data = sc.line_entry.range.GetByteSize();
-                // Sanity check - this may be a function in the middle of code that has debug information, but
-                // not for this symbol.  So the line entries surrounding us won't lie inside our function.
-                // In that case, the line entry will be bigger than we are, so we do that quick check and
-                // if that is true, we just return 0.
-                if (m_type_data >= m_addr_range.GetByteSize())
+                uint32_t resolved_flags = module_sp->ResolveSymbolContextForAddress (m_addr_range.GetBaseAddress(),
+                                                                                     eSymbolContextLineEntry,
+                                                                                     sc);
+                if (resolved_flags & eSymbolContextLineEntry)
+                {
+                    // Default to the end of the first line entry.
+                    m_type_data = sc.line_entry.range.GetByteSize();
+
+                    // Set address for next line.
+                    Address addr (m_addr_range.GetBaseAddress());
+                    addr.Slide (m_type_data);
+
+                    // Check the first few instructions and look for one that has a line number that is
+                    // different than the first entry. This is also done in Function::GetPrologueByteSize().
+                    uint16_t total_offset = m_type_data;
+                    for (int idx = 0; idx < 6; ++idx)
+                    {
+                        SymbolContext sc_temp;
+                        resolved_flags = module_sp->ResolveSymbolContextForAddress (addr, eSymbolContextLineEntry, sc_temp);
+                        // Make sure we got line number information...
+                        if (!(resolved_flags & eSymbolContextLineEntry))
+                            break;
+
+                        // If this line number is different than our first one, use it and we're done.
+                        if (sc_temp.line_entry.line != sc.line_entry.line)
+                        {
+                            m_type_data = total_offset;
+                            break;
+                        }
+
+                        // Slide addr up to the next line address.
+                        addr.Slide (sc_temp.line_entry.range.GetByteSize());
+                        total_offset += sc_temp.line_entry.range.GetByteSize();
+                        // If we've gone too far, bail out.
+                        if (total_offset >= m_addr_range.GetByteSize())
+                            break;
+                    }
+
+                    // Sanity check - this may be a function in the middle of code that has debug information, but
+                    // not for this symbol.  So the line entries surrounding us won't lie inside our function.
+                    // In that case, the line entry will be bigger than we are, so we do that quick check and
+                    // if that is true, we just return 0.
+                    if (m_type_data >= m_addr_range.GetByteSize())
+                        m_type_data = 0;
+                }
+                else
+                {
+                    // TODO: expose something in Process to figure out the
+                    // size of a function prologue.
                     m_type_data = 0;
-            }
-            else
-            {
-                // TODO: expose something in Process to figure out the
-                // size of a function prologue.
+                }
             }
         }
         return m_type_data;
@@ -418,10 +456,10 @@ Symbol::GetByteSize () const
             ModuleSP module_sp (GetAddress().GetModule());
             if (module_sp)
             {
-                ObjectFile *objfile = module_sp->GetObjectFile();
-                if (objfile)
+                SymbolVendor *sym_vendor = module_sp->GetSymbolVendor();
+                if (sym_vendor)
                 {
-                    Symtab *symtab = objfile->GetSymtab();
+                    Symtab *symtab = sym_vendor->GetSymtab();
                     if (symtab)
                     {
                         const_cast<Symbol*>(this)->SetByteSize (symtab->CalculateSymbolSize (const_cast<Symbol *>(this)));

Modified: lldb/trunk/source/Symbol/SymbolVendor.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/SymbolVendor.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/SymbolVendor.cpp (original)
+++ lldb/trunk/source/Symbol/SymbolVendor.cpp Mon Jul  1 14:45:50 2013
@@ -35,21 +35,14 @@ SymbolVendor*
 SymbolVendor::FindPlugin (const lldb::ModuleSP &module_sp, lldb_private::Stream *feedback_strm)
 {
     std::unique_ptr<SymbolVendor> instance_ap;
-    //----------------------------------------------------------------------
-    // We currently only have one debug symbol parser...
-    //----------------------------------------------------------------------
     SymbolVendorCreateInstance create_callback;
+
     for (size_t idx = 0; (create_callback = PluginManager::GetSymbolVendorCreateCallbackAtIndex(idx)) != NULL; ++idx)
     {
         instance_ap.reset(create_callback(module_sp, feedback_strm));
 
         if (instance_ap.get())
         {
-            // TODO: make sure this symbol vendor is what we want. We
-            // currently are just returning the first one we find, but
-            // we may want to call this function only when we have our
-            // main executable module and then give all symbol vendor
-            // plug-ins a chance to compete for who wins.
             return instance_ap.release();
         }
     }
@@ -84,7 +77,7 @@ SymbolVendor::~SymbolVendor()
 }
 
 //----------------------------------------------------------------------
-// Add a represantion given an object file.
+// Add a represention given an object file.
 //----------------------------------------------------------------------
 void
 SymbolVendor::AddSymbolFileRepresentation(const ObjectFileSP &objfile_sp)
@@ -444,6 +437,36 @@ SymbolVendor::GetCompileUnitAtIndex(size
     return cu_sp;
 }
 
+Symtab *
+SymbolVendor::GetSymtab ()
+{
+    ModuleSP module_sp(GetModule());
+    if (module_sp)
+    {
+        ObjectFile *objfile = module_sp->GetObjectFile();
+        if (objfile)
+        {
+            // Get symbol table from unified section list.
+            return objfile->GetSymtab (ObjectFile::eSymtabFromUnifiedSectionList);
+        }
+    }
+    return NULL;
+}
+
+void
+SymbolVendor::ClearSymtab()
+{
+    ModuleSP module_sp(GetModule());
+    if (module_sp)
+    {
+        ObjectFile *objfile = module_sp->GetObjectFile();
+        if (objfile)
+        {
+            // Clear symbol table from unified section list.
+            objfile->ClearSymtab (ObjectFile::eSymtabFromUnifiedSectionList);
+        }
+    }
+}
 
 //------------------------------------------------------------------
 // PluginInterface protocol

Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Mon Jul  1 14:45:50 2013
@@ -1775,6 +1775,15 @@ Target::GetDefaultExecutableSearchPaths
     return FileSpecList();
 }
 
+FileSpecList
+Target::GetDefaultDebugFileSearchPaths ()
+{
+    TargetPropertiesSP properties_sp(Target::GetGlobalProperties());
+    if (properties_sp)
+        return properties_sp->GetDebugFileSearchPaths();
+    return FileSpecList();
+}
+
 ArchSpec
 Target::GetDefaultArchitecture ()
 {
@@ -2305,6 +2314,7 @@ g_properties[] =
       "and the second is where the remainder of the original build hierarchy is rooted on the local system.  "
       "Each element of the array is checked in order and the first one that results in a match wins." },
     { "exec-search-paths"                  , OptionValue::eTypeFileSpecList, false, 0                       , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." },
+    { "debug-file-search-paths"            , OptionValue::eTypeFileSpecList, false, 0                       , NULL, NULL, "List of directories to be searched when locating debug symbol files." },
     { "max-children-count"                 , OptionValue::eTypeSInt64    , false, 256                       , NULL, NULL, "Maximum number of children to expand in any level of depth." },
     { "max-string-summary-length"          , OptionValue::eTypeSInt64    , false, 1024                      , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." },
     { "max-memory-read-size"               , OptionValue::eTypeSInt64    , false, 1024                      , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." },
@@ -2340,6 +2350,7 @@ enum
     ePropertySkipPrologue,
     ePropertySourceMap,
     ePropertyExecutableSearchPaths,
+    ePropertyDebugFileSearchPaths,
     ePropertyMaxChildrenCount,
     ePropertyMaxSummaryLength,
     ePropertyMaxMemReadSize,
@@ -2615,6 +2626,15 @@ TargetProperties::GetExecutableSearchPat
     OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
     assert(option_value);
     return option_value->GetCurrentValue();
+}
+
+FileSpecList &
+TargetProperties::GetDebugFileSearchPaths ()
+{
+    const uint32_t idx = ePropertyDebugFileSearchPaths;
+    OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx);
+    assert(option_value);
+    return option_value->GetCurrentValue();
 }
 
 bool

Modified: lldb/trunk/source/lldb.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=185366&r1=185365&r2=185366&view=diff
==============================================================================
--- lldb/trunk/source/lldb.cpp (original)
+++ lldb/trunk/source/lldb.cpp Mon Jul  1 14:45:50 2013
@@ -30,6 +30,7 @@
 #include "Plugins/Disassembler/llvm/DisassemblerLLVMC.h"
 #include "Plugins/Instruction/ARM/EmulateInstructionARM.h"
 #include "Plugins/SymbolVendor/MacOSX/SymbolVendorMacOSX.h"
+#include "Plugins/SymbolVendor/ELF/SymbolVendorELF.h"
 #include "Plugins/ObjectContainer/BSD-Archive/ObjectContainerBSDArchive.h"
 #include "Plugins/ObjectFile/ELF/ObjectFileELF.h"
 #include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h"
@@ -98,6 +99,7 @@ lldb_private::Initialize ()
         DisassemblerLLVMC::Initialize();
         ObjectContainerBSDArchive::Initialize();
         ObjectFileELF::Initialize();
+        SymbolVendorELF::Initialize();
         SymbolFileDWARF::Initialize();
         SymbolFileSymtab::Initialize();
         UnwindAssemblyInstEmulation::Initialize();
@@ -177,6 +179,7 @@ lldb_private::Terminate ()
     DisassemblerLLVMC::Terminate();
     ObjectContainerBSDArchive::Terminate();
     ObjectFileELF::Terminate();
+    SymbolVendorELF::Terminate();
     SymbolFileDWARF::Terminate();
     SymbolFileSymtab::Terminate();
     UnwindAssembly_x86::Terminate();
@@ -361,6 +364,10 @@ lldb_private::GetSectionTypeAsCString (S
     case eSectionTypeDWARFDebugPubTypes: return "dwarf-pubtypes";
     case eSectionTypeDWARFDebugRanges: return "dwarf-ranges";
     case eSectionTypeDWARFDebugStr: return "dwarf-str";
+    case eSectionTypeELFSymbolTable: return "elf-symbol-table";
+    case eSectionTypeELFDynamicSymbols: return "elf-dynamic-symbols";
+    case eSectionTypeELFRelocationEntries: return "elf-relocation-entries";
+    case eSectionTypeELFDynamicLinkInfo: return "elf-dynamic-link-info";
     case eSectionTypeDWARFAppleNames: return "apple-names";
     case eSectionTypeDWARFAppleTypes: return "apple-types";
     case eSectionTypeDWARFAppleNamespaces: return "apple-namespaces";





More information about the lldb-commits mailing list