mirror of
https://github.com/intel/llvm.git
synced 2026-01-15 12:25:46 +08:00
Adds an option to resolve a symbol from an address that can be used
to build out the symbol table as addresses are used, and implements
the mechanism for ELF to add stripped symbols from eh_frame.
Uses this mechanism to allow disassembly for addresses corresponding
to stripped symbols for ELF, and provide hooks to implement this for
PE COFF.
Also removes eSymbolContextTailCall in favor of an option for
ResolveSymbolContextForAddress for consistency with the documentation
for eSymbolContextEverything. Essentially, this is just an option for
interpreting the so_addr.
llvm-svn: 191307
This commit is contained in:
@@ -449,7 +449,8 @@ Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
|
||||
Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc,
|
||||
bool resolve_tail_call_address)
|
||||
{
|
||||
Mutex::Locker locker (m_mutex);
|
||||
uint32_t resolved_flags = 0;
|
||||
@@ -489,6 +490,14 @@ Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve
|
||||
if (symtab && so_addr.IsSectionOffset())
|
||||
{
|
||||
sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
|
||||
if (!sc.symbol &&
|
||||
resolve_scope & eSymbolContextFunction && !(resolved_flags & eSymbolContextFunction))
|
||||
{
|
||||
bool verify_unique = false; // No need to check again since ResolveSymbolContext failed to find a symbol at this address.
|
||||
if (ObjectFile *obj_file = sc.module_sp->GetObjectFile())
|
||||
sc.symbol = obj_file->ResolveSymbolForAddress(so_addr, verify_unique);
|
||||
}
|
||||
|
||||
if (sc.symbol)
|
||||
resolved_flags |= eSymbolContextSymbol;
|
||||
}
|
||||
@@ -498,13 +507,14 @@ Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve
|
||||
// with FDE row indices in eh_frame sections, but requires extra logic here to permit
|
||||
// symbol lookup for disassembly and unwind.
|
||||
if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol) &&
|
||||
resolve_scope & eSymbolContextTailCall &&
|
||||
so_addr.IsSectionOffset())
|
||||
resolve_tail_call_address && so_addr.IsSectionOffset())
|
||||
{
|
||||
Address previous_addr = so_addr;
|
||||
previous_addr.Slide(-1);
|
||||
|
||||
const uint32_t flags = ResolveSymbolContextForAddress(previous_addr, resolve_scope & ~eSymbolContextTailCall, sc);
|
||||
bool do_resolve_tail_call_address = false; // prevent recursion
|
||||
const uint32_t flags = ResolveSymbolContextForAddress(previous_addr, resolve_scope, sc,
|
||||
do_resolve_tail_call_address);
|
||||
if (flags & eSymbolContextSymbol)
|
||||
{
|
||||
AddressRange addr_range;
|
||||
|
||||
Reference in New Issue
Block a user