Added Symtab::FindSymbolByID() in preparation for enabling the minimal
symbol tables. Minimal symbol tables enable us to merge two symbols, one
debug symbol and one linker symbol, into a single symbol that can carry
just as much information and will avoid duplicate symbols in the symbol
table.
llvm-svn: 113223
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 9d05fac..63755cf 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -878,6 +878,10 @@
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 @@
{
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 7cb7610..74bb65f 100644
--- a/lldb/source/Symbol/Symtab.cpp
+++ b/lldb/source/Symbol/Symtab.cpp
@@ -136,6 +136,31 @@
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)
{