UNSUPPORT test on 64-bit AIX too
[llvm-project.git] / clang-tools-extra / clang-doc / BitcodeReader.cpp
blob9e0ec992917329e1193ad2a4ba84999b2f7db41c
1 //===-- BitcodeReader.cpp - ClangDoc Bitcode Reader ------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include "BitcodeReader.h"
10 #include "llvm/ADT/IndexedMap.h"
11 #include "llvm/ADT/Optional.h"
12 #include "llvm/Support/Error.h"
13 #include "llvm/Support/raw_ostream.h"
15 namespace clang {
16 namespace doc {
18 using Record = llvm::SmallVector<uint64_t, 1024>;
20 llvm::Error decodeRecord(const Record &R, llvm::SmallVectorImpl<char> &Field,
21 llvm::StringRef Blob) {
22 Field.assign(Blob.begin(), Blob.end());
23 return llvm::Error::success();
26 llvm::Error decodeRecord(const Record &R, SymbolID &Field,
27 llvm::StringRef Blob) {
28 if (R[0] != BitCodeConstants::USRHashSize)
29 return llvm::createStringError(llvm::inconvertibleErrorCode(),
30 "incorrect USR size");
32 // First position in the record is the length of the following array, so we
33 // copy the following elements to the field.
34 for (int I = 0, E = R[0]; I < E; ++I)
35 Field[I] = R[I + 1];
36 return llvm::Error::success();
39 llvm::Error decodeRecord(const Record &R, bool &Field, llvm::StringRef Blob) {
40 Field = R[0] != 0;
41 return llvm::Error::success();
44 llvm::Error decodeRecord(const Record &R, int &Field, llvm::StringRef Blob) {
45 if (R[0] > INT_MAX)
46 return llvm::createStringError(llvm::inconvertibleErrorCode(),
47 "integer too large to parse");
48 Field = (int)R[0];
49 return llvm::Error::success();
52 llvm::Error decodeRecord(const Record &R, AccessSpecifier &Field,
53 llvm::StringRef Blob) {
54 switch (R[0]) {
55 case AS_public:
56 case AS_private:
57 case AS_protected:
58 case AS_none:
59 Field = (AccessSpecifier)R[0];
60 return llvm::Error::success();
61 default:
62 return llvm::createStringError(llvm::inconvertibleErrorCode(),
63 "invalid value for AccessSpecifier");
67 llvm::Error decodeRecord(const Record &R, TagTypeKind &Field,
68 llvm::StringRef Blob) {
69 switch (R[0]) {
70 case TTK_Struct:
71 case TTK_Interface:
72 case TTK_Union:
73 case TTK_Class:
74 case TTK_Enum:
75 Field = (TagTypeKind)R[0];
76 return llvm::Error::success();
77 default:
78 return llvm::createStringError(llvm::inconvertibleErrorCode(),
79 "invalid value for TagTypeKind");
83 llvm::Error decodeRecord(const Record &R, llvm::Optional<Location> &Field,
84 llvm::StringRef Blob) {
85 if (R[0] > INT_MAX)
86 return llvm::createStringError(llvm::inconvertibleErrorCode(),
87 "integer too large to parse");
88 Field.emplace((int)R[0], Blob, (bool)R[1]);
89 return llvm::Error::success();
92 llvm::Error decodeRecord(const Record &R, InfoType &Field,
93 llvm::StringRef Blob) {
94 switch (auto IT = static_cast<InfoType>(R[0])) {
95 case InfoType::IT_namespace:
96 case InfoType::IT_record:
97 case InfoType::IT_function:
98 case InfoType::IT_default:
99 case InfoType::IT_enum:
100 Field = IT;
101 return llvm::Error::success();
103 return llvm::createStringError(llvm::inconvertibleErrorCode(),
104 "invalid value for InfoType");
107 llvm::Error decodeRecord(const Record &R, FieldId &Field,
108 llvm::StringRef Blob) {
109 switch (auto F = static_cast<FieldId>(R[0])) {
110 case FieldId::F_namespace:
111 case FieldId::F_parent:
112 case FieldId::F_vparent:
113 case FieldId::F_type:
114 case FieldId::F_child_namespace:
115 case FieldId::F_child_record:
116 case FieldId::F_default:
117 Field = F;
118 return llvm::Error::success();
120 return llvm::createStringError(llvm::inconvertibleErrorCode(),
121 "invalid value for FieldId");
124 llvm::Error decodeRecord(const Record &R,
125 llvm::SmallVectorImpl<llvm::SmallString<16>> &Field,
126 llvm::StringRef Blob) {
127 Field.push_back(Blob);
128 return llvm::Error::success();
131 llvm::Error decodeRecord(const Record &R,
132 llvm::SmallVectorImpl<Location> &Field,
133 llvm::StringRef Blob) {
134 if (R[0] > INT_MAX)
135 return llvm::createStringError(llvm::inconvertibleErrorCode(),
136 "integer too large to parse");
137 Field.emplace_back((int)R[0], Blob, (bool)R[1]);
138 return llvm::Error::success();
141 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
142 const unsigned VersionNo) {
143 if (ID == VERSION && R[0] == VersionNo)
144 return llvm::Error::success();
145 return llvm::createStringError(llvm::inconvertibleErrorCode(),
146 "mismatched bitcode version number");
149 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
150 NamespaceInfo *I) {
151 switch (ID) {
152 case NAMESPACE_USR:
153 return decodeRecord(R, I->USR, Blob);
154 case NAMESPACE_NAME:
155 return decodeRecord(R, I->Name, Blob);
156 case NAMESPACE_PATH:
157 return decodeRecord(R, I->Path, Blob);
158 default:
159 return llvm::createStringError(llvm::inconvertibleErrorCode(),
160 "invalid field for NamespaceInfo");
164 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
165 RecordInfo *I) {
166 switch (ID) {
167 case RECORD_USR:
168 return decodeRecord(R, I->USR, Blob);
169 case RECORD_NAME:
170 return decodeRecord(R, I->Name, Blob);
171 case RECORD_PATH:
172 return decodeRecord(R, I->Path, Blob);
173 case RECORD_DEFLOCATION:
174 return decodeRecord(R, I->DefLoc, Blob);
175 case RECORD_LOCATION:
176 return decodeRecord(R, I->Loc, Blob);
177 case RECORD_TAG_TYPE:
178 return decodeRecord(R, I->TagType, Blob);
179 case RECORD_IS_TYPE_DEF:
180 return decodeRecord(R, I->IsTypeDef, Blob);
181 default:
182 return llvm::createStringError(llvm::inconvertibleErrorCode(),
183 "invalid field for RecordInfo");
187 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
188 BaseRecordInfo *I) {
189 switch (ID) {
190 case BASE_RECORD_USR:
191 return decodeRecord(R, I->USR, Blob);
192 case BASE_RECORD_NAME:
193 return decodeRecord(R, I->Name, Blob);
194 case BASE_RECORD_PATH:
195 return decodeRecord(R, I->Path, Blob);
196 case BASE_RECORD_TAG_TYPE:
197 return decodeRecord(R, I->TagType, Blob);
198 case BASE_RECORD_IS_VIRTUAL:
199 return decodeRecord(R, I->IsVirtual, Blob);
200 case BASE_RECORD_ACCESS:
201 return decodeRecord(R, I->Access, Blob);
202 case BASE_RECORD_IS_PARENT:
203 return decodeRecord(R, I->IsParent, Blob);
204 default:
205 return llvm::createStringError(llvm::inconvertibleErrorCode(),
206 "invalid field for BaseRecordInfo");
210 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
211 EnumInfo *I) {
212 switch (ID) {
213 case ENUM_USR:
214 return decodeRecord(R, I->USR, Blob);
215 case ENUM_NAME:
216 return decodeRecord(R, I->Name, Blob);
217 case ENUM_DEFLOCATION:
218 return decodeRecord(R, I->DefLoc, Blob);
219 case ENUM_LOCATION:
220 return decodeRecord(R, I->Loc, Blob);
221 case ENUM_MEMBER:
222 return decodeRecord(R, I->Members, Blob);
223 case ENUM_SCOPED:
224 return decodeRecord(R, I->Scoped, Blob);
225 default:
226 return llvm::createStringError(llvm::inconvertibleErrorCode(),
227 "invalid field for EnumInfo");
231 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
232 FunctionInfo *I) {
233 switch (ID) {
234 case FUNCTION_USR:
235 return decodeRecord(R, I->USR, Blob);
236 case FUNCTION_NAME:
237 return decodeRecord(R, I->Name, Blob);
238 case FUNCTION_DEFLOCATION:
239 return decodeRecord(R, I->DefLoc, Blob);
240 case FUNCTION_LOCATION:
241 return decodeRecord(R, I->Loc, Blob);
242 case FUNCTION_ACCESS:
243 return decodeRecord(R, I->Access, Blob);
244 case FUNCTION_IS_METHOD:
245 return decodeRecord(R, I->IsMethod, Blob);
246 default:
247 return llvm::createStringError(llvm::inconvertibleErrorCode(),
248 "invalid field for FunctionInfo");
252 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
253 TypeInfo *I) {
254 return llvm::Error::success();
257 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
258 FieldTypeInfo *I) {
259 switch (ID) {
260 case FIELD_TYPE_NAME:
261 return decodeRecord(R, I->Name, Blob);
262 default:
263 return llvm::createStringError(llvm::inconvertibleErrorCode(),
264 "invalid field for TypeInfo");
268 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
269 MemberTypeInfo *I) {
270 switch (ID) {
271 case MEMBER_TYPE_NAME:
272 return decodeRecord(R, I->Name, Blob);
273 case MEMBER_TYPE_ACCESS:
274 return decodeRecord(R, I->Access, Blob);
275 default:
276 return llvm::createStringError(llvm::inconvertibleErrorCode(),
277 "invalid field for MemberTypeInfo");
281 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
282 CommentInfo *I) {
283 switch (ID) {
284 case COMMENT_KIND:
285 return decodeRecord(R, I->Kind, Blob);
286 case COMMENT_TEXT:
287 return decodeRecord(R, I->Text, Blob);
288 case COMMENT_NAME:
289 return decodeRecord(R, I->Name, Blob);
290 case COMMENT_DIRECTION:
291 return decodeRecord(R, I->Direction, Blob);
292 case COMMENT_PARAMNAME:
293 return decodeRecord(R, I->ParamName, Blob);
294 case COMMENT_CLOSENAME:
295 return decodeRecord(R, I->CloseName, Blob);
296 case COMMENT_ATTRKEY:
297 return decodeRecord(R, I->AttrKeys, Blob);
298 case COMMENT_ATTRVAL:
299 return decodeRecord(R, I->AttrValues, Blob);
300 case COMMENT_ARG:
301 return decodeRecord(R, I->Args, Blob);
302 case COMMENT_SELFCLOSING:
303 return decodeRecord(R, I->SelfClosing, Blob);
304 case COMMENT_EXPLICIT:
305 return decodeRecord(R, I->Explicit, Blob);
306 default:
307 return llvm::createStringError(llvm::inconvertibleErrorCode(),
308 "invalid field for CommentInfo");
312 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob,
313 Reference *I, FieldId &F) {
314 switch (ID) {
315 case REFERENCE_USR:
316 return decodeRecord(R, I->USR, Blob);
317 case REFERENCE_NAME:
318 return decodeRecord(R, I->Name, Blob);
319 case REFERENCE_TYPE:
320 return decodeRecord(R, I->RefType, Blob);
321 case REFERENCE_PATH:
322 return decodeRecord(R, I->Path, Blob);
323 case REFERENCE_IS_IN_GLOBAL_NAMESPACE:
324 return decodeRecord(R, I->IsInGlobalNamespace, Blob);
325 case REFERENCE_FIELD:
326 return decodeRecord(R, F, Blob);
327 default:
328 return llvm::createStringError(llvm::inconvertibleErrorCode(),
329 "invalid field for Reference");
333 template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) {
334 return llvm::createStringError(llvm::inconvertibleErrorCode(),
335 "invalid type cannot contain CommentInfo");
338 template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) {
339 I->Description.emplace_back();
340 return &I->Description.back();
343 template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) {
344 I->Description.emplace_back();
345 return &I->Description.back();
348 template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) {
349 I->Description.emplace_back();
350 return &I->Description.back();
353 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) {
354 I->Description.emplace_back();
355 return &I->Description.back();
358 template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) {
359 I->Children.emplace_back(std::make_unique<CommentInfo>());
360 return I->Children.back().get();
363 template <>
364 llvm::Expected<CommentInfo *> getCommentInfo(std::unique_ptr<CommentInfo> &I) {
365 return getCommentInfo(I.get());
368 template <typename T, typename TTypeInfo>
369 llvm::Error addTypeInfo(T I, TTypeInfo &&TI) {
370 return llvm::createStringError(llvm::inconvertibleErrorCode(),
371 "invalid type cannot contain TypeInfo");
374 template <> llvm::Error addTypeInfo(RecordInfo *I, MemberTypeInfo &&T) {
375 I->Members.emplace_back(std::move(T));
376 return llvm::Error::success();
379 template <> llvm::Error addTypeInfo(BaseRecordInfo *I, MemberTypeInfo &&T) {
380 I->Members.emplace_back(std::move(T));
381 return llvm::Error::success();
384 template <> llvm::Error addTypeInfo(FunctionInfo *I, TypeInfo &&T) {
385 I->ReturnType = std::move(T);
386 return llvm::Error::success();
389 template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) {
390 I->Params.emplace_back(std::move(T));
391 return llvm::Error::success();
394 template <typename T> llvm::Error addReference(T I, Reference &&R, FieldId F) {
395 return llvm::createStringError(llvm::inconvertibleErrorCode(),
396 "invalid type cannot contain Reference");
399 template <> llvm::Error addReference(TypeInfo *I, Reference &&R, FieldId F) {
400 switch (F) {
401 case FieldId::F_type:
402 I->Type = std::move(R);
403 return llvm::Error::success();
404 default:
405 return llvm::createStringError(llvm::inconvertibleErrorCode(),
406 "invalid type cannot contain Reference");
410 template <>
411 llvm::Error addReference(FieldTypeInfo *I, Reference &&R, FieldId F) {
412 switch (F) {
413 case FieldId::F_type:
414 I->Type = std::move(R);
415 return llvm::Error::success();
416 default:
417 return llvm::createStringError(llvm::inconvertibleErrorCode(),
418 "invalid type cannot contain Reference");
422 template <>
423 llvm::Error addReference(MemberTypeInfo *I, Reference &&R, FieldId F) {
424 switch (F) {
425 case FieldId::F_type:
426 I->Type = std::move(R);
427 return llvm::Error::success();
428 default:
429 return llvm::createStringError(llvm::inconvertibleErrorCode(),
430 "invalid type cannot contain Reference");
434 template <> llvm::Error addReference(EnumInfo *I, Reference &&R, FieldId F) {
435 switch (F) {
436 case FieldId::F_namespace:
437 I->Namespace.emplace_back(std::move(R));
438 return llvm::Error::success();
439 default:
440 return llvm::createStringError(llvm::inconvertibleErrorCode(),
441 "invalid type cannot contain Reference");
445 template <>
446 llvm::Error addReference(NamespaceInfo *I, Reference &&R, FieldId F) {
447 switch (F) {
448 case FieldId::F_namespace:
449 I->Namespace.emplace_back(std::move(R));
450 return llvm::Error::success();
451 case FieldId::F_child_namespace:
452 I->ChildNamespaces.emplace_back(std::move(R));
453 return llvm::Error::success();
454 case FieldId::F_child_record:
455 I->ChildRecords.emplace_back(std::move(R));
456 return llvm::Error::success();
457 default:
458 return llvm::createStringError(llvm::inconvertibleErrorCode(),
459 "invalid type cannot contain Reference");
463 template <>
464 llvm::Error addReference(FunctionInfo *I, Reference &&R, FieldId F) {
465 switch (F) {
466 case FieldId::F_namespace:
467 I->Namespace.emplace_back(std::move(R));
468 return llvm::Error::success();
469 case FieldId::F_parent:
470 I->Parent = std::move(R);
471 return llvm::Error::success();
472 default:
473 return llvm::createStringError(llvm::inconvertibleErrorCode(),
474 "invalid type cannot contain Reference");
478 template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) {
479 switch (F) {
480 case FieldId::F_namespace:
481 I->Namespace.emplace_back(std::move(R));
482 return llvm::Error::success();
483 case FieldId::F_parent:
484 I->Parents.emplace_back(std::move(R));
485 return llvm::Error::success();
486 case FieldId::F_vparent:
487 I->VirtualParents.emplace_back(std::move(R));
488 return llvm::Error::success();
489 case FieldId::F_child_record:
490 I->ChildRecords.emplace_back(std::move(R));
491 return llvm::Error::success();
492 default:
493 return llvm::createStringError(llvm::inconvertibleErrorCode(),
494 "invalid type cannot contain Reference");
498 template <typename T, typename ChildInfoType>
499 void addChild(T I, ChildInfoType &&R) {
500 llvm::errs() << "invalid child type for info";
501 exit(1);
504 template <> void addChild(NamespaceInfo *I, FunctionInfo &&R) {
505 I->ChildFunctions.emplace_back(std::move(R));
508 template <> void addChild(NamespaceInfo *I, EnumInfo &&R) {
509 I->ChildEnums.emplace_back(std::move(R));
512 template <> void addChild(RecordInfo *I, FunctionInfo &&R) {
513 I->ChildFunctions.emplace_back(std::move(R));
516 template <> void addChild(RecordInfo *I, EnumInfo &&R) {
517 I->ChildEnums.emplace_back(std::move(R));
520 template <> void addChild(RecordInfo *I, BaseRecordInfo &&R) {
521 I->Bases.emplace_back(std::move(R));
524 template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) {
525 I->ChildFunctions.emplace_back(std::move(R));
528 // Read records from bitcode into a given info.
529 template <typename T>
530 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) {
531 Record R;
532 llvm::StringRef Blob;
533 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
534 if (!MaybeRecID)
535 return MaybeRecID.takeError();
536 return parseRecord(R, MaybeRecID.get(), Blob, I);
539 template <>
540 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, Reference *I) {
541 Record R;
542 llvm::StringRef Blob;
543 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob);
544 if (!MaybeRecID)
545 return MaybeRecID.takeError();
546 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField);
549 // Read a block of records into a single info.
550 template <typename T>
551 llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) {
552 if (llvm::Error Err = Stream.EnterSubBlock(ID))
553 return Err;
555 while (true) {
556 unsigned BlockOrCode = 0;
557 Cursor Res = skipUntilRecordOrBlock(BlockOrCode);
559 switch (Res) {
560 case Cursor::BadBlock:
561 return llvm::createStringError(llvm::inconvertibleErrorCode(),
562 "bad block found");
563 case Cursor::BlockEnd:
564 return llvm::Error::success();
565 case Cursor::BlockBegin:
566 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) {
567 if (llvm::Error Skipped = Stream.SkipBlock())
568 return joinErrors(std::move(Err), std::move(Skipped));
569 return Err;
571 continue;
572 case Cursor::Record:
573 break;
575 if (auto Err = readRecord(BlockOrCode, I))
576 return Err;
580 template <typename T>
581 llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) {
582 switch (ID) {
583 // Blocks can only have Comment, Reference, TypeInfo, FunctionInfo, or
584 // EnumInfo subblocks
585 case BI_COMMENT_BLOCK_ID: {
586 auto Comment = getCommentInfo(I);
587 if (!Comment)
588 return Comment.takeError();
589 if (auto Err = readBlock(ID, Comment.get()))
590 return Err;
591 return llvm::Error::success();
593 case BI_TYPE_BLOCK_ID: {
594 TypeInfo TI;
595 if (auto Err = readBlock(ID, &TI))
596 return Err;
597 if (auto Err = addTypeInfo(I, std::move(TI)))
598 return Err;
599 return llvm::Error::success();
601 case BI_FIELD_TYPE_BLOCK_ID: {
602 FieldTypeInfo TI;
603 if (auto Err = readBlock(ID, &TI))
604 return Err;
605 if (auto Err = addTypeInfo(I, std::move(TI)))
606 return Err;
607 return llvm::Error::success();
609 case BI_MEMBER_TYPE_BLOCK_ID: {
610 MemberTypeInfo TI;
611 if (auto Err = readBlock(ID, &TI))
612 return Err;
613 if (auto Err = addTypeInfo(I, std::move(TI)))
614 return Err;
615 return llvm::Error::success();
617 case BI_REFERENCE_BLOCK_ID: {
618 Reference R;
619 if (auto Err = readBlock(ID, &R))
620 return Err;
621 if (auto Err = addReference(I, std::move(R), CurrentReferenceField))
622 return Err;
623 return llvm::Error::success();
625 case BI_FUNCTION_BLOCK_ID: {
626 FunctionInfo F;
627 if (auto Err = readBlock(ID, &F))
628 return Err;
629 addChild(I, std::move(F));
630 return llvm::Error::success();
632 case BI_BASE_RECORD_BLOCK_ID: {
633 BaseRecordInfo BR;
634 if (auto Err = readBlock(ID, &BR))
635 return Err;
636 addChild(I, std::move(BR));
637 return llvm::Error::success();
639 case BI_ENUM_BLOCK_ID: {
640 EnumInfo E;
641 if (auto Err = readBlock(ID, &E))
642 return Err;
643 addChild(I, std::move(E));
644 return llvm::Error::success();
646 default:
647 return llvm::createStringError(llvm::inconvertibleErrorCode(),
648 "invalid subblock type");
652 ClangDocBitcodeReader::Cursor
653 ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) {
654 BlockOrRecordID = 0;
656 while (!Stream.AtEndOfStream()) {
657 Expected<unsigned> MaybeCode = Stream.ReadCode();
658 if (!MaybeCode) {
659 // FIXME this drops the error on the floor.
660 consumeError(MaybeCode.takeError());
661 return Cursor::BadBlock;
664 unsigned Code = MaybeCode.get();
665 if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) {
666 BlockOrRecordID = Code;
667 return Cursor::Record;
669 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) {
670 case llvm::bitc::ENTER_SUBBLOCK:
671 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID())
672 BlockOrRecordID = MaybeID.get();
673 else {
674 // FIXME this drops the error on the floor.
675 consumeError(MaybeID.takeError());
677 return Cursor::BlockBegin;
678 case llvm::bitc::END_BLOCK:
679 if (Stream.ReadBlockEnd())
680 return Cursor::BadBlock;
681 return Cursor::BlockEnd;
682 case llvm::bitc::DEFINE_ABBREV:
683 if (llvm::Error Err = Stream.ReadAbbrevRecord()) {
684 // FIXME this drops the error on the floor.
685 consumeError(std::move(Err));
687 continue;
688 case llvm::bitc::UNABBREV_RECORD:
689 return Cursor::BadBlock;
690 case llvm::bitc::FIRST_APPLICATION_ABBREV:
691 llvm_unreachable("Unexpected abbrev id.");
694 llvm_unreachable("Premature stream end.");
697 llvm::Error ClangDocBitcodeReader::validateStream() {
698 if (Stream.AtEndOfStream())
699 return llvm::createStringError(llvm::inconvertibleErrorCode(),
700 "premature end of stream");
702 // Sniff for the signature.
703 for (int Idx = 0; Idx != 4; ++Idx) {
704 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8);
705 if (!MaybeRead)
706 return MaybeRead.takeError();
707 else if (MaybeRead.get() != BitCodeConstants::Signature[Idx])
708 return llvm::createStringError(llvm::inconvertibleErrorCode(),
709 "invalid bitcode signature");
711 return llvm::Error::success();
714 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() {
715 Expected<Optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo =
716 Stream.ReadBlockInfoBlock();
717 if (!MaybeBlockInfo)
718 return MaybeBlockInfo.takeError();
719 else
720 BlockInfo = MaybeBlockInfo.get();
721 if (!BlockInfo)
722 return llvm::createStringError(llvm::inconvertibleErrorCode(),
723 "unable to parse BlockInfoBlock");
724 Stream.setBlockInfo(&*BlockInfo);
725 return llvm::Error::success();
728 template <typename T>
729 llvm::Expected<std::unique_ptr<Info>>
730 ClangDocBitcodeReader::createInfo(unsigned ID) {
731 std::unique_ptr<Info> I = std::make_unique<T>();
732 if (auto Err = readBlock(ID, static_cast<T *>(I.get())))
733 return std::move(Err);
734 return std::unique_ptr<Info>{std::move(I)};
737 llvm::Expected<std::unique_ptr<Info>>
738 ClangDocBitcodeReader::readBlockToInfo(unsigned ID) {
739 switch (ID) {
740 case BI_NAMESPACE_BLOCK_ID:
741 return createInfo<NamespaceInfo>(ID);
742 case BI_RECORD_BLOCK_ID:
743 return createInfo<RecordInfo>(ID);
744 case BI_ENUM_BLOCK_ID:
745 return createInfo<EnumInfo>(ID);
746 case BI_FUNCTION_BLOCK_ID:
747 return createInfo<FunctionInfo>(ID);
748 default:
749 return llvm::createStringError(llvm::inconvertibleErrorCode(),
750 "cannot create info");
754 // Entry point
755 llvm::Expected<std::vector<std::unique_ptr<Info>>>
756 ClangDocBitcodeReader::readBitcode() {
757 std::vector<std::unique_ptr<Info>> Infos;
758 if (auto Err = validateStream())
759 return std::move(Err);
761 // Read the top level blocks.
762 while (!Stream.AtEndOfStream()) {
763 Expected<unsigned> MaybeCode = Stream.ReadCode();
764 if (!MaybeCode)
765 return MaybeCode.takeError();
766 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK)
767 return llvm::createStringError(llvm::inconvertibleErrorCode(),
768 "no blocks in input");
769 Expected<unsigned> MaybeID = Stream.ReadSubBlockID();
770 if (!MaybeID)
771 return MaybeID.takeError();
772 unsigned ID = MaybeID.get();
773 switch (ID) {
774 // NamedType and Comment blocks should not appear at the top level
775 case BI_TYPE_BLOCK_ID:
776 case BI_FIELD_TYPE_BLOCK_ID:
777 case BI_MEMBER_TYPE_BLOCK_ID:
778 case BI_COMMENT_BLOCK_ID:
779 case BI_REFERENCE_BLOCK_ID:
780 return llvm::createStringError(llvm::inconvertibleErrorCode(),
781 "invalid top level block");
782 case BI_NAMESPACE_BLOCK_ID:
783 case BI_RECORD_BLOCK_ID:
784 case BI_ENUM_BLOCK_ID:
785 case BI_FUNCTION_BLOCK_ID: {
786 auto InfoOrErr = readBlockToInfo(ID);
787 if (!InfoOrErr)
788 return InfoOrErr.takeError();
789 Infos.emplace_back(std::move(InfoOrErr.get()));
790 continue;
792 case BI_VERSION_BLOCK_ID:
793 if (auto Err = readBlock(ID, VersionNumber))
794 return std::move(Err);
795 continue;
796 case llvm::bitc::BLOCKINFO_BLOCK_ID:
797 if (auto Err = readBlockInfoBlock())
798 return std::move(Err);
799 continue;
800 default:
801 if (llvm::Error Err = Stream.SkipBlock()) {
802 // FIXME this drops the error on the floor.
803 consumeError(std::move(Err));
805 continue;
808 return std::move(Infos);
811 } // namespace doc
812 } // namespace clang