[Lldb-commits] [lldb] r260377 - Revert "Improve the handling of missing elf symtab and missing symbol sizes"

Tamas Berghammer via lldb-commits lldb-commits at lists.llvm.org
Wed Feb 10 04:10:59 PST 2016


Author: tberghammer
Date: Wed Feb 10 06:10:58 2016
New Revision: 260377

URL: http://llvm.org/viewvc/llvm-project?rev=260377&view=rev
Log:
Revert "Improve the handling of missing elf symtab and missing symbol sizes"

This reverts commit 252dda67782f2cbf838e375bce21ed4191f6d9ce.

The commit caused several test failure on the OSX build bot.

Modified:
    lldb/trunk/include/lldb/Core/RangeMap.h
    lldb/trunk/include/lldb/Symbol/DWARFCallFrameInfo.h
    lldb/trunk/include/lldb/Symbol/ObjectFile.h
    lldb/trunk/include/lldb/Symbol/Symtab.h
    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/Symbol/DWARFCallFrameInfo.cpp
    lldb/trunk/source/Symbol/ObjectFile.cpp
    lldb/trunk/source/Symbol/Symtab.cpp

Modified: lldb/trunk/include/lldb/Core/RangeMap.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/RangeMap.h?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/RangeMap.h (original)
+++ lldb/trunk/include/lldb/Core/RangeMap.h Wed Feb 10 06:10:58 2016
@@ -1123,7 +1123,7 @@ namespace lldb_private {
         // Calculate the byte size of ranges with zero byte sizes by finding
         // the next entry with a base address > the current base address
         void
-        CalculateSizesOfZeroByteSizeRanges (S full_size = 0)
+        CalculateSizesOfZeroByteSizeRanges ()
         {
 #ifdef ASSERT_RANGEMAP_ARE_SORTED
             assert (IsSorted());
@@ -1148,8 +1148,6 @@ namespace lldb_private {
                             break;
                         }
                     }
-                    if (next == end && full_size > curr_base)
-                        pos->SetByteSize (full_size - curr_base);
                 }
             }
         }
@@ -1305,22 +1303,6 @@ namespace lldb_private {
                     return &(*pos);
             }
             return nullptr;
-        }
-        
-        const Entry*
-        FindEntryStartsAt (B addr) const
-        {
-#ifdef ASSERT_RANGEMAP_ARE_SORTED
-            assert (IsSorted());
-#endif
-            if (!m_entries.empty())
-            {
-                auto begin = m_entries.begin(), end = m_entries.end();
-                auto pos = std::lower_bound (begin, end, Entry(addr, 1), BaseLessThan);
-                if (pos != end && pos->base == addr)
-                    return &(*pos);
-            }
-            return nullptr;
         }
         
         Entry *

Modified: lldb/trunk/include/lldb/Symbol/DWARFCallFrameInfo.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/DWARFCallFrameInfo.h?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/DWARFCallFrameInfo.h (original)
+++ lldb/trunk/include/lldb/Symbol/DWARFCallFrameInfo.h Wed Feb 10 06:10:58 2016
@@ -73,9 +73,6 @@ public:
     void
     GetFunctionAddressAndSizeVector (FunctionAddressAndSizeVector &function_info);
 
-    void
-    ForEachFDEEntries(const std::function<bool(lldb::addr_t, uint32_t, dw_offset_t)>& callback);
-
 private:
     enum
     {

Modified: lldb/trunk/include/lldb/Symbol/ObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/ObjectFile.h?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/ObjectFile.h (original)
+++ lldb/trunk/include/lldb/Symbol/ObjectFile.h Wed Feb 10 06:10:58 2016
@@ -860,7 +860,6 @@ 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;
-    uint32_t m_synthetic_symbol_idx;
     
     //------------------------------------------------------------------
     /// Sets the architecture for a module.  At present the architecture
@@ -874,11 +873,7 @@ protected:
     ///     Returns \b true if the architecture was changed, \b
     ///     false otherwise.
     //------------------------------------------------------------------
-    bool
-    SetModulesArchitecture (const ArchSpec &new_arch);
-
-    ConstString
-    GetNextSyntheticSymbolName();
+    bool SetModulesArchitecture (const ArchSpec &new_arch);
 
 private:
     DISALLOW_COPY_AND_ASSIGN (ObjectFile);

Modified: lldb/trunk/include/lldb/Symbol/Symtab.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/Symtab.h?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/Symtab.h (original)
+++ lldb/trunk/include/lldb/Symbol/Symtab.h Wed Feb 10 06:10:58 2016
@@ -79,7 +79,7 @@ public:
             size_t      FindAllSymbolsWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes);
             size_t      FindAllSymbolsMatchingRexExAndType (const RegularExpression &regex, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility, std::vector<uint32_t>& symbol_indexes);
             Symbol *    FindFirstSymbolWithNameAndType (const ConstString &name, lldb::SymbolType symbol_type, Debug symbol_debug_type, Visibility symbol_visibility);
-            Symbol *    FindSymbolAtFileAddress (lldb::addr_t file_addr);
+            Symbol *    FindSymbolContainingFileAddress (lldb::addr_t file_addr, const uint32_t* indexes, uint32_t num_indexes);
             Symbol *    FindSymbolContainingFileAddress (lldb::addr_t file_addr);
             void        ForEachSymbolContainingFileAddress(lldb::addr_t file_addr, std::function<bool(Symbol *)> const &callback);
             size_t      FindFunctionSymbols (const ConstString &name, uint32_t name_type_mask, SymbolContextList& sc_list);

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=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp Wed Feb 10 06:10:58 2016
@@ -2332,11 +2332,11 @@ ObjectFileELF::ParseSymbols (Symtab *sym
                 mangled.SetDemangledName( ConstString((demangled_name + suffix).str()) );
         }
 
-        // In ELF all symbol should have a valid size but it is not true for some function symbols
-        // coming from hand written assembly. As none of the function symbol should have 0 size we
-        // try to calculate the size for these symbols in the symtab with saying that their original
+        // In ELF all symbol should have a valid size but it is not true for some code symbols
+        // coming from hand written assembly. As none of the code symbol should have 0 size we try
+        // to calculate the size for these symbols in the symtab with saying that their original
         // size is not valid.
-        bool symbol_size_valid = symbol.st_size != 0 || symbol.getType() != STT_FUNC;
+        bool symbol_size_valid = symbol.st_size != 0 || symbol_type != eSymbolTypeCode;
 
         Symbol dc_symbol(
             i + start_id,       // ID is the original symbol table index.
@@ -2863,14 +2863,6 @@ ObjectFileELF::GetSymtab()
             }
         }
 
-        DWARFCallFrameInfo* eh_frame = GetUnwindTable().GetEHFrameInfo();
-        if (eh_frame)
-        {
-            if (m_symtab_ap == nullptr)
-                m_symtab_ap.reset(new Symtab(this));
-            ParseUnwindSymbols (m_symtab_ap.get(), eh_frame);
-        }
-
         // If we still don't have any symtab then create an empty instance to avoid do the section
         // lookup next time.
         if (m_symtab_ap == nullptr)
@@ -2900,65 +2892,58 @@ ObjectFileELF::GetSymtab()
     return m_symtab_ap.get();
 }
 
-void
-ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table, DWARFCallFrameInfo* eh_frame)
+Symbol *
+ObjectFileELF::ResolveSymbolForAddress(const Address& so_addr, bool verify_unique)
 {
-    SectionList* section_list = GetSectionList();
+    if (!m_symtab_ap.get())
+        return nullptr; // GetSymtab() should be called first.
+
+    const SectionList *section_list = GetSectionList();
     if (!section_list)
-        return;
+        return nullptr;
 
-    // First we save the new symbols into a separate list and add them to the symbol table after
-    // we colleced all symbols we want to add. This is neccessary because adding a new symbol
-    // invalidates the internal index of the symtab what causing the next lookup to be slow because
-    // it have to recalculate the index first.
-    std::vector<Symbol> new_symbols;
-
-    eh_frame->ForEachFDEEntries(
-        [this, symbol_table, section_list, &new_symbols](lldb::addr_t file_addr,
-                                                         uint32_t size,
-                                                         dw_offset_t) {
-        Symbol* symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
-        if (symbol)
-        {
-            if (!symbol->GetByteSizeIsValid())
-            {
-                symbol->SetByteSize(size);
-                symbol->SetSizeIsSynthesized(true);
-            }
-        }
-        else
+    if (DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo())
+    {
+        AddressRange range;
+        if (eh_frame->GetAddressRange (so_addr, range))
         {
-            SectionSP section_sp = section_list->FindSectionContainingFileAddress(file_addr);
-            if (section_sp)
+            const addr_t file_addr = range.GetBaseAddress().GetFileAddress();
+            Symbol * symbol = verify_unique ? m_symtab_ap->FindSymbolContainingFileAddress(file_addr) : nullptr;
+            if (symbol)
+                return symbol;
+
+            // Note that a (stripped) symbol won't be found by GetSymtab()...
+            lldb::SectionSP eh_sym_section_sp = section_list->FindSectionContainingFileAddress(file_addr);
+            if (eh_sym_section_sp.get())
             {
-                addr_t offset = file_addr - section_sp->GetFileAddress();
-                const char* symbol_name = GetNextSyntheticSymbolName().GetCString();
-                uint64_t symbol_id = symbol_table->GetNumSymbols();
+                addr_t section_base = eh_sym_section_sp->GetFileAddress();
+                addr_t offset = file_addr - section_base;
+                uint64_t symbol_id = m_symtab_ap->GetNumSymbols();
+
                 Symbol eh_symbol(
-                        symbol_id,       // Symbol table index.
-                        symbol_name,     // Symbol name.
-                        false,           // Is the symbol name mangled?
-                        eSymbolTypeCode, // Type of this symbol.
-                        true,            // Is this globally visible?
-                        false,           // Is this symbol debug info?
-                        false,           // Is this symbol a trampoline?
-                        true,            // Is this symbol artificial?
-                        section_sp,      // Section in which this symbol is defined or null.
-                        offset,          // Offset in section or symbol value.
-                        0,               // Size:          Don't specify the size as an FDE can
-                        false,           // Size is valid: cover multiple symbols.
-                        false,           // Contains linker annotations?
-                        0);              // Symbol flags.
-                new_symbols.push_back(eh_symbol);
+                        symbol_id,            // Symbol table index.
+                        "???",                // Symbol name.
+                        false,                // Is the symbol name mangled?
+                        eSymbolTypeCode,      // Type of this symbol.
+                        true,                 // Is this globally visible?
+                        false,                // Is this symbol debug info?
+                        false,                // Is this symbol a trampoline?
+                        true,                 // Is this symbol artificial?
+                        eh_sym_section_sp,    // Section in which this symbol is defined or null.
+                        offset,               // Offset in section or symbol value.
+                        range.GetByteSize(),  // Size in bytes of this symbol.
+                        true,                 // Size is valid.
+                        false,                // Contains linker annotations?
+                        0);                   // Symbol flags.
+                if (symbol_id == m_symtab_ap->AddSymbol(eh_symbol))
+                    return m_symtab_ap->SymbolAtIndex(symbol_id);
             }
         }
-        return true;
-    });
-
-    for (const Symbol& s : new_symbols)
-        symbol_table->AddSymbol(s);
+    }
+    return nullptr;
 }
 
+
 bool
 ObjectFileELF::IsStripped ()
 {

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=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h (original)
+++ lldb/trunk/source/Plugins/ObjectFile/ELF/ObjectFileELF.h Wed Feb 10 06:10:58 2016
@@ -150,6 +150,9 @@ public:
     lldb_private::Symtab *
     GetSymtab() override;
 
+    lldb_private::Symbol *
+    ResolveSymbolForAddress(const lldb_private::Address& so_addr, bool verify_unique) override;
+
     bool
     IsStripped () override;
 
@@ -346,10 +349,6 @@ private:
                            const ELFSectionHeaderInfo *rela_hdr,
                            lldb::user_id_t section_id);
 
-    void
-    ParseUnwindSymbols(lldb_private::Symtab *symbol_table,
-                       lldb_private::DWARFCallFrameInfo* eh_frame);
-
     /// Relocates debug sections
     unsigned
     RelocateDebugSections(const elf::ELFSectionHeader *rel_hdr, lldb::user_id_t rel_id);

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=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp (original)
+++ lldb/trunk/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp Wed Feb 10 06:10:58 2016
@@ -4517,6 +4517,7 @@ ObjectFileMachO::ParseSymtab ()
 
         if (function_starts_count > 0)
         {
+            char synthetic_function_symbol[PATH_MAX];
             uint32_t num_synthetic_function_symbols = 0;
             for (i=0; i<function_starts_count; ++i)
             {
@@ -4531,6 +4532,7 @@ ObjectFileMachO::ParseSymtab ()
                     num_syms = sym_idx + num_synthetic_function_symbols;
                     sym = symtab->Resize (num_syms);
                 }
+                uint32_t synthetic_function_symbol_idx = 0;
                 for (i=0; i<function_starts_count; ++i)
                 {
                     const FunctionStarts::Entry *func_start_entry = function_starts.GetEntryAtIndex (i);
@@ -4565,8 +4567,13 @@ ObjectFileMachO::ParseSymtab ()
                                 {
                                     symbol_byte_size = section_end_file_addr - symbol_file_addr;
                                 }
+                                snprintf (synthetic_function_symbol,
+                                          sizeof(synthetic_function_symbol),
+                                          "___lldb_unnamed_function%u$$%s",
+                                          ++synthetic_function_symbol_idx,
+                                          module_sp->GetFileSpec().GetFilename().GetCString());
                                 sym[sym_idx].SetID (synthetic_sym_id++);
-                                sym[sym_idx].GetMangled().SetDemangledName(GetNextSyntheticSymbolName());
+                                sym[sym_idx].GetMangled().SetDemangledName(ConstString(synthetic_function_symbol));
                                 sym[sym_idx].SetType (eSymbolTypeCode);
                                 sym[sym_idx].SetIsSynthetic (true);
                                 sym[sym_idx].GetAddressRef() = symbol_addr;

Modified: lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp (original)
+++ lldb/trunk/source/Symbol/DWARFCallFrameInfo.cpp Wed Feb 10 06:10:58 2016
@@ -899,17 +899,3 @@ DWARFCallFrameInfo::HandleCommonDwarfOpc
     }
     return false;
 }
-
-void
-DWARFCallFrameInfo::ForEachFDEEntries(
-    const std::function<bool(lldb::addr_t, uint32_t, dw_offset_t)>& callback)
-{
-    GetFDEIndex();
-
-    for (size_t i = 0, c = m_fde_index.GetSize(); i < c; ++i)
-    {
-        const FDEEntryMap::Entry& entry = m_fde_index.GetEntryRef(i);
-        if (!callback(entry.base, entry.size, entry.data))
-            break;
-    }
-}

Modified: lldb/trunk/source/Symbol/ObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/ObjectFile.cpp?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/ObjectFile.cpp (original)
+++ lldb/trunk/source/Symbol/ObjectFile.cpp Wed Feb 10 06:10:58 2016
@@ -241,7 +241,8 @@ ObjectFile::ObjectFile (const lldb::Modu
                         lldb::offset_t file_offset,
                         lldb::offset_t length,
                         const lldb::DataBufferSP& data_sp,
-                        lldb::offset_t data_offset) :
+                        lldb::offset_t data_offset
+) :
     ModuleChild (module_sp),
     m_file (),  // This file could be different from the original module's file
     m_type (eTypeInvalid),
@@ -253,8 +254,7 @@ ObjectFile::ObjectFile (const lldb::Modu
     m_process_wp(),
     m_memory_addr (LLDB_INVALID_ADDRESS),
     m_sections_ap(),
-    m_symtab_ap (),
-    m_synthetic_symbol_idx (0)
+    m_symtab_ap ()
 {
     if (file_spec_ptr)
         m_file = *file_spec_ptr;
@@ -286,8 +286,7 @@ ObjectFile::ObjectFile (const lldb::Modu
     m_process_wp (process_sp),
     m_memory_addr (header_addr),
     m_sections_ap(),
-    m_symtab_ap (),
-    m_synthetic_symbol_idx (0)
+    m_symtab_ap ()
 {
     if (header_data_sp)
         m_data.SetData (header_data_sp, 0, header_data_sp->GetByteSize());
@@ -654,13 +653,3 @@ ObjectFile::GetSymbolTypeFromName (llvm:
     }
     return symbol_type_hint;
 }
-
-ConstString
-ObjectFile::GetNextSyntheticSymbolName()
-{
-    StreamString ss;
-    ConstString file_name = GetModule()->GetFileSpec().GetFilename();
-    ss.Printf("___lldb_unnamed_symbol%u$$%s", ++m_synthetic_symbol_idx, file_name.GetCString());
-    return ConstString(ss.GetData());
-}
-

Modified: lldb/trunk/source/Symbol/Symtab.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/Symtab.cpp?rev=260377&r1=260376&r2=260377&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/Symtab.cpp (original)
+++ lldb/trunk/source/Symbol/Symtab.cpp Wed Feb 10 06:10:58 2016
@@ -894,6 +894,35 @@ typedef struct
     addr_t match_offset;
 } SymbolSearchInfo;
 
+static int
+SymbolWithClosestFileAddress (SymbolSearchInfo *info, const uint32_t *index_ptr)
+{
+    const Symbol *symbol = info->symtab->SymbolAtIndex (index_ptr[0]);
+    if (symbol == nullptr)
+        return -1;
+
+    const addr_t info_file_addr = info->file_addr;
+    if (symbol->ValueIsAddress())
+    {
+        const addr_t curr_file_addr = symbol->GetAddressRef().GetFileAddress();
+        if (info_file_addr < curr_file_addr)
+            return -1;
+
+        // Since we are finding the closest symbol that is greater than or equal
+        // to 'info->file_addr' we set the symbol here. This will get set
+        // multiple times, but after the search is done it will contain the best
+        // symbol match
+        info->match_symbol = const_cast<Symbol *>(symbol);
+        info->match_index_ptr = index_ptr;
+        info->match_offset = info_file_addr - curr_file_addr;
+
+        if (info_file_addr > curr_file_addr)
+            return +1;
+        return 0;
+    }
+    return -1;
+}
+
 void
 Symtab::InitAddressIndexes()
 {
@@ -915,33 +944,43 @@ Symtab::InitAddressIndexes()
                 m_file_addr_to_index.Append(entry);
             }
         }
-
-        lldb::addr_t total_size = 0;
-
         const size_t num_entries = m_file_addr_to_index.GetSize();
         if (num_entries > 0)
         {
             m_file_addr_to_index.Sort();
-
+            m_file_addr_to_index.CalculateSizesOfZeroByteSizeRanges();
+        
             // Now our last symbols might not have had sizes because there
             // was no subsequent symbol to calculate the size from. If this is
             // the case, then calculate the size by capping it at the end of the
             // section in which the symbol resides
             for (int i = num_entries - 1; i >= 0; --i)
             {
-                const FileRangeToIndexMap::Entry& entry = m_file_addr_to_index.GetEntryRef(i);
-
-                // As we iterate backwards, as soon as we find a symbol with a valid byte size, we
-                // are done.
+                const FileRangeToIndexMap::Entry &entry = m_file_addr_to_index.GetEntryRef(i);
+                // As we iterate backwards, as soon as we find a symbol with a valid
+                // byte size, we are done
                 if (entry.GetByteSize() > 0)
                     break;
 
-                const Address& address = m_symbols[entry.data].GetAddressRef();
-                if (SectionSP section_sp = address.GetSection())
-                    total_size = entry.base + section_sp->GetByteSize() - address.GetOffset();
+                // Cap the size to the end of the section in which the symbol resides
+                SectionSP section_sp (m_objfile->GetSectionList()->FindSectionContainingFileAddress (entry.GetRangeBase()));
+                if (section_sp)
+                {
+                    const lldb::addr_t end_section_file_addr = section_sp->GetFileAddress() + section_sp->GetByteSize();
+                    const lldb::addr_t symbol_file_addr = entry.GetRangeBase();
+                    if (end_section_file_addr > symbol_file_addr)
+                    {
+                        Symbol &symbol = m_symbols[entry.data];
+                        if (!symbol.GetByteSizeIsValid())
+                        {
+                            symbol.SetByteSize(end_section_file_addr - symbol_file_addr);
+                            symbol.SetSizeIsSynthesized(true);
+                        }
+                    }
+                }
             }
-
-            m_file_addr_to_index.CalculateSizesOfZeroByteSizeRanges(total_size);
+            // Sort again in case the range size changes the ordering
+            m_file_addr_to_index.Sort();
         }
     }
 }
@@ -981,18 +1020,37 @@ Symtab::CalculateSymbolSizes ()
 }
 
 Symbol *
-Symtab::FindSymbolAtFileAddress (addr_t file_addr)
+Symtab::FindSymbolContainingFileAddress (addr_t file_addr, const uint32_t* indexes, uint32_t num_indexes)
 {
     Mutex::Locker locker (m_mutex);
-    if (!m_file_addr_to_index_computed)
-        InitAddressIndexes();
 
-    const FileRangeToIndexMap::Entry *entry = m_file_addr_to_index.FindEntryStartsAt(file_addr);
-    if (entry)
+    
+    SymbolSearchInfo info = { this, file_addr, nullptr, nullptr, 0 };
+
+    ::bsearch (&info, 
+               indexes, 
+               num_indexes, 
+               sizeof(uint32_t), 
+               (ComparisonFunction)SymbolWithClosestFileAddress);
+
+    if (info.match_symbol)
     {
-        Symbol* symbol = SymbolAtIndex(entry->data);
-        if (symbol->GetFileAddress() == file_addr)
-            return symbol;
+        if (info.match_offset == 0)
+        {
+            // We found an exact match!
+            return info.match_symbol;
+        }
+
+        if (!info.match_symbol->GetByteSizeIsValid())
+        {
+            // The matched symbol dosn't have a valid byte size so lets just go with that match...
+            return info.match_symbol;
+        }
+
+        // We were able to figure out a symbol size so lets make sure our 
+        // offset puts "file_addr" in the symbol's address range.
+        if (info.match_offset < info.match_symbol->GetByteSize())
+            return info.match_symbol;
     }
     return nullptr;
 }
@@ -1030,12 +1088,8 @@ Symtab::ForEachSymbolContainingFileAddre
 
     for (size_t i = 0; i < addr_match_count; ++i)
     {
-        Symbol* symbol = SymbolAtIndex(all_addr_indexes[i]);
-        if (symbol->ContainsFileAddress(file_addr))
-        {
-            if (!callback(symbol))
-                break;
-        }
+        if (!callback(SymbolAtIndex(all_addr_indexes[i])))
+        break;
     }
 }
 




More information about the lldb-commits mailing list