diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1f7394e278c..22a6b70aed2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2005-11-17 Alexandre Oliva + + * config/rs6000/rs6000.h (ASM_OUTPUT_WEAKREF): Define. + * defaults.h (ASM_OUTPUT_WEAKREF): Add decl argument. + * varasm.c (do_assemble_alias): Adjust call. + (weak_finish): Don't use ASM_WEAKEN_LABEL if ASM_WEAKEN_DECL + is defined. + * doc/tm.texi (ASM_OUTPUT_WEAKREF): Document it. + 2005-11-17 James E Wilson * tree.def (FUNCTION_DECL): Correct typo in comment. diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index d3b3eea0557..d2b54916003 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -2033,6 +2033,26 @@ extern int toc_initialized; while (0) #endif +#if HAVE_GAS_WEAKREF +#define ASM_OUTPUT_WEAKREF(FILE, DECL, NAME, VALUE) \ + do \ + { \ + fputs ("\t.weakref\t", (FILE)); \ + RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \ + fputs (", ", (FILE)); \ + RS6000_OUTPUT_BASENAME ((FILE), (VALUE)); \ + if ((DECL) && TREE_CODE (DECL) == FUNCTION_DECL \ + && DEFAULT_ABI == ABI_AIX && DOT_SYMBOLS) \ + { \ + fputs ("\n\t.weakref\t.", (FILE)); \ + RS6000_OUTPUT_BASENAME ((FILE), (NAME)); \ + fputs (", .", (FILE)); \ + RS6000_OUTPUT_BASENAME ((FILE), (VALUE)); \ + } \ + fputc ('\n', (FILE)); \ + } while (0) +#endif + /* This implements the `alias' attribute. */ #undef ASM_OUTPUT_DEF_FROM_DECLS #define ASM_OUTPUT_DEF_FROM_DECLS(FILE, DECL, TARGET) \ diff --git a/gcc/defaults.h b/gcc/defaults.h index 9d82960e987..38dab339e34 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -174,7 +174,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA the latter is referenced directly, a strong reference prevails. */ #ifndef ASM_OUTPUT_WEAKREF #if defined HAVE_GAS_WEAKREF -#define ASM_OUTPUT_WEAKREF(FILE, NAME, VALUE) \ +#define ASM_OUTPUT_WEAKREF(FILE, DECL, NAME, VALUE) \ do \ { \ fprintf ((FILE), "\t.weakref\t"); \ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index b229ee823dd..09279ec7af5 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -6766,6 +6766,12 @@ defines (equates) the weak symbol @var{name} to have the value to make @var{name} weak. @end defmac +@defmac ASM_OUTPUT_WEAKREF (@var{stream}, @var{decl}, @var{name}, @var{value}) +Outputs a directive that enables @var{name} to be used to refer to +symbol @var{value} with weak-symbol semantics. @code{decl} is the +declaration of @code{name}. +@end defmac + @defmac SUPPORTS_WEAK A C expression which evaluates to true if the target supports weak symbols. diff --git a/gcc/varasm.c b/gcc/varasm.c index ad4d060a29f..68a46eab5e2 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4551,7 +4551,10 @@ weak_finish (void) #ifndef ASM_OUTPUT_WEAKREF else if (! TREE_SYMBOL_REFERENCED (target)) { -# ifdef ASM_WEAKEN_LABEL + /* Use ASM_WEAKEN_LABEL only if ASM_WEAKEN_DECL is not + defined, otherwise we and weak_finish_1 would use a + different macros. */ +# if defined ASM_WEAKEN_LABEL && ! defined ASM_WEAKEN_DECL ASM_WEAKEN_LABEL (asm_out_file, IDENTIFIER_POINTER (target)); # else tree decl = find_decl_and_mark_needed (alias_decl, target); @@ -4736,7 +4739,7 @@ do_assemble_alias (tree decl, tree target) weakref_targets = tree_cons (decl, target, weakref_targets); #ifdef ASM_OUTPUT_WEAKREF - ASM_OUTPUT_WEAKREF (asm_out_file, + ASM_OUTPUT_WEAKREF (asm_out_file, decl, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), IDENTIFIER_POINTER (target)); #else