diff options
-rw-r--r-- | clang/Driver/ASTConsumers.cpp | 21 | ||||
-rw-r--r-- | clang/Driver/ASTConsumers.h | 6 | ||||
-rw-r--r-- | clang/Driver/SerializationTest.cpp | 26 | ||||
-rw-r--r-- | clang/Driver/clang.cpp | 8 | ||||
-rw-r--r-- | clang/include/clang/AST/ASTContext.h | 19 | ||||
-rw-r--r-- | clang/include/clang/AST/TranslationUnit.h | 11 | ||||
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 8 | ||||
-rw-r--r-- | clang/lib/AST/TranslationUnit.cpp | 12 | ||||
-rw-r--r-- | clang/lib/Sema/ParseAST.cpp | 5 |
9 files changed, 53 insertions, 63 deletions
diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index 9ab6157cfaa..5d45f312e2e 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -868,12 +868,10 @@ namespace { class ASTSerializer : public ASTConsumer { protected: Diagnostic &Diags; - const LangOptions& lang; TranslationUnit* TU; public: - ASTSerializer(Diagnostic& diags, const LangOptions& LO) - : Diags(diags), lang(LO), TU(0) {} + ASTSerializer(Diagnostic& diags) : Diags(diags), TU(0) {} virtual ~ASTSerializer() { delete TU; } @@ -892,9 +890,8 @@ public: class SingleFileSerializer : public ASTSerializer { const llvm::sys::Path FName; public: - SingleFileSerializer(const llvm::sys::Path& F, Diagnostic &diags, - const LangOptions &LO) - : ASTSerializer(diags,LO), FName(F) {} + SingleFileSerializer(const llvm::sys::Path& F, Diagnostic &diags) + : ASTSerializer(diags), FName(F) {} ~SingleFileSerializer() { EmitASTBitcodeFile(TU, FName); @@ -904,9 +901,8 @@ public: class BuildSerializer : public ASTSerializer { llvm::sys::Path EmitDir; public: - BuildSerializer(const llvm::sys::Path& dir, Diagnostic &diags, - const LangOptions &LO) - : ASTSerializer(diags,LO), EmitDir(dir) {} + BuildSerializer(const llvm::sys::Path& dir, Diagnostic &diags) + : ASTSerializer(diags), EmitDir(dir) {} ~BuildSerializer() { @@ -950,8 +946,7 @@ public: ASTConsumer* clang::CreateASTSerializer(const std::string& InFile, const std::string& OutputFile, - Diagnostic &Diags, - const LangOptions &Features) { + Diagnostic &Diags) { if (OutputFile.size()) { if (InFile == "-") { @@ -982,7 +977,7 @@ ASTConsumer* clang::CreateASTSerializer(const std::string& InFile, // FIXME: We should probably only allow using BuildSerializer when // the ASTs come from parsed source files, and not from .ast files. - return new BuildSerializer(EmitDir, Diags, Features); + return new BuildSerializer(EmitDir, Diags); } // The user did not specify an output directory for serialized ASTs. @@ -991,5 +986,5 @@ ASTConsumer* clang::CreateASTSerializer(const std::string& InFile, llvm::sys::Path FName(InFile.c_str()); FName.appendSuffix("ast"); - return new SingleFileSerializer(FName, Diags, Features); + return new SingleFileSerializer(FName, Diags); } diff --git a/clang/Driver/ASTConsumers.h b/clang/Driver/ASTConsumers.h index 7037ade1ddf..ca93e0fbf9a 100644 --- a/clang/Driver/ASTConsumers.h +++ b/clang/Driver/ASTConsumers.h @@ -67,13 +67,11 @@ ASTConsumer* CreateHTMLPrinter(const std::string &OutFile, Diagnostic &D, Preprocessor *PP, PreprocessorFactory* PPF); ASTConsumer *CreateSerializationTest(Diagnostic &Diags, - FileManager& FMgr, - const LangOptions &LOpts); + FileManager& FMgr); ASTConsumer *CreateASTSerializer(const std::string& InFile, const std::string& EmitDir, - Diagnostic &Diags, - const LangOptions &LOpts); + Diagnostic &Diags); } // end clang namespace diff --git a/clang/Driver/SerializationTest.cpp b/clang/Driver/SerializationTest.cpp index 5f7b94fca40..946a4c87d6a 100644 --- a/clang/Driver/SerializationTest.cpp +++ b/clang/Driver/SerializationTest.cpp @@ -33,26 +33,16 @@ using namespace clang; namespace { class SerializationTest : public ASTConsumer { - llvm::OwningPtr<TranslationUnit> TU; + TranslationUnit* TU; Diagnostic &Diags; FileManager &FMgr; - const LangOptions& lopts; public: - SerializationTest(Diagnostic &d, FileManager& fmgr, const LangOptions& LOpts) - : Diags(d), FMgr(fmgr), lopts(LOpts) {} + SerializationTest(Diagnostic &d, FileManager& fmgr) + : TU(0), Diags(d), FMgr(fmgr) {} ~SerializationTest(); - virtual void Initialize(ASTContext& context) { - if (!TU) { - TU.reset(new TranslationUnit(context, lopts)); - TU->SetOwnsDecls(false); - } - } - - virtual void HandleTopLevelDecl(Decl *D) { - TU->AddTopLevelDecl(D); - } + virtual void InitializeTU(TranslationUnit& tu) { TU = &tu; } private: bool Serialize(llvm::sys::Path& Filename, llvm::sys::Path& FNameDeclPrint); @@ -62,10 +52,8 @@ private: } // end anonymous namespace ASTConsumer* -clang::CreateSerializationTest(Diagnostic &Diags, FileManager& FMgr, - const LangOptions &LOpts) { - - return new SerializationTest(Diags,FMgr,LOpts); +clang::CreateSerializationTest(Diagnostic &Diags, FileManager& FMgr) { + return new SerializationTest(Diags, FMgr); } @@ -89,7 +77,7 @@ bool SerializationTest::Deserialize(llvm::sys::Path& Filename, llvm::sys::Path& FNameDeclPrint) { // Deserialize the translation unit. - TranslationUnit* NewTU = ReadASTBitcodeFile(Filename,FMgr); + TranslationUnit* NewTU = ReadASTBitcodeFile(Filename, FMgr); if (!NewTU) return false; diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 7a61145c66c..df41e54b32d 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -1189,7 +1189,7 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile, OutputFile, VisualizeEG, TrimGraph, AnalyzeAll); case TestSerialization: - return CreateSerializationTest(Diag, FileMgr, LangOpts); + return CreateSerializationTest(Diag, FileMgr); case EmitLLVM: case EmitBC: @@ -1198,7 +1198,7 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile, case SerializeAST: // FIXME: Allow user to tailor where the file is written. - return CreateASTSerializer(InFile, OutputFile, Diag, LangOpts); + return CreateASTSerializer(InFile, OutputFile, Diag); case RewriteObjC: return CreateCodeRewriterTest(InFile, OutputFile, Diag, LangOpts); @@ -1362,8 +1362,8 @@ static void ProcessSerializedFile(const std::string& InFile, Diagnostic& Diag, // translation unit, rather than InFile. llvm::Module *DestModule; llvm::OwningPtr<ASTConsumer> - Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOpts(), 0, 0, - DestModule)); + Consumer(CreateASTConsumer(InFile, Diag, FileMgr, TU->getLangOptions(), + 0, 0, DestModule)); if (!Consumer) { fprintf(stderr, "Unsupported program action with serialized ASTs!\n"); diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index dfe117053cf..cf04f949909 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -14,6 +14,7 @@ #ifndef LLVM_CLANG_AST_ASTCONTEXT_H #define LLVM_CLANG_AST_ASTCONTEXT_H +#include "clang/Basic/LangOptions.h" #include "clang/AST/Builtins.h" #include "clang/AST/Expr.h" #include "clang/AST/RecordLayout.h" @@ -77,15 +78,24 @@ class ASTContext { TranslationUnitDecl *TUDecl; + /// SourceMgr - The associated SourceManager object. SourceManager &SourceMgr; + + /// LangOpts - The language options used to create the AST associated with + /// this ASTContext object. + LangOptions LangOpts; + + /// Allocator - The allocator object used to create AST objects. llvm::MallocAllocator Allocator; + public: TargetInfo &Target; IdentifierTable &Idents; SelectorTable &Selectors; SourceManager& getSourceManager() { return SourceMgr; } - llvm::MallocAllocator &getAllocator() { return Allocator; } + llvm::MallocAllocator &getAllocator() { return Allocator; } + const LangOptions& getLangOptions() const { return LangOpts; } FullSourceLoc getFullLoc(SourceLocation Loc) const { return FullSourceLoc(Loc,SourceMgr); @@ -109,9 +119,10 @@ public: QualType FloatComplexTy, DoubleComplexTy, LongDoubleComplexTy; QualType VoidPtrTy; - ASTContext(SourceManager &SM, TargetInfo &t, IdentifierTable &idents, - SelectorTable &sels, unsigned size_reserve=0 ) : - CFConstantStringTypeDecl(0), SourceMgr(SM), Target(t), + ASTContext(const LangOptions& LOpts, SourceManager &SM, TargetInfo &t, + IdentifierTable &idents, SelectorTable &sels, + unsigned size_reserve=0 ) : + CFConstantStringTypeDecl(0), SourceMgr(SM), LangOpts(LOpts), Target(t), Idents(idents), Selectors(sels) { if (size_reserve > 0) Types.reserve(size_reserve); diff --git a/clang/include/clang/AST/TranslationUnit.h b/clang/include/clang/AST/TranslationUnit.h index 13b29c14a8f..c5f499b6791 100644 --- a/clang/include/clang/AST/TranslationUnit.h +++ b/clang/include/clang/AST/TranslationUnit.h @@ -13,7 +13,7 @@ #ifndef LLVM_CLANG_TRANSLATION_UNIT_H #define LLVM_CLANG_TRANSLATION_UNIT_H -#include "clang/Basic/LangOptions.h" +#include "clang/AST/ASTContext.h" #include "llvm/Bitcode/SerializationFwd.h" #include "llvm/System/Path.h" #include <vector> @@ -31,7 +31,6 @@ class Decl; class FileEntry; class TranslationUnit { - LangOptions LangOpts; ASTContext* Context; std::vector<Decl*> TopLevelDecls; bool OwnsMetaData; @@ -42,15 +41,13 @@ class TranslationUnit { OwnsDecls(true) {} public: - explicit TranslationUnit(ASTContext& Ctx, const LangOptions& lopt) - : LangOpts(lopt), Context(&Ctx), OwnsMetaData(false), - OwnsDecls(true) {} + explicit TranslationUnit(ASTContext& Ctx) + : Context(&Ctx), OwnsMetaData(false), OwnsDecls(true) {} void SetOwnsDecls(bool val) { OwnsDecls = val; } ~TranslationUnit(); - const LangOptions& getLangOpts() const { return LangOpts; } const std::string& getSourceFile() const; /// Emit - Emit the translation unit to an arbitray bitcode stream. @@ -60,7 +57,7 @@ public: static TranslationUnit* Create(llvm::Deserializer& D, FileManager& FMgr); // Accessors - const LangOptions& getLangOptions() const { return LangOpts; } + const LangOptions& getLangOptions() const { return Context->getLangOptions();} ASTContext& getContext() { return *Context; } const ASTContext& getContext() const { return *Context; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index a87efa7425e..2fe1f515c0c 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1701,6 +1701,7 @@ bool ASTContext::typesAreCompatible(QualType LHS_NC, QualType RHS_NC) { /// Emit - Serialize an ASTContext object to Bitcode. void ASTContext::Emit(llvm::Serializer& S) const { + S.Emit(LangOpts); S.EmitRef(SourceMgr); S.EmitRef(Target); S.EmitRef(Idents); @@ -1720,6 +1721,11 @@ void ASTContext::Emit(llvm::Serializer& S) const { } ASTContext* ASTContext::Create(llvm::Deserializer& D) { + + // Read the language options. + LangOptions LOpts; + LOpts.Read(D); + SourceManager &SM = D.ReadRef<SourceManager>(); TargetInfo &t = D.ReadRef<TargetInfo>(); IdentifierTable &idents = D.ReadRef<IdentifierTable>(); @@ -1727,7 +1733,7 @@ ASTContext* ASTContext::Create(llvm::Deserializer& D) { unsigned size_reserve = D.ReadInt(); - ASTContext* A = new ASTContext(SM,t,idents,sels,size_reserve); + ASTContext* A = new ASTContext(LOpts, SM, t, idents, sels, size_reserve); for (unsigned i = 0; i < size_reserve; ++i) Type::Create(*A,i,D); diff --git a/clang/lib/AST/TranslationUnit.cpp b/clang/lib/AST/TranslationUnit.cpp index f1505b06218..f8416f18fa1 100644 --- a/clang/lib/AST/TranslationUnit.cpp +++ b/clang/lib/AST/TranslationUnit.cpp @@ -124,16 +124,13 @@ void TranslationUnit::Emit(llvm::Serializer& Sezr) const { Sezr.EnterBlock(BasicMetadataBlock); - // Block for SourceManager, LangOptions, and Target. Allows easy skipping + // Block for SourceManager and Target. Allows easy skipping // around to the block for the Selectors during deserialization. Sezr.EnterBlock(); // Emit the SourceManager. Sezr.Emit(Context->getSourceManager()); - - // Emit the LangOptions. - Sezr.Emit(LangOpts); - + // Emit the Target. Sezr.EmitPtr(&Context->Target); Sezr.EmitCStr(Context->Target.getTargetTriple()); @@ -211,10 +208,7 @@ TranslationUnit* TranslationUnit::Create(llvm::Deserializer& Dezr, // Read the SourceManager. SourceManager::CreateAndRegister(Dezr,FMgr); - - // Read the LangOptions. - TU->LangOpts.Read(Dezr); - + { // Read the TargetInfo. llvm::SerializedPtrID PtrID = Dezr.ReadPtrID(); char* triple = Dezr.ReadCStr(NULL,0,true); diff --git a/clang/lib/Sema/ParseAST.cpp b/clang/lib/Sema/ParseAST.cpp index 9199179af74..67b6546637f 100644 --- a/clang/lib/Sema/ParseAST.cpp +++ b/clang/lib/Sema/ParseAST.cpp @@ -34,10 +34,11 @@ void clang::ParseAST(Preprocessor &PP, ASTConsumer *Consumer, bool PrintStats) { Stmt::CollectingStats(true); } - ASTContext Context(PP.getSourceManager(), PP.getTargetInfo(), + ASTContext Context(PP.getLangOptions(), PP.getSourceManager(), + PP.getTargetInfo(), PP.getIdentifierTable(), PP.getSelectorTable()); - TranslationUnit TU(Context, PP.getLangOptions()); + TranslationUnit TU(Context); Sema S(PP, Context, *Consumer); Parser P(PP, S); |