Index: clang/include/clang/Driver/ToolChain.h =================================================================== --- clang/include/clang/Driver/ToolChain.h +++ clang/include/clang/Driver/ToolChain.h @@ -659,6 +659,9 @@ const llvm::fltSemantics *FPType = nullptr) const { return llvm::DenormalMode::getIEEE(); } + + /// Returns true if the toolchain is baremetal and false otherwise. + virtual bool isBareMetal() const { return false; } }; /// Set a ToolChain's effective triple. Reset it when the registration object Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -400,7 +400,9 @@ std::string ToolChain::getCompilerRTPath() const { SmallString<128> Path(getDriver().ResourceDir); - if (Triple.isOSUnknown()) { + if (isBareMetal()) { + llvm::sys::path::append(Path, "lib", "baremetal"); + } else if (Triple.isOSUnknown()) { llvm::sys::path::append(Path, "lib"); } else { llvm::sys::path::append(Path, "lib", getOSLibName()); Index: clang/lib/Driver/ToolChains/BareMetal.h =================================================================== --- clang/lib/Driver/ToolChains/BareMetal.h +++ clang/lib/Driver/ToolChains/BareMetal.h @@ -23,7 +23,7 @@ public: BareMetal(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args); - ~BareMetal() override; + ~BareMetal() override = default; static bool handlesTarget(const llvm::Triple &Triple); protected: @@ -36,6 +36,7 @@ bool isPIEDefault() const override { return false; } bool isPICDefaultForced() const override { return false; } bool SupportsProfiling() const override { return false; } + bool isBareMetal() const override { return true; } RuntimeLibType GetDefaultRuntimeLibType() const override { return ToolChain::RLT_CompilerRT; Index: clang/lib/Driver/ToolChains/BareMetal.cpp =================================================================== --- clang/lib/Driver/ToolChains/BareMetal.cpp +++ clang/lib/Driver/ToolChains/BareMetal.cpp @@ -35,8 +35,6 @@ getProgramPaths().push_back(getDriver().Dir); } -BareMetal::~BareMetal() {} - /// Is the triple {arm,thumb}-none-none-{eabi,eabihf} ? static bool isARMBareMetal(const llvm::Triple &Triple) { if (Triple.getArch() != llvm::Triple::arm && Index: clang/test/Driver/print-libgcc-file-name-clangrt.c =================================================================== --- clang/test/Driver/print-libgcc-file-name-clangrt.c +++ clang/test/Driver/print-libgcc-file-name-clangrt.c @@ -42,3 +42,15 @@ // RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ // RUN: | FileCheck --check-prefix=CHECK-CLANGRT-ARM-ABI %s // CHECK-CLANGRT-ARM-ABI: libclang_rt.builtins-armhf.a + +// RUN: %clang -rtlib=compiler-rt -print-libgcc-file-name 2>&1 \ +// RUN: --target=armv7m-none-eabi \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ +// RUN: | FileCheck --check-prefix=CHECK-CLANGRT-ARM-BAREMETAL %s +// CHECK-CLANGRT-ARM-BAREMETAL: libclang_rt.builtins-arm.a + +// RUN: %clang -rtlib=compiler-rt -print-libgcc-file-name 2>&1 \ +// RUN: --target=armv7m-none-eabi -mfloat-abi=hard \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_arch_subdir \ +// RUN: | FileCheck --check-prefix=CHECK-CLANGRT-ARM-BAREMETAL-HF %s +// CHECK-CLANGRT-ARM-BAREMETAL-HF: libclang_rt.builtins-armhf.a