diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-04-18 00:34:01 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-04-18 00:34:01 +0000 |
| commit | 111af7d7b4e19c6395767746a3f970e24db4c24d (patch) | |
| tree | a95811bfac5f65c77980e28ed769f12041911895 /clang/lib | |
| parent | e34fb6b5cee017ab4617356d62be87062856599b (diff) | |
| download | bcm5719-llvm-111af7d7b4e19c6395767746a3f970e24db4c24d.tar.gz bcm5719-llvm-111af7d7b4e19c6395767746a3f970e24db4c24d.zip | |
Preliminary PCH support in the driver
llvm-svn: 69410
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Driver/Driver.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 55 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.h | 5 |
3 files changed, 53 insertions, 17 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 5afcefe68d3..67e92c21b3b 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -45,7 +45,7 @@ Driver::Driver(const char *_Name, const char *_Dir, Host(0), CCCIsCXX(false), CCCEcho(false), CCCPrintBindings(false), CCCGenericGCCName("gcc"), CCCUseClang(true), CCCUseClangCXX(false), - CCCUseClangCPP(true), + CCCUseClangCPP(true), CCCUsePCH(false), SuppressMissingInputWarning(false) { // Only use clang on i386 and x86_64 by default. @@ -142,6 +142,10 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) { } else if (!strcmp(Opt, "clang-cxx")) { CCCUseClangCXX = true; + } else if (!strcmp(Opt, "pch-is-pch")) { + CCCUsePCH = true; + } else if (!strcmp(Opt, "pch-is-pth")) { + CCCUsePCH = false; } else if (!strcmp(Opt, "no-clang")) { CCCUseClang = false; } else if (!strcmp(Opt, "no-clang-cpp")) { @@ -287,6 +291,10 @@ void Driver::PrintHelp(bool ShowHidden) const { OptionHelp.push_back(std::make_pair("-ccc-clang-archs", "Comma separate list of architectures " "to use the clang compiler for")); + OptionHelp.push_back(std::make_pair("-ccc-pch-is-pch", + "Use lazy PCH for precompiled headers")); + OptionHelp.push_back(std::make_pair("-ccc-pch-is-pth", + "Use pretokenized headers for precompiled headers")); OptionHelp.push_back(std::make_pair("\nDEBUG/DEVELOPMENT OPTIONS:","")); OptionHelp.push_back(std::make_pair("-ccc-host-triple", diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index ad83fe7e8e2..825614288a7 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -31,7 +31,8 @@ using namespace clang::driver; using namespace clang::driver::tools; -void Clang::AddPreprocessingOptions(const ArgList &Args, +void Clang::AddPreprocessingOptions(const Driver &D, + const ArgList &Args, ArgStringList &CmdArgs, const InputInfo &Output, const InputInfoList &Inputs) const { @@ -94,10 +95,11 @@ void Clang::AddPreprocessingOptions(const ArgList &Args, // FIXME: Use iterator. - // Add -i* options, and automatically translate to -include-pth for - // transparent PCH support. It's wonky, but we include looking for - // .gch so we can support seamless replacement into a build system - // already set up to be generating .gch files. + // Add -i* options, and automatically translate to + // -include-pch/-include-pth for transparent PCH support. It's + // wonky, but we include looking for .gch so we can support seamless + // replacement into a build system already set up to be generating + // .gch files. for (ArgList::const_iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) { const Arg *A = *it; @@ -106,20 +108,40 @@ void Clang::AddPreprocessingOptions(const ArgList &Args, if (A->getOption().matches(options::OPT_include)) { bool FoundPTH = false; + bool FoundPCH = false; llvm::sys::Path P(A->getValue(Args)); - P.appendSuffix("pth"); - if (P.exists()) { - FoundPTH = true; - } else { - P.eraseSuffix(); - P.appendSuffix("gch"); + if (D.CCCUsePCH) { + P.appendSuffix("pch"); if (P.exists()) + FoundPCH = true; + else + P.eraseSuffix(); + } + + if (!FoundPCH) { + P.appendSuffix("pth"); + if (P.exists()) FoundPTH = true; + else + P.eraseSuffix(); + } + + if (!FoundPCH && !FoundPTH) { + P.appendSuffix("gch"); + if (P.exists()) { + FoundPCH = D.CCCUsePCH; + FoundPTH = !D.CCCUsePCH; + } + else + P.eraseSuffix(); } - if (FoundPTH) { + if (FoundPCH || FoundPTH) { A->claim(); - CmdArgs.push_back("-include-pth"); + if (FoundPCH) + CmdArgs.push_back("-include-pch"); + else + CmdArgs.push_back("-include-pth"); CmdArgs.push_back(Args.MakeArgString(P.c_str())); continue; } @@ -168,7 +190,10 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, else CmdArgs.push_back("-E"); } else if (isa<PrecompileJobAction>(JA)) { - CmdArgs.push_back("-emit-pth"); + if (D.CCCUsePCH) + CmdArgs.push_back("-emit-pch"); + else + CmdArgs.push_back("-emit-pth"); } else { assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool."); @@ -380,7 +405,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // FIXME: Support -fpreprocessed types::ID InputType = Inputs[0].getType(); if (types::getPreprocessedType(InputType) != types::TY_INVALID) - AddPreprocessingOptions(Args, CmdArgs, Output, Inputs); + AddPreprocessingOptions(D, Args, CmdArgs, Output, Inputs); // Manually translate -O to -O1 and -O4 to -O3; let clang reject // others. diff --git a/clang/lib/Driver/Tools.h b/clang/lib/Driver/Tools.h index 7be2706c0bb..8b66495f30c 100644 --- a/clang/lib/Driver/Tools.h +++ b/clang/lib/Driver/Tools.h @@ -18,6 +18,8 @@ namespace clang { namespace driver { + class Driver; + namespace toolchains { class Darwin_X86; } @@ -25,7 +27,8 @@ namespace toolchains { namespace tools { class VISIBILITY_HIDDEN Clang : public Tool { - void AddPreprocessingOptions(const ArgList &Args, + void AddPreprocessingOptions(const Driver &D, + const ArgList &Args, ArgStringList &CmdArgs, const InputInfo &Output, const InputInfoList &Inputs) const; |

