This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add support for missing DWARF2 call frame instructions


This adds the missing CFI's from the DWARF3 draft.  I moved DW_CFA_nop
to keep things in the same order as the DWARF specification.

Committed,

Mark


Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* 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.

Index: dwarf2-frame.c
===================================================================
RCS file: /cvs/src/src/gdb/dwarf2-frame.c,v
retrieving revision 1.25
diff -u -p -r1.25 dwarf2-frame.c
--- dwarf2-frame.c 27 Dec 2003 23:15:00 -0000 1.25
+++ dwarf2-frame.c 18 Jan 2004 21:20:56 -0000
@@ -432,6 +432,9 @@ execute_cfa_program (unsigned char *insn
 	      /* 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
 	      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:


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]