Skip to content

Commit

Permalink
[Driver][BareMetal] Error if no matching multilib
Browse files Browse the repository at this point in the history
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
  ...

Differential Revision: https://reviews.llvm.org/D153292
  • Loading branch information
mplatings committed Jun 22, 2023
1 parent 88f07a3 commit 028c103
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 4 deletions.
5 changes: 5 additions & 0 deletions clang/include/clang/Basic/DiagnosticDriverKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -733,4 +733,9 @@ def err_drv_loongarch_invalid_mfpu_EQ : Error<

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">;
}
16 changes: 12 additions & 4 deletions clang/lib/Driver/ToolChains/BareMetal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -158,20 +160,26 @@ static bool isRISCVBareMetal(const llvm::Triple &Triple) {
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";
Expand Down
13 changes: 13 additions & 0 deletions clang/test/Driver/baremetal-multilib.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -75,6 +85,9 @@ MultilibVersion: 1.0
# 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]

Expand Down

0 comments on commit 028c103

Please sign in to comment.