From: Shantonu Sen Date: Fri, 17 Sep 2010 18:39:08 +0000 (+0000) Subject: Driver: implement driver automagic support for -lcc_kext X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7433fedce98a58341d0f30c2e12e8d53f3bba575;p=clang Driver: implement driver automagic support for -lcc_kext 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 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index c00e93fdbf..8b78220fe8 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -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; +def Z_reserved_lib_cckext : Flag<"-Z-reserved-lib-cckext">, + Flags<[LinkerInput, NoArgumentUnused, Unsupported]>, Group; diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 5113fa2920..e96259257a 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -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 diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index e24f017ceb..86e1161169 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -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); diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index 98109fdd46..755202ae38 100644 --- a/lib/Driver/ToolChain.cpp +++ b/lib/Driver/ToolChain.cpp @@ -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"); +} diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index dbb2a9f3d2..5b4c93bb5b 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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()); diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 6062855265..3993cd2d3e 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -226,6 +226,9 @@ public: virtual void AddCXXStdlibLibArgs(const ArgList &Args, ArgStringList &CmdArgs) const; + virtual void AddCCKextLibArgs(const ArgList &Args, + ArgStringList &CmdArgs) const; + /// } }; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 028db8ca02..58f55655f1 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -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); }