diff --git a/lldb/source/Symbol/DWARFCallFrameInfo.cpp b/lldb/source/Symbol/DWARFCallFrameInfo.cpp --- a/lldb/source/Symbol/DWARFCallFrameInfo.cpp +++ b/lldb/source/Symbol/DWARFCallFrameInfo.cpp @@ -674,6 +674,11 @@ unwind_plan.GetRowAtIndex(0)->GetRegisterInfo(reg_num, reg_location)) row->SetRegisterInfo(reg_num, reg_location); + else { + // If the register was not set in the first row, remove the + // register info to keep the unmodified value from the caller. + row->RemoveRegisterInfo(reg_num); + } break; } } diff --git a/lldb/test/Shell/Unwind/Inputs/eh-frame-dwarf-unwind-abort.s b/lldb/test/Shell/Unwind/Inputs/eh-frame-dwarf-unwind-abort.s new file mode 100644 --- /dev/null +++ b/lldb/test/Shell/Unwind/Inputs/eh-frame-dwarf-unwind-abort.s @@ -0,0 +1,25 @@ + .text + .globl asm_main +asm_main: + .cfi_startproc + cmpb $0x0, g_hard_abort(%rip) + jne .L + + pushq %rbp + .cfi_def_cfa_offset 16 + .cfi_offset 6, -16 + movq %rsp, %rbp + .cfi_def_cfa_register 6 + callq abort +.L: + .cfi_def_cfa 7, 8 + .cfi_restore 6 + int3 + ud2 + .cfi_endproc + + .data + .globl g_hard_abort +g_hard_abort: + .byte 1 + .size g_hard_abort, 1 \ No newline at end of file diff --git a/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind-abort.test b/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind-abort.test new file mode 100644 --- /dev/null +++ b/lldb/test/Shell/Unwind/eh-frame-dwarf-unwind-abort.test @@ -0,0 +1,21 @@ +# Test restoring of register values. + +# UNSUPPORTED: system-windows +# REQUIRES: target-x86_64, native + +# RUN: %clang_host %p/Inputs/call-asm.c %p/Inputs/eh-frame-dwarf-unwind-abort.s -o %t +# RUN: %lldb %t -s %s -o exit | FileCheck %s + +process launch +# CHECK: stop reason = signal SIGTRAP + +thread backtrace +# CHECK: frame #0: {{.*}}`asm_main + 23 +# CHECK: frame #1: {{.*}}`main + {{.*}} + +target modules show-unwind -n asm_main +# CHECK: eh_frame UnwindPlan: +# CHECK: row[0]: 0: CFA=rsp +8 => rip=[CFA-8] +# CHECK: row[1]: 14: CFA=rsp+16 => rbp=[CFA-16] rip=[CFA-8] +# CHECK: row[2]: 17: CFA=rbp+16 => rbp=[CFA-16] rip=[CFA-8] +# CHECK: row[3]: 22: CFA=rsp +8 => rip=[CFA-8]