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