This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Generate DW_AT_ranges for non-contiguous code


This enclosed patch adds support for DW_AT_ranges when assembly code is
noncontiguous. See: http://sourceware.org/ml/gdb/2006-05/msg00015.html
for a discussion of the problem this is addressing.

I believe Tensilica's copyright assignment is already on file.

One issue here is that this particular usage of DW_AT_ranges is dwarf 3,
and gas emits 2 for the dwarf version number. Don't know the right thing to do there. Bumping the version number for this seems extreme.


Let me know any issues...

Sterling Augustine
Member of Technical Staff
Tensilica, Inc.

gas/

2006-07-28 Sterling Augustine <sterling@tensilica.com>

	* dwarf2dbg.c (out_debug_info): Add new parameter aranges_seg
	and emit DW_AT_ranges when code in compilation unit is not
	contiguous.
	(out_debug_abbrev): Emit DW_AT_ranges abbreviation if code in
	is not contiguous.
	(dwarf2_finish): Pass aranges_seg to out_debug_info.



--- 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);
     }
 }



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]