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