* dwarf2-frame.c (execute_cfa_program): Call dwarf2_restore_rule
function to handle required actions for the DW_CFA_restore and DW_CFA_restore_extended instructions. (dwarf2_restore_rule): New function.
This commit is contained in:
parent
5588bc95a7
commit
a6a5a94583
2 changed files with 39 additions and 20 deletions
|
@ -1,3 +1,10 @@
|
|||
2007-12-26 Luis Machado <luisgpm@br.ibm.com>
|
||||
|
||||
* dwarf2-frame.c (execute_cfa_program): Call dwarf2_restore_rule
|
||||
function to handle required actions for the DW_CFA_restore and
|
||||
DW_CFA_restore_extended instructions.
|
||||
(dwarf2_restore_rule): New function.
|
||||
|
||||
2007-12-24 Joel Brobecker <brobecker@adacore.com>
|
||||
|
||||
* ada-lang.c (ada_is_character_type): Add recognition of type
|
||||
|
|
|
@ -268,6 +268,36 @@ no_get_tls_address (void *baton, CORE_ADDR offset)
|
|||
_("Support for DW_OP_GNU_push_tls_address is unimplemented"));
|
||||
}
|
||||
|
||||
/* Execute the required actions for both the DW_CFA_restore and
|
||||
DW_CFA_restore_extended instructions. */
|
||||
static void
|
||||
dwarf2_restore_rule (struct gdbarch *gdbarch, ULONGEST reg_num,
|
||||
struct dwarf2_frame_state *fs, int eh_frame_p)
|
||||
{
|
||||
ULONGEST reg;
|
||||
|
||||
gdb_assert (fs->initial.reg);
|
||||
reg = dwarf2_frame_adjust_regnum (gdbarch, reg_num, eh_frame_p);
|
||||
dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
|
||||
|
||||
/* Check if this register was explicitly initialized in the
|
||||
CIE initial instructions. If not, default the rule to
|
||||
UNSPECIFIED. */
|
||||
if (reg < fs->initial.num_regs)
|
||||
fs->regs.reg[reg] = fs->initial.reg[reg];
|
||||
else
|
||||
fs->regs.reg[reg].how = DWARF2_FRAME_REG_UNSPECIFIED;
|
||||
|
||||
if (fs->regs.reg[reg].how == DWARF2_FRAME_REG_UNSPECIFIED)
|
||||
complaint (&symfile_complaints, _("\
|
||||
incomplete CFI data; DW_CFA_restore unspecified\n\
|
||||
register %s (#%d) at 0x%s"),
|
||||
gdbarch_register_name
|
||||
(gdbarch, gdbarch_dwarf2_reg_to_regnum (gdbarch, reg)),
|
||||
gdbarch_dwarf2_reg_to_regnum (gdbarch, reg),
|
||||
paddr (fs->pc));
|
||||
}
|
||||
|
||||
static CORE_ADDR
|
||||
execute_stack_op (gdb_byte *exp, ULONGEST len,
|
||||
struct frame_info *next_frame, CORE_ADDR initial)
|
||||
|
@ -324,23 +354,8 @@ execute_cfa_program (gdb_byte *insn_ptr, gdb_byte *insn_end,
|
|||
}
|
||||
else if ((insn & 0xc0) == DW_CFA_restore)
|
||||
{
|
||||
gdb_assert (fs->initial.reg);
|
||||
reg = insn & 0x3f;
|
||||
reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p);
|
||||
dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
|
||||
if (reg < fs->initial.num_regs)
|
||||
fs->regs.reg[reg] = fs->initial.reg[reg];
|
||||
else
|
||||
fs->regs.reg[reg].how = DWARF2_FRAME_REG_UNSPECIFIED;
|
||||
|
||||
if (fs->regs.reg[reg].how == DWARF2_FRAME_REG_UNSPECIFIED)
|
||||
complaint (&symfile_complaints, _("\
|
||||
incomplete CFI data; DW_CFA_restore unspecified\n\
|
||||
register %s (#%d) at 0x%s"),
|
||||
gdbarch_register_name
|
||||
(gdbarch, gdbarch_dwarf2_reg_to_regnum (gdbarch, reg)),
|
||||
gdbarch_dwarf2_reg_to_regnum (gdbarch, reg),
|
||||
paddr (fs->pc));
|
||||
dwarf2_restore_rule (gdbarch, reg, fs, eh_frame_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -378,11 +393,8 @@ register %s (#%d) at 0x%s"),
|
|||
break;
|
||||
|
||||
case DW_CFA_restore_extended:
|
||||
gdb_assert (fs->initial.reg);
|
||||
insn_ptr = read_uleb128 (insn_ptr, insn_end, ®);
|
||||
reg = dwarf2_frame_adjust_regnum (gdbarch, reg, eh_frame_p);
|
||||
dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1);
|
||||
fs->regs.reg[reg] = fs->initial.reg[reg];
|
||||
dwarf2_restore_rule (gdbarch, reg, fs, eh_frame_p);
|
||||
break;
|
||||
|
||||
case DW_CFA_undefined:
|
||||
|
|
Loading…
Add table
Reference in a new issue