[PATCH] D153292: [Driver][BareMetal] Error if no matching multilib
Michael Platings via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 19 08:48:50 PDT 2023
michaelplatings created this revision.
Herald added a subscriber: kristof.beyls.
Herald added a project: All.
michaelplatings requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.
Herald added a project: clang.
Previously if no matching multilib was found then the user would
typically see an error like "fatal error: 'stdio.h' file not found"
which gives no indication as to the underlying problem.
With this change the user will instead see an error like
clang: error: no multilib found matching flags: --target=thumbv7em-none-unknown-eabi -march=...
clang: note: available multilibs are:
--target=armv4t-none-unknown-eabi
--target=thumbv6m-none-unknown-eabi -mfpu=none
...
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D153292
Files:
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/BareMetal.cpp
clang/test/Driver/baremetal-multilib.yaml
Index: clang/test/Driver/baremetal-multilib.yaml
===================================================================
--- clang/test/Driver/baremetal-multilib.yaml
+++ clang/test/Driver/baremetal-multilib.yaml
@@ -20,6 +20,16 @@
# CHECK-SAME: "-lc" "-lm" "-lclang_rt.builtins"
# CHECK-SAME: "-o" "{{.*}}.tmp.out"
+# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -x c++ %s -### -o %t.out 2>&1 \
+# RUN: --target=thumbv7em-none-eabi -mfpu=fpv4-sp-d16 --sysroot= \
+# RUN: | FileCheck --check-prefix=CHECK-NO-MATCH %s
+# CHECK-NO-MATCH: error: no multilib found matching flags:
+# CHECK-NO-MATCH-SAME: --target=thumbv7em-none-unknown-eabi
+# CHECK-NO-MATCH: note: available multilibs are:
+# CHECK-NO-MATCH: --target=thumbv6m-none-unknown-eabi -mfpu=none
+# CHECK-NO-MATCH: --target=thumbv7m-none-unknown-eabi -mfpu=none
+# CHECK-NO-MATCH: --target=thumbv7em-none-unknown-eabi -mfpu=none
+
# RUN: %T/baremetal_multilib/bin/clang -no-canonical-prefixes -print-multi-directory 2>&1 \
# RUN: --target=thumbv8m.main-none-eabihf --sysroot= \
# RUN: | FileCheck --check-prefix=CHECK-PRINT-MULTI-DIRECTORY %s
@@ -75,6 +85,9 @@
# multilib, layered on top of each other.
Variants:
+- Dir: arm-none-eabi/arm/v4t
+ Flags: [--target=armv4t-none-unknown-eabi]
+
- Dir: arm-none-eabi/thumb/v6-m/nofp
Flags: [--target=thumbv6m-none-unknown-eabi, -mfpu=none]
Index: clang/lib/Driver/ToolChains/BareMetal.cpp
===================================================================
--- clang/lib/Driver/ToolChains/BareMetal.cpp
+++ clang/lib/Driver/ToolChains/BareMetal.cpp
@@ -23,6 +23,8 @@
#include "llvm/Support/VirtualFileSystem.h"
#include "llvm/Support/raw_ostream.h"
+#include <sstream>
+
using namespace llvm::opt;
using namespace clang;
using namespace clang::driver;
@@ -158,20 +160,26 @@
return Triple.getEnvironmentName() == "elf";
}
-static bool findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
+static void findMultilibsFromYAML(const ToolChain &TC, const Driver &D,
StringRef MultilibPath, const ArgList &Args,
DetectedMultilibs &Result) {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> MB =
D.getVFS().getBufferForFile(MultilibPath);
if (!MB)
- return false;
+ return;
Multilib::flags_list Flags = TC.getMultilibFlags(Args);
llvm::ErrorOr<MultilibSet> ErrorOrMultilibSet =
MultilibSet::parseYaml(*MB.get());
if (ErrorOrMultilibSet.getError())
- return false;
+ return;
Result.Multilibs = ErrorOrMultilibSet.get();
- return Result.Multilibs.select(Flags, Result.SelectedMultilibs);
+ if (Result.Multilibs.select(Flags, Result.SelectedMultilibs))
+ return;
+ D.Diag(clang::diag::err_drv_no_matching_multilib) << llvm::join(Flags, " ");
+ std::stringstream ss;
+ for (const Multilib &Multilib : Result.Multilibs)
+ ss << "\n" << llvm::join(Multilib.flags(), " ");
+ D.Diag(clang::diag::note_drv_available_multilibs) << ss.str();
}
static constexpr llvm::StringLiteral MultilibFilename = "multilib.yaml";
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -733,4 +733,9 @@
def err_drv_expand_response_file : Error<
"failed to expand response file: %0">;
+
+def err_drv_no_matching_multilib : Error<
+ "no multilib found matching flags: %0">;
+def note_drv_available_multilibs : Note<
+ "available multilibs are:%0">;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D153292.532680.patch
Type: text/x-patch
Size: 3604 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230619/6942aa2f/attachment-0001.bin>
More information about the cfe-commits
mailing list