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.

llvm-svn: 63175
This commit is contained in:
Ted Kremenek 2009-01-28 04:29:29 +00:00
parent 02b47b5e7a
commit 062115af59
3 changed files with 43 additions and 25 deletions

View File

@ -1418,9 +1418,20 @@ static void ProcessInputFile(Preprocessor &PP, PreprocessorFactory &PPF,
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))

View File

@ -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

View File

@ -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 @@ using namespace clang;
/// 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 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,
if (PrintStats) {
fprintf(stderr, "\nSTATISTICS:\n");
P.getActions().PrintStats();
Context->PrintStats();
TU->getContext().PrintStats();
Decl::PrintStats();
Stmt::PrintStats();
Consumer->PrintStats();
@ -76,9 +85,4 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,
Decl::CollectingStats(false);
Stmt::CollectingStats(false);
}
if (FreeMemory) {
delete TU;
delete Context;
}
}