]> granicus.if.org Git - clang/commitdiff
Driver/DarwinClang: The new toolchain definition is going to drop the -L inside
authorDaniel Dunbar <daniel@zuster.org>
Fri, 17 Sep 2010 01:16:06 +0000 (01:16 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Fri, 17 Sep 2010 01:16:06 +0000 (01:16 +0000)
the GCC dir. Unfortunately, this breaks -lstdc++ on SnowLeopard, etc. because
the libstdc++ dylib was hiding there. Workaround this by providing the path to
the right -lstdc++.6 (the only version used in recent memory) if we can't see an
obvious -lstdc++, but can find = -lstdc++.6.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114146 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h

index f5b45595fda43ab051ceef798c6373a93d775e63..865f290422812ab0f4862a442b5ebbc699aaef63 100644 (file)
@@ -578,6 +578,52 @@ void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
   setTarget(iPhoneVersion, Major, Minor, Micro);
 }
 
+void DarwinClang::AddClangCXXStdlibLibArgs(const ArgList &Args,
+                                      ArgStringList &CmdArgs) const {
+  CXXStdlibType Type = GetCXXStdlibType(Args);
+
+  switch (Type) {
+  case ToolChain::CST_Libcxx:
+    CmdArgs.push_back("-lc++");
+    break;
+
+  case ToolChain::CST_Libstdcxx: {
+    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
+    // it was previously found in the gcc lib dir. However, for all the Darwin
+    // platforms we care about it was -lstdc++.6, so we search for that
+    // explicitly if we can't see an obvious -lstdc++ candidate.
+
+    // Check in the sysroot first.
+    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
+      llvm::sys::Path P(A->getValue(Args));
+      P.appendComponent("usr");
+      P.appendComponent("lib");
+      P.appendComponent("libstdc++.dylib");
+
+      if (!P.exists()) {
+        P.eraseComponent();
+        P.appendComponent("libstdc++.6.dylib");
+        if (P.exists()) {
+          CmdArgs.push_back(Args.MakeArgString(P.str()));
+          return;
+        }
+      }
+    }
+
+    // Otherwise, look in the root.
+    if (!llvm::sys::Path("/usr/lib/libstdc++.dylib").exists() &&
+        llvm::sys::Path("/usr/lib/libstdc++.6.dylib").exists()) {
+      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
+      return;
+    }
+
+    // Otherwise, let the linker search.
+    CmdArgs.push_back("-lstdc++");
+    break;
+  }
+  }
+}
+
 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
                                       const char *BoundArch) const {
   DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
index 587bf60de8f5a69ed317654abe3e7a46f51322bd..f806e9f21570d61b8ddb8bb73a9390ae5a8419d9 100644 (file)
@@ -223,6 +223,9 @@ public:
   virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
                                      ArgStringList &CmdArgs) const;
 
+  virtual void AddClangCXXStdlibLibArgs(const ArgList &Args,
+                                        ArgStringList &CmdArgs) const;
+
   /// }
 };