From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by sourceware.org (Postfix) with ESMTPS id DDCD83858C31 for ; Thu, 4 May 2023 08:02:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DDCD83858C31 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=sifive.com Received: by mail-pf1-x429.google.com with SMTP id d2e1a72fcca58-6436e004954so284256b3a.0 for ; Thu, 04 May 2023 01:02:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1683187359; x=1685779359; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Qtg1+vgMzzhaYl0JUBcnKplhbxEyK344VNrxaasdN8E=; b=Pk5sZIMxy7K7FUNeG/n3pzKRhqXrUsQEouzkp1fMdDtGLuuqm3y+hoM920GM4YCEN7 u9yJDvzZFUbVrexQ0mBmdIMrvFLKrG8ezLOcZ2AVLINRPXC4UEbSYy851itoT/zS1vxY i+2hdDVSY7A9yDNh1InroVMb1pGIPo50Xk7nrjJodH3J+HVFvc9hR2iGhkUW3fHqRWUk OUQ0CzjQoh4AJlwkBJoohvMtxy7AqKeGz9V/nvzNNQJPGnalw3c68Ds/l7msPGadkiH7 +P7loSiwUWxHBkO5bWajT4q6tjVBmI8CxVLG8CuwUIjUgs9YmVWPqVQcYSzxQ6rvFRpC VTUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1683187359; x=1685779359; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Qtg1+vgMzzhaYl0JUBcnKplhbxEyK344VNrxaasdN8E=; b=OrCO7b8NWiGdZjLLkYRi/gkkXulecHU3Yf7RXPbfrMv5VTWh04OG6bAbCTL4qCyyIi 28sBNBuhDo6a+SsFh2U3YL8dsYU/BhmaXOUkJxU0NcXWLq4AQM6i0IUnCMceRWcb7ex9 Mpv07PrqxQt8hcDPm8dxxz6pggW4kzs4czvLLROEF75cPbDHs7hYZaN43XoGtkTzhND4 j7u8kTKQeDfWNwlpStJHUfoHdMIpbvDw4eowgubggzH0bOudPcDd518TZQgkI8yoQGNG nJaOBhiPeZKPe+qOYiKm1j+UGW4zLmZGS4dRmoaDOAuFQHsgFUtod+NGrnYER1THR+I8 0nHw== X-Gm-Message-State: AC+VfDwBGWcQ/mM+baevoxnjDVW17jTom/OT1iD7EWweqQuC/vzZl+oO yOVARv/RI/nMWea8siQRWHzrQEt4UDgbv9/35TQ9GzZbkjCp+olWKzOaPD/RSK4WJFGFqCbgBd0 ZCbupIZ53LT7mten4p1W4JBdYZ+l+7QErBr9O8NP5crstkWcnv7bKIaurWVn/pAyrOlRFFjJ6R6 SmVWg= X-Google-Smtp-Source: ACHHUZ5gG7INg1EfaPPhZXDA60OzKY1LrGenJ9Y9DtpoEG+5ilpUNK8jpgRhgjZi6FZEkiXTcnni2A== X-Received: by 2002:a05:6a20:918a:b0:f5:35f2:3ff7 with SMTP id v10-20020a056a20918a00b000f535f23ff7mr1709836pzd.52.1683187359342; Thu, 04 May 2023 01:02:39 -0700 (PDT) Received: from hsinchu02.internal.sifive.com (59-124-168-89.hinet-ip.hinet.net. [59.124.168.89]) by smtp.gmail.com with ESMTPSA id f9-20020a056a001ac900b00640d80c8a2bsm18669035pfv.50.2023.05.04.01.02.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 04 May 2023 01:02:38 -0700 (PDT) From: Kito Cheng To: gcc-patches@gcc.gnu.org, kito.cheng@gmail.com, palmer@dabbelt.com, jeffreyalaw@gmail.com Cc: Kito Cheng Subject: [PATCH v2] RISC-V: Handle multi-lib path correclty for linux Date: Thu, 4 May 2023 16:01:31 +0800 Message-Id: <20230504080130.24217-1-kito.cheng@sifive.com> X-Mailer: git-send-email 2.39.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-13.0 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: RISC-V Linux encodes the ABI into the path, so in theory, we can only use that to select multi-lib paths, and no way to use different multi-lib paths between `rv32i/ilp32` and `rv32ima/ilp32`, we'll mapping both to `/lib/ilp32`. It's hard to do that with GCC's builtin multi-lib selection mechanism; builtin mechanism did the option string compare and then enumerate all possible reuse rules during the build time. However, it's impossible to RISC-V; we have a huge number of combinations of `-march`, so implementing a customized multi-lib selection becomes the only solution. Multi-lib configuration is only used for determines which ISA should be used when compiling the corresponding ABI variant after this patch. During the multi-lib selection stage, only consider -mabi as the only key to select the multi-lib path. gcc/ChangeLog: * common/config/riscv/riscv-common.cc (riscv_select_multilib_by_abi): New. (riscv_select_multilib): New. (riscv_compute_multilib): Extract logic to riscv_select_multilib and also handle select_by_abi. * config/riscv/elf.h (RISCV_USE_CUSTOMISED_MULTI_LIB): Change it to select_by_abi_arch_cmodel from 1. * config/riscv/linux.h (RISCV_USE_CUSTOMISED_MULTI_LIB): Define. * config/riscv/riscv-opts.h (enum riscv_multilib_select_kind): New. --- V2 Changes: - Fix some trivial issue cause I forgot to squash patches... This patch also plan backport to GCC 13 after landing to trunk. --- gcc/common/config/riscv/riscv-common.cc | 128 ++++++++++++++++-------- gcc/config/riscv/elf.h | 2 +- gcc/config/riscv/linux.h | 2 + gcc/config/riscv/riscv-opts.h | 9 ++ 4 files changed, 100 insertions(+), 41 deletions(-) diff --git a/gcc/common/config/riscv/riscv-common.cc b/gcc/common/config/riscv/riscv-common.cc index 309a52def75f..57a2a279ef53 100644 --- a/gcc/common/config/riscv/riscv-common.cc +++ b/gcc/common/config/riscv/riscv-common.cc @@ -1441,9 +1441,6 @@ riscv_multi_lib_check (int argc ATTRIBUTE_UNUSED, return ""; } -/* We only override this in bare-metal toolchain. */ -#ifdef RISCV_USE_CUSTOMISED_MULTI_LIB - /* Find last switch with the prefix, options are take last one in general, return NULL if not found, and return the option value if found, it could return empty string if the option has no value. */ @@ -1597,6 +1594,68 @@ 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 &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 &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 ()); +} + +#ifndef RISCV_USE_CUSTOMISED_MULTI_LIB +#define RISCV_USE_CUSTOMISED_MULTI_LIB select_by_builtin +#endif + /* Implement TARGET_COMPUTE_MULTILIB. */ static const char * riscv_compute_multilib ( @@ -1609,6 +1668,11 @@ riscv_compute_multilib ( const char *multilib_exclusions ATTRIBUTE_UNUSED, const char *multilib_reuse ATTRIBUTE_UNUSED) { + enum riscv_multilib_select_kind select_kind = RISCV_USE_CUSTOMISED_MULTI_LIB; + + if (select_kind == select_by_builtin) + return multilib_dir; + const char *p; const char *this_path; size_t this_path_len; @@ -1672,7 +1736,13 @@ 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. @@ -1707,48 +1777,26 @@ 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) + switch (select_kind) { - /* 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; + case select_by_abi: + return riscv_select_multilib (riscv_current_arch_str, + riscv_current_abi_str, subset_list, + switches, n_switches, multilib_infos); + case select_by_abi_arch_cmodel: + return riscv_select_multilib_by_abi (riscv_current_arch_str, + riscv_current_abi_str, subset_list, + switches, n_switches, + multilib_infos); + case select_by_builtin: + gcc_unreachable (); + default: + gcc_unreachable (); } - else - return xstrdup (multilib_infos[best_match_multi_lib].path.c_str ()); } #undef TARGET_COMPUTE_MULTILIB #define TARGET_COMPUTE_MULTILIB riscv_compute_multilib -#endif vec riscv_get_valid_option_values (int option_code, diff --git a/gcc/config/riscv/elf.h b/gcc/config/riscv/elf.h index a725c00b6373..4b7e5c988ca2 100644 --- a/gcc/config/riscv/elf.h +++ b/gcc/config/riscv/elf.h @@ -37,4 +37,4 @@ along with GCC; see the file COPYING3. If not see #undef ENDFILE_SPEC #define ENDFILE_SPEC "crtend%O%s" -#define RISCV_USE_CUSTOMISED_MULTI_LIB 1 +#define RISCV_USE_CUSTOMISED_MULTI_LIB select_by_abi_arch_cmodel diff --git a/gcc/config/riscv/linux.h b/gcc/config/riscv/linux.h index 2fdfd930cf2d..3e625e0f8676 100644 --- a/gcc/config/riscv/linux.h +++ b/gcc/config/riscv/linux.h @@ -66,3 +66,5 @@ along with GCC; see the file COPYING3. If not see "/usr/lib" XLEN_SPEC "/" ABI_SPEC "/ " \ "/lib/ " \ "/usr/lib/ " + +#define RISCV_USE_CUSTOMISED_MULTI_LIB select_by_abi diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h index 4207db240ea0..1b2e6de5e1b1 100644 --- a/gcc/config/riscv/riscv-opts.h +++ b/gcc/config/riscv/riscv-opts.h @@ -82,6 +82,15 @@ enum riscv_autovec_lmul_enum { RVV_M8 = 8 }; +enum riscv_multilib_select_kind { + /* Select multilib by builtin way. */ + select_by_builtin, + /* Select multilib by ABI, arch and code model. */ + select_by_abi_arch_cmodel, + /* Select multilib by ABI only. */ + select_by_abi, +}; + #define MASK_ZICSR (1 << 0) #define MASK_ZIFENCEI (1 << 1) -- 2.39.2