diff options
author | Sterling Augustine <saugustine@google.com> | 2019-01-28 18:56:43 +0000 |
---|---|---|
committer | Sterling Augustine <saugustine@google.com> | 2019-01-28 18:56:43 +0000 |
commit | 9490fcc1919e7e24bd411b1e72802c171881be55 (patch) | |
tree | 99aaa1c043ae6f05e00ef95b7d31d4a033c66e8f /clang/lib/Driver/ToolChains/CommonArgs.cpp | |
parent | 586d949b9c554d5e5b7b445a49c122ce3d0e5c53 (diff) | |
download | bcm5719-llvm-9490fcc1919e7e24bd411b1e72802c171881be55.tar.gz bcm5719-llvm-9490fcc1919e7e24bd411b1e72802c171881be55.zip |
Add --unwindlib=[libgcc|compiler-rt] to parallel --rtlib=
Summary:
"clang++ hello.cc --rtlib=compiler-rt"
now works without specifying additional unwind or exception
handling libraries.
Reviewers: rsmith
Subscribers: srhines, dberris, aheejin, llvm-commits
Differential Revision: https://reviews.llvm.org/D57128
llvm-svn: 352404
Diffstat (limited to 'clang/lib/Driver/ToolChains/CommonArgs.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/CommonArgs.cpp | 86 |
1 files changed, 58 insertions, 28 deletions
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 1161e8158d5..909dc101059 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1131,41 +1131,70 @@ bool tools::isObjCAutoRefCount(const ArgList &Args) { return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false); } -static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, - ArgStringList &CmdArgs, const ArgList &Args) { - bool isAndroid = Triple.isAndroid(); - bool isCygMing = Triple.isOSCygMing(); - bool IsIAMCU = Triple.isOSIAMCU(); - bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || - Args.hasArg(options::OPT_static); +enum class LibGccType { UnspecifiedLibGcc, StaticLibGcc, SharedLibGcc }; + +static LibGccType getLibGccType(const ArgList &Args) { + bool Static = Args.hasArg(options::OPT_static_libgcc) || + Args.hasArg(options::OPT_static); + + bool Shared = Args.hasArg(options::OPT_shared_libgcc); + if (Shared) + return LibGccType::SharedLibGcc; + if (Static) + return LibGccType::StaticLibGcc; + return LibGccType::UnspecifiedLibGcc; +} - bool SharedLibgcc = Args.hasArg(options::OPT_shared_libgcc); - bool UnspecifiedLibgcc = !StaticLibgcc && !SharedLibgcc; +static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, + ArgStringList &CmdArgs, const ArgList &Args) { + // Targets that don't use unwind libraries. + if (TC.getTriple().isAndroid() || TC.getTriple().isOSIAMCU() || + TC.getTriple().isOSBinFormatWasm()) + return; - // Gcc adds libgcc arguments in various ways: - // - // gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed - // g++ <none>: -lgcc_s -lgcc - // gcc shared: -lgcc_s -lgcc - // g++ shared: -lgcc_s -lgcc - // gcc static: -lgcc -lgcc_eh - // g++ static: -lgcc -lgcc_eh - // - // Also, certain targets need additional adjustments. + ToolChain::RuntimeLibType UNW = TC.GetUnwindLibType(Args); + switch (UNW) { + case ToolChain::RLT_Libgcc: { + LibGccType LGT = getLibGccType(Args); + if (LGT == LibGccType::UnspecifiedLibGcc || LGT == LibGccType::SharedLibGcc) + CmdArgs.push_back("-lgcc_s"); + else if (LGT == LibGccType::StaticLibGcc) + CmdArgs.push_back("-lgcc_eh"); + break; + } + case ToolChain::RLT_CompilerRT: + CmdArgs.push_back("-lunwind"); + break; + } +} + +// Gcc adds libgcc arguments in various ways: +// +// gcc <none>: -lgcc --as-needed -lgcc_s --no-as-needed +// g++ <none>: -lgcc_s -lgcc +// gcc shared: -lgcc_s -lgcc +// g++ shared: -lgcc_s -lgcc +// gcc static: -lgcc -lgcc_eh +// g++ static: -lgcc -lgcc_eh +// +// Also, certain targets need additional adjustments. + +static void AddLibgcc(const ToolChain &TC, const Driver &D, + ArgStringList &CmdArgs, const ArgList &Args) { + bool isAndroid = TC.getTriple().isAndroid(); + LibGccType LGT = getLibGccType(Args); - bool LibGccFirst = (D.CCCIsCC() && UnspecifiedLibgcc) || StaticLibgcc; + bool LibGccFirst = (D.CCCIsCC() && LGT == LibGccType::UnspecifiedLibGcc) || + LGT == LibGccType::StaticLibGcc; if (LibGccFirst) CmdArgs.push_back("-lgcc"); - bool AsNeeded = D.CCCIsCC() && UnspecifiedLibgcc && !isAndroid && !isCygMing; + bool AsNeeded = D.CCCIsCC() && LGT == LibGccType::UnspecifiedLibGcc && + !isAndroid && !TC.getTriple().isOSCygMing(); if (AsNeeded) CmdArgs.push_back("--as-needed"); - if ((UnspecifiedLibgcc || SharedLibgcc) && !isAndroid) - CmdArgs.push_back("-lgcc_s"); - - else if (StaticLibgcc && !isAndroid && !IsIAMCU) - CmdArgs.push_back("-lgcc_eh"); + AddUnwindLibrary(TC, D, CmdArgs, Args); if (AsNeeded) CmdArgs.push_back("--no-as-needed"); @@ -1178,7 +1207,7 @@ static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, // // NOTE: This fixes a link error on Android MIPS as well. The non-static // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl. - if (isAndroid && !StaticLibgcc) + if (isAndroid && LGT != LibGccType::StaticLibGcc) CmdArgs.push_back("-ldl"); } @@ -1190,6 +1219,7 @@ void tools::AddRunTimeLibs(const ToolChain &TC, const Driver &D, switch (RLT) { case ToolChain::RLT_CompilerRT: CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins")); + AddUnwindLibrary(TC, D, CmdArgs, Args); break; case ToolChain::RLT_Libgcc: // Make sure libgcc is not used under MSVC environment by default @@ -1201,7 +1231,7 @@ void tools::AddRunTimeLibs(const ToolChain &TC, const Driver &D, << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "MSVC"; } } else - AddLibgcc(TC.getTriple(), D, CmdArgs, Args); + AddLibgcc(TC, D, CmdArgs, Args); break; } } |