diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index 7f463ddd17d3d..835215a83c403 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -30,7 +30,6 @@ #include "llvm/Option/ArgList.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/Path.h" -#include "llvm/Support/RISCVISAInfo.h" #include "llvm/Support/VirtualFileSystem.h" #include "llvm/TargetParser/TargetParser.h" #include @@ -1716,129 +1715,6 @@ static void findCSKYMultilibs(const Driver &D, const llvm::Triple &TargetTriple, Result.Multilibs = CSKYMultilibs; } -/// Extend the multi-lib re-use selection mechanism for RISC-V. -/// This function will try to re-use multi-lib if they are compatible. -/// Definition of compatible: -/// - ABI must be the same. -/// - multi-lib is a subset of current arch, e.g. multi-lib=march=rv32im -/// is a subset of march=rv32imc. -/// - march that contains atomic extension can't reuse multi-lib that -/// doesn't have atomic, vice versa. e.g. multi-lib=march=rv32im and -/// march=rv32ima are not compatible, because software and hardware -/// atomic operation can't work together correctly. -static bool -selectRISCVMultilib(const MultilibSet &RISCVMultilibSet, StringRef Arch, - const Multilib::flags_list &Flags, - llvm::SmallVectorImpl &SelectedMultilibs) { - // Try to find the perfect matching multi-lib first. - if (RISCVMultilibSet.select(Flags, SelectedMultilibs)) - return true; - - Multilib::flags_list NewFlags; - std::vector NewMultilibs; - - llvm::Expected> ParseResult = - llvm::RISCVISAInfo::parseArchString( - Arch, /*EnableExperimentalExtension=*/true, - /*ExperimentalExtensionVersionCheck=*/false); - if (!ParseResult) { - // Ignore any error here, we assume it will be handled in another place. - consumeError(ParseResult.takeError()); - return false; - } - - auto &ISAInfo = *ParseResult; - - addMultilibFlag(ISAInfo->getXLen() == 32, "-m32", NewFlags); - addMultilibFlag(ISAInfo->getXLen() == 64, "-m64", NewFlags); - - // Collect all flags except march=* - for (StringRef Flag : Flags) { - if (Flag.starts_with("!march=") || Flag.starts_with("-march=")) - continue; - - NewFlags.push_back(Flag.str()); - } - - llvm::StringSet<> AllArchExts; - // Reconstruct multi-lib list, and break march option into separated - // extension. e.g. march=rv32im -> +i +m - for (const auto &M : RISCVMultilibSet) { - bool Skip = false; - - MultilibBuilder NewMultilib = - MultilibBuilder(M.gccSuffix(), M.osSuffix(), M.includeSuffix()); - for (StringRef Flag : M.flags()) { - // Add back all flags except -march. - if (!Flag.consume_front("-march=")) { - NewMultilib.flag(Flag); - continue; - } - - // Break down -march into individual extension. - llvm::Expected> MLConfigParseResult = - llvm::RISCVISAInfo::parseArchString( - Flag, /*EnableExperimentalExtension=*/true, - /*ExperimentalExtensionVersionCheck=*/false); - if (!MLConfigParseResult) { - // Ignore any error here, we assume it will handled in another place. - llvm::consumeError(MLConfigParseResult.takeError()); - - // We might get a parsing error if rv32e in the list, we could just skip - // that and process the rest of multi-lib configs. - Skip = true; - continue; - } - auto &MLConfigISAInfo = *MLConfigParseResult; - - const llvm::RISCVISAInfo::OrderedExtensionMap &MLConfigArchExts = - MLConfigISAInfo->getExtensions(); - for (auto MLConfigArchExt : MLConfigArchExts) { - auto ExtName = MLConfigArchExt.first; - NewMultilib.flag(Twine("-", ExtName).str()); - - if (AllArchExts.insert(ExtName).second) { - addMultilibFlag(ISAInfo->hasExtension(ExtName), - Twine("-", ExtName).str(), NewFlags); - } - } - - // Check the XLEN explicitly. - if (MLConfigISAInfo->getXLen() == 32) { - NewMultilib.flag("-m32"); - NewMultilib.flag("!m64"); - } else { - NewMultilib.flag("!m32"); - NewMultilib.flag("-m64"); - } - - // Atomic extension must be explicitly checked, soft and hard atomic - // operation never co-work correctly. - if (!MLConfigISAInfo->hasExtension("a")) - NewMultilib.flag("!a"); - } - - if (Skip) - continue; - - NewMultilibs.emplace_back(NewMultilib); - } - - // Build an internal used only multi-lib list, used for checking any - // compatible multi-lib. - MultilibSet NewRISCVMultilibs = - MultilibSetBuilder().Either(NewMultilibs).makeMultilibSet(); - - if (NewRISCVMultilibs.select(NewFlags, SelectedMultilibs)) - for (const Multilib &NewSelectedM : SelectedMultilibs) - for (const auto &M : RISCVMultilibSet) - // Look up the corresponding multi-lib entry in original multi-lib set. - if (M.gccSuffix() == NewSelectedM.gccSuffix()) - return true; - - return false; -} - static void findRISCVBareMetalMultilibs(const Driver &D, const llvm::Triple &TargetTriple, StringRef Path, const ArgList &Args, @@ -1890,8 +1766,7 @@ static void findRISCVBareMetalMultilibs(const Driver &D, } } - if (selectRISCVMultilib(RISCVMultilibs, MArch, Flags, - Result.SelectedMultilibs)) + if (RISCVMultilibs.select(Flags, Result.SelectedMultilibs)) Result.Multilibs = RISCVMultilibs; } diff --git a/clang/test/Driver/riscv-toolchain-gcc-multilib-reuse.c b/clang/test/Driver/riscv-toolchain-gcc-multilib-reuse.c deleted file mode 100644 index 1f8a5a8821edf..0000000000000 --- a/clang/test/Driver/riscv-toolchain-gcc-multilib-reuse.c +++ /dev/null @@ -1,81 +0,0 @@ -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32imc -mabi=ilp32 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32IMC-ILP32 %s -// GCC-MULTI-LIB-REUSE-RV32IMC-ILP32: rv32im/ilp32 -// GCC-MULTI-LIB-REUSE-RV32IMC-ILP32-NOT: {{^.+$}} - -// Check rv32imac won't reuse rv32im or rv32ic -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32imac -mabi=ilp32 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32IMAC-ILP32 %s -// GCC-MULTI-LIB-REUSE-RV32IMAC-ILP32: rv32imac/ilp32 -// GCC-MULTI-LIB-REUSE-RV32IMAC-ILP32--NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32iac -mabi=ilp32 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32IAC-ILP32 %s -// GCC-MULTI-LIB-REUSE-RV32IAC-ILP32: rv32iac/ilp32 -// GCC-MULTI-LIB-REUSE-RV32IAC-ILP32-NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32imafdc -mabi=ilp32f \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32IMAFDC-ILP32F %s -// GCC-MULTI-LIB-REUSE-RV32IMAFDC-ILP32F: rv32imafc/ilp32f -// GCC-MULTI-LIB-REUSE-RV32IMAFDC-ILP32F-NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32imafdc -mabi=ilp32d \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32IMAFDC-ILP32D %s -// GCC-MULTI-LIB-REUSE-RV32IMAFDC-ILP32D: . -// GCC-MULTI-LIB-REUSE-RV32IMAFDC-ILP32D-NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv64imafc -mabi=lp64 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV64IMAFC-LP64 %s -// GCC-MULTI-LIB-REUSE-RV64IMAFC-LP64: rv64imac/lp64 -// GCC-MULTI-LIB-REUSE-RV64IMAFC-LP64-NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32imafc_zfh -mabi=ilp32 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32IMAFC_ZFH-ILP32 %s -// GCC-MULTI-LIB-REUSE-RV32IMAFC_ZFH-ILP32: rv32imac/ilp32 -// GCC-MULTI-LIB-REUSE-RV32IMAFC_ZFH-ILP32-NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv32i_zvkb -mabi=ilp32 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV32I_ZVKB-ILP32 %s -// GCC-MULTI-LIB-REUSE-RV32I_ZVKB-ILP32: rv32i/ilp32 -// GCC-MULTI-LIB-REUSE-RV32I_ZVKB-ILP32-NOT: {{^.+$}} - -// RUN: %clang %s \ -// RUN: -target riscv64-unknown-elf \ -// RUN: --gcc-toolchain=%S/Inputs/multilib_riscv_elf_sdk \ -// RUN: --print-multi-directory \ -// RUN: -march=rv64imfc -mabi=lp64 \ -// RUN: | FileCheck -check-prefix=GCC-MULTI-LIB-REUSE-RV64IMFC-LP64 %s -// GCC-MULTI-LIB-REUSE-RV64IMFC-LP64: . -// GCC-MULTI-LIB-REUSE-RV64IMFC-LP64-NOT: {{^.+$}}