This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Use AT_PLATFORM and limit the number of important hwcap bits on PPC


Hi!

For LD_LIBRARY_PATH, ld.so uses AT_PLATFORM whenever it is set by the
kernel, even if it is not listed in dl-procinfo.[ch] (that only matters
for ldconfig).  So, currently e.g. on G5 we look a huge number of dirs:
     14931:       trying file=/lib/tls/ppc970/altivec/power4/libc.so.6
     14931:       trying file=/lib/tls/ppc970/altivec/libc.so.6
     14931:       trying file=/lib/tls/ppc970/power4/libc.so.6
     14931:       trying file=/lib/tls/ppc970/libc.so.6
     14931:       trying file=/lib/tls/altivec/power4/libc.so.6
     14931:       trying file=/lib/tls/altivec/libc.so.6
     14931:       trying file=/lib/tls/power4/libc.so.6
     14931:       trying file=/lib/tls/libc.so.6
     14931:       trying file=/lib/ppc970/altivec/power4/libc.so.6
     14931:       trying file=/lib/ppc970/altivec/libc.so.6
     14931:       trying file=/lib/ppc970/power4/libc.so.6
     14931:       trying file=/lib/ppc970/libc.so.6
     14931:       trying file=/lib/altivec/power4/libc.so.6
     14931:       trying file=/lib/altivec/libc.so.6
     14931:       trying file=/lib/power4/libc.so.6
     14931:       trying file=/lib/libc.so.6
The following patch limits important hwcaps to just altivec (as it is
present on multiple different platforms, ppc970 (aka G5), ppc74{0,5}0,
ppc-cell-be (and arch_2_05?)) and adds booke which is also set on 4
different platforms.  The power4/power5/power5+ bits seem to be completely
redundant with the platform name.
I haven't included all platforms in dl-procinfo*, as I don't think we need
to list there prehistoric CPUs (for which non-optimized libs are good enough
anyway) and embedded stuff (as for embedded use you rarely want to choose
different libcs based on which chip you are on, you pretty much know
which chip it is), listing there all 24 platforms kernel now lists would
be a waste, especially for the scarce bit space in ldconfig's mask (we have
at most 31 bits there for platform and any other future uses, so if we now
take 6 bits out of this for the common contemporary CPUs, we still have
a big reserve for the future).

2006-09-14  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_cap_flags): Add "booke"
	to the beginning.
	(_dl_powerpc_platforms): New.
	* sysdeps/powerpc/dl-procinfo.h (_DL_HWCAP_FIRST): Decrease.
	(HWCAP_IMPORTANT): Remove power{4,5,5+} and cell, add booke.
	(_DL_PLATFORMS_COUNT, _DL_FIRST_PLATFORM): Define.
	(_DL_HWCAP_PLATFORM): Define to new mask.
	(_dl_platform_string, _dl_string_platform): New functions.
	* sysdeps/powerpc/sysdep.h (PPC_FEATURE_BOOKE): Define.

--- libc/sysdeps/powerpc/dl-procinfo.c.jj	2006-09-14 13:55:06.000000000 +0200
+++ libc/sysdeps/powerpc/dl-procinfo.c	2006-09-14 16:41:23.000000000 +0200
@@ -1,5 +1,5 @@
 /* Data for processor capability information.  PowerPC version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006 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
@@ -46,10 +46,11 @@
 #if !defined PROCINFO_DECL && defined SHARED
   ._dl_powerpc_cap_flags
 #else
-PROCINFO_CLASS const char _dl_powerpc_cap_flags[16][10]
+PROCINFO_CLASS const char _dl_powerpc_cap_flags[17][10]
 #endif
 #ifndef PROCINFO_DECL
 = {
+    "booke",
     "cell", "power5+", "power5", "power4",
     "notb", "efpdouble", "efpsingle", "spe",
     "ucache", "4xxmac", "mmu", "fpu",
@@ -62,5 +63,21 @@ PROCINFO_CLASS const char _dl_powerpc_ca
 ,
 #endif
 
+#if !defined PROCINFO_DECL && defined SHARED
+  ._dl_powerpc_platforms
+#else
+PROCINFO_CLASS const char _dl_powerpc_platforms[6][12]
+#endif
+#ifndef PROCINFO_DECL
+= {
+    "power4", "ppc970", "power5", "power5+", "power6", "ppc-cell-be"
+  }
+#endif
+#if !defined SHARED || defined PROCINFO_DECL
+;
+#else
+,
+#endif
+
 #undef PROCINFO_DECL
 #undef PROCINFO_CLASS
--- libc/sysdeps/powerpc/dl-procinfo.h.jj	2006-09-14 13:55:06.000000000 +0200
+++ libc/sysdeps/powerpc/dl-procinfo.h	2006-09-14 16:12:47.000000000 +0200
@@ -1,5 +1,5 @@
 /* Processor capability information handling macros.  PowerPC version.
-   Copyright (C) 2005 Free Software Foundation, Inc.
+   Copyright (C) 2005, 2006 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
@@ -23,27 +23,34 @@
 #include <ldsodefs.h>
 #include <sysdep.h>		/* This defines the PPC_FEATURE_* macros.  */
 
-/* There are 16 bits used, but they are bits 16..31.  */
-#define _DL_HWCAP_FIRST		16
+/* There are 17 bits used, but they are bits 15..31.  */
+#define _DL_HWCAP_FIRST		15
 #define _DL_HWCAP_COUNT		32
 
 /* These bits influence library search.  */
-#define HWCAP_IMPORTANT		(PPC_FEATURE_HAS_ALTIVEC		      \
-				 | PPC_FEATURE_POWER4			      \
-				 | PPC_FEATURE_POWER5			      \
-				 | PPC_FEATURE_POWER5_PLUS		      \
-				 | PPC_FEATURE_CELL)
-
-/* We don't use AT_PLATFORM.  */
-#define _DL_HWCAP_PLATFORM 	0
-#define _dl_string_platform(str) (-1)
+#define HWCAP_IMPORTANT		(PPC_FEATURE_HAS_ALTIVEC	\
+				 | PPC_FEATURE_BOOKE)
+
+#define _DL_PLATFORMS_COUNT	6
+
+#define _DL_FIRST_PLATFORM      32
+/* Mask to filter out platforms.  */
+#define _DL_HWCAP_PLATFORM      (((1ULL << _DL_PLATFORMS_COUNT) - 1) \
+                                 << _DL_FIRST_PLATFORM)
 
 static inline const char *
 __attribute__ ((unused))
 _dl_hwcap_string (int idx)
 {
   return GLRO(dl_powerpc_cap_flags)[idx - _DL_HWCAP_FIRST];
-};
+}
+
+static inline const char *
+__attribute__ ((unused))
+_dl_platform_string (int idx)
+{
+  return GLRO(dl_powerpc_platforms)[idx - _DL_FIRST_PLATFORM];
+}
 
 static inline int
 __attribute__ ((unused))
@@ -53,7 +60,48 @@ _dl_string_hwcap (const char *str)
     if (strcmp (str, _dl_hwcap_string (i)) == 0)
       return i;
   return -1;
-};
+}
+
+static inline int
+__attribute__ ((unused, always_inline))
+_dl_string_platform (const char *str)
+{
+  if (str == NULL)
+    return -1;
+
+  if (strncmp (str, GLRO(dl_powerpc_platforms)[0], 5) == 0)
+    {
+      int ret;
+      str += 5;
+      switch (*str)
+	{
+	case '4':
+	  ret = _DL_FIRST_PLATFORM + 0;
+	  break;
+	case '5':
+	  ret = _DL_FIRST_PLATFORM + 2;
+	  if (str[1] == '+')
+	    ++ret, ++str;
+	  break;
+	case '6':
+	  ret = _DL_FIRST_PLATFORM + 4;
+	  break;
+	default:
+	  return -1;
+	}
+      if (str[1] == '\0')
+	return ret;
+    }
+  else if (strncmp (str, GLRO(dl_powerpc_platforms)[1], 3) == 0)
+    {
+      if (strcmp (str + 3, GLRO(dl_powerpc_platforms)[1] + 3) == 0)
+	return _DL_FIRST_PLATFORM + 1;
+      else if (strcmp (str + 3, GLRO(dl_powerpc_platforms)[5] + 3) == 0)
+	return _DL_FIRST_PLATFORM + 5;
+    }
+
+  return -1;
+}
 
 #ifdef IS_IN_rtld
 static inline int
--- libc/sysdeps/powerpc/sysdep.h.jj	2005-11-21 12:07:50.000000000 +0100
+++ libc/sysdeps/powerpc/sysdep.h	2006-09-14 16:11:34.000000000 +0200
@@ -37,6 +37,7 @@
 #define PPC_FEATURE_POWER5		0x00040000 /* POWER5 microarch level */
 #define PPC_FEATURE_POWER5_PLUS		0x00020000 /* POWER5+ microarch level */
 #define PPC_FEATURE_CELL		0x00010000 /* CELL PU microarch level */
+#define PPC_FEATURE_BOOKE		0x00008000
 #define PPC_FEATURE_970 (PPC_FEATURE_POWER4 + PPC_FEATURE_HAS_ALTIVEC)
 
 #ifdef __ASSEMBLER__

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]