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 (static_cast<TagTypeKind>(R[0])) { 71 case TagTypeKind::Struct: 72 case TagTypeKind::Interface: 73 case TagTypeKind::Union: 74 case TagTypeKind::Class: 75 case TagTypeKind::Enum: 76 Field = static_cast<TagTypeKind>(R[0]); 77 return llvm::Error::success(); 78 } 79 return llvm::createStringError(llvm::inconvertibleErrorCode(), 80 "invalid value for TagTypeKind"); 81 } 82 83 llvm::Error decodeRecord(const Record &R, std::optional<Location> &Field, 84 llvm::StringRef Blob) { 85 if (R[0] > INT_MAX) 86 return llvm::createStringError(llvm::inconvertibleErrorCode(), 87 "integer too large to parse"); 88 Field.emplace((int)R[0], Blob, (bool)R[1]); 89 return llvm::Error::success(); 90 } 91 92 llvm::Error decodeRecord(const Record &R, InfoType &Field, 93 llvm::StringRef Blob) { 94 switch (auto IT = static_cast<InfoType>(R[0])) { 95 case InfoType::IT_namespace: 96 case InfoType::IT_record: 97 case InfoType::IT_function: 98 case InfoType::IT_default: 99 case InfoType::IT_enum: 100 case InfoType::IT_typedef: 101 Field = IT; 102 return llvm::Error::success(); 103 } 104 return llvm::createStringError(llvm::inconvertibleErrorCode(), 105 "invalid value for InfoType"); 106 } 107 108 llvm::Error decodeRecord(const Record &R, FieldId &Field, 109 llvm::StringRef Blob) { 110 switch (auto F = static_cast<FieldId>(R[0])) { 111 case FieldId::F_namespace: 112 case FieldId::F_parent: 113 case FieldId::F_vparent: 114 case FieldId::F_type: 115 case FieldId::F_child_namespace: 116 case FieldId::F_child_record: 117 case FieldId::F_default: 118 Field = F; 119 return llvm::Error::success(); 120 } 121 return llvm::createStringError(llvm::inconvertibleErrorCode(), 122 "invalid value for FieldId"); 123 } 124 125 llvm::Error decodeRecord(const Record &R, 126 llvm::SmallVectorImpl<llvm::SmallString<16>> &Field, 127 llvm::StringRef Blob) { 128 Field.push_back(Blob); 129 return llvm::Error::success(); 130 } 131 132 llvm::Error decodeRecord(const Record &R, 133 llvm::SmallVectorImpl<Location> &Field, 134 llvm::StringRef Blob) { 135 if (R[0] > INT_MAX) 136 return llvm::createStringError(llvm::inconvertibleErrorCode(), 137 "integer too large to parse"); 138 Field.emplace_back((int)R[0], Blob, (bool)R[1]); 139 return llvm::Error::success(); 140 } 141 142 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 143 const unsigned VersionNo) { 144 if (ID == VERSION && R[0] == VersionNo) 145 return llvm::Error::success(); 146 return llvm::createStringError(llvm::inconvertibleErrorCode(), 147 "mismatched bitcode version number"); 148 } 149 150 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 151 NamespaceInfo *I) { 152 switch (ID) { 153 case NAMESPACE_USR: 154 return decodeRecord(R, I->USR, Blob); 155 case NAMESPACE_NAME: 156 return decodeRecord(R, I->Name, Blob); 157 case NAMESPACE_PATH: 158 return decodeRecord(R, I->Path, Blob); 159 default: 160 return llvm::createStringError(llvm::inconvertibleErrorCode(), 161 "invalid field for NamespaceInfo"); 162 } 163 } 164 165 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 166 RecordInfo *I) { 167 switch (ID) { 168 case RECORD_USR: 169 return decodeRecord(R, I->USR, Blob); 170 case RECORD_NAME: 171 return decodeRecord(R, I->Name, Blob); 172 case RECORD_PATH: 173 return decodeRecord(R, I->Path, Blob); 174 case RECORD_DEFLOCATION: 175 return decodeRecord(R, I->DefLoc, Blob); 176 case RECORD_LOCATION: 177 return decodeRecord(R, I->Loc, Blob); 178 case RECORD_TAG_TYPE: 179 return decodeRecord(R, I->TagType, Blob); 180 case RECORD_IS_TYPE_DEF: 181 return decodeRecord(R, I->IsTypeDef, Blob); 182 default: 183 return llvm::createStringError(llvm::inconvertibleErrorCode(), 184 "invalid field for RecordInfo"); 185 } 186 } 187 188 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 189 BaseRecordInfo *I) { 190 switch (ID) { 191 case BASE_RECORD_USR: 192 return decodeRecord(R, I->USR, Blob); 193 case BASE_RECORD_NAME: 194 return decodeRecord(R, I->Name, Blob); 195 case BASE_RECORD_PATH: 196 return decodeRecord(R, I->Path, Blob); 197 case BASE_RECORD_TAG_TYPE: 198 return decodeRecord(R, I->TagType, Blob); 199 case BASE_RECORD_IS_VIRTUAL: 200 return decodeRecord(R, I->IsVirtual, Blob); 201 case BASE_RECORD_ACCESS: 202 return decodeRecord(R, I->Access, Blob); 203 case BASE_RECORD_IS_PARENT: 204 return decodeRecord(R, I->IsParent, Blob); 205 default: 206 return llvm::createStringError(llvm::inconvertibleErrorCode(), 207 "invalid field for BaseRecordInfo"); 208 } 209 } 210 211 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 212 EnumInfo *I) { 213 switch (ID) { 214 case ENUM_USR: 215 return decodeRecord(R, I->USR, Blob); 216 case ENUM_NAME: 217 return decodeRecord(R, I->Name, Blob); 218 case ENUM_DEFLOCATION: 219 return decodeRecord(R, I->DefLoc, Blob); 220 case ENUM_LOCATION: 221 return decodeRecord(R, I->Loc, Blob); 222 case ENUM_SCOPED: 223 return decodeRecord(R, I->Scoped, Blob); 224 default: 225 return llvm::createStringError(llvm::inconvertibleErrorCode(), 226 "invalid field for EnumInfo"); 227 } 228 } 229 230 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 231 TypedefInfo *I) { 232 switch (ID) { 233 case TYPEDEF_USR: 234 return decodeRecord(R, I->USR, Blob); 235 case TYPEDEF_NAME: 236 return decodeRecord(R, I->Name, Blob); 237 case TYPEDEF_DEFLOCATION: 238 return decodeRecord(R, I->DefLoc, Blob); 239 case TYPEDEF_IS_USING: 240 return decodeRecord(R, I->IsUsing, Blob); 241 default: 242 return llvm::createStringError(llvm::inconvertibleErrorCode(), 243 "invalid field for TypedefInfo"); 244 } 245 } 246 247 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 248 EnumValueInfo *I) { 249 switch (ID) { 250 case ENUM_VALUE_NAME: 251 return decodeRecord(R, I->Name, Blob); 252 case ENUM_VALUE_VALUE: 253 return decodeRecord(R, I->Value, Blob); 254 case ENUM_VALUE_EXPR: 255 return decodeRecord(R, I->ValueExpr, Blob); 256 default: 257 return llvm::createStringError(llvm::inconvertibleErrorCode(), 258 "invalid field for EnumValueInfo"); 259 } 260 } 261 262 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 263 FunctionInfo *I) { 264 switch (ID) { 265 case FUNCTION_USR: 266 return decodeRecord(R, I->USR, Blob); 267 case FUNCTION_NAME: 268 return decodeRecord(R, I->Name, Blob); 269 case FUNCTION_DEFLOCATION: 270 return decodeRecord(R, I->DefLoc, Blob); 271 case FUNCTION_LOCATION: 272 return decodeRecord(R, I->Loc, Blob); 273 case FUNCTION_ACCESS: 274 return decodeRecord(R, I->Access, Blob); 275 case FUNCTION_IS_METHOD: 276 return decodeRecord(R, I->IsMethod, Blob); 277 default: 278 return llvm::createStringError(llvm::inconvertibleErrorCode(), 279 "invalid field for FunctionInfo"); 280 } 281 } 282 283 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 284 TypeInfo *I) { 285 return llvm::Error::success(); 286 } 287 288 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 289 FieldTypeInfo *I) { 290 switch (ID) { 291 case FIELD_TYPE_NAME: 292 return decodeRecord(R, I->Name, Blob); 293 case FIELD_DEFAULT_VALUE: 294 return decodeRecord(R, I->DefaultValue, Blob); 295 default: 296 return llvm::createStringError(llvm::inconvertibleErrorCode(), 297 "invalid field for TypeInfo"); 298 } 299 } 300 301 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 302 MemberTypeInfo *I) { 303 switch (ID) { 304 case MEMBER_TYPE_NAME: 305 return decodeRecord(R, I->Name, Blob); 306 case MEMBER_TYPE_ACCESS: 307 return decodeRecord(R, I->Access, Blob); 308 default: 309 return llvm::createStringError(llvm::inconvertibleErrorCode(), 310 "invalid field for MemberTypeInfo"); 311 } 312 } 313 314 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 315 CommentInfo *I) { 316 switch (ID) { 317 case COMMENT_KIND: 318 return decodeRecord(R, I->Kind, Blob); 319 case COMMENT_TEXT: 320 return decodeRecord(R, I->Text, Blob); 321 case COMMENT_NAME: 322 return decodeRecord(R, I->Name, Blob); 323 case COMMENT_DIRECTION: 324 return decodeRecord(R, I->Direction, Blob); 325 case COMMENT_PARAMNAME: 326 return decodeRecord(R, I->ParamName, Blob); 327 case COMMENT_CLOSENAME: 328 return decodeRecord(R, I->CloseName, Blob); 329 case COMMENT_ATTRKEY: 330 return decodeRecord(R, I->AttrKeys, Blob); 331 case COMMENT_ATTRVAL: 332 return decodeRecord(R, I->AttrValues, Blob); 333 case COMMENT_ARG: 334 return decodeRecord(R, I->Args, Blob); 335 case COMMENT_SELFCLOSING: 336 return decodeRecord(R, I->SelfClosing, Blob); 337 case COMMENT_EXPLICIT: 338 return decodeRecord(R, I->Explicit, Blob); 339 default: 340 return llvm::createStringError(llvm::inconvertibleErrorCode(), 341 "invalid field for CommentInfo"); 342 } 343 } 344 345 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 346 Reference *I, FieldId &F) { 347 switch (ID) { 348 case REFERENCE_USR: 349 return decodeRecord(R, I->USR, Blob); 350 case REFERENCE_NAME: 351 return decodeRecord(R, I->Name, Blob); 352 case REFERENCE_QUAL_NAME: 353 return decodeRecord(R, I->QualName, Blob); 354 case REFERENCE_TYPE: 355 return decodeRecord(R, I->RefType, Blob); 356 case REFERENCE_PATH: 357 return decodeRecord(R, I->Path, Blob); 358 case REFERENCE_FIELD: 359 return decodeRecord(R, F, Blob); 360 default: 361 return llvm::createStringError(llvm::inconvertibleErrorCode(), 362 "invalid field for Reference"); 363 } 364 } 365 366 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 367 TemplateInfo *I) { 368 // Currently there are no child records of TemplateInfo (only child blocks). 369 return llvm::createStringError(llvm::inconvertibleErrorCode(), 370 "invalid field for TemplateParamInfo"); 371 } 372 373 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 374 TemplateSpecializationInfo *I) { 375 if (ID == TEMPLATE_SPECIALIZATION_OF) 376 return decodeRecord(R, I->SpecializationOf, Blob); 377 return llvm::createStringError(llvm::inconvertibleErrorCode(), 378 "invalid field for TemplateParamInfo"); 379 } 380 381 llvm::Error parseRecord(const Record &R, unsigned ID, llvm::StringRef Blob, 382 TemplateParamInfo *I) { 383 if (ID == TEMPLATE_PARAM_CONTENTS) 384 return decodeRecord(R, I->Contents, Blob); 385 return llvm::createStringError(llvm::inconvertibleErrorCode(), 386 "invalid field for TemplateParamInfo"); 387 } 388 389 template <typename T> llvm::Expected<CommentInfo *> getCommentInfo(T I) { 390 return llvm::createStringError(llvm::inconvertibleErrorCode(), 391 "invalid type cannot contain CommentInfo"); 392 } 393 394 template <> llvm::Expected<CommentInfo *> getCommentInfo(FunctionInfo *I) { 395 return &I->Description.emplace_back(); 396 } 397 398 template <> llvm::Expected<CommentInfo *> getCommentInfo(NamespaceInfo *I) { 399 return &I->Description.emplace_back(); 400 } 401 402 template <> llvm::Expected<CommentInfo *> getCommentInfo(RecordInfo *I) { 403 return &I->Description.emplace_back(); 404 } 405 406 template <> llvm::Expected<CommentInfo *> getCommentInfo(MemberTypeInfo *I) { 407 return &I->Description.emplace_back(); 408 } 409 410 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumInfo *I) { 411 return &I->Description.emplace_back(); 412 } 413 414 template <> llvm::Expected<CommentInfo *> getCommentInfo(TypedefInfo *I) { 415 return &I->Description.emplace_back(); 416 } 417 418 template <> llvm::Expected<CommentInfo *> getCommentInfo(EnumValueInfo *I) { 419 return &I->Description.emplace_back(); 420 } 421 422 template <> llvm::Expected<CommentInfo *> getCommentInfo(CommentInfo *I) { 423 I->Children.emplace_back(std::make_unique<CommentInfo>()); 424 return I->Children.back().get(); 425 } 426 427 template <> 428 llvm::Expected<CommentInfo *> getCommentInfo(std::unique_ptr<CommentInfo> &I) { 429 return getCommentInfo(I.get()); 430 } 431 432 // When readSubBlock encounters a TypeInfo sub-block, it calls addTypeInfo on 433 // the parent block to set it. The template specializations define what to do 434 // for each supported parent block. 435 template <typename T, typename TTypeInfo> 436 llvm::Error addTypeInfo(T I, TTypeInfo &&TI) { 437 return llvm::createStringError(llvm::inconvertibleErrorCode(), 438 "invalid type cannot contain TypeInfo"); 439 } 440 441 template <> llvm::Error addTypeInfo(RecordInfo *I, MemberTypeInfo &&T) { 442 I->Members.emplace_back(std::move(T)); 443 return llvm::Error::success(); 444 } 445 446 template <> llvm::Error addTypeInfo(BaseRecordInfo *I, MemberTypeInfo &&T) { 447 I->Members.emplace_back(std::move(T)); 448 return llvm::Error::success(); 449 } 450 451 template <> llvm::Error addTypeInfo(FunctionInfo *I, TypeInfo &&T) { 452 I->ReturnType = std::move(T); 453 return llvm::Error::success(); 454 } 455 456 template <> llvm::Error addTypeInfo(FunctionInfo *I, FieldTypeInfo &&T) { 457 I->Params.emplace_back(std::move(T)); 458 return llvm::Error::success(); 459 } 460 461 template <> llvm::Error addTypeInfo(EnumInfo *I, TypeInfo &&T) { 462 I->BaseType = std::move(T); 463 return llvm::Error::success(); 464 } 465 466 template <> llvm::Error addTypeInfo(TypedefInfo *I, TypeInfo &&T) { 467 I->Underlying = std::move(T); 468 return llvm::Error::success(); 469 } 470 471 template <typename T> llvm::Error addReference(T I, Reference &&R, FieldId F) { 472 return llvm::createStringError(llvm::inconvertibleErrorCode(), 473 "invalid type cannot contain Reference"); 474 } 475 476 template <> llvm::Error addReference(TypeInfo *I, Reference &&R, FieldId F) { 477 switch (F) { 478 case FieldId::F_type: 479 I->Type = std::move(R); 480 return llvm::Error::success(); 481 default: 482 return llvm::createStringError(llvm::inconvertibleErrorCode(), 483 "invalid type cannot contain Reference"); 484 } 485 } 486 487 template <> 488 llvm::Error addReference(FieldTypeInfo *I, Reference &&R, FieldId F) { 489 switch (F) { 490 case FieldId::F_type: 491 I->Type = std::move(R); 492 return llvm::Error::success(); 493 default: 494 return llvm::createStringError(llvm::inconvertibleErrorCode(), 495 "invalid type cannot contain Reference"); 496 } 497 } 498 499 template <> 500 llvm::Error addReference(MemberTypeInfo *I, Reference &&R, FieldId F) { 501 switch (F) { 502 case FieldId::F_type: 503 I->Type = 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(EnumInfo *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 default: 517 return llvm::createStringError(llvm::inconvertibleErrorCode(), 518 "invalid type cannot contain Reference"); 519 } 520 } 521 522 template <> llvm::Error addReference(TypedefInfo *I, Reference &&R, FieldId F) { 523 switch (F) { 524 case FieldId::F_namespace: 525 I->Namespace.emplace_back(std::move(R)); 526 return llvm::Error::success(); 527 default: 528 return llvm::createStringError(llvm::inconvertibleErrorCode(), 529 "invalid type cannot contain Reference"); 530 } 531 } 532 533 template <> 534 llvm::Error addReference(NamespaceInfo *I, Reference &&R, FieldId F) { 535 switch (F) { 536 case FieldId::F_namespace: 537 I->Namespace.emplace_back(std::move(R)); 538 return llvm::Error::success(); 539 case FieldId::F_child_namespace: 540 I->Children.Namespaces.emplace_back(std::move(R)); 541 return llvm::Error::success(); 542 case FieldId::F_child_record: 543 I->Children.Records.emplace_back(std::move(R)); 544 return llvm::Error::success(); 545 default: 546 return llvm::createStringError(llvm::inconvertibleErrorCode(), 547 "invalid type cannot contain Reference"); 548 } 549 } 550 551 template <> 552 llvm::Error addReference(FunctionInfo *I, Reference &&R, FieldId F) { 553 switch (F) { 554 case FieldId::F_namespace: 555 I->Namespace.emplace_back(std::move(R)); 556 return llvm::Error::success(); 557 case FieldId::F_parent: 558 I->Parent = std::move(R); 559 return llvm::Error::success(); 560 default: 561 return llvm::createStringError(llvm::inconvertibleErrorCode(), 562 "invalid type cannot contain Reference"); 563 } 564 } 565 566 template <> llvm::Error addReference(RecordInfo *I, Reference &&R, FieldId F) { 567 switch (F) { 568 case FieldId::F_namespace: 569 I->Namespace.emplace_back(std::move(R)); 570 return llvm::Error::success(); 571 case FieldId::F_parent: 572 I->Parents.emplace_back(std::move(R)); 573 return llvm::Error::success(); 574 case FieldId::F_vparent: 575 I->VirtualParents.emplace_back(std::move(R)); 576 return llvm::Error::success(); 577 case FieldId::F_child_record: 578 I->Children.Records.emplace_back(std::move(R)); 579 return llvm::Error::success(); 580 default: 581 return llvm::createStringError(llvm::inconvertibleErrorCode(), 582 "invalid type cannot contain Reference"); 583 } 584 } 585 586 template <typename T, typename ChildInfoType> 587 void addChild(T I, ChildInfoType &&R) { 588 llvm::errs() << "invalid child type for info"; 589 exit(1); 590 } 591 592 // Namespace children: 593 template <> void addChild(NamespaceInfo *I, FunctionInfo &&R) { 594 I->Children.Functions.emplace_back(std::move(R)); 595 } 596 template <> void addChild(NamespaceInfo *I, EnumInfo &&R) { 597 I->Children.Enums.emplace_back(std::move(R)); 598 } 599 template <> void addChild(NamespaceInfo *I, TypedefInfo &&R) { 600 I->Children.Typedefs.emplace_back(std::move(R)); 601 } 602 603 // Record children: 604 template <> void addChild(RecordInfo *I, FunctionInfo &&R) { 605 I->Children.Functions.emplace_back(std::move(R)); 606 } 607 template <> void addChild(RecordInfo *I, EnumInfo &&R) { 608 I->Children.Enums.emplace_back(std::move(R)); 609 } 610 template <> void addChild(RecordInfo *I, TypedefInfo &&R) { 611 I->Children.Typedefs.emplace_back(std::move(R)); 612 } 613 614 // Other types of children: 615 template <> void addChild(EnumInfo *I, EnumValueInfo &&R) { 616 I->Members.emplace_back(std::move(R)); 617 } 618 template <> void addChild(RecordInfo *I, BaseRecordInfo &&R) { 619 I->Bases.emplace_back(std::move(R)); 620 } 621 template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) { 622 I->Children.Functions.emplace_back(std::move(R)); 623 } 624 625 // TemplateParam children. These go into either a TemplateInfo (for template 626 // parameters) or TemplateSpecializationInfo (for the specialization's 627 // parameters). 628 template <typename T> void addTemplateParam(T I, TemplateParamInfo &&P) { 629 llvm::errs() << "invalid container for template parameter"; 630 exit(1); 631 } 632 template <> void addTemplateParam(TemplateInfo *I, TemplateParamInfo &&P) { 633 I->Params.emplace_back(std::move(P)); 634 } 635 template <> 636 void addTemplateParam(TemplateSpecializationInfo *I, TemplateParamInfo &&P) { 637 I->Params.emplace_back(std::move(P)); 638 } 639 640 // Template info. These apply to either records or functions. 641 template <typename T> void addTemplate(T I, TemplateInfo &&P) { 642 llvm::errs() << "invalid container for template info"; 643 exit(1); 644 } 645 template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) { 646 I->Template.emplace(std::move(P)); 647 } 648 template <> void addTemplate(FunctionInfo *I, TemplateInfo &&P) { 649 I->Template.emplace(std::move(P)); 650 } 651 652 // Template specializations go only into template records. 653 template <typename T> 654 void addTemplateSpecialization(T I, TemplateSpecializationInfo &&TSI) { 655 llvm::errs() << "invalid container for template specialization info"; 656 exit(1); 657 } 658 template <> 659 void addTemplateSpecialization(TemplateInfo *I, 660 TemplateSpecializationInfo &&TSI) { 661 I->Specialization.emplace(std::move(TSI)); 662 } 663 664 // Read records from bitcode into a given info. 665 template <typename T> 666 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, T I) { 667 Record R; 668 llvm::StringRef Blob; 669 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob); 670 if (!MaybeRecID) 671 return MaybeRecID.takeError(); 672 return parseRecord(R, MaybeRecID.get(), Blob, I); 673 } 674 675 template <> 676 llvm::Error ClangDocBitcodeReader::readRecord(unsigned ID, Reference *I) { 677 Record R; 678 llvm::StringRef Blob; 679 llvm::Expected<unsigned> MaybeRecID = Stream.readRecord(ID, R, &Blob); 680 if (!MaybeRecID) 681 return MaybeRecID.takeError(); 682 return parseRecord(R, MaybeRecID.get(), Blob, I, CurrentReferenceField); 683 } 684 685 // Read a block of records into a single info. 686 template <typename T> 687 llvm::Error ClangDocBitcodeReader::readBlock(unsigned ID, T I) { 688 if (llvm::Error Err = Stream.EnterSubBlock(ID)) 689 return Err; 690 691 while (true) { 692 unsigned BlockOrCode = 0; 693 Cursor Res = skipUntilRecordOrBlock(BlockOrCode); 694 695 switch (Res) { 696 case Cursor::BadBlock: 697 return llvm::createStringError(llvm::inconvertibleErrorCode(), 698 "bad block found"); 699 case Cursor::BlockEnd: 700 return llvm::Error::success(); 701 case Cursor::BlockBegin: 702 if (llvm::Error Err = readSubBlock(BlockOrCode, I)) { 703 if (llvm::Error Skipped = Stream.SkipBlock()) 704 return joinErrors(std::move(Err), std::move(Skipped)); 705 return Err; 706 } 707 continue; 708 case Cursor::Record: 709 break; 710 } 711 if (auto Err = readRecord(BlockOrCode, I)) 712 return Err; 713 } 714 } 715 716 template <typename T> 717 llvm::Error ClangDocBitcodeReader::readSubBlock(unsigned ID, T I) { 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 BlockOrRecordID = 0; 825 826 while (!Stream.AtEndOfStream()) { 827 Expected<unsigned> MaybeCode = Stream.ReadCode(); 828 if (!MaybeCode) { 829 // FIXME this drops the error on the floor. 830 consumeError(MaybeCode.takeError()); 831 return Cursor::BadBlock; 832 } 833 834 unsigned Code = MaybeCode.get(); 835 if (Code >= static_cast<unsigned>(llvm::bitc::FIRST_APPLICATION_ABBREV)) { 836 BlockOrRecordID = Code; 837 return Cursor::Record; 838 } 839 switch (static_cast<llvm::bitc::FixedAbbrevIDs>(Code)) { 840 case llvm::bitc::ENTER_SUBBLOCK: 841 if (Expected<unsigned> MaybeID = Stream.ReadSubBlockID()) 842 BlockOrRecordID = MaybeID.get(); 843 else { 844 // FIXME this drops the error on the floor. 845 consumeError(MaybeID.takeError()); 846 } 847 return Cursor::BlockBegin; 848 case llvm::bitc::END_BLOCK: 849 if (Stream.ReadBlockEnd()) 850 return Cursor::BadBlock; 851 return Cursor::BlockEnd; 852 case llvm::bitc::DEFINE_ABBREV: 853 if (llvm::Error Err = Stream.ReadAbbrevRecord()) { 854 // FIXME this drops the error on the floor. 855 consumeError(std::move(Err)); 856 } 857 continue; 858 case llvm::bitc::UNABBREV_RECORD: 859 return Cursor::BadBlock; 860 case llvm::bitc::FIRST_APPLICATION_ABBREV: 861 llvm_unreachable("Unexpected abbrev id."); 862 } 863 } 864 llvm_unreachable("Premature stream end."); 865 } 866 867 llvm::Error ClangDocBitcodeReader::validateStream() { 868 if (Stream.AtEndOfStream()) 869 return llvm::createStringError(llvm::inconvertibleErrorCode(), 870 "premature end of stream"); 871 872 // Sniff for the signature. 873 for (int Idx = 0; Idx != 4; ++Idx) { 874 Expected<llvm::SimpleBitstreamCursor::word_t> MaybeRead = Stream.Read(8); 875 if (!MaybeRead) 876 return MaybeRead.takeError(); 877 else if (MaybeRead.get() != BitCodeConstants::Signature[Idx]) 878 return llvm::createStringError(llvm::inconvertibleErrorCode(), 879 "invalid bitcode signature"); 880 } 881 return llvm::Error::success(); 882 } 883 884 llvm::Error ClangDocBitcodeReader::readBlockInfoBlock() { 885 Expected<std::optional<llvm::BitstreamBlockInfo>> MaybeBlockInfo = 886 Stream.ReadBlockInfoBlock(); 887 if (!MaybeBlockInfo) 888 return MaybeBlockInfo.takeError(); 889 else 890 BlockInfo = MaybeBlockInfo.get(); 891 if (!BlockInfo) 892 return llvm::createStringError(llvm::inconvertibleErrorCode(), 893 "unable to parse BlockInfoBlock"); 894 Stream.setBlockInfo(&*BlockInfo); 895 return llvm::Error::success(); 896 } 897 898 template <typename T> 899 llvm::Expected<std::unique_ptr<Info>> 900 ClangDocBitcodeReader::createInfo(unsigned ID) { 901 std::unique_ptr<Info> I = std::make_unique<T>(); 902 if (auto Err = readBlock(ID, static_cast<T *>(I.get()))) 903 return std::move(Err); 904 return std::unique_ptr<Info>{std::move(I)}; 905 } 906 907 llvm::Expected<std::unique_ptr<Info>> 908 ClangDocBitcodeReader::readBlockToInfo(unsigned ID) { 909 switch (ID) { 910 case BI_NAMESPACE_BLOCK_ID: 911 return createInfo<NamespaceInfo>(ID); 912 case BI_RECORD_BLOCK_ID: 913 return createInfo<RecordInfo>(ID); 914 case BI_ENUM_BLOCK_ID: 915 return createInfo<EnumInfo>(ID); 916 case BI_TYPEDEF_BLOCK_ID: 917 return createInfo<TypedefInfo>(ID); 918 case BI_FUNCTION_BLOCK_ID: 919 return createInfo<FunctionInfo>(ID); 920 default: 921 return llvm::createStringError(llvm::inconvertibleErrorCode(), 922 "cannot create info"); 923 } 924 } 925 926 // Entry point 927 llvm::Expected<std::vector<std::unique_ptr<Info>>> 928 ClangDocBitcodeReader::readBitcode() { 929 std::vector<std::unique_ptr<Info>> Infos; 930 if (auto Err = validateStream()) 931 return std::move(Err); 932 933 // Read the top level blocks. 934 while (!Stream.AtEndOfStream()) { 935 Expected<unsigned> MaybeCode = Stream.ReadCode(); 936 if (!MaybeCode) 937 return MaybeCode.takeError(); 938 if (MaybeCode.get() != llvm::bitc::ENTER_SUBBLOCK) 939 return llvm::createStringError(llvm::inconvertibleErrorCode(), 940 "no blocks in input"); 941 Expected<unsigned> MaybeID = Stream.ReadSubBlockID(); 942 if (!MaybeID) 943 return MaybeID.takeError(); 944 unsigned ID = MaybeID.get(); 945 switch (ID) { 946 // NamedType and Comment blocks should not appear at the top level 947 case BI_TYPE_BLOCK_ID: 948 case BI_FIELD_TYPE_BLOCK_ID: 949 case BI_MEMBER_TYPE_BLOCK_ID: 950 case BI_COMMENT_BLOCK_ID: 951 case BI_REFERENCE_BLOCK_ID: 952 return llvm::createStringError(llvm::inconvertibleErrorCode(), 953 "invalid top level block"); 954 case BI_NAMESPACE_BLOCK_ID: 955 case BI_RECORD_BLOCK_ID: 956 case BI_ENUM_BLOCK_ID: 957 case BI_TYPEDEF_BLOCK_ID: 958 case BI_FUNCTION_BLOCK_ID: { 959 auto InfoOrErr = readBlockToInfo(ID); 960 if (!InfoOrErr) 961 return InfoOrErr.takeError(); 962 Infos.emplace_back(std::move(InfoOrErr.get())); 963 continue; 964 } 965 case BI_VERSION_BLOCK_ID: 966 if (auto Err = readBlock(ID, VersionNumber)) 967 return std::move(Err); 968 continue; 969 case llvm::bitc::BLOCKINFO_BLOCK_ID: 970 if (auto Err = readBlockInfoBlock()) 971 return std::move(Err); 972 continue; 973 default: 974 if (llvm::Error Err = Stream.SkipBlock()) { 975 // FIXME this drops the error on the floor. 976 consumeError(std::move(Err)); 977 } 978 continue; 979 } 980 } 981 return std::move(Infos); 982 } 983 984 } // namespace doc 985 } // namespace clang 986