aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2-frame.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2004-01-18 21:22:50 +0000
committerMark Kettenis <kettenis@gnu.org>2004-01-18 21:22:50 +0000
commita85044923423e4daa0b55d1f8a0a4a24d0a28f2b (patch)
tree6dcbdfe0df4683aba786cef9bd666a5d0d08a1e8 /gdb/dwarf2-frame.c
parent7049b4b8ac9039dc4f09e312e68fedc8227caac8 (diff)
downloadgdb-a85044923423e4daa0b55d1f8a0a4a24d0a28f2b.zip
gdb-a85044923423e4daa0b55d1f8a0a4a24d0a28f2b.tar.gz
gdb-a85044923423e4daa0b55d1f8a0a4a24d0a28f2b.tar.bz2
* 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.
Diffstat (limited to 'gdb/dwarf2-frame.c')
-rw-r--r--gdb/dwarf2-frame.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index 84bc1c2..2c655d9 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, &reg);
+ 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: