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 //===----------------------------------------------------------------------===// 8 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" 14 15 namespace clang { 16 namespace doc { 17 18 using Record = llvm::SmallVector<uint64_t, 1024>; 19 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(); 24 } 25 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"); 31 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(); 37 } 38 39 llvm::Error decodeRecord(const Record &R, bool &Field, llvm::StringRef Blob) { 40 Field = R[0] != 0; 41 return llvm::Error::success(); 42 } 43 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(); 50 } 51 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"); 64 } 65 } 66 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"); 80 } 81 } 82 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(); 90 } 91 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(); 102 } 103 return llvm::createStringError(llvm::inconvertibleErrorCode(), 104 "invalid value for InfoType"); 105 } 106 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(); 119 } 120 return llvm::createStringError(llvm::inconvertibleErrorCode(), 121 "invalid value for FieldId"); 122 } 123 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(); 129 } 130 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(); 139 } 140 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"); 147 } 148 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"); 161 } 162 } 163 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"); 184 } 185 } 186 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"); 207 } 208 } 209 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"); 228 } 229 } 230 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"); 249 } 250 } 251 252 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 253 TypeInfo *I) { 254 return llvm::Error::success(); 255 } 256 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"); 265 } 266 } 267 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"); 278 } 279 } 280 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"); 309 } 310 } 311 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"); 330 } 331 } 332 333 template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) { 334 return llvm::createStringError(llvm::inconvertibleErrorCode(), 335 "invalid type cannot contain CommentInfo"); 336 } 337 338 template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) { 339 I->Description.emplace_back(); 340 return &I->Description.back(); 341 } 342 343 template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) { 344 I->Description.emplace_back(); 345 return &I->Description.back(); 346 } 347 348 template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) { 349 I->Description.emplace_back(); 350 return &I->Description.back(); 351 } 352 353 template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) { 354 I->Description.emplace_back(); 355 return &I->Description.back(); 356 } 357 358 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) { 359 I->Description.emplace_back(); 360 return &I->Description.back(); 361 } 362 363 template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) { 364 I->Children.emplace_back(std::make_unique<CommentInfo>()); 365 return I->Children.back().get(); 366 } 367 368 template <> 369 llvm::Expected<CommentInfo *> getCommentInfo(std::unique_ptr<CommentInfo> &I) { 370 return getCommentInfo(I.get()); 371 } 372 373 template <typename T, typename TTypeInfo> 374 llvm::Error addTypeInfo(T I, TTypeInfo &&TI) { 375 return llvm::createStringError(llvm::inconvertibleErrorCode(), 376 "invalid type cannot contain TypeInfo"); 377 } 378 379 template <> llvm::Error addTypeInfo(RecordInfo *I, MemberTypeInfo &&T) { 380 I->Members.emplace_back(std::move(T)); 381 return llvm::Error::success(); 382 } 383 384 template <> llvm::Error addTypeInfo(BaseRecordInfo *I, MemberTypeInfo &&T) { 385 I->Members.emplace_back(std::move(T)); 386 return llvm::Error::success(); 387 } 388 389 template <> llvm::Error addTypeInfo(FunctionInfo *I, TypeInfo &&T) { 390 I->ReturnType = std::move(T); 391 return llvm::Error::success(); 392 } 393 394 template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) { 395 I->Params.emplace_back(std::move(T)); 396 return llvm::Error::success(); 397 } 398 399 template <typename T> llvm::Error addReference(T I, Reference &&R, FieldId F) { 400 return llvm::createStringError(llvm::inconvertibleErrorCode(), 401 "invalid type cannot contain Reference"); 402 } 403 404 template <> llvm::Error addReference(TypeInfo *I, Reference &&R, FieldId F) { 405 switch (F) { 406 case FieldId::F_type: 407 I->Type = std::move(R); 408 return llvm::Error::success(); 409 default: 410 return llvm::createStringError(llvm::inconvertibleErrorCode(), 411 "invalid type cannot contain Reference"); 412 } 413 } 414 415 template <> 416 llvm::Error addReference(FieldTypeInfo *I, Reference &&R, FieldId F) { 417 switch (F) { 418 case FieldId::F_type: 419 I->Type = std::move(R); 420 return llvm::Error::success(); 421 default: 422 return llvm::createStringError(llvm::inconvertibleErrorCode(), 423 "invalid type cannot contain Reference"); 424 } 425 } 426 427 template <> 428 llvm::Error addReference(MemberTypeInfo *I, Reference &&R, FieldId F) { 429 switch (F) { 430 case FieldId::F_type: 431 I->Type = std::move(R); 432 return llvm::Error::success(); 433 default: 434 return llvm::createStringError(llvm::inconvertibleErrorCode(), 435 "invalid type cannot contain Reference"); 436 } 437 } 438 439 template <> llvm::Error addReference(EnumInfo *I, Reference &&R, FieldId F) { 440 switch (F) { 441 case FieldId::F_namespace: 442 I->Namespace.emplace_back(std::move(R)); 443 return llvm::Error::success(); 444 default: 445 return llvm::createStringError(llvm::inconvertibleErrorCode(), 446 "invalid type cannot contain Reference"); 447 } 448 } 449 450 template <> 451 llvm::Error addReference(NamespaceInfo *I, Reference &&R, FieldId F) { 452 switch (F) { 453 case FieldId::F_namespace: 454 I->Namespace.emplace_back(std::move(R)); 455 return llvm::Error::success(); 456 case FieldId::F_child_namespace: 457 I->ChildNamespaces.emplace_back(std::move(R)); 458 return llvm::Error::success(); 459 case FieldId::F_child_record: 460 I->ChildRecords.emplace_back(std::move(R)); 461 return llvm::Error::success(); 462 default: 463 return llvm::createStringError(llvm::inconvertibleErrorCode(), 464 "invalid type cannot contain Reference"); 465 } 466 } 467 468 template <> 469 llvm::Error addReference(FunctionInfo *I, Reference &&R, FieldId F) { 470 switch (F) { 471 case FieldId::F_namespace: 472 I->Namespace.emplace_back(std::move(R)); 473 return llvm::Error::success(); 474 case FieldId::F_parent: 475 I->Parent = std::move(R); 476 return llvm::Error::success(); 477 default: 478 return llvm::createStringError(llvm::inconvertibleErrorCode(), 479 "invalid type cannot contain Reference"); 480 } 481 } 482 483 template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) { 484 switch (F) { 485 case FieldId::F_namespace: 486 I->Namespace.emplace_back(std::move(R)); 487 return llvm::Error::success(); 488 case FieldId::F_parent: 489 I->Parents.emplace_back(std::move(R)); 490 return llvm::Error::success(); 491 case FieldId::F_vparent: 492 I->VirtualParents.emplace_back(std::move(R)); 493 return llvm::Error::success(); 494 case FieldId::F_child_record: 495 I->ChildRecords.emplace_back(std::move(R)); 496 return llvm::Error::success(); 497 default: 498 return llvm::createStringError(llvm::inconvertibleErrorCode(), 499 "invalid type cannot contain Reference"); 500 } 501 } 502 503 template <typename T, typename ChildInfoType> 504 void addChild(T I, ChildInfoType &&R) { 505 llvm::errs() << "invalid child type for info"; 506 exit(1); 507 } 508 509 template <> void addChild(NamespaceInfo *I, FunctionInfo &&R) { 510 I->ChildFunctions.emplace_back(std::move(R)); 511 } 512 513 template <> void addChild(NamespaceInfo *I, EnumInfo &&R) { 514 I->ChildEnums.emplace_back(std::move(R)); 515 } 516 517 template <> void addChild(RecordInfo *I, FunctionInfo &&R) { 518 I->ChildFunctions.emplace_back(std::move(R)); 519 } 520 521 template <> void addChild(RecordInfo *I, EnumInfo &&R) { 522 I->ChildEnums.emplace_back(std::move(R)); 523 } 524 525 template <> void addChild(RecordInfo *I, BaseRecordInfo &&R) { 526 I->Bases.emplace_back(std::move(R)); 527 } 528 529 template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) { 530 I->ChildFunctions.emplace_back(std::move(R)); 531 } 532 533 // Read records from bitcode into a given info. 534 template <typename T> 535 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) { 536 Record R; 537 llvm::StringRef Blob; 538 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob); 539 if (!MaybeRecID) 540 return MaybeRecID.takeError(); 541 return parseRecord(R, MaybeRecID.get(), Blob, I); 542 } 543 544 template <> 545 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, Reference *I) { 546 Record R; 547 llvm::StringRef Blob; 548 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob); 549 if (!MaybeRecID) 550 return MaybeRecID.takeError(); 551 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField); 552 } 553 554 // Read a block of records into a single info. 555 template <typename T> 556 llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) { 557 if (llvm::Error Err = Stream.EnterSubBlock(ID)) 558 return Err; 559 560 while (true) { 561 unsigned BlockOrCode = 0; 562 Cursor Res = skipUntilRecordOrBlock(BlockOrCode); 563 564 switch (Res) { 565 case Cursor::BadBlock: 566 return llvm::createStringError(llvm::inconvertibleErrorCode(), 567 "bad block found"); 568 case Cursor::BlockEnd: 569 return llvm::Error::success(); 570 case Cursor::BlockBegin: 571 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) { 572 if (llvm::Error Skipped = Stream.SkipBlock()) 573 return joinErrors(std::move(Err), std::move(Skipped)); 574 return Err; 575 } 576 continue; 577 case Cursor::Record: 578 break; 579 } 580 if (auto Err = readRecord(BlockOrCode, I)) 581 return Err; 582 } 583 } 584 585 template <typename T> 586 llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) { 587 switch (ID) { 588 // Blocks can only have Comment, Reference, TypeInfo, FunctionInfo, or 589 // EnumInfo subblocks 590 case BI_COMMENT_BLOCK_ID: { 591 auto Comment = getCommentInfo(I); 592 if (!Comment) 593 return Comment.takeError(); 594 if (auto Err = readBlock(ID, Comment.get())) 595 return Err; 596 return llvm::Error::success(); 597 } 598 case BI_TYPE_BLOCK_ID: { 599 TypeInfo TI; 600 if (auto Err = readBlock(ID, &TI)) 601 return Err; 602 if (auto Err = addTypeInfo(I, std::move(TI))) 603 return Err; 604 return llvm::Error::success(); 605 } 606 case BI_FIELD_TYPE_BLOCK_ID: { 607 FieldTypeInfo TI; 608 if (auto Err = readBlock(ID, &TI)) 609 return Err; 610 if (auto Err = addTypeInfo(I, std::move(TI))) 611 return Err; 612 return llvm::Error::success(); 613 } 614 case BI_MEMBER_TYPE_BLOCK_ID: { 615 MemberTypeInfo TI; 616 if (auto Err = readBlock(ID, &TI)) 617 return Err; 618 if (auto Err = addTypeInfo(I, std::move(TI))) 619 return Err; 620 return llvm::Error::success(); 621 } 622 case BI_REFERENCE_BLOCK_ID: { 623 Reference R; 624 if (auto Err = readBlock(ID, &R)) 625 return Err; 626 if (auto Err = addReference(I, std::move(R), CurrentReferenceField)) 627 return Err; 628 return llvm::Error::success(); 629 } 630 case BI_FUNCTION_BLOCK_ID: { 631 FunctionInfo F; 632 if (auto Err = readBlock(ID, &F)) 633 return Err; 634 addChild(I, std::move(F)); 635 return llvm::Error::success(); 636 } 637 case BI_BASE_RECORD_BLOCK_ID: { 638 BaseRecordInfo BR; 639 if (auto Err = readBlock(ID, &BR)) 640 return Err; 641 addChild(I, std::move(BR)); 642 return llvm::Error::success(); 643 } 644 case BI_ENUM_BLOCK_ID: { 645 EnumInfo E; 646 if (auto Err = readBlock(ID, &E)) 647 return Err; 648 addChild(I, std::move(E)); 649 return llvm::Error::success(); 650 } 651 default: 652 return llvm::createStringError(llvm::inconvertibleErrorCode(), 653 "invalid subblock type"); 654 } 655 } 656 657 ClangDocBitcodeReader::Cursor 658 ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) { 659 BlockOrRecordID = 0; 660 661 while (!Stream.AtEndOfStream()) { 662 Expected<unsigned> MaybeCode = Stream.ReadCode(); 663 if (!MaybeCode) { 664 // FIXME this drops the error on the floor. 665 consumeError(MaybeCode.takeError()); 666 return Cursor::BadBlock; 667 } 668 669 unsigned Code = MaybeCode.get(); 670 if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) { 671 BlockOrRecordID = Code; 672 return Cursor::Record; 673 } 674 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) { 675 case llvm::bitc::ENTER_SUBBLOCK: 676 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID()) 677 BlockOrRecordID = MaybeID.get(); 678 else { 679 // FIXME this drops the error on the floor. 680 consumeError(MaybeID.takeError()); 681 } 682 return Cursor::BlockBegin; 683 case llvm::bitc::END_BLOCK: 684 if (Stream.ReadBlockEnd()) 685 return Cursor::BadBlock; 686 return Cursor::BlockEnd; 687 case llvm::bitc::DEFINE_ABBREV: 688 if (llvm::Error Err = Stream.ReadAbbrevRecord()) { 689 // FIXME this drops the error on the floor. 690 consumeError(std::move(Err)); 691 } 692 continue; 693 case llvm::bitc::UNABBREV_RECORD: 694 return Cursor::BadBlock; 695 case llvm::bitc::FIRST_APPLICATION_ABBREV: 696 llvm_unreachable("Unexpected abbrev id."); 697 } 698 } 699 llvm_unreachable("Premature stream end."); 700 } 701 702 llvm::Error ClangDocBitcodeReader::validateStream() { 703 if (Stream.AtEndOfStream()) 704 return llvm::createStringError(llvm::inconvertibleErrorCode(), 705 "premature end of stream"); 706 707 // Sniff for the signature. 708 for (int Idx = 0; Idx != 4; ++Idx) { 709 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8); 710 if (!MaybeRead) 711 return MaybeRead.takeError(); 712 else if (MaybeRead.get() != BitCodeConstants::Signature[Idx]) 713 return llvm::createStringError(llvm::inconvertibleErrorCode(), 714 "invalid bitcode signature"); 715 } 716 return llvm::Error::success(); 717 } 718 719 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() { 720 Expected<Optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo = 721 Stream.ReadBlockInfoBlock(); 722 if (!MaybeBlockInfo) 723 return MaybeBlockInfo.takeError(); 724 else 725 BlockInfo = MaybeBlockInfo.get(); 726 if (!BlockInfo) 727 return llvm::createStringError(llvm::inconvertibleErrorCode(), 728 "unable to parse BlockInfoBlock"); 729 Stream.setBlockInfo(&*BlockInfo); 730 return llvm::Error::success(); 731 } 732 733 template <typename T> 734 llvm::Expected<std::unique_ptr<Info>> 735 ClangDocBitcodeReader::createInfo(unsigned ID) { 736 std::unique_ptr<Info> I = std::make_unique<T>(); 737 if (auto Err = readBlock(ID, static_cast<T *>(I.get()))) 738 return std::move(Err); 739 return std::unique_ptr<Info>{std::move(I)}; 740 } 741 742 llvm::Expected<std::unique_ptr<Info>> 743 ClangDocBitcodeReader::readBlockToInfo(unsigned ID) { 744 switch (ID) { 745 case BI_NAMESPACE_BLOCK_ID: 746 return createInfo<NamespaceInfo>(ID); 747 case BI_RECORD_BLOCK_ID: 748 return createInfo<RecordInfo>(ID); 749 case BI_ENUM_BLOCK_ID: 750 return createInfo<EnumInfo>(ID); 751 case BI_FUNCTION_BLOCK_ID: 752 return createInfo<FunctionInfo>(ID); 753 default: 754 return llvm::createStringError(llvm::inconvertibleErrorCode(), 755 "cannot create info"); 756 } 757 } 758 759 // Entry point 760 llvm::Expected<std::vector<std::unique_ptr<Info>>> 761 ClangDocBitcodeReader::readBitcode() { 762 std::vector<std::unique_ptr<Info>> Infos; 763 if (auto Err = validateStream()) 764 return std::move(Err); 765 766 // Read the top level blocks. 767 while (!Stream.AtEndOfStream()) { 768 Expected<unsigned> MaybeCode = Stream.ReadCode(); 769 if (!MaybeCode) 770 return MaybeCode.takeError(); 771 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK) 772 return llvm::createStringError(llvm::inconvertibleErrorCode(), 773 "no blocks in input"); 774 Expected<unsigned> MaybeID = Stream.ReadSubBlockID(); 775 if (!MaybeID) 776 return MaybeID.takeError(); 777 unsigned ID = MaybeID.get(); 778 switch (ID) { 779 // NamedType and Comment blocks should not appear at the top level 780 case BI_TYPE_BLOCK_ID: 781 case BI_FIELD_TYPE_BLOCK_ID: 782 case BI_MEMBER_TYPE_BLOCK_ID: 783 case BI_COMMENT_BLOCK_ID: 784 case BI_REFERENCE_BLOCK_ID: 785 return llvm::createStringError(llvm::inconvertibleErrorCode(), 786 "invalid top level block"); 787 case BI_NAMESPACE_BLOCK_ID: 788 case BI_RECORD_BLOCK_ID: 789 case BI_ENUM_BLOCK_ID: 790 case BI_FUNCTION_BLOCK_ID: { 791 auto InfoOrErr = readBlockToInfo(ID); 792 if (!InfoOrErr) 793 return InfoOrErr.takeError(); 794 Infos.emplace_back(std::move(InfoOrErr.get())); 795 continue; 796 } 797 case BI_VERSION_BLOCK_ID: 798 if (auto Err = readBlock(ID, VersionNumber)) 799 return std::move(Err); 800 continue; 801 case llvm::bitc::BLOCKINFO_BLOCK_ID: 802 if (auto Err = readBlockInfoBlock()) 803 return std::move(Err); 804 continue; 805 default: 806 if (llvm::Error Err = Stream.SkipBlock()) { 807 // FIXME this drops the error on the floor. 808 consumeError(std::move(Err)); 809 } 810 continue; 811 } 812 } 813 return std::move(Infos); 814 } 815 816 } // namespace doc 817 } // namespace clang 818