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.

llvm-svn: 137120
This commit is contained in:
Douglas Gregor 2011-08-09 15:13:55 +00:00
parent 8769449b61
commit eda8e12e86
5 changed files with 28 additions and 19 deletions

View File

@ -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.

View File

@ -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;

View File

@ -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 <typename IdxForTypeTy>
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<BuiltinType>(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);
}

View File

@ -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");

View File

@ -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<typename Vector>
@ -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));
}