]> granicus.if.org Git - clang/commitdiff
Generate the Preprocessor using a local PreprocessorFactory object.
authorTed Kremenek <kremenek@apple.com>
Thu, 17 Apr 2008 21:38:34 +0000 (21:38 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 17 Apr 2008 21:38:34 +0000 (21:38 +0000)
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

Driver/clang.cpp

index 307e49b4cb97376ff8869e8ad8d073dac4d7bca6..cbd27259d752f1d3a087bb898d212710b44043d0 100644 (file)
@@ -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<Preprocessor> PP(PPFactory.CreatePreprocessor());
+            
       std::vector<char> PredefineBuffer;
-      if (!InitializePreprocessor(PP, InFile, PredefineBuffer))
+      if (!InitializePreprocessor(*PP, InFile, PredefineBuffer))
         continue;
       
-      ProcessInputFile(PP, InFile);
+      ProcessInputFile(*PP, InFile);
       HeaderInfo.ClearFileInfo();
       
       if (Stats)