From 46157b59646e3fd4252747c679fda529b8bf46af Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 28 Jan 2009 04:29:29 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63175 91177308-0d34-0410-b5e6-96231b3b80d8 --- Driver/clang.cpp | 17 ++++++++++++--- include/clang/Sema/ParseAST.h | 11 ++++++---- lib/Sema/ParseAST.cpp | 40 +++++++++++++++++++---------------- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/Driver/clang.cpp b/Driver/clang.cpp index 51f4a5d1d8..bc548e4e8b 100644 --- a/Driver/clang.cpp +++ b/Driver/clang.cpp @@ -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)) diff --git a/include/clang/Sema/ParseAST.h b/include/clang/Sema/ParseAST.h index 91d7f1aa36..b18e5a6729 100644 --- a/include/clang/Sema/ParseAST.h +++ b/include/clang/Sema/ParseAST.h @@ -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 diff --git a/lib/Sema/ParseAST.cpp b/lib/Sema/ParseAST.cpp index 67af285315..6923476aeb 100644 --- a/lib/Sema/ParseAST.cpp +++ b/lib/Sema/ParseAST.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include #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 ContextOwner; + llvm::OwningPtr 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; - } } -- 2.40.0