Support .debug_macro with Sun as (PR debug/49887)

Rainer Orth ro@CeBiTec.Uni-Bielefeld.DE
Mon Aug 1 12:12:00 GMT 2011


As described in the PR, many gcc.dg/debug and g++.dg/debug tests were
failing on Solaris/SPARC with -gdwarf-2 -g3 and Sun as.  This happens
because the signature symbols Sun as requires for the COMDAT groups are
emitted in TARGET_ASM_CODE_END, before *debug_hooks->finish runs which
creates new ones for .debug_macro.  Fixed by moving the emission to
TARGET_ASM_FILE_END instead.

Bootstrapped without regressions on i386-pc-solaris2.11 and
sparc-sun-solaris2.11, installed on mainline.

	Rainer


2011-07-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	PR debug/49887
	* config/sol2.c (solaris_code_end): Rename to solaris_file_end.
	* config/sol2-protos.h: Likewise.
	* config/i386/i386.c (ix86_code_end) [TARGET_SOLARIS]: Don't call
	solaris_code_end.
	* config/i386/sol2.h [!USE_GAS] (TARGET_ASM_FILE_END): Redefine.
	* config/sparc/sparc.c (sparc_file_end) [TARGET_SOLARIS]: Call
	solaris_file_end.
	* config/sparc/sol2.h (TARGET_ASM_CODE_END): Remove.

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -8321,10 +8321,6 @@ ix86_code_end (void)
   rtx xops[2];
   int regno;
 
-#ifdef TARGET_SOLARIS
-  solaris_code_end ();
-#endif
-
   for (regno = AX_REG; regno <= SP_REG; regno++)
     {
       char name[32];
diff --git a/gcc/config/i386/sol2.h b/gcc/config/i386/sol2.h
--- a/gcc/config/i386/sol2.h
+++ b/gcc/config/i386/sol2.h
@@ -160,6 +160,12 @@ along with GCC; see the file COPYING3.  
 #undef TARGET_ASM_NAMED_SECTION
 #define TARGET_ASM_NAMED_SECTION i386_solaris_elf_named_section
 
+#ifndef USE_GAS
+/* Emit COMDAT group signature symbols for Sun as.  */
+#undef TARGET_ASM_FILE_END
+#define TARGET_ASM_FILE_END solaris_file_end
+#endif
+
 /* Unlike GNU ld, Sun ld doesn't coalesce .ctors.N/.dtors.N sections, so
    inhibit their creation.  Also cf. sparc/sysv4.h.  */
 #ifndef USE_GLD
diff --git a/gcc/config/sol2-protos.h b/gcc/config/sol2-protos.h
--- a/gcc/config/sol2-protos.h
+++ b/gcc/config/sol2-protos.h
@@ -1,6 +1,6 @@
 /* Operating system specific prototypes to be used when targeting GCC for any
    Solaris 2 system.
-   Copyright 2004, 2007, 2010 Free Software Foundation, Inc.
+   Copyright 2004, 2007, 2010, 2011 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -23,4 +23,4 @@ extern void solaris_register_pragmas (vo
 extern void solaris_output_init_fini (FILE *, tree);
 extern void solaris_assemble_visibility (tree, int);
 extern void solaris_elf_asm_comdat_section (const char *, unsigned int, tree);
-extern void solaris_code_end (void);
+extern void solaris_file_end (void);
diff --git a/gcc/config/sol2.c b/gcc/config/sol2.c
--- a/gcc/config/sol2.c
+++ b/gcc/config/sol2.c
@@ -228,7 +228,7 @@ solaris_elf_asm_comdat_section (const ch
      for Sun as.  With a few exceptions, this is already the case.  To
      identify the missing ones without changing the affected frontents,
      remember the signature symbols and emit those not marked
-     TREE_SYMBOL_REFERENCED in solaris_code_end.  */
+     TREE_SYMBOL_REFERENCED in solaris_file_end.  */
   if (solaris_comdat_htab == NULL)
     solaris_comdat_htab = htab_create_alloc (37, comdat_hash, comdat_eq, NULL,
 					     xcalloc, free);
@@ -275,7 +275,7 @@ solaris_define_comdat_signature (void **
 /* Emit unreferenced COMDAT group signature symbols for Sun as.  */
 
 void
-solaris_code_end (void)
+solaris_file_end (void)
 {
   if (solaris_comdat_htab == NULL)
     return;
diff --git a/gcc/config/sparc/sol2.h b/gcc/config/sparc/sol2.h
--- a/gcc/config/sparc/sol2.h
+++ b/gcc/config/sparc/sol2.h
@@ -314,10 +314,6 @@ along with GCC; see the file COPYING3.  
 #undef TARGET_ASM_NAMED_SECTION
 #define TARGET_ASM_NAMED_SECTION sparc_solaris_elf_asm_named_section
 
-/* Emit COMDAT group signature symbols for Sun as.  */
-#undef TARGET_ASM_CODE_END
-#define TARGET_ASM_CODE_END solaris_code_end
-
 /* Sun as requires doublequoted section names on SPARC.  While GNU as
    supports that, too, we prefer the standard variant.  */
 #undef SECTION_NAME_FORMAT
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -10019,6 +10019,10 @@ sparc_file_end (void)
 
   if (NEED_INDICATE_EXEC_STACK)
     file_end_indicate_exec_stack ();
+
+#ifdef TARGET_SOLARIS
+  solaris_file_end ();
+#endif
 }
 
 #ifdef TARGET_ALTERNATE_LONG_DOUBLE_MANGLING

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University



More information about the Gcc-patches mailing list