diff mbox

powerpc: Fix __wcschr static build

Message ID 54F4D28B.50205@linux.vnet.ibm.com
State New
Headers show

Commit Message

Adhemerval Zanella March 2, 2015, 9:13 p.m. UTC
On 25-02-2015 17:44, Adhemerval Zanella wrote:
> This patch fix the static build for strftime, which uses __wcschr.
> Current powerpc32 implementation defines the __wcschr be an alias to
> __wcschr_ppc32 and current implementation misses the correct alias for
> static build.
>
> It also changes the default wcschr.c logic so a IFUNC implementation
> should just define WCSCHR and undefine the required alias/internal
> definitions.  I see a better logic to undefine the required macros
> in the ifunc files themselves instead of adding more logic on default
> implementations.  It is easier for implementation, such as powerpc32,
> that does not support IFUNC symbols for internal calls.
>
> Tested on powerpc32, powerpc64 and i386.
>
> --

I have sent a wrong version with incorrect 'wcsmbs/wcschr.c' changes.  This below
have the correct fixes:

--

	* wcsmbs/wcschr.c [WCSCHR] (wcschr): Define as __wcschr.  Remove
	conditionals for weak_alias and libc_hidden_weak.
	* sysdeps/i386/i686/multiarch/wcschr-c.c [libc]: Undefine
	libc_hidden_weak and weak_alias.
	* sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c [libc]:
	Undefine libc_hidden_weak. Define libc_hidden_def for SHARED builds
	and weak_alias for static one.

---

Comments

Adhemerval Zanella March 11, 2015, 8:03 p.m. UTC | #1
On 02-03-2015 18:13, Adhemerval Zanella wrote:
> On 25-02-2015 17:44, Adhemerval Zanella wrote:
>> This patch fix the static build for strftime, which uses __wcschr.
>> Current powerpc32 implementation defines the __wcschr be an alias to
>> __wcschr_ppc32 and current implementation misses the correct alias for
>> static build.
>>
>> It also changes the default wcschr.c logic so a IFUNC implementation
>> should just define WCSCHR and undefine the required alias/internal
>> definitions.  I see a better logic to undefine the required macros
>> in the ifunc files themselves instead of adding more logic on default
>> implementations.  It is easier for implementation, such as powerpc32,
>> that does not support IFUNC symbols for internal calls.
>>
>> Tested on powerpc32, powerpc64 and i386.
>>
>> --
> I have sent a wrong version with incorrect 'wcsmbs/wcschr.c' changes.  This below
> have the correct fixes:
Ping.
>
> --
>
> 	* wcsmbs/wcschr.c [WCSCHR] (wcschr): Define as __wcschr.  Remove
> 	conditionals for weak_alias and libc_hidden_weak.
> 	* sysdeps/i386/i686/multiarch/wcschr-c.c [libc]: Undefine
> 	libc_hidden_weak and weak_alias.
> 	* sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c [libc]:
> 	Undefine libc_hidden_weak. Define libc_hidden_def for SHARED builds
> 	and weak_alias for static one.
>
> ---
>
> diff --git a/sysdeps/i386/i686/multiarch/wcschr-c.c b/sysdeps/i386/i686/multiarch/wcschr-c.c
> index 786c132..38d41d0 100644
> --- a/sysdeps/i386/i686/multiarch/wcschr-c.c
> +++ b/sysdeps/i386/i686/multiarch/wcschr-c.c
> @@ -1,6 +1,12 @@
>  #include <wchar.h>
>
>  #if IS_IN (libc)
> +# undef libc_hidden_weak
> +# define libc_hidden_weak(name)
> +
> +# undef weak_alias
> +# define weak_alias(name,alias)
> +
>  # ifdef SHARED
>  #  undef libc_hidden_def
>  #  define libc_hidden_def(name) \
> @@ -8,9 +14,9 @@
>     strong_alias (__wcschr_ia32, __wcschr_ia32_1); \
>     __hidden_ver1 (__wcschr_ia32_1, __GI___wcschr, __wcschr_ia32_1);
>  # endif
> -# define WCSCHR  __wcschr_ia32
>  #endif
>
>  extern __typeof (wcschr) __wcschr_ia32;
>
> -#include "wcsmbs/wcschr.c"
> +#define WCSCHR  __wcschr_ia32
> +#include <wcsmbs/wcschr.c>
> diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
> index df586a6..3b2ab3a 100644
> --- a/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
> +++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
> @@ -18,16 +18,26 @@
>  #include <wchar.h>
>
>  #if IS_IN (libc)
> +# undef libc_hidden_weak
> +# define libc_hidden_weak(name)
> +
> +# undef weak_alias
> +# undef libc_hidden_def
> +
>  # ifdef SHARED
> -#   undef libc_hidden_def
> -#   define libc_hidden_def(name)  \
> +#  define libc_hidden_def(name)  \
>      __hidden_ver1 (__wcschr_ppc, __GI_wcschr, __wcschr_ppc); \
>      strong_alias (__wcschr_ppc, __wcschr_ppc_1); \
>      __hidden_ver1 (__wcschr_ppc_1, __GI___wcschr, __wcschr_ppc_1);
> -# endif
> -# define WCSCHR  __wcschr_ppc
> +#  define weak_alias(name,alias)
> +# else
> +#  define weak_alias(name, alias) \
> +    _weak_alias(__wcschr_ppc, __wcschr)
> +#  define libc_hidden_def(name)
> +# endif /* SHARED  */
>  #endif
>
>  extern __typeof (wcschr) __wcschr_ppc;
>
> +#define WCSCHR  __wcschr_ppc
>  #include <wcsmbs/wcschr.c>
> diff --git a/wcsmbs/wcschr.c b/wcsmbs/wcschr.c
> index a287283..77624be 100644
> --- a/wcsmbs/wcschr.c
> +++ b/wcsmbs/wcschr.c
> @@ -17,17 +17,13 @@
>
>  #include <wchar.h>
>
> -/* Find the first occurrence of WC in WCS.  */
> -#ifdef WCSCHR
> -# define wcschr WCSCHR
> -#else
> -# define wcschr __wcschr
> +#ifndef WCSCHR
> +# define WCSCHR __wcschr
>  #endif
>
> +/* Find the first occurrence of WC in WCS.  */
>  wchar_t *
> -wcschr (wcs, wc)
> -     const wchar_t *wcs;
> -     const wchar_t wc;
> +WCSCHR (const wchar_t *wcs, const wchar_t wc)
>  {
>    do
>      if (*wcs == wc)
> @@ -36,9 +32,6 @@ wcschr (wcs, wc)
>
>    return NULL;
>  }
> -libc_hidden_def (wcschr)
> -#ifndef WCSCHR
> -# undef wcschr
> +libc_hidden_def (__wcschr)
>  weak_alias (__wcschr, wcschr)
>  libc_hidden_weak (wcschr)
> -#endif
>
diff mbox

Patch

diff --git a/sysdeps/i386/i686/multiarch/wcschr-c.c b/sysdeps/i386/i686/multiarch/wcschr-c.c
index 786c132..38d41d0 100644
--- a/sysdeps/i386/i686/multiarch/wcschr-c.c
+++ b/sysdeps/i386/i686/multiarch/wcschr-c.c
@@ -1,6 +1,12 @@ 
 #include <wchar.h>
 
 #if IS_IN (libc)
+# undef libc_hidden_weak
+# define libc_hidden_weak(name)
+
+# undef weak_alias
+# define weak_alias(name,alias)
+
 # ifdef SHARED
 #  undef libc_hidden_def
 #  define libc_hidden_def(name) \
@@ -8,9 +14,9 @@ 
    strong_alias (__wcschr_ia32, __wcschr_ia32_1); \
    __hidden_ver1 (__wcschr_ia32_1, __GI___wcschr, __wcschr_ia32_1);
 # endif
-# define WCSCHR  __wcschr_ia32
 #endif
 
 extern __typeof (wcschr) __wcschr_ia32;
 
-#include "wcsmbs/wcschr.c"
+#define WCSCHR  __wcschr_ia32
+#include <wcsmbs/wcschr.c>
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c b/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
index df586a6..3b2ab3a 100644
--- a/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
+++ b/sysdeps/powerpc/powerpc32/power4/multiarch/wcschr-ppc32.c
@@ -18,16 +18,26 @@ 
 #include <wchar.h>
 
 #if IS_IN (libc)
+# undef libc_hidden_weak
+# define libc_hidden_weak(name)
+
+# undef weak_alias
+# undef libc_hidden_def
+
 # ifdef SHARED
-#   undef libc_hidden_def
-#   define libc_hidden_def(name)  \
+#  define libc_hidden_def(name)  \
     __hidden_ver1 (__wcschr_ppc, __GI_wcschr, __wcschr_ppc); \
     strong_alias (__wcschr_ppc, __wcschr_ppc_1); \
     __hidden_ver1 (__wcschr_ppc_1, __GI___wcschr, __wcschr_ppc_1);
-# endif
-# define WCSCHR  __wcschr_ppc
+#  define weak_alias(name,alias)
+# else
+#  define weak_alias(name, alias) \
+    _weak_alias(__wcschr_ppc, __wcschr)
+#  define libc_hidden_def(name)
+# endif /* SHARED  */
 #endif
 
 extern __typeof (wcschr) __wcschr_ppc;
 
+#define WCSCHR  __wcschr_ppc
 #include <wcsmbs/wcschr.c>
diff --git a/wcsmbs/wcschr.c b/wcsmbs/wcschr.c
index a287283..77624be 100644
--- a/wcsmbs/wcschr.c
+++ b/wcsmbs/wcschr.c
@@ -17,17 +17,13 @@ 
 
 #include <wchar.h>
 
-/* Find the first occurrence of WC in WCS.  */
-#ifdef WCSCHR
-# define wcschr WCSCHR
-#else
-# define wcschr __wcschr
+#ifndef WCSCHR
+# define WCSCHR __wcschr
 #endif
 
+/* Find the first occurrence of WC in WCS.  */
 wchar_t *
-wcschr (wcs, wc)
-     const wchar_t *wcs;
-     const wchar_t wc;
+WCSCHR (const wchar_t *wcs, const wchar_t wc)
 {
   do
     if (*wcs == wc)
@@ -36,9 +32,6 @@  wcschr (wcs, wc)
 
   return NULL;
 }
-libc_hidden_def (wcschr)
-#ifndef WCSCHR
-# undef wcschr
+libc_hidden_def (__wcschr)
 weak_alias (__wcschr, wcschr)
 libc_hidden_weak (wcschr)
-#endif