]> sourceware.org Git - glibc.git/commitdiff
PowerPC: initial support for multilib for PowerPC32
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Mon, 14 Oct 2013 11:55:28 +0000 (06:55 -0500)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Fri, 6 Dec 2013 11:46:59 +0000 (05:46 -0600)
This patch add a empty Makefile, the C IFUNC helper macros, and a empty
available IFUNC implementation enumeration.

ChangeLog
sysdeps/powerpc/powerpc32/power4/multiarch/Makefile [new file with mode: 0644]
sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c [new file with mode: 0644]
sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/powerpc/powerpc32/power4/Implies [deleted file]

index cc1478c529c34c9f660493ffa3429b6137fc6a88..1eb914b743cebbaee4626d796daa6e4ee259cc7a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2013-12-06  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+       * sysdeps/powerpc/powerpc32/power4/multiarch/Makefile: New file to
+       support multiarch for POWER/PPC32.
+       * sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c:
+       Likewise.
+       * sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h: Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/power4/Implies: Remove
+       Implies file to make multiarch folder appers before the fpu and
+       default folder for power4 configuration.
+
 2013-12-06  Siddhesh Poyarekar  <siddhesh@redhat.com>
 
        * scripts/bench.pl: Append volatile keyword to type.
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile b/sysdeps/powerpc/powerpc32/power4/multiarch/Makefile
new file mode 100644 (file)
index 0000000..af8d496
--- /dev/null
@@ -0,0 +1,3 @@
+ifeq ($(subdir),string)
+sysdep_routines +=
+endif
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc32/power4/multiarch/ifunc-impl-list.c
new file mode 100644 (file)
index 0000000..f4e55ae
--- /dev/null
@@ -0,0 +1,50 @@
+/* Enumerate available IFUNC implementations of a function.  PowerPC32 version.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <assert.h>
+#include <string.h>
+#include <wchar.h>
+#include <ldsodefs.h>
+#include <ifunc-impl-list.h>
+
+/* Maximum number of IFUNC implementations.  */
+#define MAX_IFUNC      6
+
+size_t
+__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
+                       size_t max)
+{
+  assert (max >= MAX_IFUNC);
+
+  size_t i = 0;
+
+  unsigned long int hwcap = GLRO(dl_hwcap);
+  /* hwcap contains only the latest supported ISA, the code checks which is
+     and fills the previous supported ones.  */
+  if (hwcap & PPC_FEATURE_ARCH_2_06)
+    hwcap |= PPC_FEATURE_ARCH_2_05 | PPC_FEATURE_POWER5_PLUS |
+             PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
+  else if (hwcap & PPC_FEATURE_ARCH_2_05)
+    hwcap |= PPC_FEATURE_POWER5_PLUS | PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
+  else if (hwcap & PPC_FEATURE_POWER5_PLUS)
+    hwcap |= PPC_FEATURE_POWER5 | PPC_FEATURE_POWER4;
+  else if (hwcap & PPC_FEATURE_POWER5)
+    hwcap |= PPC_FEATURE_POWER4;
+
+  return i;
+}
diff --git a/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h b/sysdeps/powerpc/powerpc32/power4/multiarch/init-arch.h
new file mode 100644 (file)
index 0000000..490c0b4
--- /dev/null
@@ -0,0 +1,52 @@
+/* This file is part of the GNU C Library.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <ldsodefs.h>
+
+/* The code checks if _rtld_global_ro was realocated before trying to access
+   the dl_hwcap field. The assembly is to make the compiler not optimize the
+   test (&_rtld_global_ro != NULL), which is always true in ISO C (but not
+   in that case since _rtld_global_ro might not been realocated yet).  */
+#if defined(SHARED) && !defined(IS_IN_rtld)
+# define __GLRO(value) \
+  ({ volatile void **__p = (volatile void**)(&_rtld_global_ro);        \
+    unsigned long int __ret;                                   \
+     asm ("# x in %0" : "+r" (__p));                           \
+     __ret = (__p) ? GLRO(value) : 0;                          \
+     __ret; })
+#else
+# define __GLRO(value)  GLRO(value)
+#endif
+
+/* dl_hwcap contains only the latest supported ISA, the macro checks which is
+   and fills the previous ones.  */
+#define INIT_ARCH() \
+  unsigned long int hwcap = __GLRO(dl_hwcap);                  \
+  if (hwcap & PPC_FEATURE_ARCH_2_06)                           \
+    hwcap |= PPC_FEATURE_ARCH_2_05 |                           \
+            PPC_FEATURE_POWER5_PLUS |                          \
+            PPC_FEATURE_POWER5 |                               \
+            PPC_FEATURE_POWER4;                                \
+  else if (hwcap & PPC_FEATURE_ARCH_2_05)                      \
+    hwcap |= PPC_FEATURE_POWER5_PLUS |                         \
+            PPC_FEATURE_POWER5 |                               \
+            PPC_FEATURE_POWER4;                                \
+  else if (hwcap & PPC_FEATURE_POWER5_PLUS)                    \
+    hwcap |= PPC_FEATURE_POWER5 |                              \
+            PPC_FEATURE_POWER4;                                \
+  else if (hwcap & PPC_FEATURE_POWER5)                         \
+    hwcap |= PPC_FEATURE_POWER4;
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/power4/Implies b/sysdeps/unix/sysv/linux/powerpc/powerpc32/power4/Implies
deleted file mode 100644 (file)
index 17139bf..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-powerpc/powerpc32/power4/fpu
-powerpc/powerpc32/power4
This page took 0.119571 seconds and 5 git commands to generate.