forked from OSchip/llvm-project
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:
parent
8769449b61
commit
eda8e12e86
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue