[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