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