[clang] 9727919 - Revert "[RISCV] Implement multi-lib reuse rule for RISC-V bare-metal … (#75789)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Dec 18 04:52:26 PST 2023
Author: antoine moynault
Date: 2023-12-18T13:52:21+01:00
New Revision: 9727919a2e35d2114d52f33a7751696ae1595581
URL: https://github.com/llvm/llvm-project/commit/9727919a2e35d2114d52f33a7751696ae1595581
DIFF: https://github.com/llvm/llvm-project/commit/9727919a2e35d2114d52f33a7751696ae1595581.diff
LOG: Revert "[RISCV] Implement multi-lib reuse rule for RISC-V bare-metal … (#75789)
…toolchain (#73765)"
This reverts commit 111a2290650743b27f70f9b24618411e54493b59,
as it broke several bots
https://lab.llvm.org/buildbot/#/builders/245/builds/18162
https://lab.llvm.org/buildbot/#/builders/188/builds/39436
https://lab.llvm.org/buildbot/#/builders/187/builds/13723
https://lab.llvm.org/buildbot/#/builders/182/builds/8449
https://lab.llvm.org/buildbot/#/builders/198/builds/7438
https://lab.llvm.org/buildbot/#/builders/176/builds/7419
https://lab.llvm.org/buildbot/#/builders/186/builds/13781
https://lab.llvm.org/buildbot/#/builders/183/builds/18116
https://lab.llvm.org/buildbot/#/builders/197/builds/11410
https://lab.llvm.org/buildbot/#/builders/184/builds/8651
When reapplying, please take care of another commit that have been
merged after this one:
c7cdf3cd5d74 [clang] Use 'starts_with' instead of 'startswith' in
Gnu.cpp (NFC)
Added:
Modified:
clang/lib/Driver/ToolChains/Gnu.cpp
Removed:
clang/test/Driver/riscv-toolchain-gcc-multilib-reuse.c
################################################################################
diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
index 7f463ddd17d3d6..835215a83c4037 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 <system_error>
@@ -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<Multilib> &SelectedMultilibs) {
- // Try to find the perfect matching multi-lib first.
- if (RISCVMultilibSet.select(Flags, SelectedMultilibs))
- return true;
-
- Multilib::flags_list NewFlags;
- std::vector<MultilibBuilder> NewMultilibs;
-
- llvm::Expected<std::unique_ptr<llvm::RISCVISAInfo>> 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<std::unique_ptr<llvm::RISCVISAInfo>> 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 1f8a5a8821edfa..00000000000000
--- 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: {{^.+$}}
More information about the cfe-commits
mailing list