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
>

Reply via email to