annotate clang-tools-extra/clang-doc/BitcodeReader.cpp @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents 1d019706d866
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- BitcodeReader.cpp - ClangDoc Bitcode Reader ------------*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "BitcodeReader.h"
anatofuz
parents:
diff changeset
10 #include "llvm/ADT/IndexedMap.h"
anatofuz
parents:
diff changeset
11 #include "llvm/ADT/Optional.h"
anatofuz
parents:
diff changeset
12 #include "llvm/Support/Error.h"
anatofuz
parents:
diff changeset
13 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 namespace clang {
anatofuz
parents:
diff changeset
16 namespace doc {
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 using Record = llvm::SmallVector<uint64_t, 1024>;
anatofuz
parents:
diff changeset
19
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
20 // This implements decode for SmallString.
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
21 llvm::Error decodeRecord(const Record &R, llvm::SmallVectorImpl<char> &Field,
150
anatofuz
parents:
diff changeset
22 llvm::StringRef Blob) {
anatofuz
parents:
diff changeset
23 Field.assign(Blob.begin(), Blob.end());
anatofuz
parents:
diff changeset
24 return llvm::Error::success();
anatofuz
parents:
diff changeset
25 }
anatofuz
parents:
diff changeset
26
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
27 llvm::Error decodeRecord(const Record &R, SymbolID &Field,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
28 llvm::StringRef Blob) {
150
anatofuz
parents:
diff changeset
29 if (R[0] != BitCodeConstants::USRHashSize)
anatofuz
parents:
diff changeset
30 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
31 "incorrect USR size");
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 // First position in the record is the length of the following array, so we
anatofuz
parents:
diff changeset
34 // copy the following elements to the field.
anatofuz
parents:
diff changeset
35 for (int I = 0, E = R[0]; I < E; ++I)
anatofuz
parents:
diff changeset
36 Field[I] = R[I + 1];
anatofuz
parents:
diff changeset
37 return llvm::Error::success();
anatofuz
parents:
diff changeset
38 }
anatofuz
parents:
diff changeset
39
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
40 llvm::Error decodeRecord(const Record &R, bool &Field, llvm::StringRef Blob) {
150
anatofuz
parents:
diff changeset
41 Field = R[0] != 0;
anatofuz
parents:
diff changeset
42 return llvm::Error::success();
anatofuz
parents:
diff changeset
43 }
anatofuz
parents:
diff changeset
44
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
45 llvm::Error decodeRecord(const Record &R, int &Field, llvm::StringRef Blob) {
150
anatofuz
parents:
diff changeset
46 if (R[0] > INT_MAX)
anatofuz
parents:
diff changeset
47 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
48 "integer too large to parse");
anatofuz
parents:
diff changeset
49 Field = (int)R[0];
anatofuz
parents:
diff changeset
50 return llvm::Error::success();
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
53 llvm::Error decodeRecord(const Record &R, AccessSpecifier &Field,
150
anatofuz
parents:
diff changeset
54 llvm::StringRef Blob) {
anatofuz
parents:
diff changeset
55 switch (R[0]) {
anatofuz
parents:
diff changeset
56 case AS_public:
anatofuz
parents:
diff changeset
57 case AS_private:
anatofuz
parents:
diff changeset
58 case AS_protected:
anatofuz
parents:
diff changeset
59 case AS_none:
anatofuz
parents:
diff changeset
60 Field = (AccessSpecifier)R[0];
anatofuz
parents:
diff changeset
61 return llvm::Error::success();
anatofuz
parents:
diff changeset
62 default:
anatofuz
parents:
diff changeset
63 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
64 "invalid value for AccessSpecifier");
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66 }
anatofuz
parents:
diff changeset
67
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
68 llvm::Error decodeRecord(const Record &R, TagTypeKind &Field,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
69 llvm::StringRef Blob) {
150
anatofuz
parents:
diff changeset
70 switch (R[0]) {
anatofuz
parents:
diff changeset
71 case TTK_Struct:
anatofuz
parents:
diff changeset
72 case TTK_Interface:
anatofuz
parents:
diff changeset
73 case TTK_Union:
anatofuz
parents:
diff changeset
74 case TTK_Class:
anatofuz
parents:
diff changeset
75 case TTK_Enum:
anatofuz
parents:
diff changeset
76 Field = (TagTypeKind)R[0];
anatofuz
parents:
diff changeset
77 return llvm::Error::success();
anatofuz
parents:
diff changeset
78 default:
anatofuz
parents:
diff changeset
79 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
80 "invalid value for TagTypeKind");
anatofuz
parents:
diff changeset
81 }
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
84 llvm::Error decodeRecord(const Record &R, llvm::Optional<Location> &Field,
150
anatofuz
parents:
diff changeset
85 llvm::StringRef Blob) {
anatofuz
parents:
diff changeset
86 if (R[0] > INT_MAX)
anatofuz
parents:
diff changeset
87 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
88 "integer too large to parse");
anatofuz
parents:
diff changeset
89 Field.emplace((int)R[0], Blob, (bool)R[1]);
anatofuz
parents:
diff changeset
90 return llvm::Error::success();
anatofuz
parents:
diff changeset
91 }
anatofuz
parents:
diff changeset
92
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
93 llvm::Error decodeRecord(const Record &R, InfoType &Field,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
94 llvm::StringRef Blob) {
150
anatofuz
parents:
diff changeset
95 switch (auto IT = static_cast<InfoType>(R[0])) {
anatofuz
parents:
diff changeset
96 case InfoType::IT_namespace:
anatofuz
parents:
diff changeset
97 case InfoType::IT_record:
anatofuz
parents:
diff changeset
98 case InfoType::IT_function:
anatofuz
parents:
diff changeset
99 case InfoType::IT_default:
anatofuz
parents:
diff changeset
100 case InfoType::IT_enum:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
101 case InfoType::IT_typedef:
150
anatofuz
parents:
diff changeset
102 Field = IT;
anatofuz
parents:
diff changeset
103 return llvm::Error::success();
anatofuz
parents:
diff changeset
104 }
anatofuz
parents:
diff changeset
105 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
106 "invalid value for InfoType");
anatofuz
parents:
diff changeset
107 }
anatofuz
parents:
diff changeset
108
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
109 llvm::Error decodeRecord(const Record &R, FieldId &Field,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
110 llvm::StringRef Blob) {
150
anatofuz
parents:
diff changeset
111 switch (auto F = static_cast<FieldId>(R[0])) {
anatofuz
parents:
diff changeset
112 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
113 case FieldId::F_parent:
anatofuz
parents:
diff changeset
114 case FieldId::F_vparent:
anatofuz
parents:
diff changeset
115 case FieldId::F_type:
anatofuz
parents:
diff changeset
116 case FieldId::F_child_namespace:
anatofuz
parents:
diff changeset
117 case FieldId::F_child_record:
anatofuz
parents:
diff changeset
118 case FieldId::F_default:
anatofuz
parents:
diff changeset
119 Field = F;
anatofuz
parents:
diff changeset
120 return llvm::Error::success();
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
123 "invalid value for FieldId");
anatofuz
parents:
diff changeset
124 }
anatofuz
parents:
diff changeset
125
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
126 llvm::Error decodeRecord(const Record &R,
150
anatofuz
parents:
diff changeset
127 llvm::SmallVectorImpl<llvm::SmallString<16>> &Field,
anatofuz
parents:
diff changeset
128 llvm::StringRef Blob) {
anatofuz
parents:
diff changeset
129 Field.push_back(Blob);
anatofuz
parents:
diff changeset
130 return llvm::Error::success();
anatofuz
parents:
diff changeset
131 }
anatofuz
parents:
diff changeset
132
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
133 llvm::Error decodeRecord(const Record &R,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
134 llvm::SmallVectorImpl<Location> &Field,
150
anatofuz
parents:
diff changeset
135 llvm::StringRef Blob) {
anatofuz
parents:
diff changeset
136 if (R[0] > INT_MAX)
anatofuz
parents:
diff changeset
137 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
138 "integer too large to parse");
anatofuz
parents:
diff changeset
139 Field.emplace_back((int)R[0], Blob, (bool)R[1]);
anatofuz
parents:
diff changeset
140 return llvm::Error::success();
anatofuz
parents:
diff changeset
141 }
anatofuz
parents:
diff changeset
142
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
143 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
144 const unsigned VersionNo) {
anatofuz
parents:
diff changeset
145 if (ID == VERSION && R[0] == VersionNo)
anatofuz
parents:
diff changeset
146 return llvm::Error::success();
anatofuz
parents:
diff changeset
147 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
148 "mismatched bitcode version number");
anatofuz
parents:
diff changeset
149 }
anatofuz
parents:
diff changeset
150
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
151 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
152 NamespaceInfo *I) {
anatofuz
parents:
diff changeset
153 switch (ID) {
anatofuz
parents:
diff changeset
154 case NAMESPACE_USR:
anatofuz
parents:
diff changeset
155 return decodeRecord(R, I->USR, Blob);
anatofuz
parents:
diff changeset
156 case NAMESPACE_NAME:
anatofuz
parents:
diff changeset
157 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
158 case NAMESPACE_PATH:
anatofuz
parents:
diff changeset
159 return decodeRecord(R, I->Path, Blob);
anatofuz
parents:
diff changeset
160 default:
anatofuz
parents:
diff changeset
161 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
162 "invalid field for NamespaceInfo");
anatofuz
parents:
diff changeset
163 }
anatofuz
parents:
diff changeset
164 }
anatofuz
parents:
diff changeset
165
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
166 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
167 RecordInfo *I) {
anatofuz
parents:
diff changeset
168 switch (ID) {
anatofuz
parents:
diff changeset
169 case RECORD_USR:
anatofuz
parents:
diff changeset
170 return decodeRecord(R, I->USR, Blob);
anatofuz
parents:
diff changeset
171 case RECORD_NAME:
anatofuz
parents:
diff changeset
172 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
173 case RECORD_PATH:
anatofuz
parents:
diff changeset
174 return decodeRecord(R, I->Path, Blob);
anatofuz
parents:
diff changeset
175 case RECORD_DEFLOCATION:
anatofuz
parents:
diff changeset
176 return decodeRecord(R, I->DefLoc, Blob);
anatofuz
parents:
diff changeset
177 case RECORD_LOCATION:
anatofuz
parents:
diff changeset
178 return decodeRecord(R, I->Loc, Blob);
anatofuz
parents:
diff changeset
179 case RECORD_TAG_TYPE:
anatofuz
parents:
diff changeset
180 return decodeRecord(R, I->TagType, Blob);
anatofuz
parents:
diff changeset
181 case RECORD_IS_TYPE_DEF:
anatofuz
parents:
diff changeset
182 return decodeRecord(R, I->IsTypeDef, Blob);
anatofuz
parents:
diff changeset
183 default:
anatofuz
parents:
diff changeset
184 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
185 "invalid field for RecordInfo");
anatofuz
parents:
diff changeset
186 }
anatofuz
parents:
diff changeset
187 }
anatofuz
parents:
diff changeset
188
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
189 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
190 BaseRecordInfo *I) {
anatofuz
parents:
diff changeset
191 switch (ID) {
anatofuz
parents:
diff changeset
192 case BASE_RECORD_USR:
anatofuz
parents:
diff changeset
193 return decodeRecord(R, I->USR, Blob);
anatofuz
parents:
diff changeset
194 case BASE_RECORD_NAME:
anatofuz
parents:
diff changeset
195 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
196 case BASE_RECORD_PATH:
anatofuz
parents:
diff changeset
197 return decodeRecord(R, I->Path, Blob);
anatofuz
parents:
diff changeset
198 case BASE_RECORD_TAG_TYPE:
anatofuz
parents:
diff changeset
199 return decodeRecord(R, I->TagType, Blob);
anatofuz
parents:
diff changeset
200 case BASE_RECORD_IS_VIRTUAL:
anatofuz
parents:
diff changeset
201 return decodeRecord(R, I->IsVirtual, Blob);
anatofuz
parents:
diff changeset
202 case BASE_RECORD_ACCESS:
anatofuz
parents:
diff changeset
203 return decodeRecord(R, I->Access, Blob);
anatofuz
parents:
diff changeset
204 case BASE_RECORD_IS_PARENT:
anatofuz
parents:
diff changeset
205 return decodeRecord(R, I->IsParent, Blob);
anatofuz
parents:
diff changeset
206 default:
anatofuz
parents:
diff changeset
207 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
208 "invalid field for BaseRecordInfo");
anatofuz
parents:
diff changeset
209 }
anatofuz
parents:
diff changeset
210 }
anatofuz
parents:
diff changeset
211
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
212 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
213 EnumInfo *I) {
anatofuz
parents:
diff changeset
214 switch (ID) {
anatofuz
parents:
diff changeset
215 case ENUM_USR:
anatofuz
parents:
diff changeset
216 return decodeRecord(R, I->USR, Blob);
anatofuz
parents:
diff changeset
217 case ENUM_NAME:
anatofuz
parents:
diff changeset
218 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
219 case ENUM_DEFLOCATION:
anatofuz
parents:
diff changeset
220 return decodeRecord(R, I->DefLoc, Blob);
anatofuz
parents:
diff changeset
221 case ENUM_LOCATION:
anatofuz
parents:
diff changeset
222 return decodeRecord(R, I->Loc, Blob);
anatofuz
parents:
diff changeset
223 case ENUM_SCOPED:
anatofuz
parents:
diff changeset
224 return decodeRecord(R, I->Scoped, Blob);
anatofuz
parents:
diff changeset
225 default:
anatofuz
parents:
diff changeset
226 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
227 "invalid field for EnumInfo");
anatofuz
parents:
diff changeset
228 }
anatofuz
parents:
diff changeset
229 }
anatofuz
parents:
diff changeset
230
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
231 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
232 TypedefInfo *I) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
233 switch (ID) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
234 case TYPEDEF_USR:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
235 return decodeRecord(R, I->USR, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
236 case TYPEDEF_NAME:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
237 return decodeRecord(R, I->Name, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
238 case TYPEDEF_DEFLOCATION:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
239 return decodeRecord(R, I->DefLoc, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
240 case TYPEDEF_IS_USING:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
241 return decodeRecord(R, I->IsUsing, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
242 default:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
243 return llvm::createStringError(llvm::inconvertibleErrorCode(),
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
244 "invalid field for TypedefInfo");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
245 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
246 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
247
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
248 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
249 EnumValueInfo *I) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
250 switch (ID) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
251 case ENUM_VALUE_NAME:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
252 return decodeRecord(R, I->Name, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
253 case ENUM_VALUE_VALUE:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
254 return decodeRecord(R, I->Value, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
255 case ENUM_VALUE_EXPR:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
256 return decodeRecord(R, I->ValueExpr, Blob);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
257 default:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
258 return llvm::createStringError(llvm::inconvertibleErrorCode(),
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
259 "invalid field for EnumValueInfo");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
260 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
261 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
262
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
263 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
264 FunctionInfo *I) {
anatofuz
parents:
diff changeset
265 switch (ID) {
anatofuz
parents:
diff changeset
266 case FUNCTION_USR:
anatofuz
parents:
diff changeset
267 return decodeRecord(R, I->USR, Blob);
anatofuz
parents:
diff changeset
268 case FUNCTION_NAME:
anatofuz
parents:
diff changeset
269 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
270 case FUNCTION_DEFLOCATION:
anatofuz
parents:
diff changeset
271 return decodeRecord(R, I->DefLoc, Blob);
anatofuz
parents:
diff changeset
272 case FUNCTION_LOCATION:
anatofuz
parents:
diff changeset
273 return decodeRecord(R, I->Loc, Blob);
anatofuz
parents:
diff changeset
274 case FUNCTION_ACCESS:
anatofuz
parents:
diff changeset
275 return decodeRecord(R, I->Access, Blob);
anatofuz
parents:
diff changeset
276 case FUNCTION_IS_METHOD:
anatofuz
parents:
diff changeset
277 return decodeRecord(R, I->IsMethod, Blob);
anatofuz
parents:
diff changeset
278 default:
anatofuz
parents:
diff changeset
279 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
280 "invalid field for FunctionInfo");
anatofuz
parents:
diff changeset
281 }
anatofuz
parents:
diff changeset
282 }
anatofuz
parents:
diff changeset
283
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
284 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
285 TypeInfo *I) {
anatofuz
parents:
diff changeset
286 return llvm::Error::success();
anatofuz
parents:
diff changeset
287 }
anatofuz
parents:
diff changeset
288
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
289 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
290 FieldTypeInfo *I) {
anatofuz
parents:
diff changeset
291 switch (ID) {
anatofuz
parents:
diff changeset
292 case FIELD_TYPE_NAME:
anatofuz
parents:
diff changeset
293 return decodeRecord(R, I->Name, Blob);
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
294 case FIELD_DEFAULT_VALUE:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
295 return decodeRecord(R, I->DefaultValue, Blob);
150
anatofuz
parents:
diff changeset
296 default:
anatofuz
parents:
diff changeset
297 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
298 "invalid field for TypeInfo");
anatofuz
parents:
diff changeset
299 }
anatofuz
parents:
diff changeset
300 }
anatofuz
parents:
diff changeset
301
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
302 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
303 MemberTypeInfo *I) {
anatofuz
parents:
diff changeset
304 switch (ID) {
anatofuz
parents:
diff changeset
305 case MEMBER_TYPE_NAME:
anatofuz
parents:
diff changeset
306 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
307 case MEMBER_TYPE_ACCESS:
anatofuz
parents:
diff changeset
308 return decodeRecord(R, I->Access, Blob);
anatofuz
parents:
diff changeset
309 default:
anatofuz
parents:
diff changeset
310 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
311 "invalid field for MemberTypeInfo");
anatofuz
parents:
diff changeset
312 }
anatofuz
parents:
diff changeset
313 }
anatofuz
parents:
diff changeset
314
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
315 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
316 CommentInfo *I) {
anatofuz
parents:
diff changeset
317 switch (ID) {
anatofuz
parents:
diff changeset
318 case COMMENT_KIND:
anatofuz
parents:
diff changeset
319 return decodeRecord(R, I->Kind, Blob);
anatofuz
parents:
diff changeset
320 case COMMENT_TEXT:
anatofuz
parents:
diff changeset
321 return decodeRecord(R, I->Text, Blob);
anatofuz
parents:
diff changeset
322 case COMMENT_NAME:
anatofuz
parents:
diff changeset
323 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
324 case COMMENT_DIRECTION:
anatofuz
parents:
diff changeset
325 return decodeRecord(R, I->Direction, Blob);
anatofuz
parents:
diff changeset
326 case COMMENT_PARAMNAME:
anatofuz
parents:
diff changeset
327 return decodeRecord(R, I->ParamName, Blob);
anatofuz
parents:
diff changeset
328 case COMMENT_CLOSENAME:
anatofuz
parents:
diff changeset
329 return decodeRecord(R, I->CloseName, Blob);
anatofuz
parents:
diff changeset
330 case COMMENT_ATTRKEY:
anatofuz
parents:
diff changeset
331 return decodeRecord(R, I->AttrKeys, Blob);
anatofuz
parents:
diff changeset
332 case COMMENT_ATTRVAL:
anatofuz
parents:
diff changeset
333 return decodeRecord(R, I->AttrValues, Blob);
anatofuz
parents:
diff changeset
334 case COMMENT_ARG:
anatofuz
parents:
diff changeset
335 return decodeRecord(R, I->Args, Blob);
anatofuz
parents:
diff changeset
336 case COMMENT_SELFCLOSING:
anatofuz
parents:
diff changeset
337 return decodeRecord(R, I->SelfClosing, Blob);
anatofuz
parents:
diff changeset
338 case COMMENT_EXPLICIT:
anatofuz
parents:
diff changeset
339 return decodeRecord(R, I->Explicit, Blob);
anatofuz
parents:
diff changeset
340 default:
anatofuz
parents:
diff changeset
341 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
342 "invalid field for CommentInfo");
anatofuz
parents:
diff changeset
343 }
anatofuz
parents:
diff changeset
344 }
anatofuz
parents:
diff changeset
345
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
346 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150
anatofuz
parents:
diff changeset
347 Reference *I, FieldId &F) {
anatofuz
parents:
diff changeset
348 switch (ID) {
anatofuz
parents:
diff changeset
349 case REFERENCE_USR:
anatofuz
parents:
diff changeset
350 return decodeRecord(R, I->USR, Blob);
anatofuz
parents:
diff changeset
351 case REFERENCE_NAME:
anatofuz
parents:
diff changeset
352 return decodeRecord(R, I->Name, Blob);
anatofuz
parents:
diff changeset
353 case REFERENCE_TYPE:
anatofuz
parents:
diff changeset
354 return decodeRecord(R, I->RefType, Blob);
anatofuz
parents:
diff changeset
355 case REFERENCE_PATH:
anatofuz
parents:
diff changeset
356 return decodeRecord(R, I->Path, Blob);
anatofuz
parents:
diff changeset
357 case REFERENCE_FIELD:
anatofuz
parents:
diff changeset
358 return decodeRecord(R, F, Blob);
anatofuz
parents:
diff changeset
359 default:
anatofuz
parents:
diff changeset
360 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
361 "invalid field for Reference");
anatofuz
parents:
diff changeset
362 }
anatofuz
parents:
diff changeset
363 }
anatofuz
parents:
diff changeset
364
anatofuz
parents:
diff changeset
365 template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) {
anatofuz
parents:
diff changeset
366 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
367 "invalid type cannot contain CommentInfo");
anatofuz
parents:
diff changeset
368 }
anatofuz
parents:
diff changeset
369
anatofuz
parents:
diff changeset
370 template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
371 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
372 }
anatofuz
parents:
diff changeset
373
anatofuz
parents:
diff changeset
374 template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
375 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
376 }
anatofuz
parents:
diff changeset
377
anatofuz
parents:
diff changeset
378 template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
379 return &I->Description.emplace_back();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
380 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
381
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
382 template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
383 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
384 }
anatofuz
parents:
diff changeset
385
anatofuz
parents:
diff changeset
386 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
387 return &I->Description.emplace_back();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
388 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
389
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
390 template <> llvm::Expected<CommentInfo *> getCommentInfo(TypedefInfo *I) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
391 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
392 }
anatofuz
parents:
diff changeset
393
anatofuz
parents:
diff changeset
394 template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
anatofuz
parents:
diff changeset
395 I->Children.emplace_back(std::make_unique<CommentInfo>());
anatofuz
parents:
diff changeset
396 return I->Children.back().get();
anatofuz
parents:
diff changeset
397 }
anatofuz
parents:
diff changeset
398
anatofuz
parents:
diff changeset
399 template <>
anatofuz
parents:
diff changeset
400 llvm::Expected<CommentInfo *> getCommentInfo(std::unique_ptr<CommentInfo> &I) {
anatofuz
parents:
diff changeset
401 return getCommentInfo(I.get());
anatofuz
parents:
diff changeset
402 }
anatofuz
parents:
diff changeset
403
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
404 // When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
405 // the parent block to set it. The template specializations define what to do
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
406 // for each supported parent block.
150
anatofuz
parents:
diff changeset
407 template <typename T, typename TTypeInfo>
anatofuz
parents:
diff changeset
408 llvm::Error addTypeInfo(T I, TTypeInfo &&TI) {
anatofuz
parents:
diff changeset
409 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
410 "invalid type cannot contain TypeInfo");
anatofuz
parents:
diff changeset
411 }
anatofuz
parents:
diff changeset
412
anatofuz
parents:
diff changeset
413 template <> llvm::Error addTypeInfo(RecordInfo *I, MemberTypeInfo &&T) {
anatofuz
parents:
diff changeset
414 I->Members.emplace_back(std::move(T));
anatofuz
parents:
diff changeset
415 return llvm::Error::success();
anatofuz
parents:
diff changeset
416 }
anatofuz
parents:
diff changeset
417
anatofuz
parents:
diff changeset
418 template <> llvm::Error addTypeInfo(BaseRecordInfo *I, MemberTypeInfo &&T) {
anatofuz
parents:
diff changeset
419 I->Members.emplace_back(std::move(T));
anatofuz
parents:
diff changeset
420 return llvm::Error::success();
anatofuz
parents:
diff changeset
421 }
anatofuz
parents:
diff changeset
422
anatofuz
parents:
diff changeset
423 template <> llvm::Error addTypeInfo(FunctionInfo *I, TypeInfo &&T) {
anatofuz
parents:
diff changeset
424 I->ReturnType = std::move(T);
anatofuz
parents:
diff changeset
425 return llvm::Error::success();
anatofuz
parents:
diff changeset
426 }
anatofuz
parents:
diff changeset
427
anatofuz
parents:
diff changeset
428 template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) {
anatofuz
parents:
diff changeset
429 I->Params.emplace_back(std::move(T));
anatofuz
parents:
diff changeset
430 return llvm::Error::success();
anatofuz
parents:
diff changeset
431 }
anatofuz
parents:
diff changeset
432
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
433 template <> llvm::Error addTypeInfo(EnumInfo *I, TypeInfo &&T) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
434 I->BaseType = std::move(T);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
435 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
436 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
437
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
438 template <> llvm::Error addTypeInfo(TypedefInfo *I, TypeInfo &&T) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
439 I->Underlying = std::move(T);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
440 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
441 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
442
150
anatofuz
parents:
diff changeset
443 template <typename T> llvm::Error addReference(T I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
444 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
445 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
446 }
anatofuz
parents:
diff changeset
447
anatofuz
parents:
diff changeset
448 template <> llvm::Error addReference(TypeInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
449 switch (F) {
anatofuz
parents:
diff changeset
450 case FieldId::F_type:
anatofuz
parents:
diff changeset
451 I->Type = std::move(R);
anatofuz
parents:
diff changeset
452 return llvm::Error::success();
anatofuz
parents:
diff changeset
453 default:
anatofuz
parents:
diff changeset
454 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
455 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
456 }
anatofuz
parents:
diff changeset
457 }
anatofuz
parents:
diff changeset
458
anatofuz
parents:
diff changeset
459 template <>
anatofuz
parents:
diff changeset
460 llvm::Error addReference(FieldTypeInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
461 switch (F) {
anatofuz
parents:
diff changeset
462 case FieldId::F_type:
anatofuz
parents:
diff changeset
463 I->Type = std::move(R);
anatofuz
parents:
diff changeset
464 return llvm::Error::success();
anatofuz
parents:
diff changeset
465 default:
anatofuz
parents:
diff changeset
466 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
467 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
468 }
anatofuz
parents:
diff changeset
469 }
anatofuz
parents:
diff changeset
470
anatofuz
parents:
diff changeset
471 template <>
anatofuz
parents:
diff changeset
472 llvm::Error addReference(MemberTypeInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
473 switch (F) {
anatofuz
parents:
diff changeset
474 case FieldId::F_type:
anatofuz
parents:
diff changeset
475 I->Type = std::move(R);
anatofuz
parents:
diff changeset
476 return llvm::Error::success();
anatofuz
parents:
diff changeset
477 default:
anatofuz
parents:
diff changeset
478 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
479 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
480 }
anatofuz
parents:
diff changeset
481 }
anatofuz
parents:
diff changeset
482
anatofuz
parents:
diff changeset
483 template <> llvm::Error addReference(EnumInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
484 switch (F) {
anatofuz
parents:
diff changeset
485 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
486 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
487 return llvm::Error::success();
anatofuz
parents:
diff changeset
488 default:
anatofuz
parents:
diff changeset
489 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
490 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
491 }
anatofuz
parents:
diff changeset
492 }
anatofuz
parents:
diff changeset
493
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
494 template <> llvm::Error addReference(TypedefInfo *I, Reference &&R, FieldId F) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
495 switch (F) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
496 case FieldId::F_namespace:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
497 I->Namespace.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
498 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
499 default:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
500 return llvm::createStringError(llvm::inconvertibleErrorCode(),
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
501 "invalid type cannot contain Reference");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
502 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
503 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
504
150
anatofuz
parents:
diff changeset
505 template <>
anatofuz
parents:
diff changeset
506 llvm::Error addReference(NamespaceInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
507 switch (F) {
anatofuz
parents:
diff changeset
508 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
509 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
510 return llvm::Error::success();
anatofuz
parents:
diff changeset
511 case FieldId::F_child_namespace:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
512 I->Children.Namespaces.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
513 return llvm::Error::success();
anatofuz
parents:
diff changeset
514 case FieldId::F_child_record:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
515 I->Children.Records.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
516 return llvm::Error::success();
anatofuz
parents:
diff changeset
517 default:
anatofuz
parents:
diff changeset
518 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
519 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
520 }
anatofuz
parents:
diff changeset
521 }
anatofuz
parents:
diff changeset
522
anatofuz
parents:
diff changeset
523 template <>
anatofuz
parents:
diff changeset
524 llvm::Error addReference(FunctionInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
525 switch (F) {
anatofuz
parents:
diff changeset
526 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
527 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
528 return llvm::Error::success();
anatofuz
parents:
diff changeset
529 case FieldId::F_parent:
anatofuz
parents:
diff changeset
530 I->Parent = std::move(R);
anatofuz
parents:
diff changeset
531 return llvm::Error::success();
anatofuz
parents:
diff changeset
532 default:
anatofuz
parents:
diff changeset
533 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
534 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
535 }
anatofuz
parents:
diff changeset
536 }
anatofuz
parents:
diff changeset
537
anatofuz
parents:
diff changeset
538 template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
539 switch (F) {
anatofuz
parents:
diff changeset
540 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
541 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
542 return llvm::Error::success();
anatofuz
parents:
diff changeset
543 case FieldId::F_parent:
anatofuz
parents:
diff changeset
544 I->Parents.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
545 return llvm::Error::success();
anatofuz
parents:
diff changeset
546 case FieldId::F_vparent:
anatofuz
parents:
diff changeset
547 I->VirtualParents.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
548 return llvm::Error::success();
anatofuz
parents:
diff changeset
549 case FieldId::F_child_record:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
550 I->Children.Records.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
551 return llvm::Error::success();
anatofuz
parents:
diff changeset
552 default:
anatofuz
parents:
diff changeset
553 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
554 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
555 }
anatofuz
parents:
diff changeset
556 }
anatofuz
parents:
diff changeset
557
anatofuz
parents:
diff changeset
558 template <typename T, typename ChildInfoType>
anatofuz
parents:
diff changeset
559 void addChild(T I, ChildInfoType &&R) {
anatofuz
parents:
diff changeset
560 llvm::errs() << "invalid child type for info";
anatofuz
parents:
diff changeset
561 exit(1);
anatofuz
parents:
diff changeset
562 }
anatofuz
parents:
diff changeset
563
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
564 // Namespace children:
150
anatofuz
parents:
diff changeset
565 template <> void addChild(NamespaceInfo *I, FunctionInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
566 I->Children.Functions.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
567 }
anatofuz
parents:
diff changeset
568 template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
569 I->Children.Enums.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
570 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
571 template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
572 I->Children.Typedefs.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
573 }
anatofuz
parents:
diff changeset
574
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
575 // Record children:
150
anatofuz
parents:
diff changeset
576 template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
577 I->Children.Functions.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
578 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
579 template <> void addChild(RecordInfo *I, EnumInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
580 I->Children.Enums.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
581 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
582 template <> void addChild(RecordInfo *I, TypedefInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
583 I->Children.Typedefs.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
584 }
anatofuz
parents:
diff changeset
585
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
586 // Other types of children:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
587 template <> void addChild(EnumInfo *I, EnumValueInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
588 I->Members.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
589 }
anatofuz
parents:
diff changeset
590 template <> void addChild(RecordInfo *I, BaseRecordInfo &&R) {
anatofuz
parents:
diff changeset
591 I->Bases.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
592 }
anatofuz
parents:
diff changeset
593 template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
594 I->Children.Functions.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
595 }
anatofuz
parents:
diff changeset
596
anatofuz
parents:
diff changeset
597 // Read records from bitcode into a given info.
anatofuz
parents:
diff changeset
598 template <typename T>
anatofuz
parents:
diff changeset
599 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) {
anatofuz
parents:
diff changeset
600 Record R;
anatofuz
parents:
diff changeset
601 llvm::StringRef Blob;
anatofuz
parents:
diff changeset
602 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
anatofuz
parents:
diff changeset
603 if (!MaybeRecID)
anatofuz
parents:
diff changeset
604 return MaybeRecID.takeError();
anatofuz
parents:
diff changeset
605 return parseRecord(R, MaybeRecID.get(), Blob, I);
anatofuz
parents:
diff changeset
606 }
anatofuz
parents:
diff changeset
607
anatofuz
parents:
diff changeset
608 template <>
anatofuz
parents:
diff changeset
609 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, Reference *I) {
anatofuz
parents:
diff changeset
610 Record R;
anatofuz
parents:
diff changeset
611 llvm::StringRef Blob;
anatofuz
parents:
diff changeset
612 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
anatofuz
parents:
diff changeset
613 if (!MaybeRecID)
anatofuz
parents:
diff changeset
614 return MaybeRecID.takeError();
anatofuz
parents:
diff changeset
615 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
anatofuz
parents:
diff changeset
616 }
anatofuz
parents:
diff changeset
617
anatofuz
parents:
diff changeset
618 // Read a block of records into a single info.
anatofuz
parents:
diff changeset
619 template <typename T>
anatofuz
parents:
diff changeset
620 llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
anatofuz
parents:
diff changeset
621 if (llvm::Error Err = Stream.EnterSubBlock(ID))
anatofuz
parents:
diff changeset
622 return Err;
anatofuz
parents:
diff changeset
623
anatofuz
parents:
diff changeset
624 while (true) {
anatofuz
parents:
diff changeset
625 unsigned BlockOrCode = 0;
anatofuz
parents:
diff changeset
626 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
anatofuz
parents:
diff changeset
627
anatofuz
parents:
diff changeset
628 switch (Res) {
anatofuz
parents:
diff changeset
629 case Cursor::BadBlock:
anatofuz
parents:
diff changeset
630 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
631 "bad block found");
anatofuz
parents:
diff changeset
632 case Cursor::BlockEnd:
anatofuz
parents:
diff changeset
633 return llvm::Error::success();
anatofuz
parents:
diff changeset
634 case Cursor::BlockBegin:
anatofuz
parents:
diff changeset
635 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
anatofuz
parents:
diff changeset
636 if (llvm::Error Skipped = Stream.SkipBlock())
anatofuz
parents:
diff changeset
637 return joinErrors(std::move(Err), std::move(Skipped));
anatofuz
parents:
diff changeset
638 return Err;
anatofuz
parents:
diff changeset
639 }
anatofuz
parents:
diff changeset
640 continue;
anatofuz
parents:
diff changeset
641 case Cursor::Record:
anatofuz
parents:
diff changeset
642 break;
anatofuz
parents:
diff changeset
643 }
anatofuz
parents:
diff changeset
644 if (auto Err = readRecord(BlockOrCode, I))
anatofuz
parents:
diff changeset
645 return Err;
anatofuz
parents:
diff changeset
646 }
anatofuz
parents:
diff changeset
647 }
anatofuz
parents:
diff changeset
648
anatofuz
parents:
diff changeset
649 template <typename T>
anatofuz
parents:
diff changeset
650 llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
anatofuz
parents:
diff changeset
651 switch (ID) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
652 // Blocks can only have certain types of sub blocks.
150
anatofuz
parents:
diff changeset
653 case BI_COMMENT_BLOCK_ID: {
anatofuz
parents:
diff changeset
654 auto Comment = getCommentInfo(I);
anatofuz
parents:
diff changeset
655 if (!Comment)
anatofuz
parents:
diff changeset
656 return Comment.takeError();
anatofuz
parents:
diff changeset
657 if (auto Err = readBlock(ID, Comment.get()))
anatofuz
parents:
diff changeset
658 return Err;
anatofuz
parents:
diff changeset
659 return llvm::Error::success();
anatofuz
parents:
diff changeset
660 }
anatofuz
parents:
diff changeset
661 case BI_TYPE_BLOCK_ID: {
anatofuz
parents:
diff changeset
662 TypeInfo TI;
anatofuz
parents:
diff changeset
663 if (auto Err = readBlock(ID, &TI))
anatofuz
parents:
diff changeset
664 return Err;
anatofuz
parents:
diff changeset
665 if (auto Err = addTypeInfo(I, std::move(TI)))
anatofuz
parents:
diff changeset
666 return Err;
anatofuz
parents:
diff changeset
667 return llvm::Error::success();
anatofuz
parents:
diff changeset
668 }
anatofuz
parents:
diff changeset
669 case BI_FIELD_TYPE_BLOCK_ID: {
anatofuz
parents:
diff changeset
670 FieldTypeInfo TI;
anatofuz
parents:
diff changeset
671 if (auto Err = readBlock(ID, &TI))
anatofuz
parents:
diff changeset
672 return Err;
anatofuz
parents:
diff changeset
673 if (auto Err = addTypeInfo(I, std::move(TI)))
anatofuz
parents:
diff changeset
674 return Err;
anatofuz
parents:
diff changeset
675 return llvm::Error::success();
anatofuz
parents:
diff changeset
676 }
anatofuz
parents:
diff changeset
677 case BI_MEMBER_TYPE_BLOCK_ID: {
anatofuz
parents:
diff changeset
678 MemberTypeInfo TI;
anatofuz
parents:
diff changeset
679 if (auto Err = readBlock(ID, &TI))
anatofuz
parents:
diff changeset
680 return Err;
anatofuz
parents:
diff changeset
681 if (auto Err = addTypeInfo(I, std::move(TI)))
anatofuz
parents:
diff changeset
682 return Err;
anatofuz
parents:
diff changeset
683 return llvm::Error::success();
anatofuz
parents:
diff changeset
684 }
anatofuz
parents:
diff changeset
685 case BI_REFERENCE_BLOCK_ID: {
anatofuz
parents:
diff changeset
686 Reference R;
anatofuz
parents:
diff changeset
687 if (auto Err = readBlock(ID, &R))
anatofuz
parents:
diff changeset
688 return Err;
anatofuz
parents:
diff changeset
689 if (auto Err = addReference(I, std::move(R), CurrentReferenceField))
anatofuz
parents:
diff changeset
690 return Err;
anatofuz
parents:
diff changeset
691 return llvm::Error::success();
anatofuz
parents:
diff changeset
692 }
anatofuz
parents:
diff changeset
693 case BI_FUNCTION_BLOCK_ID: {
anatofuz
parents:
diff changeset
694 FunctionInfo F;
anatofuz
parents:
diff changeset
695 if (auto Err = readBlock(ID, &F))
anatofuz
parents:
diff changeset
696 return Err;
anatofuz
parents:
diff changeset
697 addChild(I, std::move(F));
anatofuz
parents:
diff changeset
698 return llvm::Error::success();
anatofuz
parents:
diff changeset
699 }
anatofuz
parents:
diff changeset
700 case BI_BASE_RECORD_BLOCK_ID: {
anatofuz
parents:
diff changeset
701 BaseRecordInfo BR;
anatofuz
parents:
diff changeset
702 if (auto Err = readBlock(ID, &BR))
anatofuz
parents:
diff changeset
703 return Err;
anatofuz
parents:
diff changeset
704 addChild(I, std::move(BR));
anatofuz
parents:
diff changeset
705 return llvm::Error::success();
anatofuz
parents:
diff changeset
706 }
anatofuz
parents:
diff changeset
707 case BI_ENUM_BLOCK_ID: {
anatofuz
parents:
diff changeset
708 EnumInfo E;
anatofuz
parents:
diff changeset
709 if (auto Err = readBlock(ID, &E))
anatofuz
parents:
diff changeset
710 return Err;
anatofuz
parents:
diff changeset
711 addChild(I, std::move(E));
anatofuz
parents:
diff changeset
712 return llvm::Error::success();
anatofuz
parents:
diff changeset
713 }
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
714 case BI_ENUM_VALUE_BLOCK_ID: {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
715 EnumValueInfo EV;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
716 if (auto Err = readBlock(ID, &EV))
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
717 return Err;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
718 addChild(I, std::move(EV));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
719 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
720 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
721 case BI_TYPEDEF_BLOCK_ID: {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
722 TypedefInfo TI;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
723 if (auto Err = readBlock(ID, &TI))
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
724 return Err;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
725 addChild(I, std::move(TI));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
726 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
727 }
150
anatofuz
parents:
diff changeset
728 default:
anatofuz
parents:
diff changeset
729 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
730 "invalid subblock type");
anatofuz
parents:
diff changeset
731 }
anatofuz
parents:
diff changeset
732 }
anatofuz
parents:
diff changeset
733
anatofuz
parents:
diff changeset
734 ClangDocBitcodeReader::Cursor
anatofuz
parents:
diff changeset
735 ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) {
anatofuz
parents:
diff changeset
736 BlockOrRecordID = 0;
anatofuz
parents:
diff changeset
737
anatofuz
parents:
diff changeset
738 while (!Stream.AtEndOfStream()) {
anatofuz
parents:
diff changeset
739 Expected<unsigned> MaybeCode = Stream.ReadCode();
anatofuz
parents:
diff changeset
740 if (!MaybeCode) {
anatofuz
parents:
diff changeset
741 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
742 consumeError(MaybeCode.takeError());
anatofuz
parents:
diff changeset
743 return Cursor::BadBlock;
anatofuz
parents:
diff changeset
744 }
anatofuz
parents:
diff changeset
745
anatofuz
parents:
diff changeset
746 unsigned Code = MaybeCode.get();
anatofuz
parents:
diff changeset
747 if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
anatofuz
parents:
diff changeset
748 BlockOrRecordID = Code;
anatofuz
parents:
diff changeset
749 return Cursor::Record;
anatofuz
parents:
diff changeset
750 }
anatofuz
parents:
diff changeset
751 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) {
anatofuz
parents:
diff changeset
752 case llvm::bitc::ENTER_SUBBLOCK:
anatofuz
parents:
diff changeset
753 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
anatofuz
parents:
diff changeset
754 BlockOrRecordID = MaybeID.get();
anatofuz
parents:
diff changeset
755 else {
anatofuz
parents:
diff changeset
756 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
757 consumeError(MaybeID.takeError());
anatofuz
parents:
diff changeset
758 }
anatofuz
parents:
diff changeset
759 return Cursor::BlockBegin;
anatofuz
parents:
diff changeset
760 case llvm::bitc::END_BLOCK:
anatofuz
parents:
diff changeset
761 if (Stream.ReadBlockEnd())
anatofuz
parents:
diff changeset
762 return Cursor::BadBlock;
anatofuz
parents:
diff changeset
763 return Cursor::BlockEnd;
anatofuz
parents:
diff changeset
764 case llvm::bitc::DEFINE_ABBREV:
anatofuz
parents:
diff changeset
765 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
anatofuz
parents:
diff changeset
766 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
767 consumeError(std::move(Err));
anatofuz
parents:
diff changeset
768 }
anatofuz
parents:
diff changeset
769 continue;
anatofuz
parents:
diff changeset
770 case llvm::bitc::UNABBREV_RECORD:
anatofuz
parents:
diff changeset
771 return Cursor::BadBlock;
anatofuz
parents:
diff changeset
772 case llvm::bitc::FIRST_APPLICATION_ABBREV:
anatofuz
parents:
diff changeset
773 llvm_unreachable("Unexpected abbrev id.");
anatofuz
parents:
diff changeset
774 }
anatofuz
parents:
diff changeset
775 }
anatofuz
parents:
diff changeset
776 llvm_unreachable("Premature stream end.");
anatofuz
parents:
diff changeset
777 }
anatofuz
parents:
diff changeset
778
anatofuz
parents:
diff changeset
779 llvm::Error ClangDocBitcodeReader::validateStream() {
anatofuz
parents:
diff changeset
780 if (Stream.AtEndOfStream())
anatofuz
parents:
diff changeset
781 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
782 "premature end of stream");
anatofuz
parents:
diff changeset
783
anatofuz
parents:
diff changeset
784 // Sniff for the signature.
anatofuz
parents:
diff changeset
785 for (int Idx = 0; Idx != 4; ++Idx) {
anatofuz
parents:
diff changeset
786 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
anatofuz
parents:
diff changeset
787 if (!MaybeRead)
anatofuz
parents:
diff changeset
788 return MaybeRead.takeError();
anatofuz
parents:
diff changeset
789 else if (MaybeRead.get() != BitCodeConstants::Signature[Idx])
anatofuz
parents:
diff changeset
790 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
791 "invalid bitcode signature");
anatofuz
parents:
diff changeset
792 }
anatofuz
parents:
diff changeset
793 return llvm::Error::success();
anatofuz
parents:
diff changeset
794 }
anatofuz
parents:
diff changeset
795
anatofuz
parents:
diff changeset
796 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
anatofuz
parents:
diff changeset
797 Expected<Optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
anatofuz
parents:
diff changeset
798 Stream.ReadBlockInfoBlock();
anatofuz
parents:
diff changeset
799 if (!MaybeBlockInfo)
anatofuz
parents:
diff changeset
800 return MaybeBlockInfo.takeError();
anatofuz
parents:
diff changeset
801 else
anatofuz
parents:
diff changeset
802 BlockInfo = MaybeBlockInfo.get();
anatofuz
parents:
diff changeset
803 if (!BlockInfo)
anatofuz
parents:
diff changeset
804 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
805 "unable to parse BlockInfoBlock");
anatofuz
parents:
diff changeset
806 Stream.setBlockInfo(&*BlockInfo);
anatofuz
parents:
diff changeset
807 return llvm::Error::success();
anatofuz
parents:
diff changeset
808 }
anatofuz
parents:
diff changeset
809
anatofuz
parents:
diff changeset
810 template <typename T>
anatofuz
parents:
diff changeset
811 llvm::Expected<std::unique_ptr<Info>>
anatofuz
parents:
diff changeset
812 ClangDocBitcodeReader::createInfo(unsigned ID) {
anatofuz
parents:
diff changeset
813 std::unique_ptr<Info> I = std::make_unique<T>();
anatofuz
parents:
diff changeset
814 if (auto Err = readBlock(ID, static_cast<T *>(I.get())))
anatofuz
parents:
diff changeset
815 return std::move(Err);
anatofuz
parents:
diff changeset
816 return std::unique_ptr<Info>{std::move(I)};
anatofuz
parents:
diff changeset
817 }
anatofuz
parents:
diff changeset
818
anatofuz
parents:
diff changeset
819 llvm::Expected<std::unique_ptr<Info>>
anatofuz
parents:
diff changeset
820 ClangDocBitcodeReader::readBlockToInfo(unsigned ID) {
anatofuz
parents:
diff changeset
821 switch (ID) {
anatofuz
parents:
diff changeset
822 case BI_NAMESPACE_BLOCK_ID:
anatofuz
parents:
diff changeset
823 return createInfo<NamespaceInfo>(ID);
anatofuz
parents:
diff changeset
824 case BI_RECORD_BLOCK_ID:
anatofuz
parents:
diff changeset
825 return createInfo<RecordInfo>(ID);
anatofuz
parents:
diff changeset
826 case BI_ENUM_BLOCK_ID:
anatofuz
parents:
diff changeset
827 return createInfo<EnumInfo>(ID);
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
828 case BI_TYPEDEF_BLOCK_ID:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
829 return createInfo<TypedefInfo>(ID);
150
anatofuz
parents:
diff changeset
830 case BI_FUNCTION_BLOCK_ID:
anatofuz
parents:
diff changeset
831 return createInfo<FunctionInfo>(ID);
anatofuz
parents:
diff changeset
832 default:
anatofuz
parents:
diff changeset
833 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
834 "cannot create info");
anatofuz
parents:
diff changeset
835 }
anatofuz
parents:
diff changeset
836 }
anatofuz
parents:
diff changeset
837
anatofuz
parents:
diff changeset
838 // Entry point
anatofuz
parents:
diff changeset
839 llvm::Expected<std::vector<std::unique_ptr<Info>>>
anatofuz
parents:
diff changeset
840 ClangDocBitcodeReader::readBitcode() {
anatofuz
parents:
diff changeset
841 std::vector<std::unique_ptr<Info>> Infos;
anatofuz
parents:
diff changeset
842 if (auto Err = validateStream())
anatofuz
parents:
diff changeset
843 return std::move(Err);
anatofuz
parents:
diff changeset
844
anatofuz
parents:
diff changeset
845 // Read the top level blocks.
anatofuz
parents:
diff changeset
846 while (!Stream.AtEndOfStream()) {
anatofuz
parents:
diff changeset
847 Expected<unsigned> MaybeCode = Stream.ReadCode();
anatofuz
parents:
diff changeset
848 if (!MaybeCode)
anatofuz
parents:
diff changeset
849 return MaybeCode.takeError();
anatofuz
parents:
diff changeset
850 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
anatofuz
parents:
diff changeset
851 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
852 "no blocks in input");
anatofuz
parents:
diff changeset
853 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
anatofuz
parents:
diff changeset
854 if (!MaybeID)
anatofuz
parents:
diff changeset
855 return MaybeID.takeError();
anatofuz
parents:
diff changeset
856 unsigned ID = MaybeID.get();
anatofuz
parents:
diff changeset
857 switch (ID) {
anatofuz
parents:
diff changeset
858 // NamedType and Comment blocks should not appear at the top level
anatofuz
parents:
diff changeset
859 case BI_TYPE_BLOCK_ID:
anatofuz
parents:
diff changeset
860 case BI_FIELD_TYPE_BLOCK_ID:
anatofuz
parents:
diff changeset
861 case BI_MEMBER_TYPE_BLOCK_ID:
anatofuz
parents:
diff changeset
862 case BI_COMMENT_BLOCK_ID:
anatofuz
parents:
diff changeset
863 case BI_REFERENCE_BLOCK_ID:
anatofuz
parents:
diff changeset
864 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
865 "invalid top level block");
anatofuz
parents:
diff changeset
866 case BI_NAMESPACE_BLOCK_ID:
anatofuz
parents:
diff changeset
867 case BI_RECORD_BLOCK_ID:
anatofuz
parents:
diff changeset
868 case BI_ENUM_BLOCK_ID:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
869 case BI_TYPEDEF_BLOCK_ID:
150
anatofuz
parents:
diff changeset
870 case BI_FUNCTION_BLOCK_ID: {
anatofuz
parents:
diff changeset
871 auto InfoOrErr = readBlockToInfo(ID);
anatofuz
parents:
diff changeset
872 if (!InfoOrErr)
anatofuz
parents:
diff changeset
873 return InfoOrErr.takeError();
anatofuz
parents:
diff changeset
874 Infos.emplace_back(std::move(InfoOrErr.get()));
anatofuz
parents:
diff changeset
875 continue;
anatofuz
parents:
diff changeset
876 }
anatofuz
parents:
diff changeset
877 case BI_VERSION_BLOCK_ID:
anatofuz
parents:
diff changeset
878 if (auto Err = readBlock(ID, VersionNumber))
anatofuz
parents:
diff changeset
879 return std::move(Err);
anatofuz
parents:
diff changeset
880 continue;
anatofuz
parents:
diff changeset
881 case llvm::bitc::BLOCKINFO_BLOCK_ID:
anatofuz
parents:
diff changeset
882 if (auto Err = readBlockInfoBlock())
anatofuz
parents:
diff changeset
883 return std::move(Err);
anatofuz
parents:
diff changeset
884 continue;
anatofuz
parents:
diff changeset
885 default:
anatofuz
parents:
diff changeset
886 if (llvm::Error Err = Stream.SkipBlock()) {
anatofuz
parents:
diff changeset
887 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
888 consumeError(std::move(Err));
anatofuz
parents:
diff changeset
889 }
anatofuz
parents:
diff changeset
890 continue;
anatofuz
parents:
diff changeset
891 }
anatofuz
parents:
diff changeset
892 }
anatofuz
parents:
diff changeset
893 return std::move(Infos);
anatofuz
parents:
diff changeset
894 }
anatofuz
parents:
diff changeset
895
anatofuz
parents:
diff changeset
896 } // namespace doc
anatofuz
parents:
diff changeset
897 } // namespace clang