aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/rs6000/rs6000.h20
-rw-r--r--gcc/defaults.h2
-rw-r--r--gcc/doc/tm.texi6
-rw-r--r--gcc/varasm.c7
5 files changed, 41 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1f7394e..22a6b70 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-17 Alexandre Oliva <aoliva@redhat.com>
+
+ * 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 <wilson@specifix.com>
* tree.def (FUNCTION_DECL): Correct typo in comment.
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index d3b3eea..d2b5491 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 9d82960..38dab33 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 b229ee8..09279ec 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 ad4d060..68a46ea 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