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:
Ed Maste 2013-10-11 17:39:07 +00:00
parent 1d27ffd697
commit 5480365b25
5 changed files with 20 additions and 35 deletions

View File

@ -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

View File

@ -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();

View File

@ -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 ();

View File

@ -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;
}

View File

@ -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;
}