This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH 2/3] gas: Make dwarf2dbg.c versions specific and add DW_AT_high_pc case for DWARF 4+.
- From: Mark Wielaard <mjw at redhat dot com>
- To: binutils at sourceware dot org
- Cc: jakub at redhat dot com, Mark Wielaard <mjw 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>, "Tristan Gingold" <gingold at adacore dot com>
- Date: Fri, 27 Apr 2012 14:15:20 +0200
- Subject: [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>
* 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>
* 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
+
#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);
--
1.7.7.6