| commit 18432bea764863d1c42fd569bd3846673ee4e802 |
| Author: Christopher Di Bella <cjdb@google.com> |
| Date: Wed Oct 14 10:13:32 2020 -0700 |
| |
| [Driver]: fix compiler-rt path when printing libgcc for baremetal |
| |
| clang --target arm-none-eabi --print-libgcc-file-name --rtlib=compiler-rt |
| used to print `/path/to/lib/clang/version/lib/libclang_rt.builtins-arm.a` |
| but should print `/path/to/lib/clang/version/lib/baremetal/libclang_rt.builtins-arm.a`. |
| Similarly, --target armv7m-none-eabi should print libclang_rt.builtins-armv7m.a |
| This matches the compiler-rt file name used at link time in the |
| baremetal driver. |
| |
| Reviewed By: manojgupta |
| |
| Differential Revision: https://reviews.llvm.org/D89327 |
| |
| diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h |
| index 7495e08fe6e..4704308f045 100644 |
| --- a/clang/include/clang/Driver/ToolChain.h |
| +++ b/clang/include/clang/Driver/ToolChain.h |
| @@ -419,10 +419,10 @@ public: |
| getCompilerRTArgString(const llvm::opt::ArgList &Args, StringRef Component, |
| FileType Type = ToolChain::FT_Static) const; |
| |
| - std::string getCompilerRTBasename(const llvm::opt::ArgList &Args, |
| - StringRef Component, |
| - FileType Type = ToolChain::FT_Static, |
| - bool AddArch = true) const; |
| + virtual std::string |
| + getCompilerRTBasename(const llvm::opt::ArgList &Args, StringRef Component, |
| + FileType Type = ToolChain::FT_Static, |
| + bool AddArch = true) const; |
| |
| // Returns target specific runtime path if it exists. |
| virtual Optional<std::string> getRuntimePath() const; |
| @@ -435,7 +435,7 @@ public: |
| std::string getArchSpecificLibPath() const; |
| |
| // Returns <OSname> part of above. |
| - StringRef getOSLibName() const; |
| + virtual StringRef getOSLibName() const; |
| |
| /// needsProfileRT - returns true if instrumentation profile is on. |
| static bool needsProfileRT(const llvm::opt::ArgList &Args); |
| diff --git a/clang/lib/Driver/ToolChains/BareMetal.cpp b/clang/lib/Driver/ToolChains/BareMetal.cpp |
| index 6ed81c1e34a..9df42061e12 100644 |
| --- a/clang/lib/Driver/ToolChains/BareMetal.cpp |
| +++ b/clang/lib/Driver/ToolChains/BareMetal.cpp |
| @@ -35,8 +35,6 @@ BareMetal::BareMetal(const Driver &D, const llvm::Triple &Triple, |
| 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 && |
| @@ -64,6 +62,13 @@ Tool *BareMetal::buildLinker() const { |
| return new tools::baremetal::Linker(*this); |
| } |
| |
| +std::string BareMetal::getCompilerRTPath() const { return getRuntimesDir(); } |
| + |
| +std::string BareMetal::getCompilerRTBasename(const llvm::opt::ArgList &, |
| + StringRef, FileType, bool) const { |
| + return ("libclang_rt.builtins-" + getTriple().getArchName() + ".a").str(); |
| +} |
| + |
| std::string BareMetal::getRuntimesDir() const { |
| SmallString<128> Dir(getDriver().ResourceDir); |
| llvm::sys::path::append(Dir, "lib", "baremetal"); |
| diff --git a/clang/lib/Driver/ToolChains/BareMetal.h b/clang/lib/Driver/ToolChains/BareMetal.h |
| index 4c0c739307b..0be9377134c 100644 |
| --- a/clang/lib/Driver/ToolChains/BareMetal.h |
| +++ b/clang/lib/Driver/ToolChains/BareMetal.h |
| @@ -23,7 +23,7 @@ class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain { |
| 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: |
| @@ -37,6 +37,14 @@ public: |
| bool isPICDefaultForced() const override { return false; } |
| bool SupportsProfiling() const override { return false; } |
| |
| + StringRef getOSLibName() const override { return "baremetal"; } |
| + |
| + std::string getCompilerRTPath() const override; |
| + std::string getCompilerRTBasename(const llvm::opt::ArgList &Args, |
| + StringRef Component, |
| + FileType Type = ToolChain::FT_Static, |
| + bool AddArch = true) const override; |
| + |
| RuntimeLibType GetDefaultRuntimeLibType() const override { |
| return ToolChain::RLT_CompilerRT; |
| } |
| diff --git a/clang/test/Driver/print-libgcc-file-name-clangrt.c b/clang/test/Driver/print-libgcc-file-name-clangrt.c |
| index 74a88e565bb..ac921ec38b1 100644 |
| --- a/clang/test/Driver/print-libgcc-file-name-clangrt.c |
| +++ b/clang/test/Driver/print-libgcc-file-name-clangrt.c |
| @@ -42,3 +42,9 @@ |
| // 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-armv7m.a |