On Mon, Sep 21, 2015 at 5:41 PM, David Edelsohn <dje....@gmail.com> wrote: > Appended is a patch to support DWARF on AIX and works with GDB and AIX > assembler. The AIX assembler prepends the CU length to the section > and does not want the compiler to provide it, so I need to disable > those parts of dwarf2out.c. I know it's ugly, but, on the upside, > this eventually allows GCC to deprecate Stabs, which I think is worth > the pain. > > I discovered that -g3 emits the debug_macros section, which AIX also > does not like, so I disable that section as well. As I mentioned in > v2, I moved the calculation of aranges_length to its one use in the > output function instead of calculating it early to avoid an unused > function argument. > > I also switched to XCOFF_DEBUGGING_INFO as the macro to test in > dwarf2out.c. I think a target hook or testing that DWARF section > names have not been overridden to NULL is overkill. Suggestions > welcome, but any solution that disables arbitrary portions of > dwarf2out.c is going to be ugly. I doubt that any other system, > especially ones based on ELF file format, would ever do this.
Using an existing macro works for me - but as we are working towards eliminating conditional compilation can you try using if (!XCOFF_DEBUGGING_INFO) ? If the macro is not always defined devise a new one defined from XCOFF_DEBUGGING_INFO. Richard. > With a few tweaks to the testsuite, this passes GCC dwarf2 tests. > > Thanks, David > > * dwarf2out.c (size_of_pubnames): Don't define on AIX. > (size_of_aranges): Don't define on AIX. > (output_compilation_unit_header): Don't output length on AIX. > (output_pubnames): Don't output length on AIX. > (output_aranges): Delete argument. Compute length locally. Don't > output length on AIX. > (output_line_info): Don't output length on AIX. > (dwarf2out_finish): Don't output location lists on AIX. > Don't compute aranges_length. Don't output macros section. > * config/rs6000/rs6000.c (rs6000_xcoff_debug_unwind_info): > New. > (rs6000_xcoff_asm_named_section): Emit .dwsect pseudo-op > for SECTION_DEBUG. > (rs6000_xcoff_declare_function_name): Emit different > .function pseudo-op when DWARF2_DEBUG. > * config/rs6000/xcoff.h (TARGET_DEBUG_UNWIND_INFO): > Redefine. > * config/rs6000/aix71.h (DWARF2_DEBUGGING_INFO): Define. > (PREFERRED_DEBUGGING_TYPE): Define. > (DEBUG_INFO_SECTION): Define. > (DEBUG_ABBREV_SECTION): Define. > (DEBUG_ARANGES_SECTION): Define. > (DEBUG_LINE_SECTION): Define. > (DEBUG_PUBNAMES_SECTION): Define. > (DEBUG_PUBTYPES_SECTION): Define. > (DEBUG_STR_SECTION): Define. > (DEBUG_RANGES_SECTION): Define. > > Index: dwarf2out.c > =================================================================== > --- dwarf2out.c (revision 227959) > +++ dwarf2out.c (working copy) > @@ -3185,8 +3185,10 @@ static void calc_base_type_die_sizes (void); > static void mark_dies (dw_die_ref); > static void unmark_dies (dw_die_ref); > static void unmark_all_dies (dw_die_ref); > +#ifndef XCOFF_DEBUGGING_INFO > static unsigned long size_of_pubnames (vec<pubname_entry, va_gc> *); > static unsigned long size_of_aranges (void); > +#endif > static enum dwarf_form value_format (dw_attr_node *); > static void output_value_format (dw_attr_node *); > static void output_abbrev_section (void); > @@ -3202,7 +3204,7 @@ static void add_enumerator_pubname (const char *, > static void add_pubname_string (const char *, dw_die_ref); > static void add_pubtype (tree, dw_die_ref); > static void output_pubnames (vec<pubname_entry, va_gc> *); > -static void output_aranges (unsigned long); > +static void output_aranges (void); > static unsigned int add_ranges_num (int); > static unsigned int add_ranges (const_tree); > static void add_ranges_by_labels (dw_die_ref, const char *, const char *, > @@ -8387,6 +8389,7 @@ include_pubname_in_output (vec<pubname_entry, va_g > || !flag_eliminate_unused_debug_types); > } > > +#ifndef XCOFF_DEBUGGING_INFO > /* Return the size of the .debug_pubnames or .debug_pubtypes table > generated for the compilation unit. */ > > @@ -8441,6 +8444,7 @@ size_of_aranges (void) > size += 2 * DWARF2_ADDR_SIZE; > return size; > } > +#endif > ^L > /* Select the encoding of an attribute value. */ > > @@ -9198,12 +9202,14 @@ output_compilation_unit_header (void) > DWARFv5 draft DIE tags in DWARFv4 format. */ > int ver = dwarf_version < 5 ? dwarf_version : 4; > > +#ifndef XCOFF_DEBUGGING_INFO > if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > dw2_asm_output_data (DWARF_OFFSET_SIZE, > next_die_offset - DWARF_INITIAL_LENGTH_SIZE, > "Length of Compilation Unit Info"); > +#endif > dw2_asm_output_data (2, ver, "DWARF version number"); > dw2_asm_output_offset (DWARF_OFFSET_SIZE, abbrev_section_label, > debug_abbrev_section, > @@ -9630,13 +9636,16 @@ static void > output_pubnames (vec<pubname_entry, va_gc> *names) > { > unsigned i; > - unsigned long pubnames_length = size_of_pubnames (names); > pubname_entry *pub; > > +#ifndef XCOFF_DEBUGGING_INFO > + unsigned long pubnames_length = size_of_pubnames (names); > + > if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > dw2_asm_output_data (DWARF_OFFSET_SIZE, pubnames_length, "Pub Info > Length"); > +#endif > > /* Version number for pubnames/pubtypes is independent of dwarf version. > */ > dw2_asm_output_data (2, 2, "DWARF Version"); > @@ -9706,15 +9715,19 @@ output_pubtables (void) > text section generated for this compilation unit. */ > > static void > -output_aranges (unsigned long aranges_length) > +output_aranges (void) > { > unsigned i; > > - if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > +#ifndef XCOFF_DEBUGGING_INFO > + unsigned long aranges_length = size_of_aranges (); > + > +if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > dw2_asm_output_data (DWARF_OFFSET_SIZE, aranges_length, > "Length of Address Ranges Info"); > +#endif > /* Version number for aranges is still 2, even up to DWARF5. */ > dw2_asm_output_data (2, 2, "DWARF Version"); > if (dwarf_split_debug_info) > @@ -10398,11 +10411,13 @@ output_line_info (bool prologue_only) > ASM_GENERATE_INTERNAL_LABEL (p1, LN_PROLOG_AS_LABEL, 0); > ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, 0); > > +#ifndef XCOFF_DEBUGGING_INFO > if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4) > dw2_asm_output_data (4, 0xffffffff, > "Initial length escape value indicating 64-bit DWARF extension"); > dw2_asm_output_delta (DWARF_OFFSET_SIZE, l2, l1, > "Length of Source Line Info"); > +#endif > ASM_OUTPUT_LABEL (asm_out_file, l1); > > dw2_asm_output_data (2, ver, "DWARF Version"); > @@ -25486,6 +25501,7 @@ dwarf2out_finish (const char *filename) > output_abbrev_section (); > } > > +#ifndef XCOFF_DEBUGGING_INFO > /* Output location list section if necessary. */ > if (have_location_lists) > { > @@ -25494,6 +25510,7 @@ dwarf2out_finish (const char *filename) > ASM_OUTPUT_LABEL (asm_out_file, loc_section_label); > output_location_lists (comp_unit_die ()); > } > +#endif > > output_pubtables (); > > @@ -25504,10 +25521,8 @@ dwarf2out_finish (const char *filename) > generate a table that would have contained data. */ > if (info_section_emitted) > { > - unsigned long aranges_length = size_of_aranges (); > - > switch_to_section (debug_aranges_section); > - output_aranges (aranges_length); > + output_aranges (); > } > > /* Output ranges section if necessary. */ > @@ -25518,6 +25533,7 @@ dwarf2out_finish (const char *filename) > output_ranges (); > } > > +#ifndef XCOFF_DEBUGGING_INFO > /* Have to end the macro section. */ > if (have_macinfo) > { > @@ -25526,6 +25542,7 @@ dwarf2out_finish (const char *filename) > output_macinfo (); > dw2_asm_output_data (1, 0, "End compilation unit"); > } > +#endif > > /* Output the source line correspondence table. We must do this > even if there is no line information. Otherwise, on an empty > Index: config/rs6000/rs6000.c > =================================================================== > --- config/rs6000/rs6000.c (revision 227937) > +++ config/rs6000/rs6000.c (working copy) > @@ -30684,6 +30684,12 @@ > #endif > > #if TARGET_XCOFF > +static enum unwind_info_type > +rs6000_xcoff_debug_unwind_info (void) > +{ > + return UI_NONE; > +} > + > static void > rs6000_xcoff_asm_output_anchor (rtx symbol) > { > @@ -30805,6 +30811,11 @@ > int smclass; > static const char * const suffix[4] = { "PR", "RO", "RW", "TL" }; > > + if (flags & SECTION_DEBUG) > + { > + fprintf (asm_out_file, "\t.dwsect %s\n", name); > + return; > + } > if (flags & SECTION_CODE) > smclass = 0; > else if (flags & SECTION_TLS) > @@ -31140,8 +31151,16 @@ > fputs (":\n", file); > data.function_descriptor = true; > symtab_node::get (decl)->call_for_symbol_and_aliases > (rs6000_declare_alias, & > data, true); > - if (write_symbols != NO_DEBUG && !DECL_IGNORED_P (decl)) > - xcoffout_declare_function (file, decl, buffer); > + if (!DECL_IGNORED_P (decl)) > + { > + if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG) > + xcoffout_declare_function (file, decl, buffer); > + else if (write_symbols == DWARF2_DEBUG) > + { > + name = (*targetm.strip_name_encoding) (name); > + fprintf (file, "\t.function .%s,.%s,2,0\n", name, name); > + } > + } > return; > } > > Index: config/rs6000/xcoff.h > =================================================================== > --- config/rs6000/xcoff.h (revision 227937) > +++ config/rs6000/xcoff.h (working copy) > @@ -86,6 +86,8 @@ > || (SCALAR_FLOAT_MODE_P (GET_MODE (X)) \ > && ! TARGET_NO_FP_IN_TOC))))) > > +#undef TARGET_DEBUG_UNWIND_INFO > +#define TARGET_DEBUG_UNWIND_INFO rs6000_xcoff_debug_unwind_info > #define TARGET_ASM_OUTPUT_ANCHOR rs6000_xcoff_asm_output_anchor > #define TARGET_ASM_GLOBALIZE_LABEL rs6000_xcoff_asm_globalize_label > #define TARGET_ASM_INIT_SECTIONS rs6000_xcoff_asm_init_sections > Index: config/rs6000/aix71.h > =================================================================== > +/* AIX 7.1 supports DWARF debugging, but XCOFF remains the default. */ > +#define DWARF2_DEBUGGING_INFO 1 > +#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG > +#define DEBUG_INFO_SECTION "0x10000" > +#define DEBUG_ABBREV_SECTION "0x60000" > +#define DEBUG_ARANGES_SECTION "0x50000" > +#define DEBUG_LINE_SECTION "0x20000" > +#define DEBUG_PUBNAMES_SECTION "0x30000" > +#define DEBUG_PUBTYPES_SECTION "0x40000" > +#define DEBUG_STR_SECTION "0x70000" > +#define DEBUG_RANGES_SECTION "0x80000"