* doc/tm.texi.in (SUPPORTS_WEAK): Update.
(TARGET_SUPPORTS_WEAK): New.
* doc/tm.texi: Regenerate.
* defaults.h (SUPPORTS_WEAK): Update comment.
(TARGET_SUPPORTS_WEAK): New.
* dwarf2asm.c (USE_LINKONCE_INDIRECT): Update define.
* varasm.c (assemble_external): Use TARGET_SUPPORTS_WEAK instead of
SUPPORTS_WEAK.
(merge_weak, declare_weak, do_assemble_alias, supports_one_only,
make_decl_one_only): Likewise.
* config/pa/som.h (SUPPORTS_WEAK): Rename defines to
TARGET_SUPPORTS_WEAK.
(SUPPORTS_ONE_ONLY, MAKE_DECL_ONE_ONLY): Use TARGET_SUPPORTS_WEAK
instead of SUPPORTS_WEAK.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165319
138bc75d-0d04-0410-961f-
82ee72b054a4
+2010-10-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
+ PR middle-end/45862
+ * doc/tm.texi.in (SUPPORTS_WEAK): Update.
+ (TARGET_SUPPORTS_WEAK): New.
+ * doc/tm.texi: Regenerate.
+ * defaults.h (SUPPORTS_WEAK): Update comment.
+ (TARGET_SUPPORTS_WEAK): New.
+ * dwarf2asm.c (USE_LINKONCE_INDIRECT): Update define.
+ * varasm.c (assemble_external): Use TARGET_SUPPORTS_WEAK instead of
+ SUPPORTS_WEAK.
+ (merge_weak, declare_weak, do_assemble_alias, supports_one_only,
+ make_decl_one_only): Likewise.
+ * config/pa/som.h (SUPPORTS_WEAK): Rename defines to
+ TARGET_SUPPORTS_WEAK.
+ (SUPPORTS_ONE_ONLY, MAKE_DECL_ONE_ONLY): Use TARGET_SUPPORTS_WEAK
+ instead of SUPPORTS_WEAK.
+
2010-10-11 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* config/sparc/gmon-sol2.c: Don't include coretypes.h, tm.h.
#define ALWAYS_STRIP_DOTDOT 1
/* If GAS supports weak, we can support weak when we have working linker
- support for secondary definitions and are generating code for GAS. */
+ support for secondary definitions and are generating code for GAS.
+ This is primarily for one-only support as SOM doesn't allow undefined
+ weak symbols. */
#ifdef HAVE_GAS_WEAK
-#define SUPPORTS_WEAK (TARGET_SOM_SDEF && TARGET_GAS)
+#define TARGET_SUPPORTS_WEAK (TARGET_SOM_SDEF && TARGET_GAS)
#else
-#define SUPPORTS_WEAK 0
+#define TARGET_SUPPORTS_WEAK 0
#endif
/* CVS GAS as of 4/28/04 supports a comdat parameter for the .nsubspa
#endif
/* We can support one only if we support weak or comdat. */
-#define SUPPORTS_ONE_ONLY (SUPPORTS_WEAK || SUPPORTS_SOM_COMDAT)
+#define SUPPORTS_ONE_ONLY (TARGET_SUPPORTS_WEAK || SUPPORTS_SOM_COMDAT)
/* We use DECL_COMMON for uninitialized one-only variables as we don't
have linkonce .bss. We use SOM secondary definitions or comdat for
&& (DECL_INITIAL (DECL) == 0 \
|| DECL_INITIAL (DECL) == error_mark_node)) \
DECL_COMMON (DECL) = 1; \
- else if (SUPPORTS_WEAK) \
+ else if (TARGET_SUPPORTS_WEAK) \
DECL_WEAK (DECL) = 1; \
} while (0)
#endif
#endif
-/* This determines whether or not we support weak symbols. */
+/* This determines whether or not we support weak symbols. SUPPORTS_WEAK
+ must be a preprocessor constant. */
#ifndef SUPPORTS_WEAK
#if defined (ASM_WEAKEN_LABEL) || defined (ASM_WEAKEN_DECL)
#define SUPPORTS_WEAK 1
#endif
#endif
+/* This determines whether or not we support weak symbols during target
+ code generation. TARGET_SUPPORTS_WEAK can be any valid C expression. */
+#ifndef TARGET_SUPPORTS_WEAK
+#define TARGET_SUPPORTS_WEAK (SUPPORTS_WEAK)
+#endif
+
/* This determines whether or not we support the discriminator
attribute in the .loc directive. */
#ifndef SUPPORTS_DISCRIMINATOR
@end defmac
@defmac SUPPORTS_WEAK
-A C expression which evaluates to true if the target supports weak symbols.
+A preprocessor constant expression which evaluates to true if the target
+supports weak symbols.
If you don't define this macro, @file{defaults.h} provides a default
definition. If either @code{ASM_WEAKEN_LABEL} or @code{ASM_WEAKEN_DECL}
-is defined, the default definition is @samp{1}; otherwise, it is
-@samp{0}. Define this macro if you want to control weak symbol support
-with a compiler flag such as @option{-melf}.
+is defined, the default definition is @samp{1}; otherwise, it is @samp{0}.
+@end defmac
+
+@defmac TARGET_SUPPORTS_WEAK
+A C expression which evaluates to true if the target supports weak symbols.
+
+If you don't define this macro, @file{defaults.h} provides a default
+definition. The default definition is @samp{(SUPPORTS_WEAK)}. Define
+this macro if you want to control weak symbol support with a compiler
+flag such as @option{-melf}.
@end defmac
@defmac MAKE_DECL_ONE_ONLY (@var{decl})
@end defmac
@defmac SUPPORTS_WEAK
-A C expression which evaluates to true if the target supports weak symbols.
+A preprocessor constant expression which evaluates to true if the target
+supports weak symbols.
If you don't define this macro, @file{defaults.h} provides a default
definition. If either @code{ASM_WEAKEN_LABEL} or @code{ASM_WEAKEN_DECL}
-is defined, the default definition is @samp{1}; otherwise, it is
-@samp{0}. Define this macro if you want to control weak symbol support
-with a compiler flag such as @option{-melf}.
+is defined, the default definition is @samp{1}; otherwise, it is @samp{0}.
+@end defmac
+
+@defmac TARGET_SUPPORTS_WEAK
+A C expression which evaluates to true if the target supports weak symbols.
+
+If you don't define this macro, @file{defaults.h} provides a default
+definition. The default definition is @samp{(SUPPORTS_WEAK)}. Define
+this macro if you want to control weak symbol support with a compiler
+flag such as @option{-melf}.
@end defmac
@defmac MAKE_DECL_ONE_ONLY (@var{decl})
static GTY(()) int dw2_const_labelno;
-#if defined(HAVE_GAS_HIDDEN) && defined(SUPPORTS_ONE_ONLY)
-# define USE_LINKONCE_INDIRECT 1
+#if defined(HAVE_GAS_HIDDEN)
+# define USE_LINKONCE_INDIRECT (SUPPORTS_ONE_ONLY)
#else
# define USE_LINKONCE_INDIRECT 0
#endif
/* We want to output annotation for weak and external symbols at
very last to check if they are references or not. */
- if (SUPPORTS_WEAK
+ if (TARGET_SUPPORTS_WEAK
&& DECL_WEAK (decl)
/* TREE_STATIC is a weird and abused creature which is not
generally the right test for whether an entity has been
{
if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
{
- if (DECL_WEAK (newdecl) && SUPPORTS_WEAK)
+ if (DECL_WEAK (newdecl) && TARGET_SUPPORTS_WEAK)
{
tree *pwd;
/* We put the NEWDECL on the weak_decls list at some point
warning (0, "weak declaration of %q+D after first use results "
"in unspecified behavior", newdecl);
- if (SUPPORTS_WEAK)
+ if (TARGET_SUPPORTS_WEAK)
{
/* We put the NEWDECL on the weak_decls list at some point.
Replace it with the OLDDECL. */
error ("weak declaration of %q+D must be public", decl);
else if (TREE_CODE (decl) == FUNCTION_DECL && TREE_ASM_WRITTEN (decl))
error ("weak declaration of %q+D must precede definition", decl);
- else if (!SUPPORTS_WEAK)
+ else if (!TARGET_SUPPORTS_WEAK)
warning (0, "weak declaration of %q+D not supported", decl);
mark_weak (decl);
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
IDENTIFIER_POINTER (target));
#else
- if (!SUPPORTS_WEAK)
+ if (!TARGET_SUPPORTS_WEAK)
{
error_at (DECL_SOURCE_LOCATION (decl),
"weakref is not supported in this configuration");
{
if (SUPPORTS_ONE_ONLY)
return 1;
- return SUPPORTS_WEAK;
+ return TARGET_SUPPORTS_WEAK;
}
/* Set up DECL as a public symbol that can be defined in multiple
DECL_COMMON (decl) = 1;
else
{
- gcc_assert (SUPPORTS_WEAK);
+ gcc_assert (TARGET_SUPPORTS_WEAK);
DECL_WEAK (decl) = 1;
}
}