Simplify indirect rld_map for mips (rework r192408).
Just pass a Target* into ObjectFileELF::GetImageInfoAddress so that it can do the extra dereference necessary on MIPS, instead of passing a flag back to the caller. Review: http://llvm-reviews.chandlerc.com/D1899 llvm-svn: 192469
This commit is contained in:
parent
1d27ffd697
commit
5480365b25
|
@ -506,7 +506,7 @@ public:
|
|||
/// The address of any auxiliary tables, or an invalid address if this
|
||||
/// object file format does not support or contain such information.
|
||||
virtual lldb_private::Address
|
||||
GetImageInfoAddress (bool &indirect) { indirect = false; return Address(); }
|
||||
GetImageInfoAddress (Target *target) { return Address(); }
|
||||
|
||||
//------------------------------------------------------------------
|
||||
/// Returns the address of the Entry Point in this object file - if
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "lldb/Core/Stream.h"
|
||||
#include "lldb/Symbol/DWARFCallFrameInfo.h"
|
||||
#include "lldb/Symbol/SymbolContext.h"
|
||||
#include "lldb/Target/Target.h"
|
||||
#include "lldb/Host/Host.h"
|
||||
|
||||
#include "llvm/ADT/PointerUnion.h"
|
||||
|
@ -515,7 +516,7 @@ ObjectFileELF::GetDependentModules(FileSpecList &files)
|
|||
}
|
||||
|
||||
Address
|
||||
ObjectFileELF::GetImageInfoAddress(bool &indirect)
|
||||
ObjectFileELF::GetImageInfoAddress(Target *target)
|
||||
{
|
||||
if (!ParseDynamicSymbols())
|
||||
return Address();
|
||||
|
@ -539,14 +540,24 @@ ObjectFileELF::GetImageInfoAddress(bool &indirect)
|
|||
{
|
||||
ELFDynamic &symbol = m_dynamic_symbols[i];
|
||||
|
||||
if (symbol.d_tag == DT_DEBUG || symbol.d_tag == DT_MIPS_RLD_MAP)
|
||||
if (symbol.d_tag == DT_DEBUG)
|
||||
{
|
||||
indirect = (symbol.d_tag == DT_MIPS_RLD_MAP);
|
||||
// Compute the offset as the number of previous entries plus the
|
||||
// size of d_tag.
|
||||
addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
|
||||
return Address(dynsym_section_sp, offset);
|
||||
}
|
||||
else if (symbol.d_tag == DT_MIPS_RLD_MAP && target)
|
||||
{
|
||||
addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
|
||||
addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
|
||||
if (dyn_base == LLDB_INVALID_ADDRESS)
|
||||
return Address();
|
||||
Address addr;
|
||||
Error error;
|
||||
if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr))
|
||||
return addr;
|
||||
}
|
||||
}
|
||||
|
||||
return Address();
|
||||
|
|
|
@ -127,7 +127,7 @@ public:
|
|||
GetDependentModules(lldb_private::FileSpecList& files);
|
||||
|
||||
virtual lldb_private::Address
|
||||
GetImageInfoAddress(bool &indirect);
|
||||
GetImageInfoAddress(lldb_private::Target *target);
|
||||
|
||||
virtual lldb_private::Address
|
||||
GetEntryPointAddress ();
|
||||
|
|
|
@ -289,23 +289,10 @@ ProcessPOSIX::GetImageInfoAddress()
|
|||
{
|
||||
Target *target = &GetTarget();
|
||||
ObjectFile *obj_file = target->GetExecutableModule()->GetObjectFile();
|
||||
bool indirect;
|
||||
Address addr = obj_file->GetImageInfoAddress(indirect);
|
||||
Address addr = obj_file->GetImageInfoAddress(target);
|
||||
|
||||
if (addr.IsValid())
|
||||
{
|
||||
if (indirect)
|
||||
{
|
||||
Address ind_addr;
|
||||
Error error;
|
||||
if (target->ReadPointerFromMemory(addr.GetLoadAddress(target), false, error, ind_addr))
|
||||
return ind_addr.GetLoadAddress(target);
|
||||
}
|
||||
else
|
||||
{
|
||||
return addr.GetLoadAddress(target);
|
||||
}
|
||||
}
|
||||
return addr.GetLoadAddress(target);
|
||||
return LLDB_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -338,23 +338,10 @@ ProcessElfCore::GetImageInfoAddress()
|
|||
{
|
||||
Target *target = &GetTarget();
|
||||
ObjectFile *obj_file = target->GetExecutableModule()->GetObjectFile();
|
||||
bool indirect;
|
||||
Address addr = obj_file->GetImageInfoAddress(indirect);
|
||||
Address addr = obj_file->GetImageInfoAddress(target);
|
||||
|
||||
if (addr.IsValid())
|
||||
{
|
||||
if (indirect)
|
||||
{
|
||||
Address ind_addr;
|
||||
Error error;
|
||||
if (target->ReadPointerFromMemory(addr.GetLoadAddress(target), false, error, ind_addr))
|
||||
return ind_addr.GetLoadAddress(target);
|
||||
}
|
||||
else
|
||||
{
|
||||
return addr.GetLoadAddress(target);
|
||||
}
|
||||
}
|
||||
return addr.GetLoadAddress(target);
|
||||
return LLDB_INVALID_ADDRESS;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue