clang 20.0.0git
ASTRecordReader.h
Go to the documentation of this file.
1//===- ASTRecordReader.h - Helper classes for reading AST -------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines classes that are useful in the implementation of
10// the ASTReader.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H
15#define LLVM_CLANG_SERIALIZATION_ASTRECORDREADER_H
16
19#include "clang/Lex/Token.h"
22#include "llvm/ADT/APFloat.h"
23#include "llvm/ADT/APInt.h"
24#include "llvm/ADT/APSInt.h"
25
26namespace clang {
27class OpenACCClause;
28class OMPTraitInfo;
29class OMPChildren;
30
31/// An object for streaming information from a record.
33 : public serialization::DataStreamBasicReader<ASTRecordReader> {
36
37 ASTReader *Reader;
38 ModuleFile *F;
39 unsigned Idx = 0;
41
44
45public:
46 /// Construct an ASTRecordReader that uses the default encoding scheme.
48 : DataStreamBasicReader(Reader.getContext()), Reader(&Reader), F(&F) {}
49
50 /// Reads a record with id AbbrevID from Cursor, resetting the
51 /// internal state.
52 Expected<unsigned> readRecord(llvm::BitstreamCursor &Cursor,
53 unsigned AbbrevID);
54
55 /// Is this a module file for a module (rather than a PCH or similar).
56 bool isModule() const { return F->isModule(); }
57
58 /// Retrieve the AST context that this AST reader supplements.
59 ASTContext &getContext() { return Reader->getContext(); }
60
61 /// The current position in this record.
62 unsigned getIdx() const { return Idx; }
63
64 /// The length of this record.
65 size_t size() const { return Record.size(); }
66
67 /// An arbitrary index in this record.
68 const uint64_t &operator[](size_t N) { return Record[N]; }
69
70 /// Returns the last value in this record.
71 uint64_t back() { return Record.back(); }
72
73 /// Returns the current value in this record, and advances to the
74 /// next value.
75 uint64_t readInt() { return Record[Idx++]; }
76
78 auto Array = llvm::ArrayRef(Record).slice(Idx, Len);
79 Idx += Len;
80 return Array;
81 }
82
83 /// Returns the current value in this record, without advancing.
84 uint64_t peekInt() { return Record[Idx]; }
85
86 /// Skips the specified number of values.
87 void skipInts(unsigned N) { Idx += N; }
88
89 /// Retrieve the global submodule ID its local ID number.
91 getGlobalSubmoduleID(unsigned LocalID) {
92 return Reader->getGlobalSubmoduleID(*F, LocalID);
93 }
94
95 /// Retrieve the submodule that corresponds to a global submodule ID.
97 return Reader->getSubmodule(GlobalID);
98 }
99
100 /// Read the record that describes the lexical contents of a DC.
101 bool readLexicalDeclContextStorage(uint64_t Offset, DeclContext *DC) {
102 return Reader->ReadLexicalDeclContextStorage(*F, F->DeclsCursor, Offset,
103 DC);
104 }
105
107 uint64_t Kind = readInt();
108 bool HasExpr = Kind & 0x1;
109 Kind = Kind >> 1;
110 return ExplicitSpecifier(HasExpr ? readExpr() : nullptr,
111 static_cast<ExplicitSpecKind>(Kind));
112 }
113
114 /// Read information about an exception specification (inherited).
115 //FunctionProtoType::ExceptionSpecInfo
116 //readExceptionSpecInfo(SmallVectorImpl<QualType> &ExceptionStorage);
117
118 /// Get the global offset corresponding to a local offset.
119 uint64_t getGlobalBitOffset(uint64_t LocalOffset) {
120 return Reader->getGlobalBitOffset(*F, LocalOffset);
121 }
122
123 /// Reads a statement.
124 Stmt *readStmt() { return Reader->ReadStmt(*F); }
125 Stmt *readStmtRef() { return readStmt(); /* FIXME: readSubStmt? */ }
126
127 /// Reads an expression.
128 Expr *readExpr() { return Reader->ReadExpr(*F); }
129
130 /// Reads a sub-statement operand during statement reading.
131 Stmt *readSubStmt() { return Reader->ReadSubStmt(); }
132
133 /// Reads a sub-expression operand during statement reading.
134 Expr *readSubExpr() { return Reader->ReadSubExpr(); }
135
136 /// Reads a declaration with the given local ID in the given module.
137 ///
138 /// \returns The requested declaration, casted to the given return type.
139 template <typename T> T *GetLocalDeclAs(LocalDeclID LocalID) {
140 return cast_or_null<T>(Reader->GetLocalDecl(*F, LocalID));
141 }
142
143 /// Reads a TemplateArgumentLocInfo appropriate for the
144 /// given TemplateArgument kind, advancing Idx.
147
148 /// Reads a TemplateArgumentLoc, advancing Idx.
150
152
155
156 // Reads a concept reference from the given record.
158
159 /// Reads a declarator info from the given record, advancing Idx.
161
162 /// Reads the location information for a type.
163 void readTypeLoc(TypeLoc TL, LocSeq *Seq = nullptr);
164
165 /// Map a local type ID within a given AST file to a global type ID.
167 return Reader->getGlobalTypeID(*F, LocalID);
168 }
169
172 }
173
174 /// Read a type from the current position in the record.
176 return Reader->readType(*F, Record, Idx);
177 }
179 return readType();
180 }
181
182 /// Reads a declaration ID from the given position in this record.
183 ///
184 /// \returns The declaration ID read from the record, adjusted to a global ID.
185 GlobalDeclID readDeclID() { return Reader->ReadDeclID(*F, Record, Idx); }
186
187 /// Reads a declaration from the given position in a record in the
188 /// given module, advancing Idx.
190 return Reader->ReadDecl(*F, Record, Idx);
191 }
193 return readDecl();
194 }
195
196 /// Reads a declaration from the given position in the record,
197 /// advancing Idx.
198 ///
199 /// \returns The declaration read from this location, casted to the given
200 /// result type.
201 template<typename T>
203 return Reader->ReadDeclAs<T>(*F, Record, Idx);
204 }
205
207 return Reader->readIdentifier(*F, Record, Idx);
208 }
209
210 /// Read a selector from the Record, advancing Idx.
212 return Reader->ReadSelector(*F, Record, Idx);
213 }
214
216
217 /// Read a declaration name, advancing Idx.
218 // DeclarationName readDeclarationName(); (inherited)
221
223
224 /// Return a nested name specifier, advancing Idx.
225 // NestedNameSpecifier *readNestedNameSpecifier(); (inherited)
226
228
229 /// Read a template name, advancing Idx.
230 // TemplateName readTemplateName(); (inherited)
231
232 /// Read a template argument, advancing Idx. (inherited)
233 // TemplateArgument readTemplateArgument();
234 using DataStreamBasicReader::readTemplateArgument;
237 if (Canonicalize) {
239 }
240 return Arg;
241 }
242
243 /// Read a template parameter list, advancing Idx.
245
246 /// Read a template argument array, advancing Idx.
248 bool Canonicalize = false);
249
250 /// Read a UnresolvedSet structure, advancing Idx.
252
253 /// Read a C++ base specifier, advancing Idx.
255
256 /// Read a CXXCtorInitializer array, advancing Idx.
258
260 return Reader->ReadCXXTemporary(*F, Record, Idx);
261 }
262
263 /// Read an OMPTraitInfo object, advancing Idx.
265
266 /// Read an OpenMP clause, advancing Idx.
268
269 /// Read an OpenMP children, advancing Idx.
271
272 /// Read a list of Exprs used for a var-list.
274
275 /// Read a list of Exprs used for a int-expr-list.
277
278 /// Read an OpenACC clause, advancing Idx.
280
281 /// Read a list of OpenACC clauses into the passed SmallVector.
283
284 /// Read a source location, advancing Idx.
286 return Reader->ReadSourceLocation(*F,