Add --disable-free flag to clang.

- Disables the freeing of the ASTContext and the TranslationUnit
   after parsing & sema.
 - Primarily for timing the impact on -fsyntax-only timings.

llvm-svn: 57643
This commit is contained in:
Daniel Dunbar 2008-10-16 16:54:18 +00:00
parent 89656d2298
commit 33d29b3eae
3 changed files with 31 additions and 14 deletions

View File

@ -54,13 +54,17 @@ using namespace clang;
// Global options.
//===----------------------------------------------------------------------===//
bool HadErrors = false;
static bool HadErrors = false;
static llvm::cl::opt<bool>
Verbose("v", llvm::cl::desc("Enable verbose output"));
static llvm::cl::opt<bool>
Stats("print-stats",
llvm::cl::desc("Print performance metrics and statistics"));
static llvm::cl::opt<bool>
DisableFree("disable-free",
llvm::cl::desc("Disable freeing of memory on exit"),
llvm::cl::init(false));
enum ProgActions {
RewriteObjC, // ObjC->C Rewriter.
@ -1187,7 +1191,7 @@ static void ProcessInputFile(Preprocessor &PP, PreprocessorFactory &PPF,
if (VerifyDiagnostics)
exit(CheckASTConsumer(PP, Consumer.get()));
ParseAST(PP, Consumer.get(), Stats);
ParseAST(PP, Consumer.get(), Stats, !DisableFree);
} else {
if (VerifyDiagnostics)
exit(CheckDiagnostics(PP));

View File

@ -21,7 +21,11 @@ namespace clang {
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
/// the file is parsed. This takes ownership of the ASTConsumer and
/// ultimately deletes it.
void ParseAST(Preprocessor &pp, ASTConsumer *C, bool PrintStats = false);
///
/// \param FreeMemory If false, the memory used for AST elements is
/// not released.
void ParseAST(Preprocessor &pp, ASTConsumer *C,
bool PrintStats = false, bool FreeMemory = true);
} // end namespace clang

View File

@ -26,26 +26,30 @@ using namespace clang;
/// ParseAST - Parse the entire file specified, notifying the ASTConsumer as
/// the file is parsed. This takes ownership of the ASTConsumer and
/// ultimately deletes it.
void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) {
///
/// \param FreeMemory If false, the memory used for AST elements is
/// not released.
void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer,
bool PrintStats, bool FreeMemory) {
// Collect global stats on Decls/Stmts (until we have a module streamer).
if (PrintStats) {
Decl::CollectingStats(true);
Stmt::CollectingStats(true);
}
ASTContext Context(PP.getLangOptions(), PP.getSourceManager(),
PP.getTargetInfo(),
PP.getIdentifierTable(), PP.getSelectorTable());
TranslationUnit TU(Context);
Sema S(PP, Context, *Consumer);
ASTContext *Context =
new ASTContext(PP.getLangOptions(), PP.getSourceManager(),
PP.getTargetInfo(),
PP.getIdentifierTable(), PP.getSelectorTable());
TranslationUnit *TU = new TranslationUnit(*Context);
Sema S(PP, *Context, *Consumer);
Parser P(PP, S);
PP.EnterMainSourceFile();
// Initialize the parser.
P.Initialize();
Consumer->InitializeTU(TU);
Consumer->InitializeTU(*TU);
Parser::DeclTy *ADecl;
@ -55,17 +59,17 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) {
// skipping something.
if (ADecl) {
Decl* D = static_cast<Decl*>(ADecl);
TU.AddTopLevelDecl(D); // TranslationUnit now owns the Decl.
TU->AddTopLevelDecl(D); // TranslationUnit now owns the Decl.
Consumer->HandleTopLevelDecl(D);
}
};
Consumer->HandleTranslationUnit(TU);
Consumer->HandleTranslationUnit(*TU);
if (PrintStats) {
fprintf(stderr, "\nSTATISTICS:\n");
P.getActions().PrintStats();
Context.PrintStats();
Context->PrintStats();
Decl::PrintStats();
Stmt::PrintStats();
Consumer->PrintStats();
@ -73,4 +77,9 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) {
Decl::CollectingStats(false);
Stmt::CollectingStats(false);
}
if (FreeMemory) {
delete TU;
delete Context;
}
}