зеркало из https://github.com/microsoft/clang.git
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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@57643 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
1e6759e9e3
Коммит
d3db401518
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче