From 380df93fd642693c5c8ef78a2c0b266405152179 Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Sat, 31 May 2008 20:11:04 +0000 Subject: [PATCH] Added "InitializeTU" to ASTConsumer. This is used by Sema::ParseAST to pass a TranslationUnit object instead of an ASTContext. By default it calls Initialize(ASTConstext& Context) (to match with the current interface used by most ASTConsumers). Modified the ObjC-Rewriter to use InitializeTU, and to tell the TranslationUnit to not free its Decls. This is a workaround for: llvm-svn: 51825 --- clang/Driver/ASTConsumers.cpp | 5 ++--- clang/Driver/RewriteObjC.cpp | 8 +++++++- clang/include/clang/AST/ASTConsumer.h | 3 +++ clang/lib/AST/ASTConsumer.cpp | 6 ++++++ clang/lib/Sema/ParseAST.cpp | 2 +- 5 files changed, 19 insertions(+), 5 deletions(-) diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index ba9fc90f0348..9ab6157cfaa3 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -877,9 +877,8 @@ public: virtual ~ASTSerializer() { delete TU; } - virtual void Initialize(ASTContext &Context) { - if (!TU) TU = new TranslationUnit(Context, lang); - TU->SetOwnsDecls(false); + virtual void InitializeTU(TranslationUnit &TU) { + TU.SetOwnsDecls(false); } virtual void HandleTopLevelDecl(Decl *D) { diff --git a/clang/Driver/RewriteObjC.cpp b/clang/Driver/RewriteObjC.cpp index c523b03d5682..f679e554d092 100644 --- a/clang/Driver/RewriteObjC.cpp +++ b/clang/Driver/RewriteObjC.cpp @@ -15,6 +15,7 @@ #include "clang/Rewrite/Rewriter.h" #include "clang/AST/AST.h" #include "clang/AST/ASTConsumer.h" +#include "clang/AST/TranslationUnit.h" #include "clang/Basic/SourceManager.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/Diagnostic.h" @@ -94,7 +95,12 @@ namespace { static const int OBJC_ABI_VERSION =7 ; public: - void Initialize(ASTContext &context); + virtual void Initialize(ASTContext &context); + + virtual void InitializeTU(TranslationUnit &TU) { + TU.SetOwnsDecls(false); + Initialize(TU.getContext()); + } // Top Level Driver code. diff --git a/clang/include/clang/AST/ASTConsumer.h b/clang/include/clang/AST/ASTConsumer.h index bfaa141573ee..c08f97e64094 100644 --- a/clang/include/clang/AST/ASTConsumer.h +++ b/clang/include/clang/AST/ASTConsumer.h @@ -16,6 +16,7 @@ namespace clang { class ASTContext; + class TranslationUnit; class Decl; class TagDecl; class HandleTagDeclDefinition; @@ -31,6 +32,8 @@ public: /// ASTContext. virtual void Initialize(ASTContext &Context) {} + virtual void InitializeTU(TranslationUnit& TU); + /// HandleTopLevelDecl - Handle the specified top-level declaration. This is /// called by HandleTopLevelDeclaration to process every top-level Decl*. virtual void HandleTopLevelDecl(Decl *D) {} diff --git a/clang/lib/AST/ASTConsumer.cpp b/clang/lib/AST/ASTConsumer.cpp index b3d12710927a..3f92990f3609 100644 --- a/clang/lib/AST/ASTConsumer.cpp +++ b/clang/lib/AST/ASTConsumer.cpp @@ -13,6 +13,8 @@ #include "clang/AST/ASTConsumer.h" #include "clang/AST/Decl.h" +#include "clang/AST/TranslationUnit.h" + using namespace clang; ASTConsumer::~ASTConsumer() {} @@ -26,3 +28,7 @@ void ASTConsumer::HandleTopLevelDeclaration(Decl* d) { else HandleTopLevelDecl(d); } + +void ASTConsumer::InitializeTU(TranslationUnit& TU) { + Initialize(TU.getContext()); +} diff --git a/clang/lib/Sema/ParseAST.cpp b/clang/lib/Sema/ParseAST.cpp index cff3ef7612e8..9199179af74d 100644 --- a/clang/lib/Sema/ParseAST.cpp +++ b/clang/lib/Sema/ParseAST.cpp @@ -46,7 +46,7 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) { // Initialize the parser. P.Initialize(); - Consumer->Initialize(Context); + Consumer->InitializeTU(TU); Parser::DeclTy *ADecl;