diff mbox series

[v5,06/17] RISC-V: Add path of library directories for the 32-bit

Message ID dec2fcfb6117ce13e59092dd2acf6d6f9e0fff0b.1597851293.git.alistair.francis@wdc.com
State New
Headers show
Series glibc port for 32-bit RISC-V (RV32) | expand

Commit Message

Alistair Francis Aug. 19, 2020, 3:38 p.m. UTC
With RV32 support the list of possible RISC-V system directories
increases to:
     - /lib64/lp64d
     - /lib64/lp64
     - /lib32/ilp32d
     - /lib32/ilp32
     - /lib (only ld.so)

This patch changes the add_system_dir () macro to support the new ilp32d
and ilp32 directories for RV32.  While refactoring this code let's split
out the confusing if statements into a loop to make it easier to
understand and extend.
---
 sysdeps/unix/sysv/linux/riscv/dl-cache.h | 54 +++++++++++++++++-------
 1 file changed, 38 insertions(+), 16 deletions(-)

Comments

Maciej W. Rozycki Aug. 21, 2020, 11:16 a.m. UTC | #1
On Wed, 19 Aug 2020, Alistair Francis via Libc-alpha wrote:

> With RV32 support the list of possible RISC-V system directories
> increases to:
>      - /lib64/lp64d
>      - /lib64/lp64
>      - /lib32/ilp32d
>      - /lib32/ilp32
>      - /lib (only ld.so)
> 
> This patch changes the add_system_dir () macro to support the new ilp32d
> and ilp32 directories for RV32.  While refactoring this code let's split
> out the confusing if statements into a loop to make it easier to
> understand and extend.

 LGTM.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>

  Maciej
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/riscv/dl-cache.h b/sysdeps/unix/sysv/linux/riscv/dl-cache.h
index c297dfe84f..331e6015f4 100644
--- a/sysdeps/unix/sysv/linux/riscv/dl-cache.h
+++ b/sysdeps/unix/sysv/linux/riscv/dl-cache.h
@@ -17,6 +17,7 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #include <ldconfig.h>
+#include <assert.h>
 
 /* For now we only support the natural XLEN ABI length on all targets, so the
    only bits that need to go into ld.so.cache are the FLEG ABI length.  */
@@ -34,6 +35,8 @@ 
    RISC-V, libraries can be found in paths ending in:
      - /lib64/lp64d
      - /lib64/lp64
+     - /lib32/ilp32d
+     - /lib32/ilp32
      - /lib (only ld.so)
    so this will add all of those paths.
 
@@ -48,27 +51,46 @@ 
 #define add_system_dir(dir) 						\
   do							    		\
     {									\
+      static const char* lib_dirs[] = {					\
+	"/lib64/lp64d",							\
+	"/lib64/lp64",							\
+	"/lib32/ilp32d",						\
+	"/lib32/ilp32",							\
+	NULL,								\
+      };								\
+      const size_t lib_len = sizeof ("/lib") - 1;			\
       size_t len = strlen (dir);					\
-      char path[len + 9];						\
+      char path[len + 10];						\
+      const char **ptr;							\
+									\
       memcpy (path, dir, len + 1);					\
-      if (len >= 12 && ! memcmp(path + len - 12, "/lib64/lp64d", 12))	\
+									\
+      for (ptr = lib_dirs; *ptr != NULL; ptr++)				\
 	{								\
-	  len -= 8;							\
-	  path[len] = '\0';						\
-	}								\
-      if (len >= 11 && ! memcmp(path + len - 11, "/lib64/lp64", 11))	\
-	{								\
-	  len -= 7;							\
-	  path[len] = '\0';						\
+	  const char *lib_dir = *ptr;					\
+	  size_t dir_len = strlen (lib_dir);				\
+									\
+	  if (len >= dir_len						\
+	      && !memcmp (path + len - dir_len, lib_dir, dir_len))	\
+	    {								\
+	      len -= dir_len - lib_len;					\
+	      path[len] = '\0';						\
+	      break;							\
+	    }								\
 	}								\
       add_dir (path);							\
-      if (len >= 4 && ! memcmp(path + len - 4, "/lib", 4))		\
-	{								\
-	  memcpy (path + len, "64/lp64d", 9);				\
-	  add_dir (path);						\
-	  memcpy (path + len, "64/lp64", 8);				\
-	  add_dir (path);						\
-	}								\
+      if (len >= lib_len						\
+	  && !memcmp (path + len - lib_len, "/lib", lib_len))		\
+	for (ptr = lib_dirs; *ptr != NULL; ptr++)			\
+	  {								\
+	    const char *lib_dir = *ptr;					\
+	    size_t dir_len = strlen (lib_dir);				\
+									\
+	    assert (dir_len >= lib_len);				\
+	    memcpy (path + len, lib_dir + lib_len,			\
+		    dir_len - lib_len + 1);				\
+	    add_dir (path);						\
+	  }								\
     } while (0)