123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- 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/ASTContext.h"
- #include "clang/AST/AbstractBasicReader.h"
- #include "clang/Lex/Token.h"
- #include "clang/Serialization/ASTReader.h"
- #include "clang/Serialization/SourceLocationEncoding.h"
- #include "llvm/ADT/APFloat.h"
- #include "llvm/ADT/APInt.h"
- #include "llvm/ADT/APSInt.h"
- namespace clang {
- class OMPTraitInfo;
- class OMPChildren;
- /// An object for streaming information from a record.
- class ASTRecordReader
- : public serialization::DataStreamBasicReader<ASTRecordReader> {
- using ModuleFile = serialization::ModuleFile;
- using LocSeq = SourceLocationSequence;
- 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::ArrayRef(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(uint64_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, LocSeq *Seq = nullptr);
- /// 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();
- using DataStreamBasicReader::readTemplateArgument;
- TemplateArgument readTemplateArgument(bool Canonicalize) {
- TemplateArgument Arg = readTemplateArgument();
- if (Canonicalize) {
- Arg = getContext().getCanonicalTemplateArgument(Arg);
- }
- return Arg;
- }
- /// 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 OMPTraitInfo object, advancing Idx.
- OMPTraitInfo *readOMPTraitInfo();
- /// Read an OpenMP clause, advancing Idx.
- OMPClause *readOMPClause();
- /// Read an OpenMP children, advancing Idx.
- void readOMPChildren(OMPChildren *Data);
- /// Read a source location, advancing Idx.
- SourceLocation readSourceLocation(LocSeq *Seq = nullptr) {
- return Reader->ReadSourceLocation(*F, Record, Idx, Seq);
- }
- /// Read a source range, advancing Idx.
- SourceRange readSourceRange(LocSeq *Seq = nullptr) {
- return Reader->ReadSourceRange(*F, Record, Idx, Seq);
- }
- /// Read an arbitrary constant value, advancing Idx.
- // APValue readAPValue(); (inherited)
- /// 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);
- /// Read an BTFTypeTagAttr object.
- BTFTypeTagAttr *readBTFTypeTagAttr() {
- return cast<BTFTypeTagAttr>(readAttr());
- }
- /// 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(
- llvm::Twine("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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|