summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/ToolChains/CommonArgs.cpp
diff options
context:
space:
mode:
authorSterling Augustine <saugustine@google.com>2018-08-31 17:59:03 +0000
committerSterling Augustine <saugustine@google.com>2018-08-31 17:59:03 +0000
commit1c04e1f552f0027f0d8e8b5c9bb9674e8ab2c5ea (patch)
tree7884c000a95c373840f6d3a7182731e66ede561c /clang/lib/Driver/ToolChains/CommonArgs.cpp
parentc1dceee50b9ed73d9e6ed8b5dc5e3336316bd07e (diff)
downloadbcm5719-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.cpp43
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
OpenPOWER on IntegriCloud