]> granicus.if.org Git - clang/commitdiff
Driver: implement driver automagic support for -lcc_kext
authorShantonu Sen <ssen@apple.com>
Fri, 17 Sep 2010 18:39:08 +0000 (18:39 +0000)
committerShantonu Sen <ssen@apple.com>
Fri, 17 Sep 2010 18:39:08 +0000 (18:39 +0000)
Rewrite linker arguments to use libclang_rt.cc_kext.a
instead of gcc-specific libcc_kext.a

Resolves Radar 7808495

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

include/clang/Driver/Options.td
include/clang/Driver/ToolChain.h
lib/Driver/Driver.cpp
lib/Driver/ToolChain.cpp
lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h
lib/Driver/Tools.cpp

index c00e93fdbfde803743e04a483fecf627e5b08966..8b78220fe8c8074ffa57b7efec4811d9c0684e20 100644 (file)
@@ -749,3 +749,5 @@ def Z_Xlinker__no_demangle : Flag<"-Z-Xlinker-no-demangle">, Flags<[Unsupported,
 // Reserved library options.
 def Z_reserved_lib_stdcxx : Flag<"-Z-reserved-lib-stdc++">,
     Flags<[LinkerInput, NoArgumentUnused, Unsupported]>, Group<reserved_lib_Group>;
+def Z_reserved_lib_cckext : Flag<"-Z-reserved-lib-cckext">,
+    Flags<[LinkerInput, NoArgumentUnused, Unsupported]>, Group<reserved_lib_Group>;
index 5113fa29209ae92aa82a16a07e78e26caa01f86a..e96259257a9adeea494416c3dbc0823ff507e4ef 100644 (file)
@@ -177,6 +177,11 @@ public:
   /// for the given C++ standard library type.
   virtual void AddCXXStdlibLibArgs(const ArgList &Args,
                                    ArgStringList &CmdArgs) const;
+
+  /// AddCCKextLibArgs - Add the system specific linker arguments to use
+  /// for kernel extensions (Darwin-specific).
+  virtual void AddCCKextLibArgs(const ArgList &Args,
+                                ArgStringList &CmdArgs) const;
 };
 
 } // end namespace driver
index e24f017ceb5032bed737a39de868038d05fd452b..86e1161169c49f07b0ae49fb45a9af189f4562bf 100644 (file)
@@ -158,15 +158,23 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
       continue;
     }
 
-    // Rewrite reserved library names, unless -nostdlib is present.
-    if (!HasNostdlib && A->getOption().matches(options::OPT_l)) {
+    // Rewrite reserved library names.
+    if (A->getOption().matches(options::OPT_l)) {
       llvm::StringRef Value = A->getValue(Args);
 
-      if (Value == "stdc++") {
+      // Rewrite unless -nostdlib is present.
+      if (!HasNostdlib && Value == "stdc++") {
         DAL->AddFlagArg(A, Opts->getOption(
                               options::OPT_Z_reserved_lib_stdcxx));
         continue;
       }
+
+      // Rewrite unconditionally.
+      if (Value == "cc_kext") {
+        DAL->AddFlagArg(A, Opts->getOption(
+                              options::OPT_Z_reserved_lib_cckext));
+        continue;
+      }
     }
 
     DAL->append(*it);
index 98109fdd464458ac0b398c8b55802c366717549d..755202ae38897398df4d967f58111bb2ca416a1b 100644 (file)
@@ -222,3 +222,8 @@ void ToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
     break;
   }
 }
+
+void ToolChain::AddCCKextLibArgs(const ArgList &Args,
+                                 ArgStringList &CmdArgs) const {
+  CmdArgs.push_back("-lcc_kext");
+}
index dbb2a9f3d24edf319c14f6c8da8c840a239ef88d..5b4c93bb5b8dca7fdaf4921a980003ff8ed780eb 100644 (file)
@@ -644,6 +644,27 @@ void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
   }
 }
 
+void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
+                                   ArgStringList &CmdArgs) const {
+
+  // For Darwin platforms, use the compiler-rt-based support library
+  // instead of the gcc-provided one (which is also incidentally
+  // only present in the gcc lib dir, which makes it hard to find).
+
+  llvm::sys::Path P(getDriver().ResourceDir);
+  P.appendComponent("lib");
+  P.appendComponent("darwin");
+  P.appendComponent("libclang_rt.cc_kext.a");
+  
+  // For now, allow missing resource libraries to support developers who may
+  // not have compiler-rt checked out or integrated into their build.
+  if (!P.exists())
+    getDriver().Diag(clang::diag::warn_drv_missing_resource_library)
+      << P.str();
+  else
+    CmdArgs.push_back(Args.MakeArgString(P.str()));
+}
+
 DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
                                       const char *BoundArch) const {
   DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
index 60628552651a8b856b6472305cac39ad14de4b5a..3993cd2d3ecd615746a5b7b09771f1c8ab82649b 100644 (file)
@@ -226,6 +226,9 @@ public:
   virtual void AddCXXStdlibLibArgs(const ArgList &Args,
                                    ArgStringList &CmdArgs) const;
 
+  virtual void AddCCKextLibArgs(const ArgList &Args,
+                                ArgStringList &CmdArgs) const;
+
   /// }
 };
 
index 028db8ca0255141f3cb896d1c0741e7ebc586678..58f55655f1f3852e788d50b86b38cac4caee204e 100644 (file)
@@ -116,6 +116,8 @@ static void AddLinkerInputs(const ToolChain &TC,
     // Handle reserved library options.
     if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
       TC.AddCXXStdlibLibArgs(Args, CmdArgs);
+    } else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext)) {
+      TC.AddCCKextLibArgs(Args, CmdArgs);
     } else
       A.renderAsInput(Args, CmdArgs);
   }