Skip to content

Commit

Permalink
Use eAddressClassCode for address lookup for opcodes for stack frames
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Tamas Berghammer committed Sep 7, 2015
1 parent b5d5ead commit 25b9f7e
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 10 deletions.
7 changes: 5 additions & 2 deletions lldb/include/lldb/Core/Address.h
Expand Up @@ -326,7 +326,8 @@ class Address
/// not loaded.
//------------------------------------------------------------------
lldb::addr_t
GetOpcodeLoadAddress (Target *target) const;
GetOpcodeLoadAddress (Target *target,
lldb::AddressClass addr_class = lldb::eAddressClassInvalid) const;

//------------------------------------------------------------------
/// Get the section relative offset value.
Expand Down Expand Up @@ -425,7 +426,9 @@ class Address
SetLoadAddress (lldb::addr_t load_addr, Target *target);

bool
SetOpcodeLoadAddress (lldb::addr_t load_addr, Target *target);
SetOpcodeLoadAddress (lldb::addr_t load_addr,
Target *target,
lldb::AddressClass addr_class = lldb::eAddressClassInvalid);

bool
SetCallableLoadAddress (lldb::addr_t load_addr, Target *target);
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/API/SBFrame.cpp
Expand Up @@ -484,7 +484,7 @@ SBFrame::GetPC () const
frame = exe_ctx.GetFramePtr();
if (frame)
{
addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target, eAddressClassCode);
}
else
{
Expand Down
16 changes: 12 additions & 4 deletions lldb/source/Core/Address.cpp
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion lldb/source/Target/StackFrame.cpp
Expand Up @@ -259,7 +259,7 @@ StackFrame::GetFrameCodeAddress()
TargetSP target_sp (thread_sp->CalculateTarget());
if (target_sp)
{
if (m_frame_code_addr.SetOpcodeLoadAddress (m_frame_code_addr.GetOffset(), target_sp.get()))
if (m_frame_code_addr.SetOpcodeLoadAddress (m_frame_code_addr.GetOffset(), target_sp.get(), eAddressClassCode))
{
ModuleSP module_sp (m_frame_code_addr.GetModule());
if (module_sp)
Expand Down
4 changes: 2 additions & 2 deletions lldb/source/Target/StackFrameList.cpp
Expand Up @@ -362,8 +362,8 @@ StackFrameList::GetFramesUpTo(uint32_t end_idx)
// adjustment it will point to an other section. In that case resolve the
// address again to the correct section plus offset form.
TargetSP target = m_thread.CalculateTarget();
addr_t load_addr = curr_frame_address.GetOpcodeLoadAddress(target.get());
curr_frame_address.SetOpcodeLoadAddress(load_addr - 1, target.get());
addr_t load_addr = curr_frame_address.GetOpcodeLoadAddress(target.get(), eAddressClassCode);
curr_frame_address.SetOpcodeLoadAddress(load_addr - 1, target.get(), eAddressClassCode);
}
else
{
Expand Down

0 comments on commit 25b9f7e

Please sign in to comment.