[cfe-commits] r63175 - in /cfe/trunk: Driver/clang.cpp include/clang/Sema/ParseAST.h lib/Sema/ParseAST.cpp

Ted Kremenek kremenek at apple.com
Tue Jan 27 20:29:31 PST 2009


Author: kremenek
Date: Tue Jan 27 22:29:29 2009
New Revision: 63175

URL: http://llvm.org/viewvc/llvm-project?rev=63175&view=rev
Log:
Patch by Alexei Svitkine: Refactor Sema::ParseAST API to allow clients to pass as an argument a TranslationUnit object whose contents live beyond the call to ParseAST.

Modified:
    cfe/trunk/Driver/clang.cpp
    cfe/trunk/include/clang/Sema/ParseAST.h
    cfe/trunk/lib/Sema/ParseAST.cpp

Modified: cfe/trunk/Driver/clang.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Driver/clang.cpp?rev=63175&r1=63174&r2=63175&view=diff

==============================================================================
--- cfe/trunk/Driver/clang.cpp (original)
+++ cfe/trunk/Driver/clang.cpp Tue Jan 27 22:29:29 2009
@@ -1418,9 +1418,20 @@
     ClearSourceMgr = true;
     break;
   }
-  
-  if (Consumer)
-    ParseAST(PP, Consumer.get(), Stats, !DisableFree);
+
+  if (Consumer) {
+    TranslationUnit *TU = 0;
+    if (DisableFree) {
+      ASTContext *Context = new ASTContext(PP.getLangOptions(),
+                                           PP.getSourceManager(),
+                                           PP.getTargetInfo(),
+                                           PP.getIdentifierTable(),
+                                           PP.getSelectorTable(),
+                                           /* FreeMemory = */ false);
+      TU = new TranslationUnit(*Context);
+    }
+    ParseAST(PP, Consumer.get(), TU, Stats);
+  }
 
   if (VerifyDiagnostics)
     if (CheckDiagnostics(PP))

Modified: cfe/trunk/include/clang/Sema/ParseAST.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Sema/ParseAST.h?rev=63175&r1=63174&r2=63175&view=diff

==============================================================================
--- cfe/trunk/include/clang/Sema/ParseAST.h (original)
+++ cfe/trunk/include/clang/Sema/ParseAST.h Tue Jan 27 22:29:29 2009
@@ -17,14 +17,17 @@
 namespace clang {
   class Preprocessor;
   class ASTConsumer;
-  
+  class TranslationUnit;
+
   /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
   /// the file is parsed.
   ///
-  /// \param FreeMemory If false, the memory used for AST elements is
-  /// not released.
+  /// \param TU If 0, then memory used for AST elements will be allocated only
+  /// for the duration of the ParseAST() call. In this case, the client should
+  /// not access any AST elements after ParseAST() returns.
   void ParseAST(Preprocessor &pp, ASTConsumer *C, 
-                bool PrintStats = false, bool FreeMemory = true);
+                TranslationUnit *TU = 0,
+                bool PrintStats = false);
 
 }  // end namespace clang
 

Modified: cfe/trunk/lib/Sema/ParseAST.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/ParseAST.cpp?rev=63175&r1=63174&r2=63175&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/ParseAST.cpp (original)
+++ cfe/trunk/lib/Sema/ParseAST.cpp Tue Jan 27 22:29:29 2009
@@ -11,6 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <llvm/ADT/OwningPtr.h>
 #include "clang/Sema/ParseAST.h"
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/Stmt.h"
@@ -26,23 +27,31 @@
 /// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
 /// the file is parsed.
 ///
-/// \param FreeMemory If false, the memory used for AST elements is
-/// not released.
-void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, 
-                     bool PrintStats, bool FreeMemory) {
+/// \param TU If 0, then memory used for AST elements will be allocated only
+/// for the duration of the ParseAST() call. In this case, the client should
+/// not access any AST elements after ParseAST() returns.
+void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,
+                     TranslationUnit *TU, bool PrintStats) {
   // Collect global stats on Decls/Stmts (until we have a module streamer).
   if (PrintStats) {
     Decl::CollectingStats(true);
     Stmt::CollectingStats(true);
   }
-  
-  ASTContext *Context = 
-    new ASTContext(PP.getLangOptions(), PP.getSourceManager(),
-                   PP.getTargetInfo(),
-                   PP.getIdentifierTable(), PP.getSelectorTable(),
-                   FreeMemory);
-  TranslationUnit *TU = new TranslationUnit(*Context);
-  Sema S(PP, *Context, *Consumer);
+
+  llvm::OwningPtr<ASTContext> ContextOwner;
+  llvm::OwningPtr<TranslationUnit> TranslationUnitOwner;
+  if (TU == 0) {
+    ASTContext *Context = new ASTContext(PP.getLangOptions(),
+                                         PP.getSourceManager(),
+                                         PP.getTargetInfo(),
+                                         PP.getIdentifierTable(),
+                                         PP.getSelectorTable());
+    ContextOwner.reset(Context);
+    TU = new TranslationUnit(*Context);
+    TranslationUnitOwner.reset(TU);
+  }
+
+  Sema S(PP, TU->getContext(), *Consumer);
   Parser P(PP, S);
   PP.EnterMainSourceFile();
     
@@ -68,7 +77,7 @@
   if (PrintStats) {
     fprintf(stderr, "\nSTATISTICS:\n");
     P.getActions().PrintStats();
-    Context->PrintStats();
+    TU->getContext().PrintStats();
     Decl::PrintStats();
     Stmt::PrintStats();
     Consumer->PrintStats();
@@ -76,9 +85,4 @@
     Decl::CollectingStats(false);
     Stmt::CollectingStats(false);
   }
-
-  if (FreeMemory) {
-    delete TU;
-    delete Context;      
-  }
 }





More information about the cfe-commits mailing list