This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] powerpc: Fix __wcschr static build
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: "GNU C. Library" <libc-alpha at sourceware dot org>
- Date: Wed, 25 Feb 2015 17:44:32 -0300
- Subject: [PATCH] powerpc: Fix __wcschr static build
- Authentication-results: sourceware.org; auth=none
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.
---
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