]> sourceware.org Git - glibc.git/commitdiff
RISC-V: Add path of library directories for the 32-bit
authorAlistair Francis <alistair.francis@wdc.com>
Thu, 9 Jul 2020 17:02:06 +0000 (10:02 -0700)
committerAlistair Francis <alistair.francis@wdc.com>
Thu, 27 Aug 2020 15:17:42 +0000 (08:17 -0700)
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.

Reviewed-by: Maciej W. Rozycki <macro@wdc.com>
sysdeps/unix/sysv/linux/riscv/dl-cache.h

index c297dfe84fcf35a18a67a4481b8796e53848f66c..331e6015f42baab11da2d94008275fb250f1621e 100644 (file)
@@ -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.
 
 #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)
 
 
This page took 0.04833 seconds and 5 git commands to generate.