This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
re: Generate DW_AT_ranges for non-contiguous code
- From: Sterling Augustine <sterling at tensilica dot com>
- To: binutils at sourceware dot org
- Date: Fri, 28 Jul 2006 15:06:47 -0700
- Subject: re: Generate DW_AT_ranges for non-contiguous code
I need to withdraw this patch. The attribute should point into the
debug.ranges section, rather than the .debug.aranges section.
Sterling Augustine
Member of Technical Staff
Tensilica, Inc.
--- binutils-060728/gas/dwarf2dbg.c 2006-06-07 04:27:57.000000000 -0700
+++ updated/gas/dwarf2dbg.c 2006-07-28 13:35:43.229267000 -0700
@@ -202,7 +202,7 @@ static void out_file_list (void);
static void out_debug_line (segT);
static void out_debug_aranges (segT, segT);
static void out_debug_abbrev (segT);
-static void out_debug_info (segT, segT, segT);
+static void out_debug_info (segT, segT, segT, segT);
#ifndef TC_DWARF2_EMIT_OFFSET
# define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
@@ -1382,6 +1382,9 @@ out_debug_abbrev (segT abbrev_seg)
out_abbrev (DW_AT_low_pc, DW_FORM_addr);
out_abbrev (DW_AT_high_pc, DW_FORM_addr);
}
+ else
+ out_abbrev (DW_AT_ranges, DW_FORM_addr);
+
out_abbrev (DW_AT_name, DW_FORM_string);
out_abbrev (DW_AT_comp_dir, DW_FORM_string);
out_abbrev (DW_AT_producer, DW_FORM_string);
@@ -1395,7 +1398,7 @@ out_debug_abbrev (segT abbrev_seg)
/* Emit a description of this compilation unit for .debug_info. */
static void
-out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg)
+out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT aranges_seg)
{
char producer[128];
char *comp_dir;
@@ -1458,8 +1461,7 @@ out_debug_info (segT info_seg, segT abbr
/* ??? sizeof_offset */
TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg), 4);
- /* These two attributes may only be emitted if all of the code is
- contiguous. Multiple sections are not that. */
+ /* These two attributes are emitted if all of the code is contiguous. */
if (all_segs->next == NULL)
{
/* DW_AT_low_pc */
@@ -1474,6 +1476,16 @@ out_debug_info (segT info_seg, segT abbr
expr.X_add_number = 0;
emit_expr (&expr, sizeof_address);
}
+ else
+ {
+ /* Use a range attribute for non-contiguous code. */
+
+ /* DW_AT_ranges */
+ expr.X_op = O_symbol;
+ expr.X_add_symbol = section_symbol (aranges_seg);
+ expr.X_add_number = 0;
+ emit_expr (&expr, sizeof_address);
+ }
/* DW_AT_name. We don't have the actual file name that was present
on the command line, so assume files[1] is the main input file.
@@ -1582,6 +1594,6 @@ dwarf2_finish (void)
out_debug_aranges (aranges_seg, info_seg);
out_debug_abbrev (abbrev_seg);
- out_debug_info (info_seg, abbrev_seg, line_seg);
+ out_debug_info (info_seg, abbrev_seg, line_seg, aranges_seg);
}
}