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