From: Douglas Gregor Date: Tue, 9 Aug 2011 15:13:55 +0000 (+0000) Subject: Migrate the serialization of ASTContext's AutoDeduceTy and X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b8043b49aff6e5d70f29ef5684214ce2473763c;p=clang Migrate the serialization of ASTContext's AutoDeduceTy and AutoRRefDeductTy from the "special types" block to predefined types. The latter behaves better when loading multiple AST files. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@137120 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Serialization/ASTBitCodes.h b/include/clang/Serialization/ASTBitCodes.h index 55d0ddbbc5..d9b845c88b 100644 --- a/include/clang/Serialization/ASTBitCodes.h +++ b/include/clang/Serialization/ASTBitCodes.h @@ -530,7 +530,11 @@ namespace clang { /// \brief The 'unknown any' placeholder type. PREDEF_TYPE_UNKNOWN_ANY = 29, /// \brief The placeholder type for bound member functions. - PREDEF_TYPE_BOUND_MEMBER = 30 + PREDEF_TYPE_BOUND_MEMBER = 30, + /// \brief The "auto" deduction type. + PREDEF_TYPE_AUTO_DEDUCT = 31, + /// \brief The "auto &&" deduction type. + PREDEF_TYPE_AUTO_RREF_DEDUCT = 32 }; /// \brief The number of predefined type IDs that are reserved for @@ -667,11 +671,7 @@ namespace clang { /// \brief NSConstantString type SPECIAL_TYPE_NS_CONSTANT_STRING = 15, /// \brief Whether __[u]int128_t identifier is installed. - SPECIAL_TYPE_INT128_INSTALLED = 16, - /// \brief Cached "auto" deduction type. - SPECIAL_TYPE_AUTO_DEDUCT = 17, - /// \brief Cached "auto &&" deduction type. - SPECIAL_TYPE_AUTO_RREF_DEDUCT = 18 + SPECIAL_TYPE_INT128_INSTALLED = 16 }; /// \brief Predefined declaration IDs. diff --git a/include/clang/Serialization/ASTWriter.h b/include/clang/Serialization/ASTWriter.h index a9c7213934..6f4ebfbfc4 100644 --- a/include/clang/Serialization/ASTWriter.h +++ b/include/clang/Serialization/ASTWriter.h @@ -88,6 +88,9 @@ private: /// \brief The bitstream writer used to emit this precompiled header. llvm::BitstreamWriter &Stream; + /// \brief The ASTContext we're writing. + ASTContext *Context; + /// \brief The reader of existing AST files, if we're chaining. ASTReader *Chain; @@ -457,7 +460,7 @@ public: serialization::TypeID getTypeID(QualType T) const; /// \brief Force a type to be emitted and get its index. - serialization::TypeIdx GetOrCreateTypeIdx(QualType T); + serialization::TypeIdx GetOrCreateTypeIdx( QualType T); /// \brief Determine the type index of an already-emitted type. serialization::TypeIdx getTypeIdx(QualType T) const; diff --git a/lib/Serialization/ASTCommon.h b/lib/Serialization/ASTCommon.h index 838df13f2d..367f57f715 100644 --- a/lib/Serialization/ASTCommon.h +++ b/lib/Serialization/ASTCommon.h @@ -15,6 +15,7 @@ #define LLVM_CLANG_SERIALIZATION_LIB_AST_COMMON_H #include "clang/Serialization/ASTBitCodes.h" +#include "clang/AST/ASTContext.h" namespace clang { @@ -31,7 +32,7 @@ enum DeclUpdateKind { TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT); template -TypeID MakeTypeID(QualType T, IdxForTypeTy IdxForType) { +TypeID MakeTypeID(ASTContext &Context, QualType T, IdxForTypeTy IdxForType) { if (T.isNull()) return PREDEF_TYPE_NULL_ID; @@ -46,6 +47,11 @@ TypeID MakeTypeID(QualType T, IdxForTypeTy IdxForType) { if (const BuiltinType *BT = dyn_cast(T.getTypePtr())) return TypeIdxFromBuiltin(BT).asTypeID(FastQuals); + if (T == Context.AutoDeductTy) + return TypeIdx(PREDEF_TYPE_AUTO_DEDUCT).asTypeID(FastQuals); + if (T == Context.AutoRRefDeductTy) + return TypeIdx(PREDEF_TYPE_AUTO_RREF_DEDUCT).asTypeID(FastQuals); + return IdxForType(T).asTypeID(FastQuals); } diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 0482636fc0..9659f46f17 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -3046,11 +3046,6 @@ void ASTReader::InitializeContext(ASTContext &Ctx) { if (SpecialTypes[SPECIAL_TYPE_INT128_INSTALLED]) Context->setInt128Installed(); - - if (unsigned AutoDeduct = SpecialTypes[SPECIAL_TYPE_AUTO_DEDUCT]) - Context->AutoDeductTy = GetType(AutoDeduct); - if (unsigned AutoRRefDeduct = SpecialTypes[SPECIAL_TYPE_AUTO_RREF_DEDUCT]) - Context->AutoRRefDeductTy = GetType(AutoRRefDeduct); } ReadPragmaDiagnosticMappings(Context->getDiagnostics()); @@ -4033,6 +4028,11 @@ QualType ASTReader::GetType(TypeID ID) { case PREDEF_TYPE_OBJC_ID: T = Context->ObjCBuiltinIdTy; break; case PREDEF_TYPE_OBJC_CLASS: T = Context->ObjCBuiltinClassTy; break; case PREDEF_TYPE_OBJC_SEL: T = Context->ObjCBuiltinSelTy; break; + case PREDEF_TYPE_AUTO_DEDUCT: T = Context->getAutoDeductType(); break; + + case PREDEF_TYPE_AUTO_RREF_DEDUCT: + T = Context->getAutoRRefDeductType(); + break; } assert(!T.isNull() && "Unknown predefined type"); diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index f23a0cdce9..256bf9da3e 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -2754,7 +2754,7 @@ void ASTWriter::SetSelectorOffset(Selector Sel, uint32_t Offset) { } ASTWriter::ASTWriter(llvm::BitstreamWriter &Stream) - : Stream(Stream), Chain(0), SerializationListener(0), + : Stream(Stream), Context(0), Chain(0), SerializationListener(0), FirstDeclID(NUM_PREDEF_DECL_IDS), NextDeclID(FirstDeclID), FirstTypeID(NUM_PREDEF_TYPE_IDS), NextTypeID(FirstTypeID), FirstIdentID(NUM_PREDEF_IDENT_IDS), NextIdentID(FirstIdentID), @@ -2785,10 +2785,12 @@ void ASTWriter::WriteAST(Sema &SemaRef, MemorizeStatCalls *StatCalls, WriteBlockInfoBlock(); + Context = &SemaRef.Context; if (Chain) WriteASTChain(SemaRef, StatCalls, isysroot); else WriteASTCore(SemaRef, StatCalls, isysroot, OutputFile); + Context = 0; } template @@ -2943,8 +2945,6 @@ void ASTWriter::WriteASTCore(Sema &SemaRef, MemorizeStatCalls *StatCalls, AddTypeRef(Context.ObjCSelRedefinitionType, SpecialTypes); AddTypeRef(Context.getRawNSConstantStringType(), SpecialTypes); SpecialTypes.push_back(Context.isInt128Installed()); - AddTypeRef(Context.AutoDeductTy, SpecialTypes); - AddTypeRef(Context.AutoRRefDeductTy, SpecialTypes); // Keep writing types and declarations until all types and // declarations have been written. @@ -3500,13 +3500,13 @@ void ASTWriter::AddTypeRef(QualType T, RecordDataImpl &Record) { Record.push_back(GetOrCreateTypeID(T)); } -TypeID ASTWriter::GetOrCreateTypeID(QualType T) { - return MakeTypeID(T, +TypeID ASTWriter::GetOrCreateTypeID( QualType T) { + return MakeTypeID(*Context, T, std::bind1st(std::mem_fun(&ASTWriter::GetOrCreateTypeIdx), this)); } TypeID ASTWriter::getTypeID(QualType T) const { - return MakeTypeID(T, + return MakeTypeID(*Context, T, std::bind1st(std::mem_fun(&ASTWriter::getTypeIdx), this)); }