powerpc: Fix __wcschr static build

Message ID 54EE3430.30608@linux.vnet.ibm.com
State Superseded
Delegated to: Adhemerval Zanella Netto
Headers

Commit Message

Adhemerval Zanella Netto Feb. 25, 2015, 8:44 p.m. UTC
  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.

--

	* 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.

---
  

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..ed0cecd 100644
--- a/wcsmbs/wcschr.c
+++ b/wcsmbs/wcschr.c
@@ -18,16 +18,12 @@ 
 #include <wchar.h>
 
 /* Find the first occurrence of WC in WCS.  */
-#ifdef WCSCHR
-# define wcschr WCSCHR
-#else
+#ifndef WCSCHR
 # define wcschr __wcschr
 #endif
 
 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)
@@ -37,8 +33,5 @@  wcschr (wcs, wc)
   return NULL;
 }
 libc_hidden_def (wcschr)
-#ifndef WCSCHR
-# undef wcschr
 weak_alias (__wcschr, wcschr)
 libc_hidden_weak (wcschr)
-#endif