public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [committed v2] RISC-V: Handle multi-lib path correclty for linux [DRAFT]
@ 2023-04-21  6:47 Kito Cheng
  2023-04-21  6:48 ` Kito Cheng
  0 siblings, 1 reply; 2+ messages in thread
From: Kito Cheng @ 2023-04-21  6:47 UTC (permalink / raw)
  To: gcc-patches; +Cc: Kito Cheng

---
 gcc/common/config/riscv/riscv-common.cc | 118 ++++++++++++++++--------
 gcc/config/riscv/linux.h                |  13 ++-
 2 files changed, 90 insertions(+), 41 deletions(-)

diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
index 309a52def75f..75bfe198d4c6 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -1597,6 +1597,73 @@ riscv_check_conds (
   return match_score + ok_count * 100;
 }
 
+static const char *
+riscv_select_multilib_by_abi (
+  const std::string &riscv_current_arch_str,
+  const std::string &riscv_current_abi_str,
+  const riscv_subset_list *subset_list,
+  const struct switchstr *switches,
+  int n_switches,
+  const std::vector<riscv_multi_lib_info_t> &multilib_infos
+	)
+{
+  for (size_t i = 0; i < multilib_infos.size (); ++i)
+    if (riscv_current_abi_str == multilib_infos[i].abi_str)
+      return xstrdup (multilib_infos[i].path.c_str ());
+
+  return NULL;
+}
+
+
+static const char *
+riscv_select_multilib (
+  const std::string &riscv_current_arch_str,
+  const std::string &riscv_current_abi_str,
+  const riscv_subset_list *subset_list,
+  const struct switchstr *switches,
+  int n_switches,
+  const std::vector<riscv_multi_lib_info_t> &multilib_infos
+	)
+{
+  int match_score = 0;
+  int max_match_score = 0;
+  int best_match_multi_lib = -1;
+  /* Try to decision which set we should used.  */
+  /* We have 3 level decision tree here, ABI, check input arch/ABI must
+     be superset of multi-lib arch, and other rest option checking.  */
+  for (size_t i = 0; i < multilib_infos.size (); ++i)
+    {
+      /* Check ABI is same first.  */
+      if (riscv_current_abi_str != multilib_infos[i].abi_str)
+	continue;
+
+      /* Found a potential compatible multi-lib setting!
+	 Calculate the match score.  */
+      match_score = subset_list->match_score (multilib_infos[i].subset_list);
+
+      /* Checking other cond in the multi-lib setting.  */
+      match_score = riscv_check_conds (switches,
+				       n_switches,
+				       match_score,
+				       multilib_infos[i].conds);
+
+      /* Record highest match score multi-lib setting.  */
+      if (match_score > max_match_score)
+	{
+	  best_match_multi_lib = i;
+	  max_match_score = match_score;
+	}
+    }
+
+  if (best_match_multi_lib == -1)
+    {
+      riscv_no_matched_multi_lib = true;
+      return NULL;
+    }
+  else
+    return xstrdup (multilib_infos[best_match_multi_lib].path.c_str ());
+}
+
 /* Implement TARGET_COMPUTE_MULTILIB.  */
 static const char *
 riscv_compute_multilib (
@@ -1621,6 +1688,12 @@ riscv_compute_multilib (
   std::string option_cond;
   riscv_multi_lib_info_t multilib_info;
 
+  bool check_abi_only = false;
+
+#if TARGET_LINUX == 1
+  check_abi_only = true;
+#endif
+
   /* Already found suitable, multi-lib, just use that.  */
   if (multilib_dir != NULL)
     return multilib_dir;
@@ -1672,7 +1745,11 @@ riscv_compute_multilib (
 	}
 
       this_path_len = p - this_path;
-      multilib_info.path = std::string (this_path, this_path_len);
+      const char *multi_os_dir_pos = (const char*)memchr (this_path, ':', this_path_len);
+      if (multi_os_dir_pos)
+	multilib_info.path = std::string (this_path, multi_os_dir_pos - this_path);
+      else
+	multilib_info.path = std::string (this_path, this_path_len);
 
       option_conds.clear ();
       /* Pasrse option check list into vector<string>.
@@ -1707,43 +1784,10 @@ riscv_compute_multilib (
       p++;
     }
 
-  int match_score = 0;
-  int max_match_score = 0;
-  int best_match_multi_lib = -1;
-  /* Try to decision which set we should used.  */
-  /* We have 3 level decision tree here, ABI, check input arch/ABI must
-     be superset of multi-lib arch, and other rest option checking.  */
-  for (size_t i = 0; i < multilib_infos.size (); ++i)
-    {
-      /* Check ABI is same first.  */
-      if (riscv_current_abi_str != multilib_infos[i].abi_str)
-	continue;
-
-      /* Found a potential compatible multi-lib setting!
-	 Calculate the match score.  */
-      match_score = subset_list->match_score (multilib_infos[i].subset_list);
-
-      /* Checking other cond in the multi-lib setting.  */
-      match_score = riscv_check_conds (switches,
-				       n_switches,
-				       match_score,
-				       multilib_infos[i].conds);
-
-      /* Record highest match score multi-lib setting.  */
-      if (match_score > max_match_score)
-	{
-	  best_match_multi_lib = i;
-	  max_match_score = match_score;
-	}
-    }
-
-  if (best_match_multi_lib == -1)
-    {
-      riscv_no_matched_multi_lib = true;
-      return multilib_dir;
-    }
+  if (check_abi_only)
+    return riscv_select_multilib_by_abi (riscv_current_arch_str, riscv_current_abi_str, subset_list, switches, n_switches, multilib_infos);
   else
-    return xstrdup (multilib_infos[best_match_multi_lib].path.c_str ());
+    return riscv_select_multilib (riscv_current_arch_str, riscv_current_abi_str, subset_list, switches, n_switches, multilib_infos);
 }
 
 #undef TARGET_COMPUTE_MULTILIB
diff --git a/gcc/config/riscv/linux.h b/gcc/config/riscv/linux.h
index b9557a75dc72..46256f78e5df 100644
--- a/gcc/config/riscv/linux.h
+++ b/gcc/config/riscv/linux.h
@@ -72,7 +72,12 @@ along with GCC; see the file COPYING3.  If not see
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
 #define STARTFILE_PREFIX_SPEC 			\
-   "/lib" XLEN_SPEC "/" ABI_SPEC "/ "		\
-   "/usr/lib" XLEN_SPEC "/" ABI_SPEC "/ "	\
-   "/lib/ "					\
-   "/usr/lib/ "
+  "%{mabi=lp64d: /lib64/lp64d/ /usr/lib64/lp64d/ /lib/ /usr/lib/}" \
+  "%{mabi=lp64f: /lib64/lp64f/ /usr/lib64/lp64f/ /lib/ /usr/lib/}" \
+  "%{mabi=lp64: /lib64/lp64/ /usr/lib64/lp64/ /lib/ /usr/lib/}" \
+  "%{mabi=ilp32d: /lib32/ilp32d /usr/lib32/ilp32d/ /lib/ /usr/lib/}" \
+  "%{mabi=ilp32f: /lib32/ilp32f/ /usr/lib32/ilp32f/ /lib/ /usr/lib/}" \
+  "%{mabi=ilp32: /lib32/ilp32/ /usr/lib32/ilp32/ /lib/ /usr/lib/}"
+
+#define RISCV_USE_CUSTOMISED_MULTI_LIB 1
+#define TARGET_LINUX 1
-- 
2.39.2


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [committed v2] RISC-V: Handle multi-lib path correclty for linux [DRAFT]
  2023-04-21  6:47 [committed v2] RISC-V: Handle multi-lib path correclty for linux [DRAFT] Kito Cheng
@ 2023-04-21  6:48 ` Kito Cheng
  0 siblings, 0 replies; 2+ messages in thread
From: Kito Cheng @ 2023-04-21  6:48 UTC (permalink / raw)
  To: Kito Cheng; +Cc: gcc-patches

Sorry, I didn't really commit this, it's send by accident since I give
wrong sha1

On Fri, Apr 21, 2023 at 2:47 PM Kito Cheng via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> ---
>  gcc/common/config/riscv/riscv-common.cc | 118 ++++++++++++++++--------
>  gcc/config/riscv/linux.h                |  13 ++-
>  2 files changed, 90 insertions(+), 41 deletions(-)
>
> diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc
> index 309a52def75f..75bfe198d4c6 100644
> --- a/gcc/common/config/riscv/riscv-common.cc
> +++ b/gcc/common/config/riscv/riscv-common.cc
> @@ -1597,6 +1597,73 @@ riscv_check_conds (
>    return match_score + ok_count * 100;
>  }
>
> +static const char *
> +riscv_select_multilib_by_abi (
> +  const std::string &riscv_current_arch_str,
> +  const std::string &riscv_current_abi_str,
> +  const riscv_subset_list *subset_list,
> +  const struct switchstr *switches,
> +  int n_switches,
> +  const std::vector<riscv_multi_lib_info_t> &multilib_infos
> +       )
> +{
> +  for (size_t i = 0; i < multilib_infos.size (); ++i)
> +    if (riscv_current_abi_str == multilib_infos[i].abi_str)
> +      return xstrdup (multilib_infos[i].path.c_str ());
> +
> +  return NULL;
> +}
> +
> +
> +static const char *
> +riscv_select_multilib (
> +  const std::string &riscv_current_arch_str,
> +  const std::string &riscv_current_abi_str,
> +  const riscv_subset_list *subset_list,
> +  const struct switchstr *switches,
> +  int n_switches,
> +  const std::vector<riscv_multi_lib_info_t> &multilib_infos
> +       )
> +{
> +  int match_score = 0;
> +  int max_match_score = 0;
> +  int best_match_multi_lib = -1;
> +  /* Try to decision which set we should used.  */
> +  /* We have 3 level decision tree here, ABI, check input arch/ABI must
> +     be superset of multi-lib arch, and other rest option checking.  */
> +  for (size_t i = 0; i < multilib_infos.size (); ++i)
> +    {
> +      /* Check ABI is same first.  */
> +      if (riscv_current_abi_str != multilib_infos[i].abi_str)
> +       continue;
> +
> +      /* Found a potential compatible multi-lib setting!
> +        Calculate the match score.  */
> +      match_score = subset_list->match_score (multilib_infos[i].subset_list);
> +
> +      /* Checking other cond in the multi-lib setting.  */
> +      match_score = riscv_check_conds (switches,
> +                                      n_switches,
> +                                      match_score,
> +                                      multilib_infos[i].conds);
> +
> +      /* Record highest match score multi-lib setting.  */
> +      if (match_score > max_match_score)
> +       {
> +         best_match_multi_lib = i;
> +         max_match_score = match_score;
> +       }
> +    }
> +
> +  if (best_match_multi_lib == -1)
> +    {
> +      riscv_no_matched_multi_lib = true;
> +      return NULL;
> +    }
> +  else
> +    return xstrdup (multilib_infos[best_match_multi_lib].path.c_str ());
> +}
> +
>  /* Implement TARGET_COMPUTE_MULTILIB.  */
>  static const char *
>  riscv_compute_multilib (
> @@ -1621,6 +1688,12 @@ riscv_compute_multilib (
>    std::string option_cond;
>    riscv_multi_lib_info_t multilib_info;
>
> +  bool check_abi_only = false;
> +
> +#if TARGET_LINUX == 1
> +  check_abi_only = true;
> +#endif
> +
>    /* Already found suitable, multi-lib, just use that.  */
>    if (multilib_dir != NULL)
>      return multilib_dir;
> @@ -1672,7 +1745,11 @@ riscv_compute_multilib (
>         }
>
>        this_path_len = p - this_path;
> -      multilib_info.path = std::string (this_path, this_path_len);
> +      const char *multi_os_dir_pos = (const char*)memchr (this_path, ':', this_path_len);
> +      if (multi_os_dir_pos)
> +       multilib_info.path = std::string (this_path, multi_os_dir_pos - this_path);
> +      else
> +       multilib_info.path = std::string (this_path, this_path_len);
>
>        option_conds.clear ();
>        /* Pasrse option check list into vector<string>.
> @@ -1707,43 +1784,10 @@ riscv_compute_multilib (
>        p++;
>      }
>
> -  int match_score = 0;
> -  int max_match_score = 0;
> -  int best_match_multi_lib = -1;
> -  /* Try to decision which set we should used.  */
> -  /* We have 3 level decision tree here, ABI, check input arch/ABI must
> -     be superset of multi-lib arch, and other rest option checking.  */
> -  for (size_t i = 0; i < multilib_infos.size (); ++i)
> -    {
> -      /* Check ABI is same first.  */
> -      if (riscv_current_abi_str != multilib_infos[i].abi_str)
> -       continue;
> -
> -      /* Found a potential compatible multi-lib setting!
> -        Calculate the match score.  */
> -      match_score = subset_list->match_score (multilib_infos[i].subset_list);
> -
> -      /* Checking other cond in the multi-lib setting.  */
> -      match_score = riscv_check_conds (switches,
> -                                      n_switches,
> -                                      match_score,
> -                                      multilib_infos[i].conds);
> -
> -      /* Record highest match score multi-lib setting.  */
> -      if (match_score > max_match_score)
> -       {
> -         best_match_multi_lib = i;
> -         max_match_score = match_score;
> -       }
> -    }
> -
> -  if (best_match_multi_lib == -1)
> -    {
> -      riscv_no_matched_multi_lib = true;
> -      return multilib_dir;
> -    }
> +  if (check_abi_only)
> +    return riscv_select_multilib_by_abi (riscv_current_arch_str, riscv_current_abi_str, subset_list, switches, n_switches, multilib_infos);
>    else
> -    return xstrdup (multilib_infos[best_match_multi_lib].path.c_str ());
> +    return riscv_select_multilib (riscv_current_arch_str, riscv_current_abi_str, subset_list, switches, n_switches, multilib_infos);
>  }
>
>  #undef TARGET_COMPUTE_MULTILIB
> diff --git a/gcc/config/riscv/linux.h b/gcc/config/riscv/linux.h
> index b9557a75dc72..46256f78e5df 100644
> --- a/gcc/config/riscv/linux.h
> +++ b/gcc/config/riscv/linux.h
> @@ -72,7 +72,12 @@ along with GCC; see the file COPYING3.  If not see
>  #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
>
>  #define STARTFILE_PREFIX_SPEC                  \
> -   "/lib" XLEN_SPEC "/" ABI_SPEC "/ "          \
> -   "/usr/lib" XLEN_SPEC "/" ABI_SPEC "/ "      \
> -   "/lib/ "                                    \
> -   "/usr/lib/ "
> +  "%{mabi=lp64d: /lib64/lp64d/ /usr/lib64/lp64d/ /lib/ /usr/lib/}" \
> +  "%{mabi=lp64f: /lib64/lp64f/ /usr/lib64/lp64f/ /lib/ /usr/lib/}" \
> +  "%{mabi=lp64: /lib64/lp64/ /usr/lib64/lp64/ /lib/ /usr/lib/}" \
> +  "%{mabi=ilp32d: /lib32/ilp32d /usr/lib32/ilp32d/ /lib/ /usr/lib/}" \
> +  "%{mabi=ilp32f: /lib32/ilp32f/ /usr/lib32/ilp32f/ /lib/ /usr/lib/}" \
> +  "%{mabi=ilp32: /lib32/ilp32/ /usr/lib32/ilp32/ /lib/ /usr/lib/}"
> +
> +#define RISCV_USE_CUSTOMISED_MULTI_LIB 1
> +#define TARGET_LINUX 1
> --
> 2.39.2
>

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-04-21  6:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-04-21  6:47 [committed v2] RISC-V: Handle multi-lib path correclty for linux [DRAFT] Kito Cheng
2023-04-21  6:48 ` Kito Cheng

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).