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 <m...@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)