790 changes: 135 additions & 655 deletions lldb/source/Utility/Scalar.cpp

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions lldb/test/Shell/Unwind/Inputs/eh-frame-augment-noop.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# A function whose prologue and epilogue are described perfectly. eh_frame
# augmentation machinery should detect that no augmentation is needed and use
# eh_frame directly.

.text
.globl foo
foo:
.cfi_startproc
pushq %rax
.cfi_def_cfa_offset 16
int3
pop %rcx
.cfi_def_cfa_offset 8
retq
.cfi_endproc

.globl asm_main
asm_main:
.cfi_startproc
callq foo
retq
.cfi_endproc
22 changes: 22 additions & 0 deletions lldb/test/Shell/Unwind/eh-frame-augment-noop.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Test handing of dwarf expressions specifying the location of registers, if
# those expressions refer to the frame's CFA value.

# UNSUPPORTED: system-windows
# REQUIRES: target-x86_64, native

# RUN: %clang_host %p/Inputs/call-asm.c %p/Inputs/eh-frame-augment-noop.s -o %t
# RUN: %lldb %t -s %s -o exit | FileCheck %s

process launch
# CHECK: stop reason

thread backtrace
# CHECK: frame #0: {{.*}}`foo + 2
# CHECK: frame #1: {{.*}}`asm_main + 5

target modules show-unwind -n foo
# CHECK: Asynchronous (not restricted to call-sites) UnwindPlan is 'eh_frame CFI'
# CHECK: eh_frame augmented UnwindPlan:
# CHECK: row[0]: 0: CFA=rsp +8 => rip=[CFA-8]
# CHECK-NEXT: row[1]: 1: CFA=rsp+16 => rip=[CFA-8]
# CHECK-NEXT: row[2]: 3: CFA=rsp +8 => rip=[CFA-8]