forked from OSchip/llvm-project
Add recognition for another x86 epilogue sequence (ret followed by
a nop). Fixes an instruction stepping problem when trying to step over the final instructions of an epilogue. <rdar://problem/18068877> llvm-svn: 221241
This commit is contained in:
parent
652a3f3257
commit
8030ffda91
|
@ -804,6 +804,12 @@ loopnext:
|
|||
// [ 0xc3 ] ret
|
||||
// [ 0xe8 xx xx xx xx ] call __stack_chk_fail (this is sometimes the final insn in the function)
|
||||
|
||||
// or
|
||||
|
||||
// [ 0x5d ] mov %rbp, %rsp (aka pop %rbp)
|
||||
// [ 0xc3 ] ret
|
||||
// [ 0x0f 0x1f 0x44 xx xx ] nopl (%rax,%rax) (aka nop)
|
||||
|
||||
// We want to add a Row describing how to unwind when we're stopped on the 'ret' instruction where the
|
||||
// CFA is no longer defined in terms of rbp, but is now defined in terms of rsp like on function entry.
|
||||
// (or the 'jmp' instruction in the second case)
|
||||
|
@ -834,6 +840,11 @@ loopnext:
|
|||
{
|
||||
ret_insn_offset = m_func_bounds.GetByteSize() - 6;
|
||||
}
|
||||
else if (bytebuf[0] == 0x5d && bytebuf[1] == 0xc3
|
||||
&& bytebuf[2] == 0x0f && bytebuf[3] == 0x1f & bytebuf[4] == 0x44) // mov & ret & nop
|
||||
{
|
||||
ret_insn_offset = m_func_bounds.GetByteSize() - 6;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (m_func_bounds.GetByteSize() > 2)
|
||||
|
|
Loading…
Reference in New Issue