This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [PATCH] Support DWARF 2.1 extensions in readelf
- To: James Cownie <jcownie at etnus dot com>
- Subject: Re: [PATCH] Support DWARF 2.1 extensions in readelf
- From: Daniel Berlin <dan at cgsoftware dot com>
- Date: Fri, 29 Jun 2001 12:47:59 -0400
- Cc: binutils at sourceware dot cygnus dot com
- References: <15FurT-0MM-00@etnus.com>
James Cownie <jcownie@etnus.com> writes:
> DWARF V2.1 (see http://www.eagercon.com/dwarf2std.htm ) adds a number
> of new tags and attributes to DWARF 2.
>
> Here are patches for readelf.c and dwarf2.h (against 2.11.2) to
> support dumping these new attributes in readable form.
dwarf2.h is a gcc file in reality.
And you'll note i added all the 2.1 in a patch sent to gcc-patches
and approved yesterday.
I was going to commit in a few minutes.
>
> These DWARF 2.1 features are already in use in some compilers; for
> instance Intel's Linux compilers use them...
>
> Enjoy
>
> -- Jim
>
> James Cownie <jcownie@etnus.com>
> Etnus, LLC. +44 117 9071438
> http://www.etnus.com
>
>
> jcownie@pc2: diff -u ~/binutils-2.11.2/binutils/readelf.c readelf.c
> --- /home1/jim/binutils-2.11.2/binutils/readelf.c Mon May 28 19:34:24 2001
>+++ readelf.c Fri Jun 29 10:29:38 2001
> @@ -5896,6 +5896,20 @@
> case DW_AT_variable_parameter: return "DW_AT_variable_parameter";
> case DW_AT_virtuality: return "DW_AT_virtuality";
> case DW_AT_vtable_elem_location: return "DW_AT_vtable_elem_location";
>+ /* DWARF 2.1 values */
>+ case DW_AT_allocated: return "DW_AT_allocated";
>+ case DW_AT_associated: return "DW_AT_associated";
>+ case DW_AT_data_location: return "DW_AT_data_location";
>+ case DW_AT_stride: return "DW_AT_stride";
>+ case DW_AT_entry_pc: return "DW_AT_entry_pc";
>+ case DW_AT_use_UTF8: return "DW_AT_use_UTF8";
>+ case DW_AT_extension: return "DW_AT_extension";
>+ case DW_AT_ranges: return "DW_AT_ranges";
>+ case DW_AT_trampoline: return "DW_AT_trampoline";
>+ case DW_AT_call_column: return "DW_AT_call_column";
>+ case DW_AT_call_file: return "DW_AT_call_file";
>+ case DW_AT_call_line: return "DW_AT_call_line";
>+
> case DW_AT_MIPS_fde: return "DW_AT_MIPS_fde";
> case DW_AT_MIPS_loop_begin: return "DW_AT_MIPS_loop_begin";
> case DW_AT_MIPS_tail_loop_begin: return "DW_AT_MIPS_tail_loop_begin";
> @@ -6471,7 +6485,20 @@
> case DW_OP_nop:
> printf ("DW_OP_nop");
> break;
> -
>+ case DW_OP_push_object_address:
>+ printf ("DW_OP_push_object_address");
>+ break;
>+ case DW_OP_call2:
>+ printf ("DW_OP_call2: <%lx>", (long) byte_get (data, 2));
>+ data += 2;
>+ break;
>+ case DW_OP_call4:
>+ printf ("DW_OP_call4: <%lx>", (long) byte_get (data, 4));
>+ data += 4;
>+ break;
>+ case DW_OP_calli:
>+ printf ("DW_OP_calli");
>+ break;
> default:
> if (op >= DW_OP_lo_user
> && op <= DW_OP_hi_user)
> @@ -6481,6 +6508,7 @@
> /* No way to tell where the next op is, so just bail. */
> return;
> }
>+ printf ("; "); /* Separate the ops ! */
> }
> }
>
> @@ -6725,10 +6753,25 @@
> }
> break;
>
>+ case DW_AT_ordering:
>+ switch (uvalue)
>+ {
>+ case -1: printf ("(undefined)"); break;
>+ case 0: printf ("(row major)"); break;
>+ case 1: printf ("(column major)"); break;
>+ }
>+ break;
>+
> case DW_AT_frame_base:
> case DW_AT_location:
> case DW_AT_data_member_location:
> case DW_AT_vtable_elem_location:
>+ case DW_AT_allocated:
>+ case DW_AT_associated:
>+ case DW_AT_data_location:
>+ case DW_AT_stride:
>+ case DW_AT_upper_bound:
>+ case DW_AT_lower_bound:
> if (block_start)
> {
> printf ("(");
> jcownie@pc2: diff -u ~/binutils-2.11.2/include/elf/dwarf2.h ../include/elf/dwarf2.h
> --- /home1/jim/binutils-2.11.2/include/elf/dwarf2.h Thu Jun 7 04:21:39 2001
>+++ ../include/elf/dwarf2.h Fri Jun 29 10:17:15 2001
> @@ -279,6 +279,19 @@
> DW_AT_variable_parameter = 0x4b,
> DW_AT_virtuality = 0x4c,
> DW_AT_vtable_elem_location = 0x4d,
>+ /* DWARF 2.1 values */
>+ DW_AT_allocated = 0x4e,
>+ DW_AT_associated = 0x4f,
>+ DW_AT_data_location = 0x50,
>+ DW_AT_stride = 0x51,
>+ DW_AT_entry_pc = 0x52,
>+ DW_AT_use_UTF8 = 0x53,
>+ DW_AT_extension = 0x54,
>+ DW_AT_ranges = 0x55,
>+ DW_AT_trampoline = 0x56,
>+ DW_AT_call_column = 0x57,
>+ DW_AT_call_file = 0x58,
>+ DW_AT_call_line = 0x59,
> /* SGI/MIPS Extensions */
> DW_AT_MIPS_fde = 0x2001,
> DW_AT_MIPS_loop_begin = 0x2002,
> @@ -451,7 +464,11 @@
> DW_OP_piece = 0x93,
> DW_OP_deref_size = 0x94,
> DW_OP_xderef_size = 0x95,
> - DW_OP_nop = 0x96
>+ DW_OP_nop = 0x96,
>+ DW_OP_push_object_address = 0x97, /* 0 */
>+ DW_OP_call2 = 0x98, /* 1 2-byte offset of DIE */
>+ DW_OP_call4 = 0x99, /* 1 4-byte offset of DIE */
>+ DW_OP_calli = 0x9a /* 0 */
> };
>
> #define DW_OP_lo_user 0x80 /* implementation-defined range start */
> jcownie@pc2:
--
"I saw a small bottle of cologne and asked if it was for sale.
She said, "It's free with purchase." I asked her if anyone
bought anything today.
"-Steven Wright