unwind-dw2.h (_Unwind_FrameState): Add REG_UNDEFINED enum value.
* unwind-dw2.h (_Unwind_FrameState): Add REG_UNDEFINED enum value. * unwind-dw2.c (execute_cfa_program): Set how to REG_UNDEFINED instead of REG_UNSAVED for DW_CFA_undefined. (uw_update_context_1): Handle REG_UNDEFINED the same as REG_UNSAVED. (uw_update_context): If RA column is REG_UNDEFINED, mark it as outermost frame. From-SVN: r145535
This commit is contained in:
parent
aad2bccb9b
commit
54f5943cdb
3 changed files with 35 additions and 8 deletions
|
@ -1,3 +1,12 @@
|
|||
2009-04-04 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* unwind-dw2.h (_Unwind_FrameState): Add REG_UNDEFINED enum value.
|
||||
* unwind-dw2.c (execute_cfa_program): Set how to REG_UNDEFINED
|
||||
instead of REG_UNSAVED for DW_CFA_undefined.
|
||||
(uw_update_context_1): Handle REG_UNDEFINED the same as REG_UNSAVED.
|
||||
(uw_update_context): If RA column is REG_UNDEFINED, mark it as
|
||||
outermost frame.
|
||||
|
||||
2009-04-04 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
PR target/39501
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* DWARF2 exception handling and frame unwind runtime interface routines.
|
||||
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
||||
2008 Free Software Foundation, Inc.
|
||||
2008, 2009 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -943,12 +943,16 @@ execute_cfa_program (const unsigned char *insn_ptr,
|
|||
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED;
|
||||
break;
|
||||
|
||||
case DW_CFA_undefined:
|
||||
case DW_CFA_same_value:
|
||||
insn_ptr = read_uleb128 (insn_ptr, ®);
|
||||
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNSAVED;
|
||||
break;
|
||||
|
||||
case DW_CFA_undefined:
|
||||
insn_ptr = read_uleb128 (insn_ptr, ®);
|
||||
fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN(reg)].how = REG_UNDEFINED;
|
||||
break;
|
||||
|
||||
case DW_CFA_nop:
|
||||
break;
|
||||
|
||||
|
@ -1319,6 +1323,7 @@ uw_update_context_1 (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
|||
switch (fs->regs.reg[i].how)
|
||||
{
|
||||
case REG_UNSAVED:
|
||||
case REG_UNDEFINED:
|
||||
break;
|
||||
|
||||
case REG_SAVED_OFFSET:
|
||||
|
@ -1387,10 +1392,22 @@ uw_update_context (struct _Unwind_Context *context, _Unwind_FrameState *fs)
|
|||
{
|
||||
uw_update_context_1 (context, fs);
|
||||
|
||||
/* Compute the return address now, since the return address column
|
||||
can change from frame to frame. */
|
||||
context->ra = __builtin_extract_return_addr
|
||||
(_Unwind_GetPtr (context, fs->retaddr_column));
|
||||
/* In general this unwinder doesn't make any distinction between
|
||||
undefined and same_value rule. Call-saved registers are assumed
|
||||
to have same_value rule by default and explicit undefined
|
||||
rule is handled like same_value. The only exception is
|
||||
DW_CFA_undefined on retaddr_column which is supposed to
|
||||
mark outermost frame in DWARF 3. */
|
||||
if (fs->regs.reg[DWARF_REG_TO_UNWIND_COLUMN (fs->retaddr_column)].how
|
||||
== REG_UNDEFINED)
|
||||
/* uw_frame_state_for uses context->ra == 0 check to find outermost
|
||||
stack frame. */
|
||||
context->ra = 0;
|
||||
else
|
||||
/* Compute the return address now, since the return address column
|
||||
can change from frame to frame. */
|
||||
context->ra = __builtin_extract_return_addr
|
||||
(_Unwind_GetPtr (context, fs->retaddr_column));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* DWARF2 frame unwind data structure.
|
||||
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
||||
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2009
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -55,7 +55,8 @@ typedef struct
|
|||
REG_SAVED_REG,
|
||||
REG_SAVED_EXP,
|
||||
REG_SAVED_VAL_OFFSET,
|
||||
REG_SAVED_VAL_EXP
|
||||
REG_SAVED_VAL_EXP,
|
||||
REG_UNDEFINED
|
||||
} how;
|
||||
} reg[DWARF_FRAME_REGISTERS+1];
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue