This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [PATCH 2/3] gas: Make dwarf2dbg.c versions specific and add DW_AT_high_pc case for DWARF 4+.
- From: Tristan Gingold <gingold at adacore dot com>
- To: Mark Wielaard <mjw at redhat dot com>
- Cc: binutils at sourceware dot org, jakub at redhat dot com, "Alan Modra" <amodra at bigpond dot net dot au>, "Nick Clifton" <nickc at redhat dot com>, "Richard Henderson" <rth at redhat dot com>, "Tom Tromey" <tromey at redhat dot com>
- Date: Fri, 27 Apr 2012 14:28:50 +0200
- Subject: Re: [PATCH 2/3] gas: Make dwarf2dbg.c versions specific and add DW_AT_high_pc case for DWARF 4+.
- References: <1335528921-11582-1-git-send-email-mjw@redhat.com> <1335528921-11582-3-git-send-email-mjw@redhat.com>
On Apr 27, 2012, at 2:15 PM, Mark Wielaard wrote:
> * dwarf2dbg.c (DWARF2_ARANGES_VERSION): New define to 2.
> (DWARF2_LINE_VERSION): Likewise.
> (out_debug_line): Use DWARF2_LINE_VERSION not DWARF2_VERSION.
> (out_debug_aranges): Use DWARF2_ARANGES_VERSION not DWARF2_VERSION.
> (out_debug_abbrev): Use DW_FORM_data for DW_AT_high_pc when
> DWARF2_VERSION >= 4.
> (out_debug_info): Use difference between start and end as data
> value for DW_AT_high_pc when DWARF2_VERSION >= 4.
> ---
> gas/ChangeLog | 11 +++++++++++
> gas/dwarf2dbg.c | 24 ++++++++++++++++++++----
> 2 files changed, 31 insertions(+), 4 deletions(-)
>
> diff --git a/gas/ChangeLog b/gas/ChangeLog
> index cfc3f8d..df3de43 100644
> --- a/gas/ChangeLog
> +++ b/gas/ChangeLog
> @@ -1,3 +1,14 @@
> +2012-04-26 Mark Wielaard <mjw@redhat.com>
> +
> + * dwarf2dbg.c (DWARF2_ARANGES_VERSION): New define to 2.
> + (DWARF2_LINE_VERSION): Likewise.
> + (out_debug_line): Use DWARF2_LINE_VERSION not DWARF2_VERSION.
> + (out_debug_aranges): Use DWARF2_ARANGES_VERSION not DWARF2_VERSION.
> + (out_debug_abbrev): Use DW_FORM_data for DW_AT_high_pc when
> + DWARF2_VERSION >= 4.
> + (out_debug_info): Use difference between start and end as data
> + value for DW_AT_high_pc when DWARF2_VERSION >= 4.
> +
> 2012-04-20 Tristan Gingold <gingold@adacore.com>
[ Usually the ChangeLog chunk is omitted ]
> * config/tc-ia64.c (obj_elf_vms_common): New function.
> diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c
> index 76f5e84..3e6c41e 100644
> --- a/gas/dwarf2dbg.c
> +++ b/gas/dwarf2dbg.c
> @@ -93,6 +93,12 @@
> #define DWARF2_VERSION 2
> #endif
>
> +/* The .debug_aranges version has been 2 in DWARF version 2, 3 and 4. */
> +#define DWARF2_ARANGES_VERSION 2
> +
> +/* This implementation output version 2 .debug_line information. */
> +#define DWARF2_LINE_VERSION 2
Please, wrap DWARF2_LINE_VERSION within #ifndef/#endif, so that a target can override it. In particular on ia64/VMS, the backtrace symbolizer requires version 3.
> +
> #include "subsegs.h"
>
> #include "dwarf2.h"
> @@ -1457,7 +1463,7 @@ out_debug_line (segT line_seg)
> line_end = exp.X_add_symbol;
>
> /* Version. */
> - out_two (DWARF2_VERSION);
> + out_two (DWARF2_LINE_VERSION);
>
> /* Length of the prologue following this length. */
> prologue_end = symbol_temp_make ();
> @@ -1565,7 +1571,7 @@ out_debug_aranges (segT aranges_seg, segT info_seg)
> aranges_end = exp.X_add_symbol;
>
> /* Version. */
> - out_two (DWARF2_VERSION);
> + out_two (DWARF2_ARANGES_VERSION);
>
> /* Offset to .debug_info. */
> TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
> @@ -1631,7 +1637,11 @@ out_debug_abbrev (segT abbrev_seg,
> if (all_segs->next == NULL)
> {
> out_abbrev (DW_AT_low_pc, DW_FORM_addr);
> - out_abbrev (DW_AT_high_pc, DW_FORM_addr);
> + if (DWARF2_VERSION < 4)
> + out_abbrev (DW_AT_high_pc, DW_FORM_addr);
> + else
> + out_abbrev (DW_AT_high_pc, (sizeof_address == 4
> + ? DW_FORM_data4 : DW_FORM_data8));
> }
> else
> {
> @@ -1694,7 +1704,13 @@ out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
> emit_expr (&exp, sizeof_address);
>
> /* DW_AT_high_pc */
> - exp.X_op = O_symbol;
> + if (DWARF2_VERSION < 4)
> + exp.X_op = O_symbol;
> + else
> + {
> + exp.X_op = O_subtract;
> + exp.X_op_symbol = all_segs->text_start;
> + }
> exp.X_add_symbol = all_segs->text_end;
> exp.X_add_number = 0;
> emit_expr (&exp, sizeof_address);
Otherwise, looks good to me (but I cannot approve it).
Tristan.