diff options
author | Sterling Augustine <saugustine@google.com> | 2018-08-31 17:59:03 +0000 |
---|---|---|
committer | Sterling Augustine <saugustine@google.com> | 2018-08-31 17:59:03 +0000 |
commit | 1c04e1f552f0027f0d8e8b5c9bb9674e8ab2c5ea (patch) | |
tree | 7884c000a95c373840f6d3a7182731e66ede561c /clang/lib/Driver/ToolChains/CommonArgs.cpp | |
parent | c1dceee50b9ed73d9e6ed8b5dc5e3336316bd07e (diff) | |
download | bcm5719-llvm-1c04e1f552f0027f0d8e8b5c9bb9674e8ab2c5ea.tar.gz bcm5719-llvm-1c04e1f552f0027f0d8e8b5c9bb9674e8ab2c5ea.zip |
Refactor Addlibgcc to make the when and what logic more straightfoward.
Add Android tests.
llvm-svn: 341231
Diffstat (limited to 'clang/lib/Driver/ToolChains/CommonArgs.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/CommonArgs.cpp | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/clang/lib/Driver/ToolChains/CommonArgs.cpp b/clang/lib/Driver/ToolChains/CommonArgs.cpp index 1e093b25b90..9e6aeea9581 100644 --- a/clang/lib/Driver/ToolChains/CommonArgs.cpp +++ b/clang/lib/Driver/ToolChains/CommonArgs.cpp @@ -1126,23 +1126,42 @@ static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, bool IsIAMCU = Triple.isOSIAMCU(); bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) || Args.hasArg(options::OPT_static); - if (!D.CCCIsCXX()) + + // The driver ignores -shared-libgcc and therefore treats such cases as + // unspecified. Breaking out the two variables as below makes the current + // behavior explicit. + bool UnspecifiedLibgcc = !StaticLibgcc; + bool SharedLibgcc = !StaticLibgcc; + + // 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. + + bool LibGccFirst = (D.CCCIsCC() && UnspecifiedLibgcc) || StaticLibgcc; + if (LibGccFirst) CmdArgs.push_back("-lgcc"); - if (StaticLibgcc || isAndroid) { - if (D.CCCIsCXX()) - CmdArgs.push_back("-lgcc"); - } else { - if (!D.CCCIsCXX() && !isCygMing) - CmdArgs.push_back("--as-needed"); + bool AsNeeded = D.CCCIsCC() && !StaticLibgcc && !isAndroid && !isCygMing; + if (AsNeeded) + CmdArgs.push_back("--as-needed"); + + if ((UnspecifiedLibgcc || SharedLibgcc) && !isAndroid) CmdArgs.push_back("-lgcc_s"); - if (!D.CCCIsCXX() && !isCygMing) - CmdArgs.push_back("--no-as-needed"); - } - if (StaticLibgcc && !isAndroid && !IsIAMCU) + else if (StaticLibgcc && !isAndroid && !IsIAMCU) CmdArgs.push_back("-lgcc_eh"); - else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX()) + + if (AsNeeded) + CmdArgs.push_back("--no-as-needed"); + + if (!LibGccFirst) CmdArgs.push_back("-lgcc"); // According to Android ABI, we have to link with libdl if we are |