diff --git a/lldb/include/lldb/Symbol/Symtab.h b/lldb/include/lldb/Symbol/Symtab.h index 338bda643af9..92ebbe54f151 100644 --- a/lldb/include/lldb/Symbol/Symtab.h +++ b/lldb/include/lldb/Symbol/Symtab.h @@ -32,6 +32,7 @@ public: void Dump(Stream *s, Process *process) const; void Dump(Stream *s, Process *process, std::vector& indexes) const; + Symbol * FindSymbolByID (lldb::user_id_t uid) const; Symbol * SymbolAtIndex (uint32_t idx); const Symbol * SymbolAtIndex (uint32_t idx) const; Symbol * FindSymbolWithType (lldb::SymbolType symbol_type, uint32_t &start_idx); @@ -55,7 +56,7 @@ public: static void DumpSymbolHeader (Stream *s); protected: - typedef std::vector collection; + typedef std::vector collection; typedef collection::iterator iterator; typedef collection::const_iterator const_iterator; diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index 9d05fac4d2e3..63755cf540a2 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -878,6 +878,10 @@ ObjectFileMachO::ParseSymtab (bool minimize) case StabIncludeFileName: // N_SOL - #included file name: name,,n_sect,0,address type = eSymbolTypeHeaderFile; + + // We currently don't use the header files on darwin + if (minimize) + add_nlist = false; break; case StabCompilerParameters: @@ -1175,7 +1179,13 @@ ObjectFileMachO::ParseSymtab (bool minimize) { const uint32_t symbol_index = indirect_symbol_index_data.GetU32 (&symbol_stub_offset); - Symbol *stub_symbol = symtab->SymbolAtIndex(symbol_index); + Symbol *stub_symbol; + if (minimize) + stub_symbol = symtab->FindSymbolByID (symbol_index); + else + stub_symbol = symtab->SymbolAtIndex (symbol_index); + + assert (stub_symbol); if (stub_symbol) { Address so_addr(symbol_stub_addr, section_list); diff --git a/lldb/source/Symbol/Symtab.cpp b/lldb/source/Symbol/Symtab.cpp index 7cb76106c340..74bb65f21ee7 100644 --- a/lldb/source/Symbol/Symtab.cpp +++ b/lldb/source/Symbol/Symtab.cpp @@ -136,6 +136,31 @@ Symtab::DumpSymbolHeader (Stream *s) s->Indent("------- ------ --- ------------ ------------------ ------------------ ------------------ ---------- ----------------------------------\n"); } + +static int +CompareSymbolID (const void *key, const void *p) +{ + const user_id_t match_uid = *(user_id_t*) key; + const user_id_t symbol_uid = ((Symbol *)p)->GetID(); + if (match_uid < symbol_uid) + return -1; + if (match_uid > symbol_uid) + return 1; + return 0; +} + +Symbol * +Symtab::FindSymbolByID (lldb::user_id_t symbol_uid) const +{ + Symbol *symbol = (Symbol*)::bsearch (&symbol_uid, + &m_symbols[0], + m_symbols.size(), + sizeof(Symbol), + CompareSymbolID); + return symbol; +} + + Symbol * Symtab::SymbolAtIndex(uint32_t idx) {