[clang] c2f1831 - Move ASTRecordReader into its own header; NFC.

John McCall via cfe-commits cfe-commits at lists.llvm.org
Sat Dec 14 00:28:32 PST 2019


Author: John McCall
Date: 2019-12-14T03:28:23-05:00
New Revision: c2f18315ff53006e44afe065368019e41cb98053

URL: https://github.com/llvm/llvm-project/commit/c2f18315ff53006e44afe065368019e41cb98053
DIFF: https://github.com/llvm/llvm-project/commit/c2f18315ff53006e44afe065368019e41cb98053.diff

LOG: Move ASTRecordReader into its own header; NFC.

AbstractBasicReader.h has quite a few dependencies already,
and that's only likely to increase.  Meanwhile, ASTRecordReader
is really an implementation detail of the ASTReader that is only
used in a small number of places.

I've kept it in a public header for the use of projects like Swift
that might want to plug in to Clang's serialization framework.

I've also moved OMPClauseReader into an implementation file,
although it can't be made private because of friendship.

Added: 
    clang/include/clang/Serialization/ASTRecordReader.h

Modified: 
    clang/include/clang/Serialization/ASTReader.h
    clang/lib/Serialization/ASTReader.cpp
    clang/lib/Serialization/ASTReaderDecl.cpp
    clang/lib/Serialization/ASTReaderStmt.cpp
    clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h
index 3f321f03d966..e74bf00e0872 100644
--- a/clang/include/clang/Serialization/ASTReader.h
+++ b/clang/include/clang/Serialization/ASTReader.h
@@ -13,26 +13,16 @@
 #ifndef LLVM_CLANG_SERIALIZATION_ASTREADER_H
 #define LLVM_CLANG_SERIALIZATION_ASTREADER_H
 
-#include "clang/AST/AbstractBasicReader.h"
-#include "clang/AST/DeclCXX.h"
-#include "clang/AST/DeclObjC.h"
-#include "clang/AST/DeclarationName.h"
-#include "clang/AST/NestedNameSpecifier.h"
-#include "clang/AST/OpenMPClause.h"
-#include "clang/AST/TemplateBase.h"
-#include "clang/AST/TemplateName.h"
 #include "clang/AST/Type.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticOptions.h"
 #include "clang/Basic/IdentifierTable.h"
-#include "clang/Basic/Module.h"
 #include "clang/Basic/OpenCLOptions.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/Version.h"
 #include "clang/Lex/ExternalPreprocessorSource.h"
 #include "clang/Lex/HeaderSearch.h"
 #include "clang/Lex/PreprocessingRecord.h"
-#include "clang/Lex/Token.h"
 #include "clang/Sema/ExternalSemaSource.h"
 #include "clang/Sema/IdentifierResolver.h"
 #include "clang/Serialization/ASTBitCodes.h"
@@ -40,9 +30,6 @@
 #include "clang/Serialization/ModuleFile.h"
 #include "clang/Serialization/ModuleFileExtension.h"
 #include "clang/Serialization/ModuleManager.h"
-#include "llvm/ADT/APFloat.h"
-#include "llvm/ADT/APInt.h"
-#include "llvm/ADT/APSInt.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseSet.h"
@@ -58,8 +45,6 @@
 #include "llvm/ADT/iterator.h"
 #include "llvm/ADT/iterator_range.h"
 #include "llvm/Bitstream/BitstreamReader.h"
-#include "llvm/Support/Casting.h"
-#include "llvm/Support/Endian.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Timer.h"
 #include "llvm/Support/VersionTuple.h"
@@ -83,6 +68,7 @@ class ASTReader;
 class ASTRecordReader;
 class CXXTemporary;
 class Decl;
+class DeclarationName;
 class DeclaratorDecl;
 class DeclContext;
 class EnumDecl;
@@ -112,9 +98,8 @@ class SourceManager;
 class Stmt;
 class SwitchCase;
 class TargetOptions;
-class TemplateParameterList;
+class Token;
 class TypedefNameDecl;
-class TypeSourceInfo;
 class ValueDecl;
 class VarDecl;
 
@@ -2280,341 +2265,6 @@ class ASTReader
   bool isProcessingUpdateRecords() { return ProcessingUpdateRecords; }
 };
 
-/// An object for streaming information from a record.
-class ASTRecordReader
-    : public serialization::DataStreamBasicReader<ASTRecordReader> {
-  using ModuleFile = serialization::ModuleFile;
-
-  ASTReader *Reader;
-  ModuleFile *F;
-  unsigned Idx = 0;
-  ASTReader::RecordData Record;
-
-  using RecordData = ASTReader::RecordData;
-  using RecordDataImpl = ASTReader::RecordDataImpl;
-
-public:
-  /// Construct an ASTRecordReader that uses the default encoding scheme.
-  ASTRecordReader(ASTReader &Reader, ModuleFile &F)
-    : DataStreamBasicReader(Reader.getContext()), Reader(&Reader), F(&F) {}
-
-  /// Reads a record with id AbbrevID from Cursor, resetting the
-  /// internal state.
-  Expected<unsigned> readRecord(llvm::BitstreamCursor &Cursor,
-                                unsigned AbbrevID);
-
-  /// Is this a module file for a module (rather than a PCH or similar).
-  bool isModule() const { return F->isModule(); }
-
-  /// Retrieve the AST context that this AST reader supplements.
-  ASTContext &getContext() { return Reader->getContext(); }
-
-  /// The current position in this record.
-  unsigned getIdx() const { return Idx; }
-
-  /// The length of this record.
-  size_t size() const { return Record.size(); }
-
-  /// An arbitrary index in this record.
-  const uint64_t &operator[](size_t N) { return Record[N]; }
-
-  /// Returns the last value in this record.
-  uint64_t back() { return Record.back(); }
-
-  /// Returns the current value in this record, and advances to the
-  /// next value.
-  uint64_t readInt() { return Record[Idx++]; }
-
-  ArrayRef<uint64_t> readIntArray(unsigned Len) {
-    auto Array = llvm::makeArrayRef(Record).slice(Idx, Len);
-    Idx += Len;
-    return Array;
-  }
-
-  /// Returns the current value in this record, without advancing.
-  uint64_t peekInt() { return Record[Idx]; }
-
-  /// Skips the specified number of values.
-  void skipInts(unsigned N) { Idx += N; }
-
-  /// Retrieve the global submodule ID its local ID number.
-  serialization::SubmoduleID
-  getGlobalSubmoduleID(unsigned LocalID) {
-    return Reader->getGlobalSubmoduleID(*F, LocalID);
-  }
-
-  /// Retrieve the submodule that corresponds to a global submodule ID.
-  Module *getSubmodule(serialization::SubmoduleID GlobalID) {
-    return Reader->getSubmodule(GlobalID);
-  }
-
-  /// Read the record that describes the lexical contents of a DC.
-  bool readLexicalDeclContextStorage(uint64_t Offset, DeclContext *DC) {
-    return Reader->ReadLexicalDeclContextStorage(*F, F->DeclsCursor, Offset,
-                                                 DC);
-  }
-
-  /// Read the record that describes the visible contents of a DC.
-  bool readVisibleDeclContextStorage(uint64_t Offset,
-                                     serialization::DeclID ID) {
-    return Reader->ReadVisibleDeclContextStorage(*F, F->DeclsCursor, Offset,
-                                                 ID);
-  }
-
-  ExplicitSpecifier readExplicitSpec() {
-    uint64_t Kind = readInt();
-    bool HasExpr = Kind & 0x1;
-    Kind = Kind >> 1;
-    return ExplicitSpecifier(HasExpr ? readExpr() : nullptr,
-                             static_cast<ExplicitSpecKind>(Kind));
-  }
-
-  /// Read information about an exception specification (inherited).
-  //FunctionProtoType::ExceptionSpecInfo
-  //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage);
-
-  /// Get the global offset corresponding to a local offset.
-  uint64_t getGlobalBitOffset(uint32_t LocalOffset) {
-    return Reader->getGlobalBitOffset(*F, LocalOffset);
-  }
-
-  /// Reads a statement.
-  Stmt *readStmt() { return Reader->ReadStmt(*F); }
-  Stmt *readStmtRef() { return readStmt(); /* FIXME: readSubStmt? */ }
-
-  /// Reads an expression.
-  Expr *readExpr() { return Reader->ReadExpr(*F); }
-
-  /// Reads a sub-statement operand during statement reading.
-  Stmt *readSubStmt() { return Reader->ReadSubStmt(); }
-
-  /// Reads a sub-expression operand during statement reading.
-  Expr *readSubExpr() { return Reader->ReadSubExpr(); }
-
-  /// Reads a declaration with the given local ID in the given module.
-  ///
-  /// \returns The requested declaration, casted to the given return type.
-  template<typename T>
-  T *GetLocalDeclAs(uint32_t LocalID) {
-    return cast_or_null<T>(Reader->GetLocalDecl(*F, LocalID));
-  }
-
-  /// Reads a TemplateArgumentLocInfo appropriate for the
-  /// given TemplateArgument kind, advancing Idx.
-  TemplateArgumentLocInfo
-  readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind);
-
-  /// Reads a TemplateArgumentLoc, advancing Idx.
-  TemplateArgumentLoc readTemplateArgumentLoc();
-
-  const ASTTemplateArgumentListInfo*
-  readASTTemplateArgumentListInfo();
-
-  /// Reads a declarator info from the given record, advancing Idx.
-  TypeSourceInfo *readTypeSourceInfo();
-
-  /// Reads the location information for a type.
-  void readTypeLoc(TypeLoc TL);
-
-
-  /// Map a local type ID within a given AST file to a global type ID.
-  serialization::TypeID getGlobalTypeID(unsigned LocalID) const {
-    return Reader->getGlobalTypeID(*F, LocalID);
-  }
-
-  Qualifiers readQualifiers() {
-    return Qualifiers::fromOpaqueValue(readInt());
-  }
-
-  /// Read a type from the current position in the record.
-  QualType readType() {
-    return Reader->readType(*F, Record, Idx);
-  }
-  QualType readQualType() {
-    return readType();
-  }
-
-  /// Reads a declaration ID from the given position in this record.
-  ///
-  /// \returns The declaration ID read from the record, adjusted to a global ID.
-  serialization::DeclID readDeclID() {
-    return Reader->ReadDeclID(*F, Record, Idx);
-  }
-
-  /// Reads a declaration from the given position in a record in the
-  /// given module, advancing Idx.
-  Decl *readDecl() {
-    return Reader->ReadDecl(*F, Record, Idx);
-  }
-  Decl *readDeclRef() {
-    return readDecl();
-  }
-
-  /// Reads a declaration from the given position in the record,
-  /// advancing Idx.
-  ///
-  /// \returns The declaration read from this location, casted to the given
-  /// result type.
-  template<typename T>
-  T *readDeclAs() {
-    return Reader->ReadDeclAs<T>(*F, Record, Idx);
-  }
-
-  IdentifierInfo *readIdentifier() {
-    return Reader->readIdentifier(*F, Record, Idx);
-  }
-
-  /// Read a selector from the Record, advancing Idx.
-  Selector readSelector() {
-    return Reader->ReadSelector(*F, Record, Idx);
-  }
-
-  /// Read a declaration name, advancing Idx.
-  // DeclarationName readDeclarationName(); (inherited)
-  DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name);
-  DeclarationNameInfo readDeclarationNameInfo();
-
-  void readQualifierInfo(QualifierInfo &Info);
-
-  /// Return a nested name specifier, advancing Idx.
-  // NestedNameSpecifier *readNestedNameSpecifier(); (inherited)
-
-  NestedNameSpecifierLoc readNestedNameSpecifierLoc();
-
-  /// Read a template name, advancing Idx.
-  // TemplateName readTemplateName(); (inherited)
-
-  /// Read a template argument, advancing Idx. (inherited)
-  // TemplateArgument readTemplateArgument(bool Canonicalize = false);
-
-  /// Read a template parameter list, advancing Idx.
-  TemplateParameterList *readTemplateParameterList();
-
-  /// Read a template argument array, advancing Idx.
-  void readTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
-                                bool Canonicalize = false);
-
-  /// Read a UnresolvedSet structure, advancing Idx.
-  void readUnresolvedSet(LazyASTUnresolvedSet &Set);
-
-  /// Read a C++ base specifier, advancing Idx.
-  CXXBaseSpecifier readCXXBaseSpecifier();
-
-  /// Read a CXXCtorInitializer array, advancing Idx.
-  CXXCtorInitializer **readCXXCtorInitializers();
-
-  CXXTemporary *readCXXTemporary() {
-    return Reader->ReadCXXTemporary(*F, Record, Idx);
-  }
-
-  /// Read a source location, advancing Idx.
-  SourceLocation readSourceLocation() {
-    return Reader->ReadSourceLocation(*F, Record, Idx);
-  }
-
-  /// Read a source range, advancing Idx.
-  SourceRange readSourceRange() {
-    return Reader->ReadSourceRange(*F, Record, Idx);
-  }
-
-  /// Read an arbitrary constant value, advancing Idx.
-  APValue readAPValue();
-
-  /// Read an integral value, advancing Idx.
-  // llvm::APInt readAPInt(); (inherited)
-
-  /// Read a signed integral value, advancing Idx.
-  // llvm::APSInt readAPSInt(); (inherited)
-
-  /// Read a floating-point value, advancing Idx.
-  llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem);
-
-  /// Read a boolean value, advancing Idx.
-  bool readBool() { return readInt() != 0; }
-
-  /// Read a 32-bit unsigned value; required to satisfy BasicReader.
-  uint32_t readUInt32() {
-    return uint32_t(readInt());
-  }
-
-  /// Read a 64-bit unsigned value; required to satisfy BasicReader.
-  uint64_t readUInt64() {
-    return readInt();
-  }
-
-  /// Read a string, advancing Idx.
-  std::string readString() {
-    return Reader->ReadString(Record, Idx);
-  }
-
-  /// Read a path, advancing Idx.
-  std::string readPath() {
-    return Reader->ReadPath(*F, Record, Idx);
-  }
-
-  /// Read a version tuple, advancing Idx.
-  VersionTuple readVersionTuple() {
-    return ASTReader::ReadVersionTuple(Record, Idx);
-  }
-
-  /// Reads one attribute from the current stream position, advancing Idx.
-  Attr *readAttr();
-
-  /// Reads attributes from the current stream position, advancing Idx.
-  void readAttributes(AttrVec &Attrs);
-
-  /// Reads a token out of a record, advancing Idx.
-  Token readToken() {
-    return Reader->ReadToken(*F, Record, Idx);
-  }
-
-  void recordSwitchCaseID(SwitchCase *SC, unsigned ID) {
-    Reader->RecordSwitchCaseID(SC, ID);
-  }
-
-  /// Retrieve the switch-case statement with the given ID.
-  SwitchCase *getSwitchCaseWithID(unsigned ID) {
-    return Reader->getSwitchCaseWithID(ID);
-  }
-};
-
-/// Helper class that saves the current stream position and
-/// then restores it when destroyed.
-struct SavedStreamPosition {
-  explicit SavedStreamPosition(llvm::BitstreamCursor &Cursor)
-      : Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) {}
-
-  ~SavedStreamPosition() {
-    if (llvm::Error Err = Cursor.JumpToBit(Offset))
-      llvm::report_fatal_error(
-          "Cursor should always be able to go back, failed: " +
-          toString(std::move(Err)));
-  }
-
-private:
-  llvm::BitstreamCursor &Cursor;
-  uint64_t Offset;
-};
-
-inline void PCHValidator::Error(const char *Msg) {
-  Reader.Error(Msg);
-}
-
-class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
-  ASTRecordReader &Record;
-  ASTContext &Context;
-
-public:
-  OMPClauseReader(ASTRecordReader &Record)
-      : Record(Record), Context(Record.getContext()) {}
-
-#define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C);
-#include "clang/Basic/OpenMPKinds.def"
-  OMPClause *readClause();
-  void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
-  void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
-};
-
 } // namespace clang
 
 #endif // LLVM_CLANG_SERIALIZATION_ASTREADER_H

diff  --git a/clang/include/clang/Serialization/ASTRecordReader.h b/clang/include/clang/Serialization/ASTRecordReader.h
new file mode 100644
index 000000000000..4fad2881ffd9
--- /dev/null
+++ b/clang/include/clang/Serialization/ASTRecordReader.h
@@ -0,0 +1,351 @@
+//===- ASTRecordReader.h - Helper classes for reading AST -------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+//  This file defines classes that are useful in the implementation of
+//  the ASTReader.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H
+#define LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H
+
+#include "clang/AST/AbstractBasicReader.h"
+#include "clang/Lex/Token.h"
+#include "clang/Serialization/ASTReader.h"
+#include "llvm/ADT/APFloat.h"
+#include "llvm/ADT/APInt.h"
+#include "llvm/ADT/APSInt.h"
+
+namespace clang {
+
+/// An object for streaming information from a record.
+class ASTRecordReader
+    : public serialization::DataStreamBasicReader<ASTRecordReader> {
+  using ModuleFile = serialization::ModuleFile;
+
+  ASTReader *Reader;
+  ModuleFile *F;
+  unsigned Idx = 0;
+  ASTReader::RecordData Record;
+
+  using RecordData = ASTReader::RecordData;
+  using RecordDataImpl = ASTReader::RecordDataImpl;
+
+public:
+  /// Construct an ASTRecordReader that uses the default encoding scheme.
+  ASTRecordReader(ASTReader &Reader, ModuleFile &F)
+    : DataStreamBasicReader(Reader.getContext()), Reader(&Reader), F(&F) {}
+
+  /// Reads a record with id AbbrevID from Cursor, resetting the
+  /// internal state.
+  Expected<unsigned> readRecord(llvm::BitstreamCursor &Cursor,
+                                unsigned AbbrevID);
+
+  /// Is this a module file for a module (rather than a PCH or similar).
+  bool isModule() const { return F->isModule(); }
+
+  /// Retrieve the AST context that this AST reader supplements.
+  ASTContext &getContext() { return Reader->getContext(); }
+
+  /// The current position in this record.
+  unsigned getIdx() const { return Idx; }
+
+  /// The length of this record.
+  size_t size() const { return Record.size(); }
+
+  /// An arbitrary index in this record.
+  const uint64_t &operator[](size_t N) { return Record[N]; }
+
+  /// Returns the last value in this record.
+  uint64_t back() { return Record.back(); }
+
+  /// Returns the current value in this record, and advances to the
+  /// next value.
+  uint64_t readInt() { return Record[Idx++]; }
+
+  ArrayRef<uint64_t> readIntArray(unsigned Len) {
+    auto Array = llvm::makeArrayRef(Record).slice(Idx, Len);
+    Idx += Len;
+    return Array;
+  }
+
+  /// Returns the current value in this record, without advancing.
+  uint64_t peekInt() { return Record[Idx]; }
+
+  /// Skips the specified number of values.
+  void skipInts(unsigned N) { Idx += N; }
+
+  /// Retrieve the global submodule ID its local ID number.
+  serialization::SubmoduleID
+  getGlobalSubmoduleID(unsigned LocalID) {
+    return Reader->getGlobalSubmoduleID(*F, LocalID);
+  }
+
+  /// Retrieve the submodule that corresponds to a global submodule ID.
+  Module *getSubmodule(serialization::SubmoduleID GlobalID) {
+    return Reader->getSubmodule(GlobalID);
+  }
+
+  /// Read the record that describes the lexical contents of a DC.
+  bool readLexicalDeclContextStorage(uint64_t Offset, DeclContext *DC) {
+    return Reader->ReadLexicalDeclContextStorage(*F, F->DeclsCursor, Offset,
+                                                 DC);
+  }
+
+  /// Read the record that describes the visible contents of a DC.
+  bool readVisibleDeclContextStorage(uint64_t Offset,
+                                     serialization::DeclID ID) {
+    return Reader->ReadVisibleDeclContextStorage(*F, F->DeclsCursor, Offset,
+                                                 ID);
+  }
+
+  ExplicitSpecifier readExplicitSpec() {
+    uint64_t Kind = readInt();
+    bool HasExpr = Kind & 0x1;
+    Kind = Kind >> 1;
+    return ExplicitSpecifier(HasExpr ? readExpr() : nullptr,
+                             static_cast<ExplicitSpecKind>(Kind));
+  }
+
+  /// Read information about an exception specification (inherited).
+  //FunctionProtoType::ExceptionSpecInfo
+  //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage);
+
+  /// Get the global offset corresponding to a local offset.
+  uint64_t getGlobalBitOffset(uint32_t LocalOffset) {
+    return Reader->getGlobalBitOffset(*F, LocalOffset);
+  }
+
+  /// Reads a statement.
+  Stmt *readStmt() { return Reader->ReadStmt(*F); }
+  Stmt *readStmtRef() { return readStmt(); /* FIXME: readSubStmt? */ }
+
+  /// Reads an expression.
+  Expr *readExpr() { return Reader->ReadExpr(*F); }
+
+  /// Reads a sub-statement operand during statement reading.
+  Stmt *readSubStmt() { return Reader->ReadSubStmt(); }
+
+  /// Reads a sub-expression operand during statement reading.
+  Expr *readSubExpr() { return Reader->ReadSubExpr(); }
+
+  /// Reads a declaration with the given local ID in the given module.
+  ///
+  /// \returns The requested declaration, casted to the given return type.
+  template<typename T>
+  T *GetLocalDeclAs(uint32_t LocalID) {
+    return cast_or_null<T>(Reader->GetLocalDecl(*F, LocalID));
+  }
+
+  /// Reads a TemplateArgumentLocInfo appropriate for the
+  /// given TemplateArgument kind, advancing Idx.
+  TemplateArgumentLocInfo
+  readTemplateArgumentLocInfo(TemplateArgument::ArgKind Kind);
+
+  /// Reads a TemplateArgumentLoc, advancing Idx.
+  TemplateArgumentLoc readTemplateArgumentLoc();
+
+  const ASTTemplateArgumentListInfo*
+  readASTTemplateArgumentListInfo();
+
+  /// Reads a declarator info from the given record, advancing Idx.
+  TypeSourceInfo *readTypeSourceInfo();
+
+  /// Reads the location information for a type.
+  void readTypeLoc(TypeLoc TL);
+
+
+  /// Map a local type ID within a given AST file to a global type ID.
+  serialization::TypeID getGlobalTypeID(unsigned LocalID) const {
+    return Reader->getGlobalTypeID(*F, LocalID);
+  }
+
+  Qualifiers readQualifiers() {
+    return Qualifiers::fromOpaqueValue(readInt());
+  }
+
+  /// Read a type from the current position in the record.
+  QualType readType() {
+    return Reader->readType(*F, Record, Idx);
+  }
+  QualType readQualType() {
+    return readType();
+  }
+
+  /// Reads a declaration ID from the given position in this record.
+  ///
+  /// \returns The declaration ID read from the record, adjusted to a global ID.
+  serialization::DeclID readDeclID() {
+    return Reader->ReadDeclID(*F, Record, Idx);
+  }
+
+  /// Reads a declaration from the given position in a record in the
+  /// given module, advancing Idx.
+  Decl *readDecl() {
+    return Reader->ReadDecl(*F, Record, Idx);
+  }
+  Decl *readDeclRef() {
+    return readDecl();
+  }
+
+  /// Reads a declaration from the given position in the record,
+  /// advancing Idx.
+  ///
+  /// \returns The declaration read from this location, casted to the given
+  /// result type.
+  template<typename T>
+  T *readDeclAs() {
+    return Reader->ReadDeclAs<T>(*F, Record, Idx);
+  }
+
+  IdentifierInfo *readIdentifier() {
+    return Reader->readIdentifier(*F, Record, Idx);
+  }
+
+  /// Read a selector from the Record, advancing Idx.
+  Selector readSelector() {
+    return Reader->ReadSelector(*F, Record, Idx);
+  }
+
+  /// Read a declaration name, advancing Idx.
+  // DeclarationName readDeclarationName(); (inherited)
+  DeclarationNameLoc readDeclarationNameLoc(DeclarationName Name);
+  DeclarationNameInfo readDeclarationNameInfo();
+
+  void readQualifierInfo(QualifierInfo &Info);
+
+  /// Return a nested name specifier, advancing Idx.
+  // NestedNameSpecifier *readNestedNameSpecifier(); (inherited)
+
+  NestedNameSpecifierLoc readNestedNameSpecifierLoc();
+
+  /// Read a template name, advancing Idx.
+  // TemplateName readTemplateName(); (inherited)
+
+  /// Read a template argument, advancing Idx. (inherited)
+  // TemplateArgument readTemplateArgument(bool Canonicalize = false);
+
+  /// Read a template parameter list, advancing Idx.
+  TemplateParameterList *readTemplateParameterList();
+
+  /// Read a template argument array, advancing Idx.
+  void readTemplateArgumentList(SmallVectorImpl<TemplateArgument> &TemplArgs,
+                                bool Canonicalize = false);
+
+  /// Read a UnresolvedSet structure, advancing Idx.
+  void readUnresolvedSet(LazyASTUnresolvedSet &Set);
+
+  /// Read a C++ base specifier, advancing Idx.
+  CXXBaseSpecifier readCXXBaseSpecifier();
+
+  /// Read a CXXCtorInitializer array, advancing Idx.
+  CXXCtorInitializer **readCXXCtorInitializers();
+
+  CXXTemporary *readCXXTemporary() {
+    return Reader->ReadCXXTemporary(*F, Record, Idx);
+  }
+
+  /// Read an OpenMP clause, advancing Idx.
+  OMPClause *readOMPClause();
+
+  /// Read a source location, advancing Idx.
+  SourceLocation readSourceLocation() {
+    return Reader->ReadSourceLocation(*F, Record, Idx);
+  }
+
+  /// Read a source range, advancing Idx.
+  SourceRange readSourceRange() {
+    return Reader->ReadSourceRange(*F, Record, Idx);
+  }
+
+  /// Read an arbitrary constant value, advancing Idx.
+  APValue readAPValue();
+
+  /// Read an integral value, advancing Idx.
+  // llvm::APInt readAPInt(); (inherited)
+
+  /// Read a signed integral value, advancing Idx.
+  // llvm::APSInt readAPSInt(); (inherited)
+
+  /// Read a floating-point value, advancing Idx.
+  llvm::APFloat readAPFloat(const llvm::fltSemantics &Sem);
+
+  /// Read a boolean value, advancing Idx.
+  bool readBool() { return readInt() != 0; }
+
+  /// Read a 32-bit unsigned value; required to satisfy BasicReader.
+  uint32_t readUInt32() {
+    return uint32_t(readInt());
+  }
+
+  /// Read a 64-bit unsigned value; required to satisfy BasicReader.
+  uint64_t readUInt64() {
+    return readInt();
+  }
+
+  /// Read a string, advancing Idx.
+  std::string readString() {
+    return Reader->ReadString(Record, Idx);
+  }
+
+  /// Read a path, advancing Idx.
+  std::string readPath() {
+    return Reader->ReadPath(*F, Record, Idx);
+  }
+
+  /// Read a version tuple, advancing Idx.
+  VersionTuple readVersionTuple() {
+    return ASTReader::ReadVersionTuple(Record, Idx);
+  }
+
+  /// Reads one attribute from the current stream position, advancing Idx.
+  Attr *readAttr();
+
+  /// Reads attributes from the current stream position, advancing Idx.
+  void readAttributes(AttrVec &Attrs);
+
+  /// Reads a token out of a record, advancing Idx.
+  Token readToken() {
+    return Reader->ReadToken(*F, Record, Idx);
+  }
+
+  void recordSwitchCaseID(SwitchCase *SC, unsigned ID) {
+    Reader->RecordSwitchCaseID(SC, ID);
+  }
+
+  /// Retrieve the switch-case statement with the given ID.
+  SwitchCase *getSwitchCaseWithID(unsigned ID) {
+    return Reader->getSwitchCaseWithID(ID);
+  }
+};
+
+/// Helper class that saves the current stream position and
+/// then restores it when destroyed.
+struct SavedStreamPosition {
+  explicit SavedStreamPosition(llvm::BitstreamCursor &Cursor)
+      : Cursor(Cursor), Offset(Cursor.GetCurrentBitNo()) {}
+
+  ~SavedStreamPosition() {
+    if (llvm::Error Err = Cursor.JumpToBit(Offset))
+      llvm::report_fatal_error(
+          "Cursor should always be able to go back, failed: " +
+          toString(std::move(Err)));
+  }
+
+private:
+  llvm::BitstreamCursor &Cursor;
+  uint64_t Offset;
+};
+
+inline void PCHValidator::Error(const char *Msg) {
+  Reader.Error(Msg);
+}
+
+} // namespace clang
+
+#endif

diff  --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index c85cfcd3a33f..a2e4e7b469c9 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -10,7 +10,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/Serialization/ASTReader.h"
+#include "clang/Serialization/ASTRecordReader.h"
 #include "ASTCommon.h"
 #include "ASTReaderInternals.h"
 #include "clang/AST/AbstractTypeReader.h"
@@ -30,6 +30,7 @@
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/ExternalASTSource.h"
 #include "clang/AST/NestedNameSpecifier.h"
+#include "clang/AST/OpenMPClause.h"
 #include "clang/AST/ODRHash.h"
 #include "clang/AST/RawCommentList.h"
 #include "clang/AST/TemplateBase.h"
@@ -11471,6 +11472,31 @@ Expected<unsigned> ASTRecordReader::readRecord(llvm::BitstreamCursor &Cursor,
 //// OMPClauseReader implementation
 ////===----------------------------------------------------------------------===//
 
+// This has to be in namespace clang because it's friended by all
+// of the OMP clauses.
+namespace clang {
+
+class OMPClauseReader : public OMPClauseVisitor<OMPClauseReader> {
+  ASTRecordReader &Record;
+  ASTContext &Context;
+
+public:
+  OMPClauseReader(ASTRecordReader &Record)
+      : Record(Record), Context(Record.getContext()) {}
+
+#define OPENMP_CLAUSE(Name, Class) void Visit##Class(Class *C);
+#include "clang/Basic/OpenMPKinds.def"
+  OMPClause *readClause();
+  void VisitOMPClauseWithPreInit(OMPClauseWithPreInit *C);
+  void VisitOMPClauseWithPostUpdate(OMPClauseWithPostUpdate *C);
+};
+
+} // end namespace clang
+
+OMPClause *ASTRecordReader::readOMPClause() {
+  return OMPClauseReader(*this).readClause();
+}
+
 OMPClause *OMPClauseReader::readClause() {
   OMPClause *C = nullptr;
   switch (Record.readInt()) {

diff  --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
index 229bea8b031f..0240984d75a5 100644
--- a/clang/lib/Serialization/ASTReaderDecl.cpp
+++ b/clang/lib/Serialization/ASTReaderDecl.cpp
@@ -48,7 +48,7 @@
 #include "clang/Basic/Specifiers.h"
 #include "clang/Sema/IdentifierResolver.h"
 #include "clang/Serialization/ASTBitCodes.h"
-#include "clang/Serialization/ASTReader.h"
+#include "clang/Serialization/ASTRecordReader.h"
 #include "clang/Serialization/ContinuousRangeMap.h"
 #include "clang/Serialization/ModuleFile.h"
 #include "llvm/ADT/DenseMap.h"
@@ -2630,9 +2630,8 @@ void ASTDeclReader::VisitOMPAllocateDecl(OMPAllocateDecl *D) {
   D->setVars(Vars);
   SmallVector<OMPClause *, 8> Clauses;
   Clauses.reserve(NumClauses);
-  OMPClauseReader ClauseReader(Record);
   for (unsigned I = 0; I != NumClauses; ++I)
-    Clauses.push_back(ClauseReader.readClause());
+    Clauses.push_back(Record.readOMPClause());
   D->setClauses(Clauses);
 }
 
@@ -2641,9 +2640,8 @@ void ASTDeclReader::VisitOMPRequiresDecl(OMPRequiresDecl * D) {
   unsigned NumClauses = D->clauselist_size();
   SmallVector<OMPClause *, 8> Clauses;
   Clauses.reserve(NumClauses);
-  OMPClauseReader ClauseReader(Record);
   for (unsigned I = 0; I != NumClauses; ++I)
-    Clauses.push_back(ClauseReader.readClause());
+    Clauses.push_back(Record.readOMPClause());
   D->setClauses(Clauses);
 }
 
@@ -2674,9 +2672,8 @@ void ASTDeclReader::VisitOMPDeclareMapperDecl(OMPDeclareMapperDecl *D) {
   unsigned NumClauses = D->clauselist_size();
   SmallVector<OMPClause *, 8> Clauses;
   Clauses.reserve(NumClauses);
-  OMPClauseReader ClauseReader(Record);
   for (unsigned I = 0; I != NumClauses; ++I)
-    Clauses.push_back(ClauseReader.readClause());
+    Clauses.push_back(Record.readOMPClause());
   D->setClauses(Clauses);
 }
 

diff  --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp
index 5d7c6762061c..533502116ed7 100644
--- a/clang/lib/Serialization/ASTReaderStmt.cpp
+++ b/clang/lib/Serialization/ASTReaderStmt.cpp
@@ -11,7 +11,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "clang/Serialization/ASTReader.h"
+#include "clang/Serialization/ASTRecordReader.h"
 #include "clang/AST/ASTConcept.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/AttrIterator.h"
@@ -67,8 +67,6 @@ using namespace serialization;
 namespace clang {
 
   class ASTStmtReader : public StmtVisitor<ASTStmtReader> {
-    friend class OMPClauseReader;
-
     ASTRecordReader &Record;
     llvm::BitstreamCursor &DeclsCursor;
 
@@ -2026,10 +2024,9 @@ void ASTStmtReader::VisitAsTypeExpr(AsTypeExpr *E) {
 void ASTStmtReader::VisitOMPExecutableDirective(OMPExecutableDirective *E) {
   E->setLocStart(readSourceLocation());
   E->setLocEnd(readSourceLocation());
-  OMPClauseReader ClauseReader(Record);
   SmallVector<OMPClause *, 5> Clauses;
   for (unsigned i = 0; i < E->getNumClauses(); ++i)
-    Clauses.push_back(ClauseReader.readClause());
+    Clauses.push_back(Record.readOMPClause());
   E->setClauses(Clauses);
   if (E->hasAssociatedStmt())
     E->setAssociatedStmt(Record.readSubStmt());

diff  --git a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
index 687fda75db48..7baae6778ebd 100644
--- a/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
+++ b/clang/lib/StaticAnalyzer/Frontend/ModelInjector.cpp
@@ -11,6 +11,7 @@
 #include "clang/Basic/IdentifierTable.h"
 #include "clang/Basic/LangStandard.h"
 #include "clang/Basic/Stack.h"
+#include "clang/AST/DeclObjC.h"
 #include "clang/Frontend/ASTUnit.h"
 #include "clang/Frontend/CompilerInstance.h"
 #include "clang/Frontend/FrontendAction.h"


        


More information about the cfe-commits mailing list