Restore XCOFF for DWARF on AIX.
Commit Message
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?
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(-)
Comments
On Wed, Sep 7, 2022 at 1:45 PM Martin Liška <mliska@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
>
On Wed, Sep 7, 2022 at 7:45 AM Martin Liška <mliska@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?
> 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.
>
Hi, Martin
Thanks for the quick patch to fix this. This restores bootstrap, but does
not completely restore functionality. This patch did not restore the
gcc/configure test for AIX assembler XCOFF feature support that defines
HAVE_XCOFF_DWARF_EXTRAS. That part of the removal patch also needs to be
reverted.
Thanks, David
On 9/7/22 15:43, David Edelsohn wrote:
> On Wed, Sep 7, 2022 at 7:45 AM Martin Liška <mliska@suse.cz <mailto:mliska@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?
> 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.
>
>
> Hi, Martin
>
> Thanks for the quick patch to fix this. This restores bootstrap, but does not completely restore functionality. This patch did not restore the gcc/configure test for AIX assembler XCOFF feature support that defines HAVE_XCOFF_DWARF_EXTRAS. That part of the removal patch also needs to be reverted.
Ohh! Sorry about that, should be restored by the following patch.
Ready for master?
Thanks,
Martin
>
> Thanks, David
>
> Am 07.09.2022 um 16:37 schrieb Martin Liška <mliska@suse.cz>:
>
> On 9/7/22 15:43, David Edelsohn wrote:
>> On Wed, Sep 7, 2022 at 7:45 AM Martin Liška <mliska@suse.cz <mailto:mliska@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?
>> 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.
>>
>>
>> Hi, Martin
>>
>> Thanks for the quick patch to fix this. This restores bootstrap, but does not completely restore functionality. This patch did not restore the gcc/configure test for AIX assembler XCOFF feature support that defines HAVE_XCOFF_DWARF_EXTRAS. That part of the removal patch also needs to be reverted.
>
> Ohh! Sorry about that, should be restored by the following patch.
>
> Ready for master?
Ok.
Richard
> Thanks,
> Martin
>
>>
>> Thanks, David
>>
> <0001-Restore-detection-of-HAVE_XCOFF_DWARF_EXTRAS.patch>
@@ -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
@@ -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 ();
@@ -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
@@ -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
@@ -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);