This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils 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]

Re: PATCH: Add some dwarf3 support to readelf


On Fri, Jun 07, 2002 at 12:07:40PM +0100, Nick Clifton wrote:
> Hi H.J.
> 
> > 2002-06-03  H.J. Lu <hjl@gnu.org>
> > 
> > 	* readelf.c (DW_CFA_GNU_args_size): Don't define.
> > 	(DW_CFA_GNU_negative_offset_extended): Likewise.
> > 	(DW_CFA_GNU_window_save): Likewise.
> > 	(display_debug_frames): Handle DW_CFA_offset_extended_sf,
> > 	DW_CFA_def_cfa_sf and DW_CFA_def_cfa_offset_sf.
> 
> Approved - please apply (but see below).
> 
> > Here is a patch for readelf to support some dwarf3 output from gcc 
> > 3.1.1. I don't know how to handle DW_CFA_def_cfa_expression nor
> > DW_CFA_expression. 
> 
> Hmm, neither do I.  Please could you add a FIXME comment to your patch
> so that we do not forget about this.
> 

This is what I checked in. BTW, we may be able to take a look at the
gcc EH frame unwind code to figure out how to handle them.


H.J.
--- readelf.c.orig	Fri Jun  7 09:30:32 2002
+++ readelf.c	Fri Jun  7 09:40:40 2002
@@ -8473,15 +8473,20 @@ display_debug_frames (section, start, fi
 		case DW_CFA_def_cfa_offset:
 		  LEB ();
 		  break;
-#ifndef DW_CFA_GNU_args_size
-#define DW_CFA_GNU_args_size 0x2e
-#endif
+		case DW_CFA_offset_extended_sf:
+		  reg = LEB (); SLEB ();
+		  frame_need_space (fc, reg);
+		  fc->col_type[reg] = DW_CFA_undefined;
+		  break;
+		case DW_CFA_def_cfa_sf:
+		  LEB (); SLEB ();
+		  break;
+		case DW_CFA_def_cfa_offset_sf:
+		  SLEB ();
+		  break;
 		case DW_CFA_GNU_args_size:
 		  LEB ();
 		  break;
-#ifndef DW_CFA_GNU_negative_offset_extended
-#define DW_CFA_GNU_negative_offset_extended 0x2f
-#endif
 		case DW_CFA_GNU_negative_offset_extended:
 		  reg = LEB (); LEB ();
 		  frame_need_space (fc, reg);
@@ -8676,9 +8681,31 @@ display_debug_frames (section, start, fi
 		printf ("  DW_CFA_nop\n");
 	      break;
 
-#ifndef DW_CFA_GNU_window_save
-#define DW_CFA_GNU_window_save 0x2d
-#endif
+	    case DW_CFA_offset_extended_sf:
+	      reg = LEB ();
+	      l = SLEB ();
+	      frame_need_space (fc, reg);
+	      if (! do_debug_frames_interp)
+		printf ("  DW_CFA_offset_extended_sf: r%ld at cfa%+ld\n",
+			reg, l * fc->data_factor);
+	      fc->col_type[reg] = DW_CFA_offset;
+	      fc->col_offset[reg] = l * fc->data_factor;
+	      break;
+
+	    case DW_CFA_def_cfa_sf:
+	      fc->cfa_reg = LEB ();
+	      fc->cfa_offset = SLEB ();
+	      if (! do_debug_frames_interp)
+		printf ("  DW_CFA_def_cfa_sf: r%d ofs %d\n",
+			fc->cfa_reg, fc->cfa_offset);
+	      break;
+
+	    case DW_CFA_def_cfa_offset_sf:
+	      fc->cfa_offset = SLEB ();
+	      if (! do_debug_frames_interp)
+		printf ("  DW_CFA_def_cfa_offset_sf: %d\n", fc->cfa_offset);
+	      break;
+
 	    case DW_CFA_GNU_window_save:
 	      if (! do_debug_frames_interp)
 		printf ("  DW_CFA_GNU_window_save\n");
@@ -8699,6 +8726,17 @@ display_debug_frames (section, start, fi
 			reg, l * fc->data_factor);
 	      fc->col_type[reg] = DW_CFA_offset;
 	      fc->col_offset[reg] = l * fc->data_factor;
+	      break;
+
+	    /* FIXME: How do we handle these? */
+	    case DW_CFA_def_cfa_expression:
+	      fprintf (stderr, "unsupported DW_CFA_def_cfa_expression\n");
+	      start = block_end;
+	      break;
+
+	    case DW_CFA_expression:
+	      fprintf (stderr, "unsupported DW_CFA_expression\n");
+	      start = block_end;
 	      break;
 
 	    default:


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