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/TimeProfiler.h" 13 #include "llvm/Support/raw_ostream.h" 14 #include <optional> 15 16 namespace clang { 17 namespace doc { 18 19 using Record = llvm::SmallVector<uint64_t, 1024>; 20 21 // This implements decode for SmallString. 22 llvm::Error decodeRecord(const Record &R, llvm::SmallVectorImpl<char> &Field, 23 llvm::StringRef Blob) { 24 Field.assign(Blob.begin(), Blob.end()); 25 return llvm::Error::success(); 26 } 27 28 llvm::Error decodeRecord(const Record &R, SymbolID &Field, 29 llvm::StringRef Blob) { 30 if (R[0] != BitCodeConstants::USRHashSize) 31 return llvm::createStringError(llvm::inconvertibleErrorCode(), 32 "incorrect USR size"); 33 34 // First position in the record is the length of the following array, so we 35 // copy the following elements to the field. 36 for (int I = 0, E = R[0]; I < E; ++I) 37 Field[I] = R[I + 1]; 38 return llvm::Error::success(); 39 } 40 41 llvm::Error decodeRecord(const Record &R, bool &Field, llvm::StringRef Blob) { 42 Field = R[0] != 0; 43 return llvm::Error::success(); 44 } 45 46 llvm::Error decodeRecord(const Record &R, int &Field, llvm::StringRef Blob) { 47 if (R[0] > INT_MAX) 48 return llvm::createStringError(llvm::inconvertibleErrorCode(), 49 "integer too large to parse"); 50 Field = (int)R[0]; 51 return llvm::Error::success(); 52 } 53 54 llvm::Error decodeRecord(const Record &R, AccessSpecifier &Field, 55 llvm::StringRef Blob) { 56 switch (R[0]) { 57 case AS_public: 58 case AS_private: 59 case AS_protected: 60 case AS_none: 61 Field = (AccessSpecifier)R[0]; 62 return llvm::Error::success(); 63 default: 64 return llvm::createStringError(llvm::inconvertibleErrorCode(), 65 "invalid value for AccessSpecifier"); 66 } 67 } 68 69 llvm::Error decodeRecord(const Record &R, TagTypeKind &Field, 70 llvm::StringRef Blob) { 71 switch (static_cast<TagTypeKind>(R[0])) { 72 case TagTypeKind::Struct: 73 case TagTypeKind::Interface: 74 case TagTypeKind::Union: 75 case TagTypeKind::Class: 76 case TagTypeKind::Enum: 77 Field = static_cast<TagTypeKind>(R[0]); 78 return llvm::Error::success(); 79 } 80 return llvm::createStringError(llvm::inconvertibleErrorCode(), 81 "invalid value for TagTypeKind"); 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_QUAL_NAME: 354 return decodeRecord(R, I->QualName, Blob); 355 case REFERENCE_TYPE: 356 return decodeRecord(R, I->RefType, Blob); 357 case REFERENCE_PATH: 358 return decodeRecord(R, I->Path, Blob); 359 case REFERENCE_FIELD: 360 return decodeRecord(R, F, Blob); 361 default: 362 return llvm::createStringError(llvm::inconvertibleErrorCode(), 363 "invalid field for Reference"); 364 } 365 } 366 367 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 368 TemplateInfo *I) { 369 // Currently there are no child records of TemplateInfo (only child blocks). 370 return llvm::createStringError(llvm::inconvertibleErrorCode(), 371 "invalid field for TemplateParamInfo"); 372 } 373 374 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 375 TemplateSpecializationInfo *I) { 376 if (ID == TEMPLATE_SPECIALIZATION_OF) 377 return decodeRecord(R, I->SpecializationOf, Blob); 378 return llvm::createStringError(llvm::inconvertibleErrorCode(), 379 "invalid field for TemplateParamInfo"); 380 } 381 382 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 383 TemplateParamInfo *I) { 384 if (ID == TEMPLATE_PARAM_CONTENTS) 385 return decodeRecord(R, I->Contents, Blob); 386 return llvm::createStringError(llvm::inconvertibleErrorCode(), 387 "invalid field for TemplateParamInfo"); 388 } 389 390 template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) { 391 return llvm::createStringError(llvm::inconvertibleErrorCode(), 392 "invalid type cannot contain CommentInfo"); 393 } 394 395 template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) { 396 return &I->Description.emplace_back(); 397 } 398 399 template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) { 400 return &I->Description.emplace_back(); 401 } 402 403 template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) { 404 return &I->Description.emplace_back(); 405 } 406 407 template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) { 408 return &I->Description.emplace_back(); 409 } 410 411 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) { 412 return &I->Description.emplace_back(); 413 } 414 415 template <> llvm::Expected<CommentInfo *> getCommentInfo(TypedefInfo *I) { 416 return &I->Description.emplace_back(); 417 } 418 419 template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) { 420 I->Children.emplace_back(std::make_unique<CommentInfo>()); 421 return I->Children.back().get(); 422 } 423 424 template <> 425 llvm::Expected<CommentInfo *> getCommentInfo(std::unique_ptr<CommentInfo> &I) { 426 return getCommentInfo(I.get()); 427 } 428 429 // When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on 430 // the parent block to set it. The template specializations define what to do 431 // for each supported parent block. 432 template <typename T, typename TTypeInfo> 433 llvm::Error addTypeInfo(T I, TTypeInfo &&TI) { 434 return llvm::createStringError(llvm::inconvertibleErrorCode(), 435 "invalid type cannot contain TypeInfo"); 436 } 437 438 template <> llvm::Error addTypeInfo(RecordInfo *I, MemberTypeInfo &&T) { 439 I->Members.emplace_back(std::move(T)); 440 return llvm::Error::success(); 441 } 442 443 template <> llvm::Error addTypeInfo(BaseRecordInfo *I, MemberTypeInfo &&T) { 444 I->Members.emplace_back(std::move(T)); 445 return llvm::Error::success(); 446 } 447 448 template <> llvm::Error addTypeInfo(FunctionInfo *I, TypeInfo &&T) { 449 I->ReturnType = std::move(T); 450 return llvm::Error::success(); 451 } 452 453 template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) { 454 I->Params.emplace_back(std::move(T)); 455 return llvm::Error::success(); 456 } 457 458 template <> llvm::Error addTypeInfo(EnumInfo *I, TypeInfo &&T) { 459 I->BaseType = std::move(T); 460 return llvm::Error::success(); 461 } 462 463 template <> llvm::Error addTypeInfo(TypedefInfo *I, TypeInfo &&T) { 464 I->Underlying = std::move(T); 465 return llvm::Error::success(); 466 } 467 468 template <typename T> llvm::Error addReference(T I, Reference &&R, FieldId F) { 469 return llvm::createStringError(llvm::inconvertibleErrorCode(), 470 "invalid type cannot contain Reference"); 471 } 472 473 template <> llvm::Error addReference(TypeInfo *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 <> 485 llvm::Error addReference(FieldTypeInfo *I, Reference &&R, FieldId F) { 486 switch (F) { 487 case FieldId::F_type: 488 I->Type = 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(MemberTypeInfo *I, Reference &&R, FieldId F) { 498 switch (F) { 499 case FieldId::F_type: 500 I->Type = std::move(R); 501 return llvm::Error::success(); 502 default: 503 return llvm::createStringError(llvm::inconvertibleErrorCode(), 504 "invalid type cannot contain Reference"); 505 } 506 } 507 508 template <> llvm::Error addReference(EnumInfo *I, Reference &&R, FieldId F) { 509 switch (F) { 510 case FieldId::F_namespace: 511 I->Namespace.emplace_back(std::move(R)); 512 return llvm::Error::success(); 513 default: 514 return llvm::createStringError(llvm::inconvertibleErrorCode(), 515 "invalid type cannot contain Reference"); 516 } 517 } 518 519 template <> llvm::Error addReference(TypedefInfo *I, Reference &&R, FieldId F) { 520 switch (F) { 521 case FieldId::F_namespace: 522 I->Namespace.emplace_back(std::move(R)); 523 return llvm::Error::success(); 524 default: 525 return llvm::createStringError(llvm::inconvertibleErrorCode(), 526 "invalid type cannot contain Reference"); 527 } 528 } 529 530 template <> 531 llvm::Error addReference(NamespaceInfo *I, Reference &&R, FieldId F) { 532 switch (F) { 533 case FieldId::F_namespace: 534 I->Namespace.emplace_back(std::move(R)); 535 return llvm::Error::success(); 536 case FieldId::F_child_namespace: 537 I->Children.Namespaces.emplace_back(std::move(R)); 538 return llvm::Error::success(); 539 case FieldId::F_child_record: 540 I->Children.Records.emplace_back(std::move(R)); 541 return llvm::Error::success(); 542 default: 543 return llvm::createStringError(llvm::inconvertibleErrorCode(), 544 "invalid type cannot contain Reference"); 545 } 546 } 547 548 template <> 549 llvm::Error addReference(FunctionInfo *I, Reference &&R, FieldId F) { 550 switch (F) { 551 case FieldId::F_namespace: 552 I->Namespace.emplace_back(std::move(R)); 553 return llvm::Error::success(); 554 case FieldId::F_parent: 555 I->Parent = std::move(R); 556 return llvm::Error::success(); 557 default: 558 return llvm::createStringError(llvm::inconvertibleErrorCode(), 559 "invalid type cannot contain Reference"); 560 } 561 } 562 563 template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) { 564 switch (F) { 565 case FieldId::F_namespace: 566 I->Namespace.emplace_back(std::move(R)); 567 return llvm::Error::success(); 568 case FieldId::F_parent: 569 I->Parents.emplace_back(std::move(R)); 570 return llvm::Error::success(); 571 case FieldId::F_vparent: 572 I->VirtualParents.emplace_back(std::move(R)); 573 return llvm::Error::success(); 574 case FieldId::F_child_record: 575 I->Children.Records.emplace_back(std::move(R)); 576 return llvm::Error::success(); 577 default: 578 return llvm::createStringError(llvm::inconvertibleErrorCode(), 579 "invalid type cannot contain Reference"); 580 } 581 } 582 583 template <typename T, typename ChildInfoType> 584 void addChild(T I, ChildInfoType &&R) { 585 llvm::errs() << "invalid child type for info"; 586 exit(1); 587 } 588 589 // Namespace children: 590 template <> void addChild(NamespaceInfo *I, FunctionInfo &&R) { 591 I->Children.Functions.emplace_back(std::move(R)); 592 } 593 template <> void addChild(NamespaceInfo *I, EnumInfo &&R) { 594 I->Children.Enums.emplace_back(std::move(R)); 595 } 596 template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) { 597 I->Children.Typedefs.emplace_back(std::move(R)); 598 } 599 600 // Record children: 601 template <> void addChild(RecordInfo *I, FunctionInfo &&R) { 602 I->Children.Functions.emplace_back(std::move(R)); 603 } 604 template <> void addChild(RecordInfo *I, EnumInfo &&R) { 605 I->Children.Enums.emplace_back(std::move(R)); 606 } 607 template <> void addChild(RecordInfo *I, TypedefInfo &&R) { 608 I->Children.Typedefs.emplace_back(std::move(R)); 609 } 610 611 // Other types of children: 612 template <> void addChild(EnumInfo *I, EnumValueInfo &&R) { 613 I->Members.emplace_back(std::move(R)); 614 } 615 template <> void addChild(RecordInfo *I, BaseRecordInfo &&R) { 616 I->Bases.emplace_back(std::move(R)); 617 } 618 template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) { 619 I->Children.Functions.emplace_back(std::move(R)); 620 } 621 622 // TemplateParam children. These go into either a TemplateInfo (for template 623 // parameters) or TemplateSpecializationInfo (for the specialization's 624 // parameters). 625 template <typename T> void addTemplateParam(T I, TemplateParamInfo &&P) { 626 llvm::errs() << "invalid container for template parameter"; 627 exit(1); 628 } 629 template <> void addTemplateParam(TemplateInfo *I, TemplateParamInfo &&P) { 630 I->Params.emplace_back(std::move(P)); 631 } 632 template <> 633 void addTemplateParam(TemplateSpecializationInfo *I, TemplateParamInfo &&P) { 634 I->Params.emplace_back(std::move(P)); 635 } 636 637 // Template info. These apply to either records or functions. 638 template <typename T> void addTemplate(T I, TemplateInfo &&P) { 639 llvm::errs() << "invalid container for template info"; 640 exit(1); 641 } 642 template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) { 643 I->Template.emplace(std::move(P)); 644 } 645 template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) { 646 I->Template.emplace(std::move(P)); 647 } 648 649 // Template specializations go only into template records. 650 template <typename T> 651 void addTemplateSpecialization(T I, TemplateSpecializationInfo &&TSI) { 652 llvm::errs() << "invalid container for template specialization info"; 653 exit(1); 654 } 655 template <> 656 void addTemplateSpecialization(TemplateInfo *I, 657 TemplateSpecializationInfo &&TSI) { 658 I->Specialization.emplace(std::move(TSI)); 659 } 660 661 // Read records from bitcode into a given info. 662 template <typename T> 663 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) { 664 Record R; 665 llvm::StringRef Blob; 666 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob); 667 if (!MaybeRecID) 668 return MaybeRecID.takeError(); 669 return parseRecord(R, MaybeRecID.get(), Blob, I); 670 } 671 672 template <> 673 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, Reference *I) { 674 llvm::TimeTraceScope("Reducing infos", "readRecord"); 675 Record R; 676 llvm::StringRef Blob; 677 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob); 678 if (!MaybeRecID) 679 return MaybeRecID.takeError(); 680 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField); 681 } 682 683 // Read a block of records into a single info. 684 template <typename T> 685 llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) { 686 llvm::TimeTraceScope("Reducing infos", "readBlock"); 687 if (llvm::Error Err = Stream.EnterSubBlock(ID)) 688 return Err; 689 690 while (true) { 691 unsigned BlockOrCode = 0; 692 Cursor Res = skipUntilRecordOrBlock(BlockOrCode); 693 694 switch (Res) { 695 case Cursor::BadBlock: 696 return llvm::createStringError(llvm::inconvertibleErrorCode(), 697 "bad block found"); 698 case Cursor::BlockEnd: 699 return llvm::Error::success(); 700 case Cursor::BlockBegin: 701 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) { 702 if (llvm::Error Skipped = Stream.SkipBlock()) 703 return joinErrors(std::move(Err), std::move(Skipped)); 704 return Err; 705 } 706 continue; 707 case Cursor::Record: 708 break; 709 } 710 if (auto Err = readRecord(BlockOrCode, I)) 711 return Err; 712 } 713 } 714 715 template <typename T> 716 llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) { 717 llvm::TimeTraceScope("Reducing infos", "readSubBlock"); 718 switch (ID) { 719 // Blocks can only have certain types of sub blocks. 720 case BI_COMMENT_BLOCK_ID: { 721 auto Comment = getCommentInfo(I); 722 if (!Comment) 723 return Comment.takeError(); 724 if (auto Err = readBlock(ID, Comment.get())) 725 return Err; 726 return llvm::Error::success(); 727 } 728 case BI_TYPE_BLOCK_ID: { 729 TypeInfo TI; 730 if (auto Err = readBlock(ID, &TI)) 731 return Err; 732 if (auto Err = addTypeInfo(I, std::move(TI))) 733 return Err; 734 return llvm::Error::success(); 735 } 736 case BI_FIELD_TYPE_BLOCK_ID: { 737 FieldTypeInfo TI; 738 if (auto Err = readBlock(ID, &TI)) 739 return Err; 740 if (auto Err = addTypeInfo(I, std::move(TI))) 741 return Err; 742 return llvm::Error::success(); 743 } 744 case BI_MEMBER_TYPE_BLOCK_ID: { 745 MemberTypeInfo TI; 746 if (auto Err = readBlock(ID, &TI)) 747 return Err; 748 if (auto Err = addTypeInfo(I, std::move(TI))) 749 return Err; 750 return llvm::Error::success(); 751 } 752 case BI_REFERENCE_BLOCK_ID: { 753 Reference R; 754 if (auto Err = readBlock(ID, &R)) 755 return Err; 756 if (auto Err = addReference(I, std::move(R), CurrentReferenceField)) 757 return Err; 758 return llvm::Error::success(); 759 } 760 case BI_FUNCTION_BLOCK_ID: { 761 FunctionInfo F; 762 if (auto Err = readBlock(ID, &F)) 763 return Err; 764 addChild(I, std::move(F)); 765 return llvm::Error::success(); 766 } 767 case BI_BASE_RECORD_BLOCK_ID: { 768 BaseRecordInfo BR; 769 if (auto Err = readBlock(ID, &BR)) 770 return Err; 771 addChild(I, std::move(BR)); 772 return llvm::Error::success(); 773 } 774 case BI_ENUM_BLOCK_ID: { 775 EnumInfo E; 776 if (auto Err = readBlock(ID, &E)) 777 return Err; 778 addChild(I, std::move(E)); 779 return llvm::Error::success(); 780 } 781 case BI_ENUM_VALUE_BLOCK_ID: { 782 EnumValueInfo EV; 783 if (auto Err = readBlock(ID, &EV)) 784 return Err; 785 addChild(I, std::move(EV)); 786 return llvm::Error::success(); 787 } 788 case BI_TEMPLATE_BLOCK_ID: { 789 TemplateInfo TI; 790 if (auto Err = readBlock(ID, &TI)) 791 return Err; 792 addTemplate(I, std::move(TI)); 793 return llvm::Error::success(); 794 } 795 case BI_TEMPLATE_SPECIALIZATION_BLOCK_ID: { 796 TemplateSpecializationInfo TSI; 797 if (auto Err = readBlock(ID, &TSI)) 798 return Err; 799 addTemplateSpecialization(I, std::move(TSI)); 800 return llvm::Error::success(); 801 } 802 case BI_TEMPLATE_PARAM_BLOCK_ID: { 803 TemplateParamInfo TPI; 804 if (auto Err = readBlock(ID, &TPI)) 805 return Err; 806 addTemplateParam(I, std::move(TPI)); 807 return llvm::Error::success(); 808 } 809 case BI_TYPEDEF_BLOCK_ID: { 810 TypedefInfo TI; 811 if (auto Err = readBlock(ID, &TI)) 812 return Err; 813 addChild(I, std::move(TI)); 814 return llvm::Error::success(); 815 } 816 default: 817 return llvm::createStringError(llvm::inconvertibleErrorCode(), 818 "invalid subblock type"); 819 } 820 } 821 822 ClangDocBitcodeReader::Cursor 823 ClangDocBitcodeReader::skipUntilRecordOrBlock(unsigned &BlockOrRecordID) { 824 llvm::TimeTraceScope("Reducing infos", "skipUntilRecordOrBlock"); 825 BlockOrRecordID = 0; 826 827 while (!Stream.AtEndOfStream()) { 828 Expected<unsigned> MaybeCode = Stream.ReadCode(); 829 if (!MaybeCode) { 830 // FIXME this drops the error on the floor. 831 consumeError(MaybeCode.takeError()); 832 return Cursor::BadBlock; 833 } 834 835 unsigned Code = MaybeCode.get(); 836 if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) { 837 BlockOrRecordID = Code; 838 return Cursor::Record; 839 } 840 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) { 841 case llvm::bitc::ENTER_SUBBLOCK: 842 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID()) 843 BlockOrRecordID = MaybeID.get(); 844 else { 845 // FIXME this drops the error on the floor. 846 consumeError(MaybeID.takeError()); 847 } 848 return Cursor::BlockBegin; 849 case llvm::bitc::END_BLOCK: 850 if (Stream.ReadBlockEnd()) 851 return Cursor::BadBlock; 852 return Cursor::BlockEnd; 853 case llvm::bitc::DEFINE_ABBREV: 854 if (llvm::Error Err = Stream.ReadAbbrevRecord()) { 855 // FIXME this drops the error on the floor. 856 consumeError(std::move(Err)); 857 } 858 continue; 859 case llvm::bitc::UNABBREV_RECORD: 860 return Cursor::BadBlock; 861 case llvm::bitc::FIRST_APPLICATION_ABBREV: 862 llvm_unreachable("Unexpected abbrev id."); 863 } 864 } 865 llvm_unreachable("Premature stream end."); 866 } 867 868 llvm::Error ClangDocBitcodeReader::validateStream() { 869 if (Stream.AtEndOfStream()) 870 return llvm::createStringError(llvm::inconvertibleErrorCode(), 871 "premature end of stream"); 872 873 // Sniff for the signature. 874 for (int Idx = 0; Idx != 4; ++Idx) { 875 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8); 876 if (!MaybeRead) 877 return MaybeRead.takeError(); 878 else if (MaybeRead.get() != BitCodeConstants::Signature[Idx]) 879 return llvm::createStringError(llvm::inconvertibleErrorCode(), 880 "invalid bitcode signature"); 881 } 882 return llvm::Error::success(); 883 } 884 885 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() { 886 llvm::TimeTraceScope("Reducing infos", "readBlockInfoBlock"); 887 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo = 888 Stream.ReadBlockInfoBlock(); 889 if (!MaybeBlockInfo) 890 return MaybeBlockInfo.takeError(); 891 else 892 BlockInfo = MaybeBlockInfo.get(); 893 if (!BlockInfo) 894 return llvm::createStringError(llvm::inconvertibleErrorCode(), 895 "unable to parse BlockInfoBlock"); 896 Stream.setBlockInfo(&*BlockInfo); 897 return llvm::Error::success(); 898 } 899 900 template <typename T> 901 llvm::Expected<std::unique_ptr<Info>> 902 ClangDocBitcodeReader::createInfo(unsigned ID) { 903 llvm::TimeTraceScope("Reducing infos", "createInfo"); 904 std::unique_ptr<Info> I = std::make_unique<T>(); 905 if (auto Err = readBlock(ID, static_cast<T *>(I.get()))) 906 return std::move(Err); 907 return std::unique_ptr<Info>{std::move(I)}; 908 } 909 910 llvm::Expected<std::unique_ptr<Info>> 911 ClangDocBitcodeReader::readBlockToInfo(unsigned ID) { 912 llvm::TimeTraceScope("Reducing infos", "readBlockToInfo"); 913 switch (ID) { 914 case BI_NAMESPACE_BLOCK_ID: 915 return createInfo<NamespaceInfo>(ID); 916 case BI_RECORD_BLOCK_ID: 917 return createInfo<RecordInfo>(ID); 918 case BI_ENUM_BLOCK_ID: 919 return createInfo<EnumInfo>(ID); 920 case BI_TYPEDEF_BLOCK_ID: 921 return createInfo<TypedefInfo>(ID); 922 case BI_FUNCTION_BLOCK_ID: 923 return createInfo<FunctionInfo>(ID); 924 default: 925 return llvm::createStringError(llvm::inconvertibleErrorCode(), 926 "cannot create info"); 927 } 928 } 929 930 // Entry point 931 llvm::Expected<std::vector<std::unique_ptr<Info>>> 932 ClangDocBitcodeReader::readBitcode() { 933 std::vector<std::unique_ptr<Info>> Infos; 934 if (auto Err = validateStream()) 935 return std::move(Err); 936 937 // Read the top level blocks. 938 while (!Stream.AtEndOfStream()) { 939 Expected<unsigned> MaybeCode = Stream.ReadCode(); 940 if (!MaybeCode) 941 return MaybeCode.takeError(); 942 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK) 943 return llvm::createStringError(llvm::inconvertibleErrorCode(), 944 "no blocks in input"); 945 Expected<unsigned> MaybeID = Stream.ReadSubBlockID(); 946 if (!MaybeID) 947 return MaybeID.takeError(); 948 unsigned ID = MaybeID.get(); 949 switch (ID) { 950 // NamedType and Comment blocks should not appear at the top level 951 case BI_TYPE_BLOCK_ID: 952 case BI_FIELD_TYPE_BLOCK_ID: 953 case BI_MEMBER_TYPE_BLOCK_ID: 954 case BI_COMMENT_BLOCK_ID: 955 case BI_REFERENCE_BLOCK_ID: 956 return llvm::createStringError(llvm::inconvertibleErrorCode(), 957 "invalid top level block"); 958 case BI_NAMESPACE_BLOCK_ID: 959 case BI_RECORD_BLOCK_ID: 960 case BI_ENUM_BLOCK_ID: 961 case BI_TYPEDEF_BLOCK_ID: 962 case BI_FUNCTION_BLOCK_ID: { 963 auto InfoOrErr = readBlockToInfo(ID); 964 if (!InfoOrErr) 965 return InfoOrErr.takeError(); 966 Infos.emplace_back(std::move(InfoOrErr.get())); 967 continue; 968 } 969 case BI_VERSION_BLOCK_ID: 970 if (auto Err = readBlock(ID, VersionNumber)) 971 return std::move(Err); 972 continue; 973 case llvm::bitc::BLOCKINFO_BLOCK_ID: 974 if (auto Err = readBlockInfoBlock()) 975 return std::move(Err); 976 continue; 977 default: 978 if (llvm::Error Err = Stream.SkipBlock()) { 979 // FIXME this drops the error on the floor. 980 consumeError(std::move(Err)); 981 } 982 continue; 983 } 984 } 985 return std::move(Infos); 986 } 987 988 } // namespace doc 989 } // namespace clang 990