Author: Hafiz Abid Qadeer Date: 2020-12-07T09:19:52Z New Revision: 275592e714130345a481a5cb889c89b73a98614f
URL: https://github.com/llvm/llvm-project/commit/275592e714130345a481a5cb889c89b73a98614f DIFF: https://github.com/llvm/llvm-project/commit/275592e714130345a481a5cb889c89b73a98614f.diff LOG: Provide default location of sysroot for Baremetal toolchain. Currently, Baremetal toolchain requires user to pass a sysroot location using a --sysroot flag. This is not very convenient for the user. It also creates problem for toolchain vendors who don't have a fixed location to put the sysroot bits. Clang does provide 'DEFAULT_SYSROOT' which can be used by the toolchain builder to provide the default location. But it does not work if toolchain is targeting multiple targets e.g. arm-none-eabi/riscv64-unknown-elf which clang is capable of doing. This patch tries to solve this problem by providing a default location of the toolchain if user does not explicitly provides --sysroot. The exact location and name can be different but it should fulfill these conditions: 1. The sysroot path should have a target triple element so that multi-target toolchain problem (as I described above) could be addressed. 2. The location should not be $TOP/$Triple as this is used by gcc generally and will be a problem for installing both gcc and clang based toolchain at the same location. Reviewed By: jroelofs Differential Revision: https://reviews.llvm.org/D92677 Added: clang/test/Driver/baremetal-sysroot.cpp Modified: clang/lib/Driver/ToolChains/BareMetal.cpp clang/lib/Driver/ToolChains/BareMetal.h Removed: ################################################################################ diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp index 20ffd4b2cd57..7429c822b7e9 100644 --- a/clang/lib/Driver/ToolChains/BareMetal.cpp +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp @@ -33,7 +33,7 @@ BareMetal::BareMetal(const Driver &D, const llvm::Triple &Triple, 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 @@ std::string BareMetal::getRuntimesDir() const { 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 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs, } 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 @@ void BareMetal::AddClangCXXStdlibIncludeArgs( DriverArgs.hasArg(options::OPT_nostdincxx)) return; - StringRef SysRoot = getDriver().SysRoot; + std::string SysRoot(computeSysRoot()); if (SysRoot.empty()) return; diff --git a/clang/lib/Driver/ToolChains/BareMetal.h b/clang/lib/Driver/ToolChains/BareMetal.h index 0be9377134ce..3f4fadf8a7c3 100644 --- a/clang/lib/Driver/ToolChains/BareMetal.h +++ b/clang/lib/Driver/ToolChains/BareMetal.h @@ -67,6 +67,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain { 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/test/Driver/baremetal-sysroot.cpp b/clang/test/Driver/baremetal-sysroot.cpp new file mode 100644 index 000000000000..ae174e01417e --- /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" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits