[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 May 7 08:25:17 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL360158: RegisterContextLLDB: Push CFA value on DWARF stack when evaluating register… (authored by labath, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D61018?vs=196253&id=198478#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D61018/new/
https://reviews.llvm.org/D61018
Files:
lldb/trunk/lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
lldb/trunk/lit/Unwind/eh-frame-dwarf-unwind.test
lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
Index: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
===================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
@@ -1513,9 +1513,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: lldb/trunk/lit/Unwind/eh-frame-dwarf-unwind.test
===================================================================
--- lldb/trunk/lit/Unwind/eh-frame-dwarf-unwind.test
+++ lldb/trunk/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, system-linux, native
+
+# RUN: %clang %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: {{.*}}`main + 19
+
+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: lldb/trunk/lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
===================================================================
--- lldb/trunk/lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
+++ lldb/trunk/lit/Unwind/Inputs/eh-frame-dwarf-unwind.s
@@ -0,0 +1,49 @@
+ .text
+ .globl bar
+ .type bar, @function
+bar:
+.LFB0:
+ .cfi_startproc
+ leal (%edi, %edi), %eax
+ ret
+ .cfi_endproc
+.LFE0:
+ .size bar, .-bar
+ .globl foo
+ .type foo, @function
+foo:
+.LFB1:
+ .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
+.LFE1:
+ .size foo, .-foo
+ .globl main
+ .type main, @function
+main:
+.LFB2:
+ .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
+.LFE2:
+ .size main, .-main
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61018.198478.patch
Type: text/x-patch
Size: 3258 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20190507/727d4eb9/attachment.bin>
More information about the lldb-commits
mailing list