This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
PATCH: Add some dwarf3 support to readelf
- From: "H . J . Lu" <hjl at lucon dot org>
- To: binutils at sources dot redhat dot com
- Cc: dan at dberlin dot org
- Date: Mon, 3 Jun 2002 09:06:43 -0700
- Subject: PATCH: Add some dwarf3 support to readelf
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. Could someone please take a look at this?
Thanks.
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.
--- binutils/readelf.c.dwarf3 Thu May 23 08:22:25 2002
+++ binutils/readelf.c Mon Jun 3 09:00:06 2002
@@ -8461,15 +8461,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);
@@ -8664,9 +8669,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");