This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

Avoid bad entries in .debug_aranges


The .debug_aranges section contains (for each compilation unit) a sequence 
of (address, length) pairs, terminated by a (0, 0) pair.  It's invalid for 
a (0, 0) pair to be there other than as a terminator.

GCC (output_aranges) outputs an entry for .text, one for the cold text 
section if applicable (but fails to allow for this one when calculating 
the length for the header in size_of_aranges) followed by individual 
entries from arange_table.

libstdc++ is built with -ffunction-sections, so the entry for .text has a 
length of 0.  When the shared libstdc++ is linked, the linker (with 
--gc-sections) discards the empty .text and the .debug_aranges entries 
referencing it end up with the address as well as the length being 0.  
(This then triggers a prelink sanity check if you use prelink with a 
libstdc++ with debug information.)

To fix this, we can detect that no functions went in .text and avoid 
outputting the entry for it if so (and likewise for the cold text 
section).  This patch does so, as well as fixing the length calculation 
bug mentioned above.

Bootstrapped with no regressions on i686-pc-linux-gnu.  Approved off-list 
by Mark; will commit in 24 hours' time if there are no objections.

2007-08-18  Joseph Myers  <joseph@codesourcery.com>

	* dwarf2out.c (text_section_used, cold_text_section_used,
	cold_text_section, dwarf2out_note_section_used): New.
	(dwarf2out_init): Initialize cold_text_section.
	(dwarf2out_switch_text_section, dwarf2out_begin_function): Call
	dwarf2out_note_section_used.
	(size_of_aranges): Only count entry for text section if it was
	used.  Count entry for cold text section if it was used.
	(output_aranges): Only output entries for text section and cold
	text section if they were used.

testsuite:
2007-08-18  Joseph Myers  <joseph@codesourcery.com>

	* gcc.dg/debug/dwarf2/aranges-fnsec-1.c: New test.

Index: gcc/testsuite/gcc.dg/debug/dwarf2/aranges-fnsec-1.c
===================================================================
--- gcc/testsuite/gcc.dg/debug/dwarf2/aranges-fnsec-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/debug/dwarf2/aranges-fnsec-1.c	(revision 0)
@@ -0,0 +1,12 @@
+/* Test that .debug_aranges does not have an entry for the text
+   section if nothing went in there.  */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-gdwarf-2 -ffunction-sections" } */
+/* { dg-final { scan-assembler-not "\\.Letext0-\\.Ltext0" } } */
+
+int
+f (void)
+{
+  return 1;
+}
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 127613)
+++ gcc/dwarf2out.c	(working copy)
@@ -4412,6 +4412,15 @@
 #ifndef SEPARATE_LINE_CODE_LABEL
 #define SEPARATE_LINE_CODE_LABEL	"LSM"
 #endif
+
+/* Whether the default text and cold text sections have been used at
+   all.  */
+
+static GTY(()) bool text_section_used = false;
+static GTY(()) bool cold_text_section_used = false;
+
+/* The default cold text section.  */
+static GTY(()) section *cold_text_section;
 
 /* We allow a language front-end to designate a function that is to be
    called to "demangle" any name before it is put into a DIE.  */
@@ -6852,7 +6861,10 @@
   size = DWARF_ARANGES_HEADER_SIZE;
 
   /* Count the address/length pair for this compilation unit.  */
-  size += 2 * DWARF2_ADDR_SIZE;
+  if (text_section_used)
+    size += 2 * DWARF2_ADDR_SIZE;
+  if (cold_text_section_used)
+    size += 2 * DWARF2_ADDR_SIZE;
   size += 2 * DWARF2_ADDR_SIZE * arange_table_in_use;
 
   /* Count the two zero words used to terminated the address range table.  */
@@ -7050,7 +7062,19 @@
   *d = new_loc_list (descr, begin, end, section, 0);
 }
 
+/* Note that the current function section is being used for code.  */
+
 static void
+dwarf2out_note_section_used (void)
+{
+  section *sec = current_function_section ();
+  if (sec == text_section)
+    text_section_used = true;
+  else if (sec == cold_text_section)
+    cold_text_section_used = true;
+}
+
+static void
 dwarf2out_switch_text_section (void)
 {
   dw_fde_ref fde;
@@ -7068,6 +7092,8 @@
   /* Reset the current label on switching text sections, so that we
      don't attempt to advance_loc4 between labels in different sections.  */
   fde->dw_fde_current_label = NULL;
+
+  dwarf2out_note_section_used ();
 }
 
 /* Output the location list given to us.  */
@@ -7553,11 +7579,19 @@
 	dw2_asm_output_data (2, 0, NULL);
     }
 
-  dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address");
-  dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
-			text_section_label, "Length");
-  if (flag_reorder_blocks_and_partition)
+  /* It is necessary not to output these entries if the sections were
+     not used; if the sections were not used, the length will be 0 and
+     the address may end up as 0 if the section is discarded by ld
+     --gc-sections, leaving an invalid (0, 0) entry that can be
+     confused with the terminator.  */
+  if (text_section_used)
     {
+      dw2_asm_output_addr (DWARF2_ADDR_SIZE, text_section_label, "Address");
+      dw2_asm_output_delta (DWARF2_ADDR_SIZE, text_end_label,
+			    text_section_label, "Length");
+    }
+  if (cold_text_section_used)
+    {
       dw2_asm_output_addr (DWARF2_ADDR_SIZE, cold_text_section_label,
 			   "Address");
       dw2_asm_output_delta (DWARF2_ADDR_SIZE, cold_end_label,
@@ -14071,6 +14105,8 @@
 
   if (function_section (fun) != text_section)
     have_multiple_function_sections = true;
+
+  dwarf2out_note_section_used ();
 }
 
 /* Output a label to mark the beginning of a source code line entry
@@ -14343,7 +14379,8 @@
   ASM_OUTPUT_LABEL (asm_out_file, text_section_label);
   if (flag_reorder_blocks_and_partition)
     {
-      switch_to_section (unlikely_text_section ());
+      cold_text_section = unlikely_text_section ();
+      switch_to_section (cold_text_section);
       ASM_OUTPUT_LABEL (asm_out_file, cold_text_section_label);
     }
 }

-- 
Joseph S. Myers
joseph@codesourcery.com


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