diff options
author | Jonas Hahnfeld <Hahnfeld@itc.rwth-aachen.de> | 2016-07-27 08:15:54 +0000 |
---|---|---|
committer | Jonas Hahnfeld <Hahnfeld@itc.rwth-aachen.de> | 2016-07-27 08:15:54 +0000 |
commit | d196fa524fa483a6195f6f079b0ee82dba03db1f (patch) | |
tree | c49889501e16de7bc63ef8f8d0e35dd29d99ca96 /clang/lib/Driver | |
parent | 7094aa4f8d9cf64c56e07966b993c593bc8c73d8 (diff) | |
download | bcm5719-llvm-d196fa524fa483a6195f6f079b0ee82dba03db1f.tar.gz bcm5719-llvm-d196fa524fa483a6195f6f079b0ee82dba03db1f.zip |
Support setting default value for -rtlib at build time
This patch introduces a new cmake variable: CLANG_DEFAULT_RTLIB, thru
which we can specify a default value for -rtlib (libgcc or
compiler-rt) at build time, just like how we set the default C++
stdlib thru CLANG_DEFAULT_CXX_STDLIB.
With these two options, we can configure clang to build binaries on
Linux that have no runtime dependence on any gcc libs (libstdc++ or
libgcc_s).
Patch by Lei Zhang!
Differential Revision: https://reviews.llvm.org/D22663
llvm-svn: 276848
Diffstat (limited to 'clang/lib/Driver')
-rw-r--r-- | clang/lib/Driver/ToolChain.cpp | 22 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.cpp | 23 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.h | 2 |
3 files changed, 29 insertions, 18 deletions
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp index 66b76cda14a..91b364128c9 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -534,15 +534,19 @@ void ToolChain::addProfileRTLibs(const llvm::Triple &EffectiveTriple, ToolChain::RuntimeLibType ToolChain::GetRuntimeLibType( const ArgList &Args) const { - if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) { - StringRef Value = A->getValue(); - if (Value == "compiler-rt") - return ToolChain::RLT_CompilerRT; - if (Value == "libgcc") - return ToolChain::RLT_Libgcc; - getDriver().Diag(diag::err_drv_invalid_rtlib_name) - << A->getAsString(Args); - } + const Arg* A = Args.getLastArg(options::OPT_rtlib_EQ); + StringRef LibName = A ? A->getValue() : CLANG_DEFAULT_RTLIB; + + // "platform" is only used in tests to override CLANG_DEFAULT_RTLIB + if (LibName == "compiler-rt") + return ToolChain::RLT_CompilerRT; + else if (LibName == "libgcc") + return ToolChain::RLT_Libgcc; + else if (LibName == "platform") + return GetDefaultRuntimeLibType(); + + if (A) + getDriver().Diag(diag::err_drv_invalid_rtlib_name) << A->getAsString(Args); return GetDefaultRuntimeLibType(); } diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index f05261aef30..610285e1f40 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -403,18 +403,23 @@ void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args, /*AddRPath*/ true); } +ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType( + const ArgList &Args) const { + if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) { + StringRef Value = A->getValue(); + if (Value != "compiler-rt") + getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) + << Value << "darwin"; + } + + return ToolChain::RLT_CompilerRT; +} + void DarwinClang::AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple, const ArgList &Args, ArgStringList &CmdArgs) const { - // Darwin only supports the compiler-rt based runtime libraries. - switch (GetRuntimeLibType(Args)) { - case ToolChain::RLT_CompilerRT: - break; - default: - getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform) - << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin"; - return; - } + // Call once to ensure diagnostic is printed if wrong value was specified + GetRuntimeLibType(Args); // Darwin doesn't support real static executables, don't link any runtime // libraries with -static. diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 25dae72ca86..d36a799b580 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -575,6 +575,8 @@ public: /// @name Apple ToolChain Implementation /// { + RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override; + void AddLinkRuntimeLibArgs(const llvm::Triple &EffectiveTriple, const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override; |