> On Dec 12, 2014, at 12:17 PM, Philippe Lavoie <philippe.lav...@octasic.com> 
> wrote:
> 
> Hi,
> 
> I have an issue with frame unwinding using .eh_frame
> 
> The PC for our architecture is a dword pointer. To enable the LLDB frame 
> unwinder to see it as a byte pointer when using CFI, I encoded the return 
> address value in a DWARF expression.
> 
> When RA (r3) is in a register the expression is:
>   DW_CFA_val_expression: r3 (DW_OP_reg3 (r3); DW_OP_lit2; DW_OP_shl)
> 
> When RA has been pushed on the stack (r2), the expression is: 
>   DW_CFA_val_expression: r3 (DW_OP_breg2 (r2): -8; DW_OP_deref; DW_OP_lit2; 
> DW_OP_shl)
> 
> Up until r217185 the stack unwinding was working fine. But since we resynced 
> our code with the more recent r221593, the return address is not evaluated 
> according to the DWARF expression. The unwinder just uses R3.
> 
> (lldb) bt
> th1/fr0 requested caller's saved PC but this UnwindPlan uses a RA reg; 
> getting r3 (3) instead  
> th1/fr0 supplying caller's register r3 (3) from the live RegisterContext at 
> frame 0, saved in 3  <<<<<<<<<<<<
>  th1/fr1 pc = 0x100014  
> th1/fr0 supplying caller's saved r2 (2)'s location using eh_frame CFI 
> UnwindPlan
> th1/fr0 supplying caller's register r2 (2) from the stack, saved at CFA plus 
> offset -4
>  th1/fr1 fp = 0x7fff7f8
> th1/fr0 supplying caller's stack pointer r1 (1) value, computed from CFA
>  th1/fr1 sp = 0x7fff7d8
> 
> Was a bug introduced in LLDB? Or is our use of DWARF expressions to retrieve 
> the return address not "standards compliant"?

I am not sure, you can put a breakpoint in:

DWARFExpression::Evaluate() at DWARFExpression.cpp:1348

And you can step through it to verify.

It will get run in the "if" statement at RegisterContextLLDB.cpp:1445.

Let us know what you find.

Greg


_______________________________________________
lldb-dev mailing list
lldb-dev@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev

Reply via email to