[libunwind] 380fee3 - [libunwind] Provide a way to set '_LIBUNWIND_IS_BAREMETAL' through cmake.
Author: Hafiz Abid Qadeer Date: 2020-07-29T11:48:28+01:00 New Revision: 380fee34d2794361f9e222fe3c8c065be3b9fff8 URL: https://github.com/llvm/llvm-project/commit/380fee34d2794361f9e222fe3c8c065be3b9fff8 DIFF: https://github.com/llvm/llvm-project/commit/380fee34d2794361f9e222fe3c8c065be3b9fff8.diff LOG: [libunwind] Provide a way to set '_LIBUNWIND_IS_BAREMETAL' through cmake. Libunwind uses _LIBUNWIND_IS_BAREMETAL in a lot of places but there is no cmake variable to set it. This patch adds such a variable. It is quite like what LIBCXXABI_BAREMETAL does in libcxxabi. Reviewed By: compnerd, #libunwind Differential Revision: https://reviews.llvm.org/D84759 Added: Modified: libunwind/CMakeLists.txt Removed: diff --git a/libunwind/CMakeLists.txt b/libunwind/CMakeLists.txt index c5b536532f3c..4606360f07ab 100644 --- a/libunwind/CMakeLists.txt +++ b/libunwind/CMakeLists.txt @@ -137,6 +137,7 @@ option(LIBUNWIND_ENABLE_THREADS "Build libunwind with threading support." ON) option(LIBUNWIND_WEAK_PTHREAD_LIB "Use weak references to refer to pthread functions." OFF) option(LIBUNWIND_USE_COMPILER_RT "Use compiler-rt instead of libgcc" OFF) option(LIBUNWIND_INCLUDE_DOCS "Build the libunwind documentation." ${LLVM_INCLUDE_DOCS}) +option(LIBUNWIND_IS_BAREMETAL "Build libunwind for baremetal targets." OFF) set(LIBUNWIND_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}" CACHE STRING "Define suffix of library directory name (32/64)") @@ -361,6 +362,10 @@ if (LIBUNWIND_ENABLE_ARM_WMMX) add_compile_flags(-D__ARM_WMMX) endif() +if(LIBUNWIND_IS_BAREMETAL) + add_compile_definitions(_LIBUNWIND_IS_BAREMETAL) +endif() + # This is the _ONLY_ place where add_definitions is called. if (MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 670686a - Add initial support for multilibs in Baremetal toolchain.
Author: Hafiz Abid Qadeer Date: 2020-12-14T20:49:45Z New Revision: 670686ad8ecc80158a6ff87fff55e0ffa6fdff5d URL: https://github.com/llvm/llvm-project/commit/670686ad8ecc80158a6ff87fff55e0ffa6fdff5d DIFF: https://github.com/llvm/llvm-project/commit/670686ad8ecc80158a6ff87fff55e0ffa6fdff5d.diff LOG: Add initial support for multilibs in Baremetal toolchain. This patch add support of riscv multilibs in the Baremetal toolchain. It is a bit different to what is done in GNU.cpp as we are not iterating a GNU sysroot to find the multilibs. This is intended for an llvm only toolchain. We are not checking for the presence of any runtime bits to enable a specific multilib. I have structured the patch so that other targets for which there is no multilibs support yet in Baremetal.cpp (e.g. arm-none-eabi) will not be affected. Patch also allows some multilibs reuse. Long term, I would like to go in the direction of data-driven specification of multilib directories and flags. Reviewed By: jroelofs Differential Revision: https://reviews.llvm.org/D93138 Added: Modified: clang/lib/Driver/ToolChains/BareMetal.cpp clang/lib/Driver/ToolChains/BareMetal.h clang/test/Driver/baremetal.cpp Removed: diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp index 7429c822b7e9..7619dd30da5a 100644 --- a/clang/lib/Driver/ToolChains/BareMetal.cpp +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp @@ -12,6 +12,7 @@ #include "InputInfo.h" #include "Gnu.h" +#include "Arch/RISCV.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" #include "clang/Driver/DriverDiagnostic.h" @@ -27,12 +28,77 @@ using namespace clang::driver; using namespace clang::driver::tools; using namespace clang::driver::toolchains; +static Multilib makeMultilib(StringRef commonSuffix) { + return Multilib(commonSuffix, commonSuffix, commonSuffix); +} + +static bool findRISCVMultilibs(const Driver &D, + const llvm::Triple &TargetTriple, + const ArgList &Args, DetectedMultilibs &Result) { + Multilib::flags_list Flags; + StringRef Arch = riscv::getRISCVArch(Args, TargetTriple); + StringRef Abi = tools::riscv::getRISCVABI(Args, TargetTriple); + + if (TargetTriple.getArch() == llvm::Triple::riscv64) { +Multilib Imac = makeMultilib("").flag("+march=rv64imac").flag("+mabi=lp64"); +Multilib Imafdc = makeMultilib("/rv64imafdc/lp64d") + .flag("+march=rv64imafdc") + .flag("+mabi=lp64d"); + +// Multilib reuse +bool UseImafdc = +(Arch == "rv64imafdc") || (Arch == "rv64gc"); // gc => imafdc + +addMultilibFlag((Arch == "rv64imac"), "march=rv64imac", Flags); +addMultilibFlag(UseImafdc, "march=rv64imafdc", Flags); +addMultilibFlag(Abi == "lp64", "mabi=lp64", Flags); +addMultilibFlag(Abi == "lp64d", "mabi=lp64d", Flags); + +Result.Multilibs = MultilibSet().Either(Imac, Imafdc); +return Result.Multilibs.select(Flags, Result.SelectedMultilib); + } + if (TargetTriple.getArch() == llvm::Triple::riscv32) { +Multilib Imac = +makeMultilib("").flag("+march=rv32imac").flag("+mabi=ilp32"); +Multilib I = +makeMultilib("/rv32i/ilp32").flag("+march=rv32i").flag("+mabi=ilp32"); +Multilib Im = + makeMultilib("/rv32im/ilp32").flag("+march=rv32im").flag("+mabi=ilp32"); +Multilib Iac = makeMultilib("/rv32iac/ilp32") + .flag("+march=rv32iac") + .flag("+mabi=ilp32"); +Multilib Imafc = makeMultilib("/rv32imafc/ilp32f") + .flag("+march=rv32imafc") + .flag("+mabi=ilp32f"); + +// Multilib reuse +bool UseI = (Arch == "rv32i") || (Arch == "rv32ic");// ic => i +bool UseIm = (Arch == "rv32im") || (Arch == "rv32imc"); // imc => im +bool UseImafc = (Arch == "rv32imafc") || (Arch == "rv32imafdc") || +(Arch == "rv32gc"); // imafdc,gc => imafc + +addMultilibFlag(UseI, "march=rv32i", Flags); +addMultilibFlag(UseIm, "march=rv32im", Flags); +addMultilibFlag((Arch == "rv32iac"), "march=rv32iac", Flags); +addMultilibFlag((Arch == "rv32imac"), "march=rv32imac", Flags); +addMultilibFlag(UseImafc, "march=rv32imafc", Flags); +addMultilibFlag(Abi == "ilp32", "mabi=ilp32", Flags); +addMultilibFlag(Abi == "ilp32f", "mabi=ilp32f", Flags); + +Result.Multilibs = MultilibSet().Either(I, Im, Iac, Imac, Imafc); +return Result.Multilibs.select(Flags, Result.SelectedMultilib); + } + return false; +} + BareMetal::BareMetal(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) : ToolChain(D, Triple, Args) { getProgramPaths().push_back(getDriver().getInstalledDir()); if (getDriver().getInstalledDir() != getDriver().Dir) getP
[clang] 8cdc538 - Add sysroot/lib to library search path of baremetal toolchain.
Author: Hafiz Abid Qadeer Date: 2020-11-18T12:38:52Z New Revision: 8cdc538873879bd57c3ba71956d68b49a2973a45 URL: https://github.com/llvm/llvm-project/commit/8cdc538873879bd57c3ba71956d68b49a2973a45 DIFF: https://github.com/llvm/llvm-project/commit/8cdc538873879bd57c3ba71956d68b49a2973a45.diff LOG: Add sysroot/lib to library search path of baremetal toolchain. Baremetal toolchain is not adding sysroot/lib to the library search path. This is forcing the user to do it manually. This commit fixes this shortcoming by adding the sysroot/lib to library search path if sysroot is not empty. Reviewed By: jroelofs Differential Revision: https://reviews.llvm.org/D91559 Added: Modified: clang/lib/Driver/ToolChains/BareMetal.cpp clang/test/Driver/baremetal.cpp Removed: diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp index 9df42061e12c..91e2715404fe 100644 --- a/clang/lib/Driver/ToolChains/BareMetal.cpp +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp @@ -33,6 +33,11 @@ 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); + if (!SysRoot.empty()) { +llvm::sys::path::append(SysRoot, "lib"); +getFilePaths().push_back(std::string(SysRoot)); + } } /// Is the triple {arm,thumb}-none-none-{eabi,eabihf} ? @@ -189,6 +194,7 @@ void baremetal::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back(Args.MakeArgString("-L" + TC.getRuntimesDir())); + TC.AddFilePathLibArgs(Args, CmdArgs); Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group, options::OPT_e, options::OPT_s, options::OPT_t, options::OPT_Z_Flag, options::OPT_r}); diff --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp index 3a5c1555dc2c..f9d48e46e639 100644 --- a/clang/test/Driver/baremetal.cpp +++ b/clang/test/Driver/baremetal.cpp @@ -12,6 +12,7 @@ // CHECK-V6M-C-SAME: "-x" "c++" "{{.*}}baremetal.cpp" // CHECK-V6M-C-NEXT: "{{[^"]*}}ld{{(\.(lld|bfd|gold))?}}{{(\.exe)?}}" "{{.*}}.o" "-Bstatic" // CHECK-V6M-C-SAME: "-L[[RESOURCE_DIR:[^"]+]]{{[/\\]+}}lib{{[/\\]+}}baremetal" +// CHECK-V6M-C-SAME: "-L[[SYSROOT:[^"]+]]{{[/\\]+}}lib" // CHECK-V6M-C-SAME: "-T" "semihosted.lds" "-Lsome{{[/\\]+}}directory{{[/\\]+}}user{{[/\\]+}}asked{{[/\\]+}}for" // CHECK-V6M-C-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m" // CHECK-V6M-C-SAME: "-o" "{{.*}}.o" @@ -34,6 +35,7 @@ // RUN: | FileCheck --check-prefix=CHECK-V6M-DEFAULTCXX %s // CHECK-V6M-DEFAULTCXX: "{{[^"]*}}ld{{(\.(lld|bfd|gold))?}}{{(\.exe)?}}" "{{.*}}.o" "-Bstatic" // CHECK-V6M-DEFAULTCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}lib{{(64)?}}{{[/\\]+}}clang{{[/\\]+}}{{.*}}{{[/\\]+}}lib{{[/\\]+}}baremetal" +// CHECK-V6M-DEFAULTCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}baremetal_arm{{[/\\]+}}lib" // CHECK-V6M-DEFAULTCXX-SAME: "-lc++" "-lc++abi" "-lunwind" // CHECK-V6M-DEFAULTCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m" // CHECK-V6M-DEFAULTCXX-SAME: "-o" "{{.*}}.o" @@ -47,6 +49,7 @@ // CHECK-V6M-LIBCXX: "-internal-isystem" "{{[^"]+}}{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}v1" // CHECK-V6M-LIBCXX: "{{[^"]*}}ld{{(\.(lld|bfd|gold))?}}{{(\.exe)?}}" "{{.*}}.o" "-Bstatic" // CHECK-V6M-LIBCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}lib{{(64)?}}{{[/\\]+}}clang{{[/\\]+}}{{.*}}{{[/\\]+}}lib{{[/\\]+}}baremetal" +// CHECK-V6M-LIBCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}baremetal_arm{{[/\\]+}}lib" // CHECK-V6M-LIBCXX-SAME: "-lc++" "-lc++abi" "-lunwind" // CHECK-V6M-LIBCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m" // CHECK-V6M-LIBCXX-SAME: "-o" "{{.*}}.o" @@ -60,6 +63,7 @@ // CHECK-V6M-LIBSTDCXX: "-internal-isystem" "{{[^"]+}}{{[/\\]+}}include{{[/\\]+}}c++{{[/\\]+}}6.0.0" // CHECK-V6M-LIBSTDCXX: "{{[^"]*}}ld{{(\.(lld|bfd|gold))?}}{{(\.exe)?}}" "{{.*}}.o" "-Bstatic" // CHECK-V6M-LIBSTDCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}lib{{(64)?}}{{[/\\]+}}clang{{[/\\]+}}{{.*}}{{[/\\]+}}lib{{[/\\]+}}baremetal" +// CHECK-V6M-LIBSTDCXX-SAME: "-L{{[^"]*}}{{[/\\]+}}Inputs{{[/\\]+}}baremetal_arm{{[/\\]+}}lib" // CHECK-V6M-LIBSTDCXX-SAME: "-lstdc++" "-lsupc++" "-lunwind" // CHECK-V6M-LIBSTDCXX-SAME: "-lc" "-lm" "-lclang_rt.builtins-armv6m" // CHECK-V6M-LIBSTDCXX-SAME: "-o" "{{.*}}.o" @@ -70,7 +74,8 @@ // RUN: -nodefaultlibs \ // RUN: | FileCheck --check-prefix=CHECK-V6M-NDL %s // CHECK-V6M-NDL: "{{[^"]*}}ld{{(\.(lld|bfd|gold))?}}{{(\.exe)?}}" "{{.*}}.o" "-Bstatic" -// CHECK-V6M-NDL-SAME: "-L{{[^"]*}}{{[/\\]+}}lib{{(64)?}}{{[/\\]+}}clang{{[/\\]+}}{{.*}}{{[/\\]+}}lib{{[/\\]+}}baremetal" "-o" "{{.*}}.o" +// CHECK-V6M-NDL-SAME: "-L{{[^"]*}}{{[/\\]+}}lib{{(64)?}}{{[/\\]+}}clang{{[/\\]+}}{{.*}}{{[/\\
[clang] 45ba239 - [clang][Driver] Handle risvc in Baremetal.cpp.
Author: Hafiz Abid Qadeer Date: 2020-11-26T11:43:17Z New Revision: 45ba2392d7e00aedd4d9fb04070dbae8a7fbbeeb URL: https://github.com/llvm/llvm-project/commit/45ba2392d7e00aedd4d9fb04070dbae8a7fbbeeb DIFF: https://github.com/llvm/llvm-project/commit/45ba2392d7e00aedd4d9fb04070dbae8a7fbbeeb.diff LOG: [clang][Driver] Handle risvc in Baremetal.cpp. I am working on a baremetal riscv toolchain using LLVM runtime and LLD linker. Baremetal.cpp provides most of the things needed for such toolchain. So I have modified it to also handle riscv64/32-unknown-elf targets alongside arm-none-eabi. Currently, targets like riscv64-unknown-elf are handled by RISCVToolChain which mostly expects a gcc toolchain to be present. If you dont want the dependency on gcc-toolchain/libgloss or want to use LLD, then RISCVToolChain is not a good fit. So in the toolchain selection code, I have made this dependency of RISCVToolChain on gcc toolchain explicit. It is created if gcc-toolchain option is present. Otherwise Baremetal toolchain is created. I will be happy to hear if there is a better way to choose between these two toolchains. Reviewed By: jroelofs Differential Revision: https://reviews.llvm.org/D91442 Added: Modified: clang/lib/Driver/Driver.cpp clang/lib/Driver/ToolChains/BareMetal.cpp clang/lib/Driver/ToolChains/RISCVToolchain.cpp clang/lib/Driver/ToolChains/RISCVToolchain.h clang/test/Driver/baremetal.cpp clang/test/Driver/riscv-gnutools.c clang/test/Driver/riscv32-toolchain-extra.c clang/test/Driver/riscv32-toolchain.c clang/test/Driver/riscv64-toolchain-extra.c clang/test/Driver/riscv64-toolchain.c Removed: diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index fb258197cfdd..5e4eb8c4e6c5 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5213,7 +5213,11 @@ const ToolChain &Driver::getToolChain(const ArgList &Args, break; case llvm::Triple::riscv32: case llvm::Triple::riscv64: -TC = std::make_unique(*this, Target, Args); +if (toolchains::RISCVToolChain::hasGCCToolchain(*this, Args)) + TC = + std::make_unique(*this, Target, Args); +else + TC = std::make_unique(*this, Target, Args); break; case llvm::Triple::ve: TC = std::make_unique(*this, Target, Args); diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp index 91e2715404fe..e032d07112eb 100644 --- a/clang/lib/Driver/ToolChains/BareMetal.cpp +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp @@ -59,8 +59,22 @@ static bool isARMBareMetal(const llvm::Triple &Triple) { return true; } +static bool isRISCVBareMetal(const llvm::Triple &Triple) { + if (Triple.getArch() != llvm::Triple::riscv32 && + Triple.getArch() != llvm::Triple::riscv64) +return false; + + if (Triple.getVendor() != llvm::Triple::UnknownVendor) +return false; + + if (Triple.getOS() != llvm::Triple::UnknownOS) +return false; + + return Triple.getEnvironmentName() == "elf"; +} + bool BareMetal::handlesTarget(const llvm::Triple &Triple) { - return isARMBareMetal(Triple); + return isARMBareMetal(Triple) || isRISCVBareMetal(Triple); } Tool *BareMetal::buildLinker() const { diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp index 312c8b52c5e8..0dc12c7a84b5 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.cpp +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.cpp @@ -31,6 +31,21 @@ static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs, addPathIfExists(D, InstallPath + Path, Paths); } +// This function tests whether a gcc installation is present either +// through gcc-toolchain argument or in the same prefix where clang +// is installed. This helps decide whether to instantiate this toolchain +// or Baremetal toolchain. +bool RISCVToolChain::hasGCCToolchain(const Driver &D, + const llvm::opt::ArgList &Args) { + if (Args.getLastArg(options::OPT_gcc_toolchain)) +return true; + + SmallString<128> GCCDir; + llvm::sys::path::append(GCCDir, D.Dir, "..", D.getTargetTriple(), + "lib/crt0.o"); + return llvm::sys::fs::exists(GCCDir); +} + /// RISCV Toolchain RISCVToolChain::RISCVToolChain(const Driver &D, const llvm::Triple &Triple, const ArgList &Args) diff --git a/clang/lib/Driver/ToolChains/RISCVToolchain.h b/clang/lib/Driver/ToolChains/RISCVToolchain.h index 4734aee5f1ab..62099bee0404 100644 --- a/clang/lib/Driver/ToolChains/RISCVToolchain.h +++ b/clang/lib/Driver/ToolChains/RISCVToolchain.h @@ -21,6 +21,7 @@ class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF { RISCVToolChain(const Driver &D, const llvm::Triple &Triple,
[clang] ca28883 - Don't use sysroot/include when sysroot is empty.
Author: Hafiz Abid Qadeer Date: 2020-12-04T18:33:24Z New Revision: ca2888310b245d0532d989685a090ae373ee3f93 URL: https://github.com/llvm/llvm-project/commit/ca2888310b245d0532d989685a090ae373ee3f93 DIFF: https://github.com/llvm/llvm-project/commit/ca2888310b245d0532d989685a090ae373ee3f93.diff LOG: Don't use sysroot/include when sysroot is empty. Baremetal toolchain add Driver.SysRoot/include to the system include paths without checking if Driver.SysRoot is empty. This resulted in "-internal-isystem" "include" in the command. This patch adds check for empty sysroot. Reviewed By: jroelofs Differential Revision: https://reviews.llvm.org/D92176 Added: Modified: clang/lib/Driver/ToolChains/BareMetal.cpp clang/test/Driver/baremetal.cpp Removed: diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp index e032d07112eb..20ffd4b2cd57 100644 --- a/clang/lib/Driver/ToolChains/BareMetal.cpp +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp @@ -107,8 +107,10 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs, if (!DriverArgs.hasArg(options::OPT_nostdlibinc)) { SmallString<128> Dir(getDriver().SysRoot); -llvm::sys::path::append(Dir, "include"); -addSystemInclude(DriverArgs, CC1Args, Dir.str()); +if (!Dir.empty()) { + llvm::sys::path::append(Dir, "include"); + addSystemInclude(DriverArgs, CC1Args, Dir.str()); +} } } diff --git a/clang/test/Driver/baremetal.cpp b/clang/test/Driver/baremetal.cpp index 7dd213ee56b4..addf09f00e14 100644 --- a/clang/test/Driver/baremetal.cpp +++ b/clang/test/Driver/baremetal.cpp @@ -93,6 +93,10 @@ // RUN: | FileCheck %s --check-prefix=CHECK-RTLIB-GCC // CHECK-RTLIB-GCC: -lgcc +// RUN: %clang -### -target arm-none-eabi -v %s 2>&1 \ +// RUN: | FileCheck %s --check-prefix=CHECK-SYSROOT-INC +// CHECK-SYSROOT-INC-NOT: "-internal-isystem" "include" + // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target riscv64-unknown-elf \ // RUN: -L some/directory/user/asked/for \ ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 275592e - Provide default location of sysroot for Baremetal toolchain.
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 ..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-canonica
[clang] 60bed4a - Replace deprecated %T in 2 tests.
Author: Hafiz Abid Qadeer Date: 2021-02-11T22:21:21Z New Revision: 60bed4ab57d562d5770cc9c24a8fcb243208f5e5 URL: https://github.com/llvm/llvm-project/commit/60bed4ab57d562d5770cc9c24a8fcb243208f5e5 DIFF: https://github.com/llvm/llvm-project/commit/60bed4ab57d562d5770cc9c24a8fcb243208f5e5.diff LOG: Replace deprecated %T in 2 tests. In D91442, @MaskRay commented about a failure. This commit does the following to address his comments: 1. Replace %T with %t as former is deprecated. 2. Add an explicit --sysroot argument in a test. Some tests were failing when gcc-10-riscv64-linux-gnu is installed on test machine. This was happening because the test was checking a case when --gcc-toolchain is not provided. But if --sysroot was also not provided then code could pick a toolchain installed in /usr. So to make the test more robust, I have provided an explicit --sysroot argument. Its value has been chosen to match the existing patterns. Reviewed By: MaskRay Differential Revision: https://reviews.llvm.org/D93023 Added: Modified: clang/test/Driver/riscv32-toolchain-extra.c clang/test/Driver/riscv64-toolchain-extra.c Removed: diff --git a/clang/test/Driver/riscv32-toolchain-extra.c b/clang/test/Driver/riscv32-toolchain-extra.c index 59e2560b09c7..5df09029fc6f 100644 --- a/clang/test/Driver/riscv32-toolchain-extra.c +++ b/clang/test/Driver/riscv32-toolchain-extra.c @@ -11,25 +11,26 @@ // The test below checks that the driver correctly finds the linker and // runtime if and only if they exist. // -// RUN: rm -rf %T/testroot-riscv32-baremetal-nogcc -// RUN: mkdir -p %T/testroot-riscv32-baremetal-nogcc/bin -// RUN: ln -s %clang %T/testroot-riscv32-baremetal-nogcc/bin/clang -// RUN: ln -s %S/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld %T/testroot-riscv32-baremetal-nogcc/bin/riscv32-unknown-elf-ld -// RUN: ln -s %S/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf %T/testroot-riscv32-baremetal-nogcc/riscv32-unknown-elf -// RUN: %T/testroot-riscv32-baremetal-nogcc/bin/clang %s -### -no-canonical-prefixes \ -// RUN:--gcc-toolchain=%T/testroot-riscv32-baremetal-nogcc/invalid \ +// RUN: rm -rf %t +// RUN: mkdir -p %t/riscv32-nogcc/bin +// RUN: ln -s %clang %t/riscv32-nogcc/bin/clang +// RUN: ln -s %S/Inputs/basic_riscv32_nogcc_tree/bin/riscv32-unknown-elf-ld %t/riscv32-nogcc/bin/riscv32-unknown-elf-ld +// RUN: ln -s %S/Inputs/basic_riscv32_nogcc_tree/riscv32-unknown-elf %t/riscv32-nogcc/riscv32-unknown-elf +// RUN: %t/riscv32-nogcc/bin/clang %s -### -no-canonical-prefixes \ +// RUN:--gcc-toolchain=%t/riscv32-nogcc/invalid \ // RUN:-target riscv32-unknown-elf --rtlib=platform -fuse-ld= 2>&1 \ // RUN:| FileCheck -check-prefix=C-RV32-BAREMETAL-ILP32-NOGCC %s -// RUN: %T/testroot-riscv32-baremetal-nogcc/bin/clang %s -### -no-canonical-prefixes \ +// RUN: %t/riscv32-nogcc/bin/clang %s -### -no-canonical-prefixes \ +// RUN:--sysroot=%t/riscv32-nogcc/bin/../riscv32-unknown-elf \ // RUN:-target riscv32-unknown-elf --rtlib=platform -fuse-ld= 2>&1 \ // RUN:| FileCheck -check-prefix=C-RV32-BAREMETAL-ILP32-NOGCC %s -// C-RV32-BAREMETAL-ILP32-NOGCC: "-internal-isystem" "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/../riscv32-unknown-elf/include" -// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/riscv32-unknown-elf-ld" -// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/../riscv32-unknown-elf/lib/crt0.o" -// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/{{.*}}/lib/clang_rt.crtbegin-riscv32.o" -// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/bin/../riscv32-unknown-elf/lib" +// C-RV32-BAREMETAL-ILP32-NOGCC: "-internal-isystem" "{{.*}}/riscv32-nogcc/bin/../riscv32-unknown-elf/include" +// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}/riscv32-nogcc/bin/riscv32-unknown-elf-ld" +// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}/riscv32-nogcc/bin/../riscv32-unknown-elf/lib/crt0.o" +// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}/riscv32-nogcc/{{.*}}/lib/clang_rt.crtbegin-riscv32.o" +// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}/riscv32-nogcc/bin/../riscv32-unknown-elf/lib" // C-RV32-BAREMETAL-ILP32-NOGCC: "--start-group" "-lc" "-lgloss" "--end-group" -// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/{{.*}}/lib/libclang_rt.builtins-riscv32.a" -// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}Output/testroot-riscv32-baremetal-nogcc/{{.*}}/lib/clang_rt.crtend-riscv32.o" +// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}/riscv32-nogcc/{{.*}}/lib/libclang_rt.builtins-riscv32.a" +// C-RV32-BAREMETAL-ILP32-NOGCC: "{{.*}}/riscv32-nogcc/{{.*}}/lib/clang_rt.crtend-riscv32.o" diff --git a/clang/test/Driver/riscv64-toolchain-extra.c b/clang/test/Driver/riscv64-toolchain-extra.c index 4412a90713d4..e6cae72ed2a2 100644 --- a/clang/test/Driver/risc