diff --git a/clang/lib/Driver/ToolChains/BareMetal.h b/clang/lib/Driver/ToolChains/BareMetal.h --- a/clang/lib/Driver/ToolChains/BareMetal.h +++ b/clang/lib/Driver/ToolChains/BareMetal.h @@ -67,6 +67,7 @@ llvm::opt::ArgStringList &CmdArgs) const override; void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const; + std::string computeSysRoot() const override; }; } // namespace toolchains diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp --- a/clang/lib/Driver/ToolChains/BareMetal.cpp +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp @@ -33,7 +33,7 @@ getProgramPaths().push_back(getDriver().getInstalledDir()); if (getDriver().getInstalledDir() != getDriver().Dir) getProgramPaths().push_back(getDriver().Dir); - SmallString<128> SysRoot(getDriver().SysRoot); + SmallString<128> SysRoot(computeSysRoot()); if (!SysRoot.empty()) { llvm::sys::path::append(SysRoot, "lib"); getFilePaths().push_back(std::string(SysRoot)); @@ -94,6 +94,17 @@ return std::string(Dir.str()); } +std::string BareMetal::computeSysRoot() const { + if (!getDriver().SysRoot.empty()) + return getDriver().SysRoot; + + SmallString<128> SysRootDir; + llvm::sys::path::append(SysRootDir, getDriver().Dir, "../lib/clang-runtimes", + getDriver().getTargetTriple()); + + return std::string(SysRootDir); +} + void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs, ArgStringList &CC1Args) const { if (DriverArgs.hasArg(options::OPT_nostdinc)) @@ -106,7 +117,7 @@ } if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) { - SmallString<128> Dir(getDriver().SysRoot); + SmallString<128> Dir(computeSysRoot()); if (!Dir.empty()) { llvm::sys::path::append(Dir, "include"); addSystemInclude(DriverArgs, CC1Args, Dir.str()); @@ -127,7 +138,7 @@ DriverArgs.hasArg(options::OPT_nostdincxx)) return; - StringRef SysRoot = getDriver().SysRoot; + std::string SysRoot(computeSysRoot()); if (SysRoot.empty()) return; diff --git a/clang/test/Driver/baremetal-sysroot.cpp b/clang/test/Driver/baremetal-sysroot.cpp new file mode 100644 --- /dev/null +++ b/clang/test/Driver/baremetal-sysroot.cpp @@ -0,0 +1,22 @@ +// REQUIRES: shell +// UNSUPPORTED: system-windows + +// Test that when a --sysroot is not provided, driver picks the default +// location correctly if available. + +// RUN: rm -rf %T/baremetal_default_sysroot +// RUN: mkdir -p %T/baremetal_default_sysroot/bin +// RUN: mkdir -p %T/baremetal_default_sysroot/lib/clang-runtimes/armv6m-none-eabi +// RUN: ln -s %clang %T/baremetal_default_sysroot/bin/clang + +// RUN: %T/baremetal_default_sysroot/bin/clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -target armv6m-none-eabi \ +// RUN: | FileCheck --check-prefix=CHECK-V6M-C %s +// CHECK-V6M-C: "{{.*}}clang{{.*}}" "-cc1" "-triple" "thumbv6m-none-unknown-eabi" +// CHECK-V6M-C-SAME: "-internal-isystem" "{{.*}}/baremetal_default_sysroot{{[/\\]+}}bin{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+}}armv6m-none-eabi{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1" +// CHECk-V6M-C-SAME: "-internal-isystem" "{{.*}}/baremetal_default_sysroot{{[/\\]+}}bin{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+}}armv6m-none-eabi{{[/\\]+}}include" +// CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal-sysroot.cpp" +// CHECK-V6M-C-NEXT: "{{[^"]*}}ld{{(\.(lld|bfd|gold))?}}{{(\.exe)?}}" "{{.*}}.o" "-Bstatic" +// CHECK-V6M-C-SAME: "-L{{.*}}/baremetal_default_sysroot{{[/\\]+}}bin{{[/\\]+}}..{{[/\\]+}}lib{{[/\\]+}}clang-runtimes{{[/\\]+}}armv6m-none-eabi{{[/\\]+}}lib" +// CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m" +// CHECK-V6M-C-SAME: "-o" "{{.*}}.o"