public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] Restore XCOFF for DWARF on AIX.
@ 2022-09-07 11:45 Martin Liška
  2022-09-07 12:04 ` Richard Biener
  2022-09-07 13:43 ` David Edelsohn
  0 siblings, 2 replies; 5+ messages in thread
From: Martin Liška @ 2022-09-07 11:45 UTC (permalink / raw)
  To: gcc-patches; +Cc: David Edelsohn, Richard Biener

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(-)

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
+
 \f
 /* 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


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-09-07 15:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-07 11:45 [PATCH] Restore XCOFF for DWARF on AIX Martin Liška
2022-09-07 12:04 ` Richard Biener
2022-09-07 13:43 ` David Edelsohn
2022-09-07 14:37   ` Martin Liška
2022-09-07 15:49     ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).