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]

[debug] Don't add DW_AT_low_pc if the CU has no associated code


Hi,

The dwarf spec (v4 - 2.17) explicitly says that CUs (and other DIEs)
which have no associated machine code should not have a DW_AT_low_pc,
DW_AT_high_pc or DW_AT_ranges set. This patch also makes gcc not output
DW_AT_entry_pc for a CU.  Which also wasn't according to spec and gcc
has been outputting DW_AT_low_pc for years already. The condition being
dwarf_version >= 4, assuming any consumers updated to Dwarf 4 will have
been following the spec. I checked gdb and elfutils already check for
DW_AT_low_pc.

2011-03-31  Mark Wielaard  <mjw@redhat.com>

    * dwarf2out.c (dwarf2out_finish): Don't add low_pc and/or
    high_pc attribute if the CU has no associated code. Only output
    DW_AT_entry_pc for CU if not generating strict dwarf and
    dwarf_version < 4.

OK to commit?

Bootstrapped and no regressions on GNU/Linux x86_64.

Cheers,

Mark 
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 91be9a4..6b9561c 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -23647,23 +23647,18 @@ dwarf2out_finish (const char *filename)
   if (!have_multiple_function_sections 
       || (dwarf_version < 3 && dwarf_strict))
     {
-      add_AT_lbl_id (comp_unit_die (), DW_AT_low_pc, text_section_label);
-      add_AT_lbl_id (comp_unit_die (), DW_AT_high_pc, text_end_label);
+      /* Don't add if the CU has no associated code.  */
+      if (text_section_used)
+	{
+	  add_AT_lbl_id (comp_unit_die (), DW_AT_low_pc, text_section_label);
+	  add_AT_lbl_id (comp_unit_die (), DW_AT_high_pc, text_end_label);
+	}
     }
-
   else
     {
       unsigned fde_idx = 0;
       bool range_list_added = false;
 
-      /* We need to give .debug_loc and .debug_ranges an appropriate
-	 "base address".  Use zero so that these addresses become
-	 absolute.  Historically, we've emitted the unexpected
-	 DW_AT_entry_pc instead of DW_AT_low_pc for this purpose.
-	 Emit both to give time for other tools to adapt.  */
-      add_AT_addr (comp_unit_die (), DW_AT_low_pc, const0_rtx);
-      add_AT_addr (comp_unit_die (), DW_AT_entry_pc, const0_rtx);
-
       if (text_section_used)
 	add_ranges_by_labels (comp_unit_die (), text_section_label,
 			      text_end_label, &range_list_added);
@@ -23684,7 +23679,18 @@ dwarf2out_finish (const char *filename)
 	}
 
       if (range_list_added)
-	add_ranges (NULL);
+	{
+	  /* We need to give .debug_loc and .debug_ranges an appropriate
+	     "base address".  Use zero so that these addresses become
+	     absolute.  Historically, we've emitted the unexpected
+	     DW_AT_entry_pc instead of DW_AT_low_pc for this purpose.
+	     Emit both to give time for other tools to adapt.  */
+	  add_AT_addr (comp_unit_die (), DW_AT_low_pc, const0_rtx);
+	  if (! dwarf_strict && dwarf_version < 4)
+	    add_AT_addr (comp_unit_die (), DW_AT_entry_pc, const0_rtx);
+
+	  add_ranges (NULL);
+	}
     }
 
   if (debug_info_level >= DINFO_LEVEL_NORMAL)

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