From: Ted Kremenek Date: Thu, 17 Apr 2008 21:38:34 +0000 (+0000) Subject: Generate the Preprocessor using a local PreprocessorFactory object. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a42cf2e309a038fd5d2d541f4662aaffe9a060c4;p=clang Generate the Preprocessor using a local PreprocessorFactory object. While this adds no extra functionality now, we will soon pass the PreprocessorFactory object to some ASTConsumers. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@49873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 307e49b4cb..cbd27259d7 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -1009,6 +1009,32 @@ static void InitializeIncludePaths(const char *Argv0, HeaderSearch &Headers, } } +//===----------------------------------------------------------------------===// +// Driver PreprocessorFactory - For lazily generating preprocessors ... +//===----------------------------------------------------------------------===// + +namespace { +class VISIBILITY_HIDDEN DriverPreprocessorFactory : public PreprocessorFactory { + Diagnostic &Diags; + const LangOptions &LangInfo; + TargetInfo &Target; + SourceManager &SourceMgr; + HeaderSearch &HeaderInfo; + +public: + DriverPreprocessorFactory(Diagnostic &diags, const LangOptions &opts, + TargetInfo &target, SourceManager &SM, + HeaderSearch &Headers) + : Diags(diags), LangInfo(opts), Target(target), + SourceMgr(SM), HeaderInfo(Headers) {} + + virtual ~DriverPreprocessorFactory() {} + + virtual Preprocessor* CreatePreprocessor() { + return new Preprocessor(Diags, LangInfo, Target, SourceMgr, HeaderInfo); + } +}; +} //===----------------------------------------------------------------------===// // Basic Parser driver @@ -1361,13 +1387,16 @@ int main(int argc, char **argv) { InitializeIncludePaths(argv[0], HeaderInfo, FileMgr, LangInfo); // Set up the preprocessor with these options. - Preprocessor PP(Diags, LangInfo, *Target, SourceMgr, HeaderInfo); + DriverPreprocessorFactory PPFactory(Diags, LangInfo, *Target, + SourceMgr, HeaderInfo); + llvm::OwningPtr PP(PPFactory.CreatePreprocessor()); + std::vector PredefineBuffer; - if (!InitializePreprocessor(PP, InFile, PredefineBuffer)) + if (!InitializePreprocessor(*PP, InFile, PredefineBuffer)) continue; - ProcessInputFile(PP, InFile); + ProcessInputFile(*PP, InFile); HeaderInfo.ClearFileInfo(); if (Stats)