forked from OSchip/llvm-project
<rdar://problem/15191078>
Fixed Module::ResolveSymbolContextForAddress() to be able to also look in the SymbolVendor's SymbolFile's ObjectFile for a more meaningful symbol when a symbol lookup finds a synthetic symbol from the main object file. This will help lookups on MacOSX as the main executable might be stripped, but the dSYM file always has a full symbol table. llvm-svn: 192510
This commit is contained in:
parent
a1490d616f
commit
93e2861b81
|
@ -95,6 +95,10 @@ public:
|
|||
bool add_mangled,
|
||||
NameToIndexMap &name_to_index_map) const;
|
||||
|
||||
ObjectFile * GetObjectFile()
|
||||
{
|
||||
return m_objfile;
|
||||
}
|
||||
protected:
|
||||
typedef std::vector<Symbol> collection;
|
||||
typedef collection::iterator iterator;
|
||||
|
|
|
@ -499,7 +499,39 @@ Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve
|
|||
}
|
||||
|
||||
if (sc.symbol)
|
||||
{
|
||||
if (sc.symbol->IsSynthetic())
|
||||
{
|
||||
// We have a synthetic symbol so lets check if the object file
|
||||
// from the symbol file in the symbol vendor is different than
|
||||
// the object file for the module, and if so search its symbol
|
||||
// table to see if we can come up with a better symbol. For example
|
||||
// dSYM files on MacOSX have an unstripped symbol table inside of
|
||||
// them.
|
||||
ObjectFile *symtab_objfile = symtab->GetObjectFile();
|
||||
if (symtab_objfile && symtab_objfile->IsStripped())
|
||||
{
|
||||
SymbolFile *symfile = sym_vendor->GetSymbolFile();
|
||||
if (symfile)
|
||||
{
|
||||
ObjectFile *symfile_objfile = symfile->GetObjectFile();
|
||||
if (symfile_objfile != symtab_objfile)
|
||||
{
|
||||
Symtab *symfile_symtab = symfile_objfile->GetSymtab();
|
||||
if (symfile_symtab)
|
||||
{
|
||||
Symbol *symbol = symfile_symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
|
||||
if (symbol && !symbol->IsSynthetic())
|
||||
{
|
||||
sc.symbol = symbol;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
resolved_flags |= eSymbolContextSymbol;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -949,7 +949,7 @@ ObjectFileMachO::IsStripped ()
|
|||
}
|
||||
}
|
||||
if (m_dysymtab.cmd)
|
||||
return m_dysymtab.nlocalsym == 0;
|
||||
return m_dysymtab.nlocalsym <= 1;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue