annotate clang-tools-extra/clang-doc/BitcodeReader.cpp @ 266:00f31e85ec16 default tip

Added tag current for changeset 31d058e83c98
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 14 Oct 2023 10:13:55 +0900
parents 1f2b6ac9f198
children
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/Support/Error.h"
anatofuz
parents:
diff changeset
12 #include "llvm/Support/raw_ostream.h"
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
13 #include <optional>
150
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
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
84 llvm::Error decodeRecord(const Record &R, std::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);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
353 case REFERENCE_QUAL_NAME:
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
354 return decodeRecord(R, I->QualName, Blob);
150
anatofuz
parents:
diff changeset
355 case REFERENCE_TYPE:
anatofuz
parents:
diff changeset
356 return decodeRecord(R, I->RefType, Blob);
anatofuz
parents:
diff changeset
357 case REFERENCE_PATH:
anatofuz
parents:
diff changeset
358 return decodeRecord(R, I->Path, Blob);
anatofuz
parents:
diff changeset
359 case REFERENCE_FIELD:
anatofuz
parents:
diff changeset
360 return decodeRecord(R, F, Blob);
anatofuz
parents:
diff changeset
361 default:
anatofuz
parents:
diff changeset
362 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
363 "invalid field for Reference");
anatofuz
parents:
diff changeset
364 }
anatofuz
parents:
diff changeset
365 }
anatofuz
parents:
diff changeset
366
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
367 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
368 TemplateInfo *I) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
369 // Currently there are no child records of TemplateInfo (only child blocks).
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
370 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
371 "invalid field for TemplateParamInfo");
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
372 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
373
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
374 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
375 TemplateSpecializationInfo *I) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
376 if (ID == TEMPLATE_SPECIALIZATION_OF)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
377 return decodeRecord(R, I->SpecializationOf, Blob);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
378 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
379 "invalid field for TemplateParamInfo");
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
380 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
381
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
382 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
383 TemplateParamInfo *I) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
384 if (ID == TEMPLATE_PARAM_CONTENTS)
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
385 return decodeRecord(R, I->Contents, Blob);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
386 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
387 "invalid field for TemplateParamInfo");
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
388 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
389
150
anatofuz
parents:
diff changeset
390 template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) {
anatofuz
parents:
diff changeset
391 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
392 "invalid type cannot contain CommentInfo");
anatofuz
parents:
diff changeset
393 }
anatofuz
parents:
diff changeset
394
anatofuz
parents:
diff changeset
395 template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
396 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
397 }
anatofuz
parents:
diff changeset
398
anatofuz
parents:
diff changeset
399 template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
400 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
401 }
anatofuz
parents:
diff changeset
402
anatofuz
parents:
diff changeset
403 template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
404 return &I->Description.emplace_back();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
405 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
406
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
407 template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
408 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
409 }
anatofuz
parents:
diff changeset
410
anatofuz
parents:
diff changeset
411 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
412 return &I->Description.emplace_back();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
413 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
414
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
415 template <> llvm::Expected<CommentInfo *> getCommentInfo(TypedefInfo *I) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
416 return &I->Description.emplace_back();
150
anatofuz
parents:
diff changeset
417 }
anatofuz
parents:
diff changeset
418
anatofuz
parents:
diff changeset
419 template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
anatofuz
parents:
diff changeset
420 I->Children.emplace_back(std::make_unique<CommentInfo>());
anatofuz
parents:
diff changeset
421 return I->Children.back().get();
anatofuz
parents:
diff changeset
422 }
anatofuz
parents:
diff changeset
423
anatofuz
parents:
diff changeset
424 template <>
anatofuz
parents:
diff changeset
425 llvm::Expected<CommentInfo *> getCommentInfo(std::unique_ptr<CommentInfo> &I) {
anatofuz
parents:
diff changeset
426 return getCommentInfo(I.get());
anatofuz
parents:
diff changeset
427 }
anatofuz
parents:
diff changeset
428
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
429 // When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
430 // the parent block to set it. The template specializations define what to do
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
431 // for each supported parent block.
150
anatofuz
parents:
diff changeset
432 template <typename T, typename TTypeInfo>
anatofuz
parents:
diff changeset
433 llvm::Error addTypeInfo(T I, TTypeInfo &&TI) {
anatofuz
parents:
diff changeset
434 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
435 "invalid type cannot contain TypeInfo");
anatofuz
parents:
diff changeset
436 }
anatofuz
parents:
diff changeset
437
anatofuz
parents:
diff changeset
438 template <> llvm::Error addTypeInfo(RecordInfo *I, MemberTypeInfo &&T) {
anatofuz
parents:
diff changeset
439 I->Members.emplace_back(std::move(T));
anatofuz
parents:
diff changeset
440 return llvm::Error::success();
anatofuz
parents:
diff changeset
441 }
anatofuz
parents:
diff changeset
442
anatofuz
parents:
diff changeset
443 template <> llvm::Error addTypeInfo(BaseRecordInfo *I, MemberTypeInfo &&T) {
anatofuz
parents:
diff changeset
444 I->Members.emplace_back(std::move(T));
anatofuz
parents:
diff changeset
445 return llvm::Error::success();
anatofuz
parents:
diff changeset
446 }
anatofuz
parents:
diff changeset
447
anatofuz
parents:
diff changeset
448 template <> llvm::Error addTypeInfo(FunctionInfo *I, TypeInfo &&T) {
anatofuz
parents:
diff changeset
449 I->ReturnType = std::move(T);
anatofuz
parents:
diff changeset
450 return llvm::Error::success();
anatofuz
parents:
diff changeset
451 }
anatofuz
parents:
diff changeset
452
anatofuz
parents:
diff changeset
453 template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) {
anatofuz
parents:
diff changeset
454 I->Params.emplace_back(std::move(T));
anatofuz
parents:
diff changeset
455 return llvm::Error::success();
anatofuz
parents:
diff changeset
456 }
anatofuz
parents:
diff changeset
457
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
458 template <> llvm::Error addTypeInfo(EnumInfo *I, TypeInfo &&T) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
459 I->BaseType = std::move(T);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
460 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
461 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
462
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
463 template <> llvm::Error addTypeInfo(TypedefInfo *I, TypeInfo &&T) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
464 I->Underlying = std::move(T);
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
465 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
466 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
467
150
anatofuz
parents:
diff changeset
468 template <typename T> llvm::Error addReference(T I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
469 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
470 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
471 }
anatofuz
parents:
diff changeset
472
anatofuz
parents:
diff changeset
473 template <> llvm::Error addReference(TypeInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
474 switch (F) {
anatofuz
parents:
diff changeset
475 case FieldId::F_type:
anatofuz
parents:
diff changeset
476 I->Type = std::move(R);
anatofuz
parents:
diff changeset
477 return llvm::Error::success();
anatofuz
parents:
diff changeset
478 default:
anatofuz
parents:
diff changeset
479 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
480 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
481 }
anatofuz
parents:
diff changeset
482 }
anatofuz
parents:
diff changeset
483
anatofuz
parents:
diff changeset
484 template <>
anatofuz
parents:
diff changeset
485 llvm::Error addReference(FieldTypeInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
486 switch (F) {
anatofuz
parents:
diff changeset
487 case FieldId::F_type:
anatofuz
parents:
diff changeset
488 I->Type = std::move(R);
anatofuz
parents:
diff changeset
489 return llvm::Error::success();
anatofuz
parents:
diff changeset
490 default:
anatofuz
parents:
diff changeset
491 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
492 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
493 }
anatofuz
parents:
diff changeset
494 }
anatofuz
parents:
diff changeset
495
anatofuz
parents:
diff changeset
496 template <>
anatofuz
parents:
diff changeset
497 llvm::Error addReference(MemberTypeInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
498 switch (F) {
anatofuz
parents:
diff changeset
499 case FieldId::F_type:
anatofuz
parents:
diff changeset
500 I->Type = std::move(R);
anatofuz
parents:
diff changeset
501 return llvm::Error::success();
anatofuz
parents:
diff changeset
502 default:
anatofuz
parents:
diff changeset
503 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
504 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
505 }
anatofuz
parents:
diff changeset
506 }
anatofuz
parents:
diff changeset
507
anatofuz
parents:
diff changeset
508 template <> llvm::Error addReference(EnumInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
509 switch (F) {
anatofuz
parents:
diff changeset
510 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
511 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
512 return llvm::Error::success();
anatofuz
parents:
diff changeset
513 default:
anatofuz
parents:
diff changeset
514 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
515 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
516 }
anatofuz
parents:
diff changeset
517 }
anatofuz
parents:
diff changeset
518
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
519 template <> llvm::Error addReference(TypedefInfo *I, Reference &&R, FieldId F) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
520 switch (F) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
521 case FieldId::F_namespace:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
522 I->Namespace.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
523 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
524 default:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
525 return llvm::createStringError(llvm::inconvertibleErrorCode(),
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
526 "invalid type cannot contain Reference");
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
527 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
528 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
529
150
anatofuz
parents:
diff changeset
530 template <>
anatofuz
parents:
diff changeset
531 llvm::Error addReference(NamespaceInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
532 switch (F) {
anatofuz
parents:
diff changeset
533 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
534 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
535 return llvm::Error::success();
anatofuz
parents:
diff changeset
536 case FieldId::F_child_namespace:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
537 I->Children.Namespaces.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
538 return llvm::Error::success();
anatofuz
parents:
diff changeset
539 case FieldId::F_child_record:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
540 I->Children.Records.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
541 return llvm::Error::success();
anatofuz
parents:
diff changeset
542 default:
anatofuz
parents:
diff changeset
543 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
544 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
545 }
anatofuz
parents:
diff changeset
546 }
anatofuz
parents:
diff changeset
547
anatofuz
parents:
diff changeset
548 template <>
anatofuz
parents:
diff changeset
549 llvm::Error addReference(FunctionInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
550 switch (F) {
anatofuz
parents:
diff changeset
551 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
552 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
553 return llvm::Error::success();
anatofuz
parents:
diff changeset
554 case FieldId::F_parent:
anatofuz
parents:
diff changeset
555 I->Parent = std::move(R);
anatofuz
parents:
diff changeset
556 return llvm::Error::success();
anatofuz
parents:
diff changeset
557 default:
anatofuz
parents:
diff changeset
558 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
559 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
560 }
anatofuz
parents:
diff changeset
561 }
anatofuz
parents:
diff changeset
562
anatofuz
parents:
diff changeset
563 template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) {
anatofuz
parents:
diff changeset
564 switch (F) {
anatofuz
parents:
diff changeset
565 case FieldId::F_namespace:
anatofuz
parents:
diff changeset
566 I->Namespace.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
567 return llvm::Error::success();
anatofuz
parents:
diff changeset
568 case FieldId::F_parent:
anatofuz
parents:
diff changeset
569 I->Parents.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
570 return llvm::Error::success();
anatofuz
parents:
diff changeset
571 case FieldId::F_vparent:
anatofuz
parents:
diff changeset
572 I->VirtualParents.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
573 return llvm::Error::success();
anatofuz
parents:
diff changeset
574 case FieldId::F_child_record:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
575 I->Children.Records.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
576 return llvm::Error::success();
anatofuz
parents:
diff changeset
577 default:
anatofuz
parents:
diff changeset
578 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
579 "invalid type cannot contain Reference");
anatofuz
parents:
diff changeset
580 }
anatofuz
parents:
diff changeset
581 }
anatofuz
parents:
diff changeset
582
anatofuz
parents:
diff changeset
583 template <typename T, typename ChildInfoType>
anatofuz
parents:
diff changeset
584 void addChild(T I, ChildInfoType &&R) {
anatofuz
parents:
diff changeset
585 llvm::errs() << "invalid child type for info";
anatofuz
parents:
diff changeset
586 exit(1);
anatofuz
parents:
diff changeset
587 }
anatofuz
parents:
diff changeset
588
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
589 // Namespace children:
150
anatofuz
parents:
diff changeset
590 template <> void addChild(NamespaceInfo *I, FunctionInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
591 I->Children.Functions.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
592 }
anatofuz
parents:
diff changeset
593 template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
594 I->Children.Enums.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
595 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
596 template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
597 I->Children.Typedefs.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
598 }
anatofuz
parents:
diff changeset
599
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
600 // Record children:
150
anatofuz
parents:
diff changeset
601 template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
602 I->Children.Functions.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
603 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
604 template <> void addChild(RecordInfo *I, EnumInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
605 I->Children.Enums.emplace_back(std::move(R));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
606 }
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
607 template <> void addChild(RecordInfo *I, TypedefInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
608 I->Children.Typedefs.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
609 }
anatofuz
parents:
diff changeset
610
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
611 // Other types of children:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
612 template <> void addChild(EnumInfo *I, EnumValueInfo &&R) {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
613 I->Members.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
614 }
anatofuz
parents:
diff changeset
615 template <> void addChild(RecordInfo *I, BaseRecordInfo &&R) {
anatofuz
parents:
diff changeset
616 I->Bases.emplace_back(std::move(R));
anatofuz
parents:
diff changeset
617 }
anatofuz
parents:
diff changeset
618 template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
619 I->Children.Functions.emplace_back(std::move(R));
150
anatofuz
parents:
diff changeset
620 }
anatofuz
parents:
diff changeset
621
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
622 // TemplateParam children. These go into either a TemplateInfo (for template
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
623 // parameters) or TemplateSpecializationInfo (for the specialization's
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
624 // parameters).
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
625 template <typename T> void addTemplateParam(T I, TemplateParamInfo &&P) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
626 llvm::errs() << "invalid container for template parameter";
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
627 exit(1);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
628 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
629 template <> void addTemplateParam(TemplateInfo *I, TemplateParamInfo &&P) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
630 I->Params.emplace_back(std::move(P));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
631 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
632 template <>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
633 void addTemplateParam(TemplateSpecializationInfo *I, TemplateParamInfo &&P) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
634 I->Params.emplace_back(std::move(P));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
635 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
636
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
637 // Template info. These apply to either records or functions.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
638 template <typename T> void addTemplate(T I, TemplateInfo &&P) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
639 llvm::errs() << "invalid container for template info";
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
640 exit(1);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
641 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
642 template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
643 I->Template.emplace(std::move(P));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
644 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
645 template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
646 I->Template.emplace(std::move(P));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
647 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
648
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
649 // Template specializations go only into template records.
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
650 template <typename T>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
651 void addTemplateSpecialization(T I, TemplateSpecializationInfo &&TSI) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
652 llvm::errs() << "invalid container for template specialization info";
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
653 exit(1);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
654 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
655 template <>
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
656 void addTemplateSpecialization(TemplateInfo *I,
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
657 TemplateSpecializationInfo &&TSI) {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
658 I->Specialization.emplace(std::move(TSI));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
659 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
660
150
anatofuz
parents:
diff changeset
661 // Read records from bitcode into a given info.
anatofuz
parents:
diff changeset
662 template <typename T>
anatofuz
parents:
diff changeset
663 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) {
anatofuz
parents:
diff changeset
664 Record R;
anatofuz
parents:
diff changeset
665 llvm::StringRef Blob;
anatofuz
parents:
diff changeset
666 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
anatofuz
parents:
diff changeset
667 if (!MaybeRecID)
anatofuz
parents:
diff changeset
668 return MaybeRecID.takeError();
anatofuz
parents:
diff changeset
669 return parseRecord(R, MaybeRecID.get(), Blob, I);
anatofuz
parents:
diff changeset
670 }
anatofuz
parents:
diff changeset
671
anatofuz
parents:
diff changeset
672 template <>
anatofuz
parents:
diff changeset
673 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, Reference *I) {
anatofuz
parents:
diff changeset
674 Record R;
anatofuz
parents:
diff changeset
675 llvm::StringRef Blob;
anatofuz
parents:
diff changeset
676 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
anatofuz
parents:
diff changeset
677 if (!MaybeRecID)
anatofuz
parents:
diff changeset
678 return MaybeRecID.takeError();
anatofuz
parents:
diff changeset
679 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
anatofuz
parents:
diff changeset
680 }
anatofuz
parents:
diff changeset
681
anatofuz
parents:
diff changeset
682 // Read a block of records into a single info.
anatofuz
parents:
diff changeset
683 template <typename T>
anatofuz
parents:
diff changeset
684 llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
anatofuz
parents:
diff changeset
685 if (llvm::Error Err = Stream.EnterSubBlock(ID))
anatofuz
parents:
diff changeset
686 return Err;
anatofuz
parents:
diff changeset
687
anatofuz
parents:
diff changeset
688 while (true) {
anatofuz
parents:
diff changeset
689 unsigned BlockOrCode = 0;
anatofuz
parents:
diff changeset
690 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
anatofuz
parents:
diff changeset
691
anatofuz
parents:
diff changeset
692 switch (Res) {
anatofuz
parents:
diff changeset
693 case Cursor::BadBlock:
anatofuz
parents:
diff changeset
694 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
695 "bad block found");
anatofuz
parents:
diff changeset
696 case Cursor::BlockEnd:
anatofuz
parents:
diff changeset
697 return llvm::Error::success();
anatofuz
parents:
diff changeset
698 case Cursor::BlockBegin:
anatofuz
parents:
diff changeset
699 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
anatofuz
parents:
diff changeset
700 if (llvm::Error Skipped = Stream.SkipBlock())
anatofuz
parents:
diff changeset
701 return joinErrors(std::move(Err), std::move(Skipped));
anatofuz
parents:
diff changeset
702 return Err;
anatofuz
parents:
diff changeset
703 }
anatofuz
parents:
diff changeset
704 continue;
anatofuz
parents:
diff changeset
705 case Cursor::Record:
anatofuz
parents:
diff changeset
706 break;
anatofuz
parents:
diff changeset
707 }
anatofuz
parents:
diff changeset
708 if (auto Err = readRecord(BlockOrCode, I))
anatofuz
parents:
diff changeset
709 return Err;
anatofuz
parents:
diff changeset
710 }
anatofuz
parents:
diff changeset
711 }
anatofuz
parents:
diff changeset
712
anatofuz
parents:
diff changeset
713 template <typename T>
anatofuz
parents:
diff changeset
714 llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
anatofuz
parents:
diff changeset
715 switch (ID) {
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
716 // Blocks can only have certain types of sub blocks.
150
anatofuz
parents:
diff changeset
717 case BI_COMMENT_BLOCK_ID: {
anatofuz
parents:
diff changeset
718 auto Comment = getCommentInfo(I);
anatofuz
parents:
diff changeset
719 if (!Comment)
anatofuz
parents:
diff changeset
720 return Comment.takeError();
anatofuz
parents:
diff changeset
721 if (auto Err = readBlock(ID, Comment.get()))
anatofuz
parents:
diff changeset
722 return Err;
anatofuz
parents:
diff changeset
723 return llvm::Error::success();
anatofuz
parents:
diff changeset
724 }
anatofuz
parents:
diff changeset
725 case BI_TYPE_BLOCK_ID: {
anatofuz
parents:
diff changeset
726 TypeInfo TI;
anatofuz
parents:
diff changeset
727 if (auto Err = readBlock(ID, &TI))
anatofuz
parents:
diff changeset
728 return Err;
anatofuz
parents:
diff changeset
729 if (auto Err = addTypeInfo(I, std::move(TI)))
anatofuz
parents:
diff changeset
730 return Err;
anatofuz
parents:
diff changeset
731 return llvm::Error::success();
anatofuz
parents:
diff changeset
732 }
anatofuz
parents:
diff changeset
733 case BI_FIELD_TYPE_BLOCK_ID: {
anatofuz
parents:
diff changeset
734 FieldTypeInfo TI;
anatofuz
parents:
diff changeset
735 if (auto Err = readBlock(ID, &TI))
anatofuz
parents:
diff changeset
736 return Err;
anatofuz
parents:
diff changeset
737 if (auto Err = addTypeInfo(I, std::move(TI)))
anatofuz
parents:
diff changeset
738 return Err;
anatofuz
parents:
diff changeset
739 return llvm::Error::success();
anatofuz
parents:
diff changeset
740 }
anatofuz
parents:
diff changeset
741 case BI_MEMBER_TYPE_BLOCK_ID: {
anatofuz
parents:
diff changeset
742 MemberTypeInfo TI;
anatofuz
parents:
diff changeset
743 if (auto Err = readBlock(ID, &TI))
anatofuz
parents:
diff changeset
744 return Err;
anatofuz
parents:
diff changeset
745 if (auto Err = addTypeInfo(I, std::move(TI)))
anatofuz
parents:
diff changeset
746 return Err;
anatofuz
parents:
diff changeset
747 return llvm::Error::success();
anatofuz
parents:
diff changeset
748 }
anatofuz
parents:
diff changeset
749 case BI_REFERENCE_BLOCK_ID: {
anatofuz
parents:
diff changeset
750 Reference R;
anatofuz
parents:
diff changeset
751 if (auto Err = readBlock(ID, &R))
anatofuz
parents:
diff changeset
752 return Err;
anatofuz
parents:
diff changeset
753 if (auto Err = addReference(I, std::move(R), CurrentReferenceField))
anatofuz
parents:
diff changeset
754 return Err;
anatofuz
parents:
diff changeset
755 return llvm::Error::success();
anatofuz
parents:
diff changeset
756 }
anatofuz
parents:
diff changeset
757 case BI_FUNCTION_BLOCK_ID: {
anatofuz
parents:
diff changeset
758 FunctionInfo F;
anatofuz
parents:
diff changeset
759 if (auto Err = readBlock(ID, &F))
anatofuz
parents:
diff changeset
760 return Err;
anatofuz
parents:
diff changeset
761 addChild(I, std::move(F));
anatofuz
parents:
diff changeset
762 return llvm::Error::success();
anatofuz
parents:
diff changeset
763 }
anatofuz
parents:
diff changeset
764 case BI_BASE_RECORD_BLOCK_ID: {
anatofuz
parents:
diff changeset
765 BaseRecordInfo BR;
anatofuz
parents:
diff changeset
766 if (auto Err = readBlock(ID, &BR))
anatofuz
parents:
diff changeset
767 return Err;
anatofuz
parents:
diff changeset
768 addChild(I, std::move(BR));
anatofuz
parents:
diff changeset
769 return llvm::Error::success();
anatofuz
parents:
diff changeset
770 }
anatofuz
parents:
diff changeset
771 case BI_ENUM_BLOCK_ID: {
anatofuz
parents:
diff changeset
772 EnumInfo E;
anatofuz
parents:
diff changeset
773 if (auto Err = readBlock(ID, &E))
anatofuz
parents:
diff changeset
774 return Err;
anatofuz
parents:
diff changeset
775 addChild(I, std::move(E));
anatofuz
parents:
diff changeset
776 return llvm::Error::success();
anatofuz
parents:
diff changeset
777 }
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
778 case BI_ENUM_VALUE_BLOCK_ID: {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
779 EnumValueInfo EV;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
780 if (auto Err = readBlock(ID, &EV))
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
781 return Err;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
782 addChild(I, std::move(EV));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
783 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
784 }
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
785 case BI_TEMPLATE_BLOCK_ID: {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
786 TemplateInfo TI;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
787 if (auto Err = readBlock(ID, &TI))
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
788 return Err;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
789 addTemplate(I, std::move(TI));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
790 return llvm::Error::success();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
791 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
792 case BI_TEMPLATE_SPECIALIZATION_BLOCK_ID: {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
793 TemplateSpecializationInfo TSI;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
794 if (auto Err = readBlock(ID, &TSI))
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
795 return Err;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
796 addTemplateSpecialization(I, std::move(TSI));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
797 return llvm::Error::success();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
798 }
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
799 case BI_TEMPLATE_PARAM_BLOCK_ID: {
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
800 TemplateParamInfo TPI;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
801 if (auto Err = readBlock(ID, &TPI))
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
802 return Err;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
803 addTemplateParam(I, std::move(TPI));
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
804 return llvm::Error::success();
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
805 }
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
806 case BI_TYPEDEF_BLOCK_ID: {
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
807 TypedefInfo TI;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
808 if (auto Err = readBlock(ID, &TI))
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
809 return Err;
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
810 addChild(I, std::move(TI));
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
811 return llvm::Error::success();
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
812 }
150
anatofuz
parents:
diff changeset
813 default:
anatofuz
parents:
diff changeset
814 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
815 "invalid subblock type");
anatofuz
parents:
diff changeset
816 }
anatofuz
parents:
diff changeset
817 }
anatofuz
parents:
diff changeset
818
anatofuz
parents:
diff changeset
819 ClangDocBitcodeReader::Cursor
anatofuz
parents:
diff changeset
820 ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) {
anatofuz
parents:
diff changeset
821 BlockOrRecordID = 0;
anatofuz
parents:
diff changeset
822
anatofuz
parents:
diff changeset
823 while (!Stream.AtEndOfStream()) {
anatofuz
parents:
diff changeset
824 Expected<unsigned> MaybeCode = Stream.ReadCode();
anatofuz
parents:
diff changeset
825 if (!MaybeCode) {
anatofuz
parents:
diff changeset
826 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
827 consumeError(MaybeCode.takeError());
anatofuz
parents:
diff changeset
828 return Cursor::BadBlock;
anatofuz
parents:
diff changeset
829 }
anatofuz
parents:
diff changeset
830
anatofuz
parents:
diff changeset
831 unsigned Code = MaybeCode.get();
anatofuz
parents:
diff changeset
832 if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
anatofuz
parents:
diff changeset
833 BlockOrRecordID = Code;
anatofuz
parents:
diff changeset
834 return Cursor::Record;
anatofuz
parents:
diff changeset
835 }
anatofuz
parents:
diff changeset
836 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) {
anatofuz
parents:
diff changeset
837 case llvm::bitc::ENTER_SUBBLOCK:
anatofuz
parents:
diff changeset
838 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
anatofuz
parents:
diff changeset
839 BlockOrRecordID = MaybeID.get();
anatofuz
parents:
diff changeset
840 else {
anatofuz
parents:
diff changeset
841 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
842 consumeError(MaybeID.takeError());
anatofuz
parents:
diff changeset
843 }
anatofuz
parents:
diff changeset
844 return Cursor::BlockBegin;
anatofuz
parents:
diff changeset
845 case llvm::bitc::END_BLOCK:
anatofuz
parents:
diff changeset
846 if (Stream.ReadBlockEnd())
anatofuz
parents:
diff changeset
847 return Cursor::BadBlock;
anatofuz
parents:
diff changeset
848 return Cursor::BlockEnd;
anatofuz
parents:
diff changeset
849 case llvm::bitc::DEFINE_ABBREV:
anatofuz
parents:
diff changeset
850 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
anatofuz
parents:
diff changeset
851 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
852 consumeError(std::move(Err));
anatofuz
parents:
diff changeset
853 }
anatofuz
parents:
diff changeset
854 continue;
anatofuz
parents:
diff changeset
855 case llvm::bitc::UNABBREV_RECORD:
anatofuz
parents:
diff changeset
856 return Cursor::BadBlock;
anatofuz
parents:
diff changeset
857 case llvm::bitc::FIRST_APPLICATION_ABBREV:
anatofuz
parents:
diff changeset
858 llvm_unreachable("Unexpected abbrev id.");
anatofuz
parents:
diff changeset
859 }
anatofuz
parents:
diff changeset
860 }
anatofuz
parents:
diff changeset
861 llvm_unreachable("Premature stream end.");
anatofuz
parents:
diff changeset
862 }
anatofuz
parents:
diff changeset
863
anatofuz
parents:
diff changeset
864 llvm::Error ClangDocBitcodeReader::validateStream() {
anatofuz
parents:
diff changeset
865 if (Stream.AtEndOfStream())
anatofuz
parents:
diff changeset
866 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
867 "premature end of stream");
anatofuz
parents:
diff changeset
868
anatofuz
parents:
diff changeset
869 // Sniff for the signature.
anatofuz
parents:
diff changeset
870 for (int Idx = 0; Idx != 4; ++Idx) {
anatofuz
parents:
diff changeset
871 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
anatofuz
parents:
diff changeset
872 if (!MaybeRead)
anatofuz
parents:
diff changeset
873 return MaybeRead.takeError();
anatofuz
parents:
diff changeset
874 else if (MaybeRead.get() != BitCodeConstants::Signature[Idx])
anatofuz
parents:
diff changeset
875 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
876 "invalid bitcode signature");
anatofuz
parents:
diff changeset
877 }
anatofuz
parents:
diff changeset
878 return llvm::Error::success();
anatofuz
parents:
diff changeset
879 }
anatofuz
parents:
diff changeset
880
anatofuz
parents:
diff changeset
881 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
882 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
150
anatofuz
parents:
diff changeset
883 Stream.ReadBlockInfoBlock();
anatofuz
parents:
diff changeset
884 if (!MaybeBlockInfo)
anatofuz
parents:
diff changeset
885 return MaybeBlockInfo.takeError();
anatofuz
parents:
diff changeset
886 else
anatofuz
parents:
diff changeset
887 BlockInfo = MaybeBlockInfo.get();
anatofuz
parents:
diff changeset
888 if (!BlockInfo)
anatofuz
parents:
diff changeset
889 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
890 "unable to parse BlockInfoBlock");
anatofuz
parents:
diff changeset
891 Stream.setBlockInfo(&*BlockInfo);
anatofuz
parents:
diff changeset
892 return llvm::Error::success();
anatofuz
parents:
diff changeset
893 }
anatofuz
parents:
diff changeset
894
anatofuz
parents:
diff changeset
895 template <typename T>
anatofuz
parents:
diff changeset
896 llvm::Expected<std::unique_ptr<Info>>
anatofuz
parents:
diff changeset
897 ClangDocBitcodeReader::createInfo(unsigned ID) {
anatofuz
parents:
diff changeset
898 std::unique_ptr<Info> I = std::make_unique<T>();
anatofuz
parents:
diff changeset
899 if (auto Err = readBlock(ID, static_cast<T *>(I.get())))
anatofuz
parents:
diff changeset
900 return std::move(Err);
anatofuz
parents:
diff changeset
901 return std::unique_ptr<Info>{std::move(I)};
anatofuz
parents:
diff changeset
902 }
anatofuz
parents:
diff changeset
903
anatofuz
parents:
diff changeset
904 llvm::Expected<std::unique_ptr<Info>>
anatofuz
parents:
diff changeset
905 ClangDocBitcodeReader::readBlockToInfo(unsigned ID) {
anatofuz
parents:
diff changeset
906 switch (ID) {
anatofuz
parents:
diff changeset
907 case BI_NAMESPACE_BLOCK_ID:
anatofuz
parents:
diff changeset
908 return createInfo<NamespaceInfo>(ID);
anatofuz
parents:
diff changeset
909 case BI_RECORD_BLOCK_ID:
anatofuz
parents:
diff changeset
910 return createInfo<RecordInfo>(ID);
anatofuz
parents:
diff changeset
911 case BI_ENUM_BLOCK_ID:
anatofuz
parents:
diff changeset
912 return createInfo<EnumInfo>(ID);
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
913 case BI_TYPEDEF_BLOCK_ID:
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
914 return createInfo<TypedefInfo>(ID);
150
anatofuz
parents:
diff changeset
915 case BI_FUNCTION_BLOCK_ID:
anatofuz
parents:
diff changeset
916 return createInfo<FunctionInfo>(ID);
anatofuz
parents:
diff changeset
917 default:
anatofuz
parents:
diff changeset
918 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
919 "cannot create info");
anatofuz
parents:
diff changeset
920 }
anatofuz
parents:
diff changeset
921 }
anatofuz
parents:
diff changeset
922
anatofuz
parents:
diff changeset
923 // Entry point
anatofuz
parents:
diff changeset
924 llvm::Expected<std::vector<std::unique_ptr<Info>>>
anatofuz
parents:
diff changeset
925 ClangDocBitcodeReader::readBitcode() {
anatofuz
parents:
diff changeset
926 std::vector<std::unique_ptr<Info>> Infos;
anatofuz
parents:
diff changeset
927 if (auto Err = validateStream())
anatofuz
parents:
diff changeset
928 return std::move(Err);
anatofuz
parents:
diff changeset
929
anatofuz
parents:
diff changeset
930 // Read the top level blocks.
anatofuz
parents:
diff changeset
931 while (!Stream.AtEndOfStream()) {
anatofuz
parents:
diff changeset
932 Expected<unsigned> MaybeCode = Stream.ReadCode();
anatofuz
parents:
diff changeset
933 if (!MaybeCode)
anatofuz
parents:
diff changeset
934 return MaybeCode.takeError();
anatofuz
parents:
diff changeset
935 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
anatofuz
parents:
diff changeset
936 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
937 "no blocks in input");
anatofuz
parents:
diff changeset
938 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
anatofuz
parents:
diff changeset
939 if (!MaybeID)
anatofuz
parents:
diff changeset
940 return MaybeID.takeError();
anatofuz
parents:
diff changeset
941 unsigned ID = MaybeID.get();
anatofuz
parents:
diff changeset
942 switch (ID) {
anatofuz
parents:
diff changeset
943 // NamedType and Comment blocks should not appear at the top level
anatofuz
parents:
diff changeset
944 case BI_TYPE_BLOCK_ID:
anatofuz
parents:
diff changeset
945 case BI_FIELD_TYPE_BLOCK_ID:
anatofuz
parents:
diff changeset
946 case BI_MEMBER_TYPE_BLOCK_ID:
anatofuz
parents:
diff changeset
947 case BI_COMMENT_BLOCK_ID:
anatofuz
parents:
diff changeset
948 case BI_REFERENCE_BLOCK_ID:
anatofuz
parents:
diff changeset
949 return llvm::createStringError(llvm::inconvertibleErrorCode(),
anatofuz
parents:
diff changeset
950 "invalid top level block");
anatofuz
parents:
diff changeset
951 case BI_NAMESPACE_BLOCK_ID:
anatofuz
parents:
diff changeset
952 case BI_RECORD_BLOCK_ID:
anatofuz
parents:
diff changeset
953 case BI_ENUM_BLOCK_ID:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
954 case BI_TYPEDEF_BLOCK_ID:
150
anatofuz
parents:
diff changeset
955 case BI_FUNCTION_BLOCK_ID: {
anatofuz
parents:
diff changeset
956 auto InfoOrErr = readBlockToInfo(ID);
anatofuz
parents:
diff changeset
957 if (!InfoOrErr)
anatofuz
parents:
diff changeset
958 return InfoOrErr.takeError();
anatofuz
parents:
diff changeset
959 Infos.emplace_back(std::move(InfoOrErr.get()));
anatofuz
parents:
diff changeset
960 continue;
anatofuz
parents:
diff changeset
961 }
anatofuz
parents:
diff changeset
962 case BI_VERSION_BLOCK_ID:
anatofuz
parents:
diff changeset
963 if (auto Err = readBlock(ID, VersionNumber))
anatofuz
parents:
diff changeset
964 return std::move(Err);
anatofuz
parents:
diff changeset
965 continue;
anatofuz
parents:
diff changeset
966 case llvm::bitc::BLOCKINFO_BLOCK_ID:
anatofuz
parents:
diff changeset
967 if (auto Err = readBlockInfoBlock())
anatofuz
parents:
diff changeset
968 return std::move(Err);
anatofuz
parents:
diff changeset
969 continue;
anatofuz
parents:
diff changeset
970 default:
anatofuz
parents:
diff changeset
971 if (llvm::Error Err = Stream.SkipBlock()) {
anatofuz
parents:
diff changeset
972 // FIXME this drops the error on the floor.
anatofuz
parents:
diff changeset
973 consumeError(std::move(Err));
anatofuz
parents:
diff changeset
974 }
anatofuz
parents:
diff changeset
975 continue;
anatofuz
parents:
diff changeset
976 }
anatofuz
parents:
diff changeset
977 }
anatofuz
parents:
diff changeset
978 return std::move(Infos);
anatofuz
parents:
diff changeset
979 }
anatofuz
parents:
diff changeset
980
anatofuz
parents:
diff changeset
981 } // namespace doc
anatofuz
parents:
diff changeset
982 } // namespace clang