On Wed, Sep 7, 2022 at 1:45 PM Martin Liška <mli...@suse.cz> wrote: > > Hi. > > The patch restores DWARF support for AIX target where XCOFF file container is > used. > Verified before and after the patch, gcc119 machine (AIX) could not build any > run-time library, > now it can. > > Ready to be installed?
OK. Thanks, Richard. > Thanks, > Martin > > PR bootstrap/106855 > > gcc/ChangeLog: > > * collect2.cc (scan_prog_file): Restore if XCOFF_DEBUGGING_INFO. > * config/rs6000/rs6000.cc (rs6000_option_override_internal): > Restore usage of XCOFF_DEBUGGING_INFO. > * config/rs6000/xcoff.h (XCOFF_DEBUGGING_INFO): Restore. > * dwarf2asm.cc (XCOFF_DEBUGGING_INFO): Restore support for > XCOFF_DEBUGGING_INFO. > (dw2_asm_output_nstring): Likewise. > (USE_LINKONCE_INDIRECT): Likewise. > * dwarf2out.cc (XCOFF_DEBUGGING_INFO): Likewise. > (HAVE_XCOFF_DWARF_EXTRAS): Likewise. > (output_fde): Likewise. > (output_call_frame_info): Likewise. > (have_macinfo): Likewise. > (add_AT_loc_list): Likewise. > (add_AT_view_list): Likewise. > (output_compilation_unit_header): Likewise. > (output_pubnames): Likewise. > (output_aranges): Likewise. > (output_line_info): Likewise. > (output_macinfo): Likewise. > (dwarf2out_finish): Likewise. > (dwarf2out_early_finish): Likewise. > --- > gcc/collect2.cc | 7 +++ > gcc/config/rs6000/rs6000.cc | 6 +++ > gcc/config/rs6000/xcoff.h | 3 ++ > gcc/dwarf2asm.cc | 13 +++-- > gcc/dwarf2out.cc | 103 +++++++++++++++++++++++++----------- > 5 files changed, 97 insertions(+), 35 deletions(-) > > diff --git a/gcc/collect2.cc b/gcc/collect2.cc > index 9715e8eee30..d81c7f28f16 100644 > --- a/gcc/collect2.cc > +++ b/gcc/collect2.cc > @@ -2784,6 +2784,13 @@ scan_prog_file (const char *prog_name, scanpass > which_pass, > if ((name = ldgetname (ldptr, &symbol)) == NULL) > continue; /* Should never happen. */ > > +#ifdef XCOFF_DEBUGGING_INFO > + /* All AIX function names have a duplicate entry > + beginning with a dot. */ > + if (*name == '.') > + ++name; > +#endif > + > switch (is_ctor_dtor (name)) > { > #if TARGET_AIX_VERSION > diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc > index 8b4edd281ca..7623d69a8c0 100644 > --- a/gcc/config/rs6000/rs6000.cc > +++ b/gcc/config/rs6000/rs6000.cc > @@ -3821,6 +3821,12 @@ rs6000_option_override_internal (bool global_init_p) > if (TARGET_DEBUG_REG || TARGET_DEBUG_TARGET) > rs6000_print_isa_options (stderr, 0, "before defaults", > rs6000_isa_flags); > > +#ifdef XCOFF_DEBUGGING_INFO > + /* For AIX default to 64-bit DWARF. */ > + if (!OPTION_SET_P (dwarf_offset_size)) > + dwarf_offset_size = POINTER_SIZE_UNITS; > +#endif > + > /* Handle explicit -mno-{altivec,vsx,power8-vector,power9-vector} and turn > off all of the options that depend on those flags. */ > ignore_masks = rs6000_disable_incompatible_switches (); > diff --git a/gcc/config/rs6000/xcoff.h b/gcc/config/rs6000/xcoff.h > index bafc57df59a..cd0f99cb9c6 100644 > --- a/gcc/config/rs6000/xcoff.h > +++ b/gcc/config/rs6000/xcoff.h > @@ -21,6 +21,9 @@ > > #define TARGET_OBJECT_FORMAT OBJECT_XCOFF > > +/* The RS/6000 uses the XCOFF format. */ > +#define XCOFF_DEBUGGING_INFO 1 > + > /* Define if the object format being used is COFF or a superset. */ > #define OBJECT_FORMAT_COFF > > diff --git a/gcc/dwarf2asm.cc b/gcc/dwarf2asm.cc > index 7eac83f7b0f..274f574f25e 100644 > --- a/gcc/dwarf2asm.cc > +++ b/gcc/dwarf2asm.cc > @@ -35,6 +35,10 @@ along with GCC; see the file COPYING3. If not see > #include "emit-rtl.h" > #include "fold-const.h" > > +#ifndef XCOFF_DEBUGGING_INFO > +#define XCOFF_DEBUGGING_INFO 0 > +#endif > + > > /* Output an unaligned integer with the given value and size. Prefer not > to print a newline, since the caller may want to add a comment. */ > @@ -380,13 +384,16 @@ dw2_asm_output_nstring (const char *str, size_t > orig_len, > > if (flag_debug_asm && comment) > { > - fputs ("\t.ascii \"", asm_out_file); > + if (XCOFF_DEBUGGING_INFO) > + fputs ("\t.byte \"", asm_out_file); > + else > + fputs ("\t.ascii \"", asm_out_file); > > for (i = 0; i < len; i++) > { > int c = str[i]; > if (c == '\"') > - fputc ('\\', asm_out_file); > + fputc (XCOFF_DEBUGGING_INFO ? '\"' : '\\', asm_out_file); > else if (c == '\\') > fputc ('\\', asm_out_file); > if (ISPRINT (c)) > @@ -906,7 +913,7 @@ static GTY(()) hash_map<const char *, tree> > *indirect_pool; > static GTY(()) int dw2_const_labelno; > > #if defined(HAVE_GAS_HIDDEN) > -# define USE_LINKONCE_INDIRECT (SUPPORTS_ONE_ONLY) > +# define USE_LINKONCE_INDIRECT (SUPPORTS_ONE_ONLY && !XCOFF_DEBUGGING_INFO) > #else > # define USE_LINKONCE_INDIRECT 0 > #endif > diff --git a/gcc/dwarf2out.cc b/gcc/dwarf2out.cc > index e4183607ff8..2df75904022 100644 > --- a/gcc/dwarf2out.cc > +++ b/gcc/dwarf2out.cc > @@ -105,6 +105,14 @@ static rtx_insn *cached_next_real_insn; > static void dwarf2out_decl (tree); > static bool is_redundant_typedef (const_tree); > > +#ifndef XCOFF_DEBUGGING_INFO > +#define XCOFF_DEBUGGING_INFO 0 > +#endif > + > +#ifndef HAVE_XCOFF_DWARF_EXTRAS > +#define HAVE_XCOFF_DWARF_EXTRAS 0 > +#endif > + > #ifdef VMS_DEBUGGING_INFO > int vms_file_stats_name (const char *, long long *, long *, char *, int *); > > @@ -600,11 +608,14 @@ output_fde (dw_fde_ref fde, bool for_eh, bool second, > for_eh + j); > ASM_GENERATE_INTERNAL_LABEL (l1, FDE_AFTER_SIZE_LABEL, for_eh + j); > ASM_GENERATE_INTERNAL_LABEL (l2, FDE_END_LABEL, for_eh + j); > - if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4 && !for_eh) > - dw2_asm_output_data (4, 0xffffffff, "Initial length escape value" > - " indicating 64-bit DWARF extension"); > - dw2_asm_output_delta (for_eh ? 4 : dwarf_offset_size, l2, l1, > - "FDE Length"); > + if (!XCOFF_DEBUGGING_INFO || for_eh) > + { > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4 && !for_eh) > + dw2_asm_output_data (4, 0xffffffff, "Initial length escape value" > + " indicating 64-bit DWARF extension"); > + dw2_asm_output_delta (for_eh ? 4 : dwarf_offset_size, l2, l1, > + "FDE Length"); > + } > ASM_OUTPUT_LABEL (asm_out_file, l1); > > if (for_eh) > @@ -801,11 +812,14 @@ output_call_frame_info (int for_eh) > /* Output the CIE. */ > ASM_GENERATE_INTERNAL_LABEL (l1, CIE_AFTER_SIZE_LABEL, for_eh); > ASM_GENERATE_INTERNAL_LABEL (l2, CIE_END_LABEL, for_eh); > - if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4 && !for_eh) > - dw2_asm_output_data (4, 0xffffffff, > - "Initial length escape value indicating 64-bit DWARF > extension"); > - dw2_asm_output_delta (for_eh ? 4 : dwarf_offset_size, l2, l1, > - "Length of Common Information Entry"); > + if (!XCOFF_DEBUGGING_INFO || for_eh) > + { > + if (DWARF_INITIAL_LENGTH_SIZE - dwarf_offset_size == 4 && !for_eh) > + dw2_asm_output_data (4, 0xffffffff, > + "Initial length escape value indicating 64-bit DWARF extension"); > + dw2_asm_output_delta (for_eh ? 4 : dwarf_offset_size, l2, l1, > + "Length of Common Information Entry"); > + } > ASM_OUTPUT_LABEL (asm_out_file, l1); > > /* Now that the CIE pointer is PC-relative for EH, > @@ -3665,7 +3679,8 @@ static GTY (()) vec<macinfo_entry, va_gc> > *macinfo_table; > /* True if .debug_macinfo or .debug_macros section is going to be > emitted. */ > #define have_macinfo \ > - (debug_info_level >= DINFO_LEVEL_VERBOSE \ > + ((!XCOFF_DEBUGGING_INFO || HAVE_XCOFF_DWARF_EXTRAS) \ > + && debug_info_level >= DINFO_LEVEL_VERBOSE \ > && !macinfo_table->is_empty ()) > > /* Vector of dies for which we should generate .debug_ranges info. */ > @@ -4967,6 +4982,9 @@ add_AT_loc_list (dw_die_ref die, enum dwarf_attribute > attr_kind, dw_loc_list_ref > { > dw_attr_node attr; > > + if (XCOFF_DEBUGGING_INFO && !HAVE_XCOFF_DWARF_EXTRAS) > + return; > + > attr.dw_attr = attr_kind; > attr.dw_attr_val.val_class = dw_val_class_loc_list; > attr.dw_attr_val.val_entry = NULL; > @@ -4990,6 +5008,9 @@ add_AT_view_list (dw_die_ref die, enum dwarf_attribute > attr_kind) > { > dw_attr_node attr; > > + if (XCOFF_DEBUGGING_INFO && !HAVE_XCOFF_DWARF_EXTRAS) > + return; > + > attr.dw_attr = attr_kind; > attr.dw_attr_val.val_class = dw_val_class_view_list; > attr.dw_attr_val.val_entry = NULL; > @@ -11145,12 +11166,15 @@ output_dwarf_version () > static void > output_compilation_unit_header (enum dwarf_unit_type ut) > { > - 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"); > + if (!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"); > + } > > output_dwarf_version (); > if (dwarf_version >= 5) > @@ -11659,11 +11683,14 @@ output_pubnames (vec<pubname_entry, va_gc> *names) > unsigned long pubnames_length = size_of_pubnames (names); > pubname_entry *pub; > > - 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"); > + if (!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, pubnames_length, > + "Pub Info Length"); > + } > > /* Version number for pubnames/pubtypes is independent of dwarf version. > */ > dw2_asm_output_data (2, 2, "DWARF pubnames/pubtypes version"); > @@ -11738,11 +11765,14 @@ output_aranges (void) > unsigned i; > 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"); > + if (!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, aranges_length, > + "Length of Address Ranges Info"); > + } > > /* Version number for aranges is still 2, even up to DWARF5. */ > dw2_asm_output_data (2, 2, "DWARF aranges version"); > @@ -13036,11 +13066,14 @@ output_line_info (bool prologue_only) > ASM_GENERATE_INTERNAL_LABEL (p2, LN_PROLOG_END_LABEL, > output_line_info_generation++); > > - 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"); > + if (!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"); > + } > > ASM_OUTPUT_LABEL (asm_out_file, l1); > > @@ -29111,6 +29144,8 @@ output_macinfo (const char *debug_line_label, bool > early_lto_debug) > /* AIX Assembler inserts the length, so adjust the reference to match the > offset expected by debuggers. */ > strcpy (dl_section_ref, debug_line_label); > + if (XCOFF_DEBUGGING_INFO) > + strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR); > > /* For .debug_macro emit the section header. */ > if (!dwarf_strict || dwarf_version >= 5) > @@ -32315,6 +32350,8 @@ dwarf2out_finish (const char *filename) > /* AIX Assembler inserts the length, so adjust the reference to match the > offset expected by debuggers. */ > strcpy (dl_section_ref, debug_line_section_label); > + if (XCOFF_DEBUGGING_INFO) > + strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR); > > if (debug_info_level >= DINFO_LEVEL_TERSE) > add_AT_lineptr (main_comp_unit_die, DW_AT_stmt_list, > @@ -33030,6 +33067,8 @@ dwarf2out_early_finish (const char *filename) > /* AIX Assembler inserts the length, so adjust the reference to match the > offset expected by debuggers. */ > strcpy (dl_section_ref, debug_line_section_label); > + if (XCOFF_DEBUGGING_INFO) > + strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR); > > if (debug_info_level >= DINFO_LEVEL_TERSE) > add_AT_lineptr (comp_unit_die (), DW_AT_stmt_list, dl_section_ref); > -- > 2.37.3 >