Patchwork Provide new macro TARGET_SUPPORTS_WEAK

login
register
mail settings
Submitter John David Anglin
Date Oct. 11, 2010, 3:19 p.m.
Message ID <20101011151904.GA28378@hiauly1.hia.nrc.ca>
Download mbox | patch
Permalink /patch/67430/
State New
Headers show

Comments

John David Anglin - Oct. 11, 2010, 3:19 p.m.
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
Richard Guenther - Oct. 11, 2010, 4:03 p.m.
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)
>
>
Joseph S. Myers - Oct. 11, 2010, 4:43 p.m.
On Mon, 11 Oct 2010, Richard Guenther wrote:

> Ok.  But please leave Joseph time to comment.

I have no comments on this patch.

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)