Hi! The GNU DW_AT_GNU_macros and .debug_macro* extensions were added to DWARF5, so we should emit those even in -gstrict-dwarf -gdwarf-5 mode.
Bootstrapped/regtested on x86_64-linux and i686-linux on top of the dwarf2.{def,h} patch, ok for trunk? 2016-10-14 Jakub Jelinek <ja...@redhat.com> * dwarf2out.c (dwarf2out_define, dwarf2out_undef, output_macinfo_op, optimize_macinfo_range, save_macinfo_strings): Replace DW_MACRO_GNU_* constants with corresponding DW_MACRO_* constants. (output_macinfo): Likewise. Emit .debug_macro* rather than .debug_macinfo* even for -gstrict-dwarf -gdwarf-5. (init_sections_and_labels): Use .debug_macro* labels rather than .debug_macinfo* labels even for -gstrict-dwarf -gdwarf-5. (dwarf2out_finish): Use DW_AT_macros instead of DW_AT_macro_info or DW_AT_GNU_macros for -gdwarf-5. --- gcc/dwarf2out.c.jj 2016-10-14 16:39:12.000000000 +0200 +++ gcc/dwarf2out.c 2016-10-14 17:59:32.304773877 +0200 @@ -25213,7 +25213,7 @@ dwarf2out_define (unsigned int lineno AT { macinfo_entry e; /* Insert a dummy first entry to be able to optimize the whole - predefined macro block using DW_MACRO_GNU_transparent_include. */ + predefined macro block using DW_MACRO_import. */ if (macinfo_table->is_empty () && lineno <= 1) { e.code = 0; @@ -25240,7 +25240,7 @@ dwarf2out_undef (unsigned int lineno ATT { macinfo_entry e; /* Insert a dummy first entry to be able to optimize the whole - predefined macro block using DW_MACRO_GNU_transparent_include. */ + predefined macro block using DW_MACRO_import. */ if (macinfo_table->is_empty () && lineno <= 1) { e.code = 0; @@ -25312,8 +25312,7 @@ output_macinfo_op (macinfo_entry *ref) && (debug_str_section->common.flags & SECTION_MERGE) != 0) { ref->code = ref->code == DW_MACINFO_define - ? DW_MACRO_GNU_define_indirect - : DW_MACRO_GNU_undef_indirect; + ? DW_MACRO_define_strp : DW_MACRO_undef_strp; output_macinfo_op (ref); return; } @@ -25324,16 +25323,16 @@ output_macinfo_op (macinfo_entry *ref) (unsigned long) ref->lineno); dw2_asm_output_nstring (ref->info, -1, "The macro"); break; - case DW_MACRO_GNU_define_indirect: - case DW_MACRO_GNU_undef_indirect: + case DW_MACRO_define_strp: + case DW_MACRO_undef_strp: node = find_AT_string (ref->info); gcc_assert (node - && ((node->form == DW_FORM_strp) - || (node->form == DW_FORM_GNU_str_index))); + && (node->form == DW_FORM_strp + || node->form == DW_FORM_GNU_str_index)); dw2_asm_output_data (1, ref->code, - ref->code == DW_MACRO_GNU_define_indirect - ? "Define macro indirect" - : "Undefine macro indirect"); + ref->code == DW_MACRO_define_strp + ? "Define macro strp" + : "Undefine macro strp"); dw2_asm_output_data_uleb128 (ref->lineno, "At line number %lu", (unsigned long) ref->lineno); if (node->form == DW_FORM_strp) @@ -25344,8 +25343,8 @@ output_macinfo_op (macinfo_entry *ref) dw2_asm_output_data_uleb128 (node->index, "The macro: \"%s\"", ref->info); break; - case DW_MACRO_GNU_transparent_include: - dw2_asm_output_data (1, ref->code, "Transparent include"); + case DW_MACRO_import: + dw2_asm_output_data (1, ref->code, "Import"); ASM_GENERATE_INTERNAL_LABEL (label, DEBUG_MACRO_SECTION_LABEL, ref->lineno); dw2_asm_output_offset (DWARF_OFFSET_SIZE, label, NULL, NULL); @@ -25361,7 +25360,7 @@ output_macinfo_op (macinfo_entry *ref) other compilation unit .debug_macinfo sections. IDX is the first index of a define/undef, return the number of ops that should be emitted in a comdat .debug_macinfo section and emit - a DW_MACRO_GNU_transparent_include entry referencing it. + a DW_MACRO_import entry referencing it. If the define/undef entry should be emitted normally, return 0. */ static unsigned @@ -25447,10 +25446,10 @@ optimize_macinfo_range (unsigned int idx for (i = 0; i < 16; i++) sprintf (tail + i * 2, "%02x", checksum[i] & 0xff); - /* Construct a macinfo_entry for DW_MACRO_GNU_transparent_include + /* Construct a macinfo_entry for DW_MACRO_import in the empty vector entry before the first define/undef. */ inc = &(*macinfo_table)[idx - 1]; - inc->code = DW_MACRO_GNU_transparent_include; + inc->code = DW_MACRO_import; inc->lineno = 0; inc->info = ggc_strdup (grp_name); if (!*macinfo_htab) @@ -25462,7 +25461,7 @@ optimize_macinfo_range (unsigned int idx inc->code = 0; inc->info = NULL; /* If such an entry has been used before, just emit - a DW_MACRO_GNU_transparent_include op. */ + a DW_MACRO_import op. */ inc = *slot; output_macinfo_op (inc); /* And clear all macinfo_entry in the range to avoid emitting them @@ -25508,8 +25507,8 @@ save_macinfo_strings (void) && (debug_str_section->common.flags & SECTION_MERGE) != 0) set_indirect_string (find_AT_string (ref->info)); break; - case DW_MACRO_GNU_define_indirect: - case DW_MACRO_GNU_undef_indirect: + case DW_MACRO_define_strp: + case DW_MACRO_undef_strp: set_indirect_string (find_AT_string (ref->info)); break; default: @@ -25533,15 +25532,16 @@ output_macinfo (void) return; /* output_macinfo* uses these interchangeably. */ - gcc_assert ((int) DW_MACINFO_define == (int) DW_MACRO_GNU_define - && (int) DW_MACINFO_undef == (int) DW_MACRO_GNU_undef - && (int) DW_MACINFO_start_file == (int) DW_MACRO_GNU_start_file - && (int) DW_MACINFO_end_file == (int) DW_MACRO_GNU_end_file); + gcc_assert ((int) DW_MACINFO_define == (int) DW_MACRO_define + && (int) DW_MACINFO_undef == (int) DW_MACRO_undef + && (int) DW_MACINFO_start_file == (int) DW_MACRO_start_file + && (int) DW_MACINFO_end_file == (int) DW_MACRO_end_file); /* For .debug_macro emit the section header. */ - if (!dwarf_strict) + if (!dwarf_strict || dwarf_version >= 5) { - dw2_asm_output_data (2, 4, "DWARF macro version number"); + dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4, + "DWARF macro version number"); if (DWARF_OFFSET_SIZE == 8) dw2_asm_output_data (1, 3, "Flags: 64-bit, lineptr present"); else @@ -25555,8 +25555,7 @@ output_macinfo (void) /* In the first loop, it emits the primary .debug_macinfo section and after each emitted op the macinfo_entry is cleared. If a longer range of define/undef ops can be optimized using - DW_MACRO_GNU_transparent_include, the - DW_MACRO_GNU_transparent_include op is emitted and kept in + DW_MACRO_import, the DW_MACRO_import op is emitted and kept in the vector before the first define/undef in the range and the whole range of define/undef ops is not emitted and kept. */ for (i = 0; macinfo_table->iterate (i, &ref); i++) @@ -25572,7 +25571,7 @@ output_macinfo (void) break; case DW_MACINFO_define: case DW_MACINFO_undef: - if (!dwarf_strict + if ((!dwarf_strict || dwarf_version >= 5) && HAVE_COMDAT_GROUP && vec_safe_length (files) != 1 && i > 0 @@ -25606,16 +25605,15 @@ output_macinfo (void) delete macinfo_htab; macinfo_htab = NULL; - /* If any DW_MACRO_GNU_transparent_include were used, on those - DW_MACRO_GNU_transparent_include entries terminate the - current chain and switch to a new comdat .debug_macinfo + /* If any DW_MACRO_import were used, on those DW_MACRO_import entries + terminate the current chain and switch to a new comdat .debug_macinfo section and emit the define/undef entries within it. */ for (i = 0; macinfo_table->iterate (i, &ref); i++) switch (ref->code) { case 0: continue; - case DW_MACRO_GNU_transparent_include: + case DW_MACRO_import: { char label[MAX_ARTIFICIAL_LABEL_BYTES]; tree comdat_key = get_identifier (ref->info); @@ -25631,7 +25629,8 @@ output_macinfo (void) ASM_OUTPUT_LABEL (asm_out_file, label); ref->code = 0; ref->info = NULL; - dw2_asm_output_data (2, 4, "DWARF macro version number"); + dw2_asm_output_data (2, dwarf_version >= 5 ? 5 : 4, + "DWARF macro version number"); if (DWARF_OFFSET_SIZE == 8) dw2_asm_output_data (1, 1, "Flags: 64-bit"); else @@ -25663,7 +25662,8 @@ init_sections_and_labels (void) debug_loc_section = get_section (DEBUG_LOC_SECTION, SECTION_DEBUG, NULL); debug_macinfo_section_name - = dwarf_strict ? DEBUG_MACINFO_SECTION : DEBUG_MACRO_SECTION; + = (dwarf_strict && dwarf_version < 5) + ? DEBUG_MACINFO_SECTION : DEBUG_MACRO_SECTION; debug_macinfo_section = get_section (debug_macinfo_section_name, SECTION_DEBUG, NULL); } @@ -25700,7 +25700,8 @@ init_sections_and_labels (void) debug_str_dwo_section = get_section (DEBUG_STR_DWO_SECTION, DEBUG_STR_DWO_SECTION_FLAGS, NULL); debug_macinfo_section_name - = dwarf_strict ? DEBUG_DWO_MACINFO_SECTION : DEBUG_DWO_MACRO_SECTION; + = (dwarf_strict && dwarf_version < 5) + ? DEBUG_DWO_MACINFO_SECTION : DEBUG_DWO_MACRO_SECTION; debug_macinfo_section = get_section (debug_macinfo_section_name, SECTION_DEBUG | SECTION_EXCLUDE, NULL); @@ -25731,7 +25732,7 @@ init_sections_and_labels (void) ASM_GENERATE_INTERNAL_LABEL (debug_addr_section_label, DEBUG_ADDR_SECTION_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (macinfo_section_label, - dwarf_strict + (dwarf_strict && dwarf_version < 5) ? DEBUG_MACINFO_SECTION_LABEL : DEBUG_MACRO_SECTION_LABEL, 0); ASM_GENERATE_INTERNAL_LABEL (loc_section_label, DEBUG_LOC_SECTION_LABEL, 0); @@ -28061,7 +28062,8 @@ dwarf2out_finish (const char *) if (have_macinfo) add_AT_macptr (comp_unit_die (), - dwarf_strict ? DW_AT_macro_info : DW_AT_GNU_macros, + dwarf_version >= 5 ? DW_AT_macros + : dwarf_strict ? DW_AT_macro_info : DW_AT_GNU_macros, macinfo_section_label); if (dwarf_split_debug_info) Jakub