Message ID | 20101011151904.GA28378@hiauly1.hia.nrc.ca |
---|---|
State | New |
Headers | show |
On Mon, Oct 11, 2010 at 5:19 PM, John David Anglin <dave@hiauly1.hia.nrc.ca> wrote: > 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? Ok. But please leave Joseph time to comment. Thanks, Richard. > Dave > -- > J. David Anglin dave.anglin@nrc-cnrc.gc.ca > National Research Council of Canada (613) 990-0752 (FAX: 952-6602) > > 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. > > 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) > >
On Mon, 11 Oct 2010, Richard Guenther wrote:
> Ok. But please leave Joseph time to comment.
I have no comments on this patch.
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)