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 <r...@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