From patchwork Mon Oct 11 15:19:05 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John David Anglin X-Patchwork-Id: 67430 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 74EB6B70A3 for ; Tue, 12 Oct 2010 02:19:30 +1100 (EST) Received: (qmail 20064 invoked by alias); 11 Oct 2010 15:19:28 -0000 Received: (qmail 20051 invoked by uid 22791); 11 Oct 2010 15:19:26 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from hiauly1.hia.nrc.ca (HELO hiauly1.hia.nrc.ca) (132.246.100.193) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Oct 2010 15:19:21 +0000 Received: by hiauly1.hia.nrc.ca (Postfix, from userid 1000) id 5D6B34E7B; Mon, 11 Oct 2010 11:19:05 -0400 (EDT) Date: Mon, 11 Oct 2010 11:19:05 -0400 From: John David Anglin To: "Joseph S. Myers" Cc: Steve Ellcey , gcc-patches@gcc.gnu.org, dave.anglin@nrc-cnrc.gc.ca Subject: [PATCH] Provide new macro TARGET_SUPPORTS_WEAK Message-ID: <20101011151904.GA28378@hiauly1.hia.nrc.ca> Reply-To: John David Anglin References: <201009302247.o8UMlrb18236@lucas.cup.hp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.16 (2007-06-09) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org On Thu, 30 Sep 2010, Joseph S. Myers wrote: > As with HARD_FRAME_POINTER_IS_FRAME_POINTER and > HARD_FRAME_POINTER_IS_ARG_POINTER, and with the powerpc64-linux fix > (r164764), if a target macro is used in preprocessor conditionals then it > must not depend on command-line options, and if it does at present you > need to define a new macro that does not. Such dependencies have never > made much logical sense, but now they break the build rather than quietly > treating target_flags as 0. The enclosed patch defines a new macro, TARGET_SUPPORTS_WEAK, to decouple uses a preprocessor constant and a C expression. The uses as a C expression are renamed to use the new macro TARGET_SUPPORTS_WEAK. In reviewing these changes, I noticed that the define for USE_LINKONCE_INDIRECT was broken as SUPPORTS_ONE_ONLY is always defined. This is corrected. Tested on hppa2.0w-hp-hpux11.11 and hppa64-hp-hpux11.11. An earlier version was tested on hppa-unknown-linux-gnu. OK? Dave Index: doc/tm.texi.in =================================================================== --- doc/tm.texi.in (revision 165311) +++ doc/tm.texi.in (working copy) @@ -7909,15 +7909,23 @@ @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}) A C statement (sans semicolon) to mark @var{decl} to be emitted as a public symbol such that extra copies in multiple translation units will Index: doc/tm.texi =================================================================== --- doc/tm.texi (revision 165311) +++ doc/tm.texi (working copy) @@ -7923,15 +7923,23 @@ @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}) A C statement (sans semicolon) to mark @var{decl} to be emitted as a public symbol such that extra copies in multiple translation units will Index: defaults.h =================================================================== --- defaults.h (revision 165311) +++ defaults.h (working copy) @@ -286,7 +286,8 @@ #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 @@ -295,6 +296,12 @@ #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 Index: dwarf2asm.c =================================================================== --- dwarf2asm.c (revision 165311) +++ dwarf2asm.c (working copy) @@ -798,8 +798,8 @@ 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 Index: varasm.c =================================================================== --- varasm.c (revision 165311) +++ varasm.c (working copy) @@ -2053,7 +2053,7 @@ /* 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 @@ -5027,7 +5027,7 @@ { 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 @@ -5064,7 +5064,7 @@ 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. */ @@ -5098,7 +5098,7 @@ 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); @@ -5344,7 +5344,7 @@ 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"); @@ -5636,7 +5636,7 @@ { 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 @@ -5662,7 +5662,7 @@ DECL_COMMON (decl) = 1; else { - gcc_assert (SUPPORTS_WEAK); + gcc_assert (TARGET_SUPPORTS_WEAK); DECL_WEAK (decl) = 1; } } Index: config/pa/som.h =================================================================== --- config/pa/som.h (revision 165311) +++ config/pa/som.h (working copy) @@ -272,11 +272,13 @@ #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 @@ -289,7 +291,7 @@ #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 @@ -300,7 +302,7 @@ && (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)