[Lldb-commits] [PATCH] D61018: RegisterContextLLDB: Push CFA value on DWARF stack when evaluating register expressions
Pavel Labath via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 23 08:16:45 PDT 2019
labath updated this revision to Diff 196253.
labath added a comment.
This is the version that should at least compile on a mac (it turns out asm is more portable than I expected). I am still building lldb to see if the test will pass.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D61018/new/
https://reviews.llvm.org/D61018
Files:
lit/Unwind/Inputs/call-asm.c
lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
lit/Unwind/eh-frame-dwarf-unwind.test
source/Plugins/Process/Utility/RegisterContextLLDB.cpp
Index: source/Plugins/Process/Utility/RegisterContextLLDB.cpp
===================================================================
--- source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -1507,9 +1507,11 @@
DWARFExpression dwarfexpr(opcode_ctx, dwarfdata, nullptr, 0,
unwindplan_regloc.GetDWARFExpressionLength());
dwarfexpr.SetRegisterKind(unwindplan_registerkind);
+ Value cfa_val = Scalar(m_cfa);
+ cfa_val.SetValueType(Value::eValueTypeLoadAddress);
Value result;
Status error;
- if (dwarfexpr.Evaluate(&exe_ctx, this, 0, nullptr, nullptr, result,
+ if (dwarfexpr.Evaluate(&exe_ctx, this, 0, &cfa_val, nullptr, result,
&error)) {
addr_t val;
val = result.GetScalar().ULongLong();
Index: lit/Unwind/eh-frame-dwarf-unwind.test
===================================================================
--- /dev/null
+++ lit/Unwind/eh-frame-dwarf-unwind.test
@@ -0,0 +1,22 @@
+# Test handing of dwarf expressions specifying the location of registers, if
+# those expressions refer to the frame's CFA value.
+
+# REQUIRES: target-x86_64, native
+
+# RUN: %clang %p/Inputs/call-asm.c %p/Inputs/eh-frame-dwarf-unwind.s -o %t
+# RUN: %lldb %t -s %s -o exit | FileCheck %s
+
+breakpoint set -n bar
+# CHECK: Breakpoint 1: where = {{.*}}`bar
+
+process launch
+# CHECK: stop reason = breakpoint 1.1
+
+thread backtrace
+# CHECK: frame #0: {{.*}}`bar
+# CHECK: frame #1: {{.*}}`foo + 5
+# CHECK: frame #2: {{.*}}`asm_main + 22
+
+target modules show-unwind -n foo
+# CHECK: eh_frame UnwindPlan:
+# CHECK: row[0]: 0: CFA=rsp +8 => rip=DW_OP_lit8 , DW_OP_minus , DW_OP_deref , DW_OP_const1u 0x47, DW_OP_minus
Index: lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
===================================================================
--- /dev/null
+++ lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
@@ -0,0 +1,39 @@
+ .text
+ .globl bar
+bar:
+ .cfi_startproc
+ leal (%edi, %edi), %eax
+ ret
+ .cfi_endproc
+
+ .globl foo
+foo:
+ .cfi_startproc
+ .cfi_escape 0x16, 0x10, 0x06, 0x38, 0x1c, 0x06, 0x08, 0x47, 0x1c
+ call bar
+ addl $1, %eax
+ popq %rdi
+ subq $0x47, %rdi
+ jmp *%rdi # Return
+ .cfi_endproc
+
+ .globl asm_main
+asm_main:
+ .cfi_startproc
+ pushq %rbp
+ .cfi_def_cfa_offset 16
+ .cfi_offset 6, -16
+ movq %rsp, %rbp
+ .cfi_def_cfa_register 6
+ movl $47, %edi
+
+ # Non-standard calling convention. The real return address must be
+ # decremented by 0x47.
+ leaq 0x47+1f(%rip), %rax
+ pushq %rax
+ jmp foo # call
+1:
+ popq %rbp
+ .cfi_def_cfa 7, 8
+ ret
+ .cfi_endproc
Index: lit/Unwind/Inputs/call-asm.c
===================================================================
--- /dev/null
+++ lit/Unwind/Inputs/call-asm.c
@@ -0,0 +1,3 @@
+int asm_main() asm("asm_main");
+
+int main() { return asm_main(); }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61018.196253.patch
Type: text/x-patch
Size: 3128 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190423/73b96ad9/attachment-0001.bin>
More information about the lldb-commits
mailing list