forked from OSchip/llvm-project
Fix for TestNoreturnUnwind.py on i386
Summary: The testcase TestNoreturnUnwind.py was failing because the unwind from the vdso library was not successful for clang compiler while it was passing for gcc. It was passing for gcc since the unwind plan used was the assembly plan and the ebp register was set by the main function in case of gcc and was not used by the functions in the call flow to the vdso, whereas clang did not emit assembly prologue for main and so the assembly unwind was failing. Normally in case of failure of assembly unwind, lldb switches to EH CFI frame based unwinding, but this was not happening for the first frame. This patch tries to fix this behaviour by falling to EH CFI frame based unwinding in case of assembly unwind failure even for the first frame. The test is still marked as XFAIL since it relys on the fix of another bug. Reviewers: lldb-commits, jingham, zturner, tberghammer, jasonmolenda Subscribers: jasonmolenda Differential Revision: http://reviews.llvm.org/D15046 llvm-svn: 257465
This commit is contained in:
parent
e961b445ad
commit
49982f5773
|
@ -14,7 +14,7 @@ import lldbsuite.test.lldbutil as lldbutil
|
|||
class NoreturnUnwind(TestBase):
|
||||
mydir = TestBase.compute_mydir(__file__)
|
||||
|
||||
@expectedFailurei386 #xfail to get buildbot green, failing config: i386 binary running on ubuntu 14.04 x86_64
|
||||
@expectedFailurei386("llvm.org/pr25338")
|
||||
@skipIfWindows # clang-cl does not support gcc style attributes.
|
||||
def test (self):
|
||||
"""Test that we can backtrace correctly with 'noreturn' functions on the stack"""
|
||||
|
|
|
@ -265,9 +265,32 @@ RegisterContextLLDB::InitializeZerothFrame()
|
|||
|
||||
if (!ReadCFAValueForRow (row_register_kind, active_row, m_cfa))
|
||||
{
|
||||
UnwindLogMsg ("could not read CFA register for this frame.");
|
||||
m_frame_type = eNotAValidFrame;
|
||||
return;
|
||||
// Try the fall back unwind plan since the
|
||||
// full unwind plan failed.
|
||||
FuncUnwindersSP func_unwinders_sp;
|
||||
UnwindPlanSP call_site_unwind_plan;
|
||||
bool cfa_status = false;
|
||||
|
||||
if (m_sym_ctx_valid)
|
||||
{
|
||||
func_unwinders_sp = pc_module_sp->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
|
||||
}
|
||||
|
||||
if(func_unwinders_sp.get() != nullptr)
|
||||
call_site_unwind_plan = func_unwinders_sp->GetUnwindPlanAtCallSite(process->GetTarget(), m_current_offset_backed_up_one);
|
||||
|
||||
if (call_site_unwind_plan.get() != nullptr)
|
||||
{
|
||||
m_fallback_unwind_plan_sp = call_site_unwind_plan;
|
||||
if(TryFallbackUnwindPlan())
|
||||
cfa_status = true;
|
||||
}
|
||||
if (!cfa_status)
|
||||
{
|
||||
UnwindLogMsg ("could not read CFA value for first frame.");
|
||||
m_frame_type = eNotAValidFrame;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
UnwindLogMsg ("initialized frame current pc is 0x%" PRIx64 " cfa is 0x%" PRIx64 " using %s UnwindPlan",
|
||||
|
|
Loading…
Reference in New Issue