[clang] Revert "[RISCV] Implement multi-lib reuse rule for RISC-V bare-metal … (PR #75789)

via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 18 04:34:01 PST 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-driver

Author: antoine moynault (antmox)

<details>
<summary>Changes</summary>

…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)

---
Full diff: https://github.com/llvm/llvm-project/pull/75789.diff


2 Files Affected:

- (modified) clang/lib/Driver/ToolChains/Gnu.cpp (+1-126) 
- (removed) clang/test/Driver/riscv-toolchain-gcc-multilib-reuse.c (-81) 


``````````diff
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: {{^.+$}}

``````````

</details>


https://github.com/llvm/llvm-project/pull/75789


More information about the cfe-commits mailing list