Index: include/clang/Serialization/ASTReader.h =================================================================== --- include/clang/Serialization/ASTReader.h +++ include/clang/Serialization/ASTReader.h @@ -2098,8 +2098,7 @@ unsigned &Idx); /// \brief Reads attributes from the current stream position. - void ReadAttributes(ModuleFile &F, AttrVec &Attrs, - const RecordData &Record, unsigned &Idx); + void ReadAttributes(ASTRecordReader &Record, AttrVec &Attrs); /// \brief Reads a statement. Stmt *ReadStmt(ModuleFile &F); @@ -2284,6 +2283,14 @@ /// \brief Reads a sub-expression operand during statement reading. Expr *ReadSubExpr() { return Reader->ReadSubExpr(); } + /// \brief Reads a declaration with the given local ID in the given module. + /// + /// \returns The requested declaration, casted to the given return type. + template + T *GetLocalDeclAs(uint32_t LocalID) { + return cast_or_null(Reader->GetLocalDecl(*F, LocalID)); + } + /// \brief Reads a TemplateArgumentLocInfo appropriate for the /// given TemplateArgument kind, advancing Idx. TemplateArgumentLocInfo @@ -2455,7 +2462,7 @@ /// \brief Reads attributes from the current stream position, advancing Idx. void ReadAttributes(AttrVec &Attrs) { - return Reader->ReadAttributes(*F, Attrs, Record, Idx); + return Reader->ReadAttributes(*this, Attrs); } /// \brief Reads a token out of a record, advancing Idx. Index: lib/Serialization/ASTReaderDecl.cpp =================================================================== --- lib/Serialization/ASTReaderDecl.cpp +++ lib/Serialization/ASTReaderDecl.cpp @@ -1830,7 +1830,7 @@ SourceLocation *StoredLocs = D->getTrailingObjects(); for (unsigned I = 0, N = Record.back(); I != N; ++I) StoredLocs[I] = ReadSourceLocation(); - (void)Record.readInt(); // The number of stored source locations. + Record.skipInts(1); // The number of stored source locations. } void ASTDeclReader::VisitAccessSpecDecl(AccessSpecDecl *D) { @@ -2470,12 +2470,11 @@ //===----------------------------------------------------------------------===// /// \brief Reads attributes from the current stream position. -void ASTReader::ReadAttributes(ModuleFile &F, AttrVec &Attrs, - const RecordData &Record, unsigned &Idx) { - for (unsigned i = 0, e = Record[Idx++]; i != e; ++i) { +void ASTReader::ReadAttributes(ASTRecordReader &Record, AttrVec &Attrs) { + for (unsigned i = 0, e = Record.readInt(); i != e; ++i) { Attr *New = nullptr; - attr::Kind Kind = (attr::Kind)Record[Idx++]; - SourceRange Range = ReadSourceRange(F, Record, Idx); + attr::Kind Kind = (attr::Kind)Record.readInt(); + SourceRange Range = Record.ReadSourceRange(); #include "clang/Serialization/AttrPCHRead.inc" Index: utils/TableGen/ClangAttrEmitter.cpp =================================================================== --- utils/TableGen/ClangAttrEmitter.cpp +++ utils/TableGen/ClangAttrEmitter.cpp @@ -90,13 +90,13 @@ static std::string ReadPCHRecord(StringRef type) { return StringSwitch(type) - .EndsWith("Decl *", "GetLocalDeclAs<" - + std::string(type, 0, type.size()-1) + ">(F, Record[Idx++])") - .Case("TypeSourceInfo *", "GetTypeSourceInfo(F, Record, Idx)") - .Case("Expr *", "ReadExpr(F)") - .Case("IdentifierInfo *", "GetIdentifierInfo(F, Record, Idx)") - .Case("StringRef", "ReadString(Record, Idx)") - .Default("Record[Idx++]"); + .EndsWith("Decl *", "Record.GetLocalDeclAs<" + + std::string(type, 0, type.size()-1) + ">(Record.readInt())") + .Case("TypeSourceInfo *", "Record.GetTypeSourceInfo()") + .Case("Expr *", "Record.ReadExpr()") + .Case("IdentifierInfo *", "Record.GetIdentifierInfo()") + .Case("StringRef", "Record.ReadString()") + .Default("Record.readInt()"); } // Get a type that is suitable for storing an object of the specified type. @@ -414,7 +414,7 @@ void writePCHReadDecls(raw_ostream &OS) const override { OS << " std::string " << getLowerName() - << "= ReadString(Record, Idx);\n"; + << "= Record.ReadString();\n"; } void writePCHReadArgs(raw_ostream &OS) const override { @@ -540,13 +540,13 @@ } void writePCHReadDecls(raw_ostream &OS) const override { - OS << " bool is" << getLowerName() << "Expr = Record[Idx++];\n"; + OS << " bool is" << getLowerName() << "Expr = Record.readInt();\n"; OS << " void *" << getLowerName() << "Ptr;\n"; OS << " if (is" << getLowerName() << "Expr)\n"; - OS << " " << getLowerName() << "Ptr = ReadExpr(F);\n"; + OS << " " << getLowerName() << "Ptr = Record.ReadExpr();\n"; OS << " else\n"; OS << " " << getLowerName() - << "Ptr = GetTypeSourceInfo(F, Record, Idx);\n"; + << "Ptr = Record.GetTypeSourceInfo();\n"; } void writePCHWrite(raw_ostream &OS) const override { @@ -659,7 +659,7 @@ } void writePCHReadDecls(raw_ostream &OS) const override { - OS << " unsigned " << getLowerName() << "Size = Record[Idx++];\n"; + OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n"; OS << " SmallVector<" << getType() << ", 4> " << getLowerName() << ";\n"; OS << " " << getLowerName() << ".reserve(" << getLowerName() @@ -784,7 +784,7 @@ void writePCHReadDecls(raw_ostream &OS) const override { OS << " " << getAttrName() << "Attr::" << type << " " << getLowerName() << "(static_cast<" << getAttrName() << "Attr::" << type - << ">(Record[Idx++]));\n"; + << ">(Record.readInt()));\n"; } void writePCHReadArgs(raw_ostream &OS) const override { @@ -907,14 +907,14 @@ } void writePCHReadDecls(raw_ostream &OS) const override { - OS << " unsigned " << getLowerName() << "Size = Record[Idx++];\n"; + OS << " unsigned " << getLowerName() << "Size = Record.readInt();\n"; OS << " SmallVector<" << QualifiedTypeName << ", 4> " << getLowerName() << ";\n"; OS << " " << getLowerName() << ".reserve(" << getLowerName() << "Size);\n"; OS << " for (unsigned i = " << getLowerName() << "Size; i; --i)\n"; OS << " " << getLowerName() << ".push_back(" << "static_cast<" - << QualifiedTypeName << ">(Record[Idx++]));\n"; + << QualifiedTypeName << ">(Record.readInt()));\n"; } void writePCHWrite(raw_ostream &OS) const override { @@ -997,7 +997,7 @@ void writePCHReadDecls(raw_ostream &OS) const override { OS << " VersionTuple " << getLowerName() - << "= ReadVersionTuple(Record, Idx);\n"; + << "= Record.ReadVersionTuple();\n"; } void writePCHReadArgs(raw_ostream &OS) const override { @@ -2127,9 +2127,9 @@ OS << " case attr::" << R.getName() << ": {\n"; if (R.isSubClassOf(InhClass)) - OS << " bool isInherited = Record[Idx++];\n"; - OS << " bool isImplicit = Record[Idx++];\n"; - OS << " unsigned Spelling = Record[Idx++];\n"; + OS << " bool isInherited = Record.readInt();\n"; + OS << " bool isImplicit = Record.readInt();\n"; + OS << " unsigned Spelling = Record.readInt();\n"; ArgRecords = R.getValueAsListOfDefs("Args"); Args.clear(); for (const auto *Arg : ArgRecords) {