Use eAddressClassCode for address lookup for opcodes for stack frames

It is required because of the following edge case on arm:

bx <addr>   Non-tail call in a no return function
[data-pool] Marked with $d mapping symbol

The return address of the function call will point to the data pool but
we have to treat it as code so the StackFrame can calculate the symbols
correctly.

Differential revision: http://reviews.llvm.org/D12556

llvm-svn: 246958
This commit is contained in:
Tamas Berghammer
2015-09-07 09:58:09 +00:00
parent b5d5ead8c9
commit 25b9f7ebd3
5 changed files with 21 additions and 10 deletions

View File

@@ -367,21 +367,29 @@ Address::SetCallableLoadAddress (lldb::addr_t load_addr, Target *target)
}
addr_t
Address::GetOpcodeLoadAddress (Target *target) const
Address::GetOpcodeLoadAddress (Target *target, AddressClass addr_class) const
{
addr_t code_addr = GetLoadAddress (target);
if (code_addr != LLDB_INVALID_ADDRESS)
code_addr = target->GetOpcodeLoadAddress (code_addr, GetAddressClass());
{
if (addr_class == eAddressClassInvalid)
addr_class = GetAddressClass();
code_addr = target->GetOpcodeLoadAddress (code_addr, addr_class);
}
return code_addr;
}
bool
Address::SetOpcodeLoadAddress (lldb::addr_t load_addr, Target *target)
Address::SetOpcodeLoadAddress (lldb::addr_t load_addr, Target *target, AddressClass addr_class)
{
if (SetLoadAddress (load_addr, target))
{
if (target)
m_offset = target->GetOpcodeLoadAddress (m_offset, GetAddressClass());
{
if (addr_class == eAddressClassInvalid)
addr_class = GetAddressClass();
m_offset = target->GetOpcodeLoadAddress (m_offset, addr_class);
}
return true;
}
return false;