BitcodeReader.cpp 31 KB

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