From: Mark Kettenis Date: Sun, 18 Jan 2004 21:22:50 +0000 (+0000) Subject: * dwarf2-frame.c (execute_cfa_program): Move DWA_CFA_nop before X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a85044923423e4daa0b55d1f8a0a4a24d0a28f2b;p=binutils-gdb.git * dwarf2-frame.c (execute_cfa_program): Move DWA_CFA_nop before DW_CFA_def_cfa_exporession. Add support for DW_CFA_offset_extendend_sf, DW_CFA_def_cfa_sf and DW_CFA_def_cfa_offset_sf. This should fix PR backtrace/1391. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1e06e3e7d9e..7772813ed4c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2004-01-18 Mark Kettenis + + * dwarf2-frame.c (execute_cfa_program): Move DWA_CFA_nop before + DW_CFA_def_cfa_exporession. Add support for + DW_CFA_offset_extendend_sf, DW_CFA_def_cfa_sf and + DW_CFA_def_cfa_offset_sf. This should fix PR backtrace/1391. + 2004-01-18 Andrew Cagney * ocd.c: Update copyright. diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c index 84bc1c2d50c..2c655d9793c 100644 --- a/gdb/dwarf2-frame.c +++ b/gdb/dwarf2-frame.c @@ -432,6 +432,9 @@ execute_cfa_program (unsigned char *insn_ptr, unsigned char *insn_end, /* cfa_how deliberately not set. */ break; + case DW_CFA_nop: + break; + case DW_CFA_def_cfa_expression: insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_exp_len); fs->cfa_exp = insn_ptr; @@ -449,7 +452,26 @@ execute_cfa_program (unsigned char *insn_ptr, unsigned char *insn_end, insn_ptr += utmp; break; - case DW_CFA_nop: + case DW_CFA_offset_extended_sf: + insn_ptr = read_uleb128 (insn_ptr, insn_end, ®); + insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); + offset += fs->data_align; + dwarf2_frame_state_alloc_regs (&fs->regs, reg + 1); + fs->regs.reg[reg].how = REG_SAVED_OFFSET; + fs->regs.reg[reg].loc.offset = offset; + break; + + case DW_CFA_def_cfa_sf: + insn_ptr = read_uleb128 (insn_ptr, insn_end, &fs->cfa_reg); + insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); + fs->cfa_offset = offset * fs->data_align; + fs->cfa_how = CFA_REG_OFFSET; + break; + + case DW_CFA_def_cfa_offset_sf: + insn_ptr = read_sleb128 (insn_ptr, insn_end, &offset); + fs->cfa_offset = offset * fs->data_align; + /* cfa_how deliberately not set. */ break; case DW_CFA_GNU_args_size: