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