dump.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. // Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. // Exceptions. See /LICENSE for license information.
  3. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. #ifndef NDEBUG
  5. #include "toolchain/sem_ir/dump.h"
  6. #include <string>
  7. #include "common/raw_string_ostream.h"
  8. #include "toolchain/sem_ir/ids.h"
  9. #include "toolchain/sem_ir/inst.h"
  10. #include "toolchain/sem_ir/name_scope.h"
  11. #include "toolchain/sem_ir/stringify.h"
  12. #include "toolchain/sem_ir/typed_insts.h"
  13. namespace Carbon::SemIR {
  14. static LLVM_DUMP_METHOD auto Dump(const File& file) -> std::string {
  15. return PrintToString(file);
  16. }
  17. static auto DumpNameIfValid(const File& file, NameId name_id) -> std::string {
  18. RawStringOstream out;
  19. if (name_id.has_value()) {
  20. out << " `" << file.names().GetFormatted(name_id) << "`";
  21. }
  22. return out.TakeStr();
  23. }
  24. static auto DumpLocSummary(const File& file, LocId loc_id) -> std::string {
  25. RawStringOstream out;
  26. // TODO: If the canonical location is None but the original is an InstId,
  27. // should we dump the InstId anyway even though it has no location? Is that
  28. // ever useful?
  29. loc_id = file.insts().GetCanonicalLocId(loc_id);
  30. switch (loc_id.kind()) {
  31. case LocId::Kind::None: {
  32. out << "LocId(<none>)";
  33. break;
  34. }
  35. case LocId::Kind::ImportIRInstId: {
  36. auto import_ir_id =
  37. file.import_ir_insts().Get(loc_id.import_ir_inst_id()).ir_id();
  38. const auto* import_file = file.import_irs().Get(import_ir_id).sem_ir;
  39. out << "LocId(import from ";
  40. if (import_file == nullptr) {
  41. out << "unknown file";
  42. } else {
  43. out << "\"" << FormatEscaped(import_file->filename()) << "\"";
  44. }
  45. out << ")";
  46. break;
  47. }
  48. case LocId::Kind::NodeId: {
  49. auto token = file.parse_tree().node_token(loc_id.node_id());
  50. auto line = file.parse_tree().tokens().GetLineNumber(token);
  51. auto col = file.parse_tree().tokens().GetColumnNumber(token);
  52. const char* implicit = loc_id.is_desugared() ? " implicit" : "";
  53. out << "LocId(" << FormatEscaped(file.filename()) << ":" << line << ":"
  54. << col << implicit << ")";
  55. break;
  56. }
  57. case LocId::Kind::InstId:
  58. CARBON_FATAL("unexpected LocId kind");
  59. }
  60. return out.TakeStr();
  61. }
  62. static auto DumpConstantSummary(const File& file, ConstantId const_id)
  63. -> std::string {
  64. RawStringOstream out;
  65. out << const_id;
  66. if (!const_id.has_value()) {
  67. return out.TakeStr();
  68. }
  69. if (const_id.is_symbolic()) {
  70. out << ": " << file.constant_values().GetSymbolicConstant(const_id);
  71. } else if (const_id.is_concrete()) {
  72. out << ": "
  73. << file.insts().GetWithAttachedType(
  74. file.constant_values().GetInstId(const_id));
  75. }
  76. return out.TakeStr();
  77. }
  78. static auto DumpTypeSummary(const File& file, TypeId type_id) -> std::string {
  79. RawStringOstream out;
  80. out << type_id;
  81. if (!type_id.has_value()) {
  82. return out.TakeStr();
  83. }
  84. InstId inst_id = file.types().GetTypeInstId(type_id);
  85. out << ": " << StringifyConstantInst(file, inst_id) << "; "
  86. << file.insts().Get(inst_id);
  87. auto const_id = file.types().GetConstantId(type_id);
  88. if (const_id.is_symbolic()) {
  89. if (file.constant_values().IsAttached(const_id)) {
  90. out << " (attached symbolic)";
  91. } else {
  92. out << " (unattached symbolic)";
  93. }
  94. } else {
  95. out << " (concrete)";
  96. }
  97. return out.TakeStr();
  98. }
  99. static auto DumpInstSummary(const File& file, InstId inst_id) -> std::string {
  100. RawStringOstream out;
  101. out << inst_id;
  102. if (inst_id.has_value() && inst_id != InstId::InitTombstone &&
  103. inst_id != InstId::ImplWitnessTablePlaceholder) {
  104. out << ": " << file.insts().GetWithAttachedType(inst_id);
  105. }
  106. return out.TakeStr();
  107. }
  108. static auto DumpGenericSummary(const File& file, GenericId generic_id)
  109. -> std::string {
  110. RawStringOstream out;
  111. out << generic_id;
  112. if (!generic_id.has_value()) {
  113. return out.TakeStr();
  114. }
  115. const auto& generic = file.generics().Get(generic_id);
  116. out << ": " << generic
  117. << "\ndecl: " << DumpInstSummary(file, generic.decl_id);
  118. return out.TakeStr();
  119. }
  120. static auto DumpInterfaceSummary(const File& file, InterfaceId interface_id)
  121. -> std::string {
  122. RawStringOstream out;
  123. out << interface_id;
  124. if (interface_id.has_value()) {
  125. const auto& interface = file.interfaces().Get(interface_id);
  126. out << ": " << interface << DumpNameIfValid(file, interface.name_id);
  127. }
  128. return out.TakeStr();
  129. }
  130. static auto DumpNamedConstraintSummary(const File& file,
  131. NamedConstraintId named_constraint_id)
  132. -> std::string {
  133. RawStringOstream out;
  134. out << named_constraint_id;
  135. if (named_constraint_id.has_value()) {
  136. const auto& constraint = file.named_constraints().Get(named_constraint_id);
  137. out << ": " << constraint << DumpNameIfValid(file, constraint.name_id);
  138. }
  139. return out.TakeStr();
  140. }
  141. static auto DumpSpecificSummary(const File& file, SpecificId specific_id)
  142. -> std::string {
  143. RawStringOstream out;
  144. out << specific_id;
  145. if (specific_id.has_value()) {
  146. out << ": " << file.specifics().Get(specific_id);
  147. }
  148. return out.TakeStr();
  149. }
  150. static auto DumpRequireImplsSummary(const File& file,
  151. RequireImplsId require_impls_id)
  152. -> std::string {
  153. RawStringOstream out;
  154. out << require_impls_id;
  155. if (require_impls_id.has_value()) {
  156. out << ": " << file.require_impls().Get(require_impls_id);
  157. }
  158. return out.TakeStr();
  159. }
  160. LLVM_DUMP_METHOD auto Dump(const File& file, ClassId class_id) -> std::string {
  161. RawStringOstream out;
  162. out << class_id;
  163. if (class_id.has_value()) {
  164. const auto& class_obj = file.classes().Get(class_id);
  165. out << ": " << class_obj << DumpNameIfValid(file, class_obj.name_id);
  166. }
  167. return out.TakeStr();
  168. }
  169. LLVM_DUMP_METHOD auto Dump(const File& file, ConstantId const_id)
  170. -> std::string {
  171. RawStringOstream out;
  172. out << const_id;
  173. if (!const_id.has_value()) {
  174. return out.TakeStr();
  175. }
  176. if (const_id.is_symbolic()) {
  177. const auto& symbolic = file.constant_values().GetSymbolicConstant(const_id);
  178. out << ": " << symbolic << '\n'
  179. << DumpInstSummary(file, symbolic.inst_id) << '\n'
  180. << DumpGenericSummary(file, symbolic.generic_id);
  181. } else if (const_id.is_concrete()) {
  182. out << ": "
  183. << DumpInstSummary(file, file.constant_values().GetInstId(const_id));
  184. }
  185. return out.TakeStr();
  186. }
  187. LLVM_DUMP_METHOD auto Dump(const File& file, EntityNameId entity_name_id)
  188. -> std::string {
  189. RawStringOstream out;
  190. out << entity_name_id;
  191. if (entity_name_id.has_value()) {
  192. auto entity_name = file.entity_names().Get(entity_name_id);
  193. out << ": " << entity_name << DumpNameIfValid(file, entity_name.name_id);
  194. }
  195. return out.TakeStr();
  196. }
  197. LLVM_DUMP_METHOD auto Dump(const File& file, FacetTypeId facet_type_id)
  198. -> std::string {
  199. RawStringOstream out;
  200. out << facet_type_id;
  201. if (!facet_type_id.has_value()) {
  202. return out.TakeStr();
  203. }
  204. const auto& facet_type = file.facet_types().Get(facet_type_id);
  205. out << ": " << facet_type;
  206. for (auto impls : facet_type.extend_constraints) {
  207. out << "\n - " << DumpInterfaceSummary(file, impls.interface_id);
  208. if (impls.specific_id.has_value()) {
  209. out << "; " << DumpSpecificSummary(file, impls.specific_id);
  210. }
  211. out << " (extend)";
  212. }
  213. for (auto impls : facet_type.self_impls_constraints) {
  214. out << "\n - " << DumpInterfaceSummary(file, impls.interface_id);
  215. if (impls.specific_id.has_value()) {
  216. out << "; " << DumpSpecificSummary(file, impls.specific_id);
  217. }
  218. }
  219. for (auto impls : facet_type.extend_named_constraints) {
  220. out << "\n - "
  221. << DumpNamedConstraintSummary(file, impls.named_constraint_id);
  222. if (impls.specific_id.has_value()) {
  223. out << "; " << DumpSpecificSummary(file, impls.specific_id);
  224. }
  225. out << " (extend)";
  226. }
  227. for (auto impls : facet_type.self_impls_named_constraints) {
  228. out << "\n - "
  229. << DumpNamedConstraintSummary(file, impls.named_constraint_id);
  230. if (impls.specific_id.has_value()) {
  231. out << "; " << DumpSpecificSummary(file, impls.specific_id);
  232. }
  233. }
  234. for (auto rewrite : facet_type.rewrite_constraints) {
  235. out << "\n"
  236. << " - " << DumpInstSummary(file, rewrite.lhs_id) << "\n"
  237. << " - " << DumpInstSummary(file, rewrite.rhs_id);
  238. }
  239. return out.TakeStr();
  240. }
  241. LLVM_DUMP_METHOD auto Dump(const File& file, FunctionId function_id)
  242. -> std::string {
  243. RawStringOstream out;
  244. out << function_id;
  245. if (function_id.has_value()) {
  246. const auto& function = file.functions().Get(function_id);
  247. out << ": " << function << DumpNameIfValid(file, function.name_id);
  248. }
  249. return out.TakeStr();
  250. }
  251. LLVM_DUMP_METHOD auto Dump(const File& file, GenericId generic_id)
  252. -> std::string {
  253. RawStringOstream out;
  254. out << DumpGenericSummary(file, generic_id);
  255. if (!generic_id.has_value()) {
  256. return out.TakeStr();
  257. }
  258. const auto& generic = file.generics().Get(generic_id);
  259. out << "\nbindings block: " << Dump(file, generic.bindings_id);
  260. if (generic.decl_block_id.has_value()) {
  261. out << "\ngeneric decl block: " << Dump(file, generic.decl_block_id);
  262. }
  263. if (generic.definition_block_id.has_value()) {
  264. out << "\ngeneric definition block: "
  265. << Dump(file, generic.definition_block_id);
  266. }
  267. return out.TakeStr();
  268. }
  269. LLVM_DUMP_METHOD auto Dump(const File& file,
  270. IdentifiedFacetTypeId identified_facet_type_id)
  271. -> std::string {
  272. RawStringOstream out;
  273. out << identified_facet_type_id;
  274. if (!identified_facet_type_id.has_value()) {
  275. return out.TakeStr();
  276. }
  277. const auto& identified_facet_type =
  278. file.identified_facet_types().Get(identified_facet_type_id);
  279. for (auto [i, req_impl] :
  280. llvm::enumerate(identified_facet_type.required_impls())) {
  281. auto [self, req_interface] = req_impl;
  282. out << "\n - self: " << DumpConstantSummary(file, self);
  283. out << "\n impls "
  284. << DumpInterfaceSummary(file, req_interface.interface_id);
  285. if (req_interface.specific_id.has_value()) {
  286. out << "; " << DumpSpecificSummary(file, req_interface.specific_id);
  287. }
  288. if (req_interface == identified_facet_type.impl_as_target_interface()) {
  289. out << "\n - `impl as` target";
  290. }
  291. }
  292. if (!identified_facet_type.is_valid_impl_as_target()) {
  293. out << "\n - " << identified_facet_type.num_interfaces_to_impl()
  294. << " possible `impl as` targets";
  295. }
  296. return out.TakeStr();
  297. }
  298. LLVM_DUMP_METHOD auto Dump(const File& file, ImplId impl_id) -> std::string {
  299. RawStringOstream out;
  300. out << impl_id;
  301. if (!impl_id.has_value()) {
  302. return out.TakeStr();
  303. }
  304. const auto& impl = file.impls().Get(impl_id);
  305. out << ": " << impl << '\n'
  306. << " - interface_id: "
  307. << DumpInterfaceSummary(file, impl.interface.interface_id) << '\n'
  308. << " - specific_id: "
  309. << DumpSpecificSummary(file, impl.interface.specific_id);
  310. if (impl.interface.specific_id.has_value()) {
  311. auto inst_block_id =
  312. file.specifics().Get(impl.interface.specific_id).args_id;
  313. out << '\n' << Dump(file, inst_block_id);
  314. }
  315. out << "\n - witness loc: " << DumpLocSummary(file, LocId(impl.witness_id));
  316. return out.TakeStr();
  317. }
  318. LLVM_DUMP_METHOD auto Dump(const File& file, InstBlockId inst_block_id)
  319. -> std::string {
  320. RawStringOstream out;
  321. out << inst_block_id;
  322. if (inst_block_id.has_value()) {
  323. out << ":";
  324. auto inst_block = file.inst_blocks().GetOrEmpty(inst_block_id);
  325. for (auto inst_id : inst_block) {
  326. out << "\n - " << DumpInstSummary(file, inst_id);
  327. }
  328. }
  329. return out.TakeStr();
  330. }
  331. LLVM_DUMP_METHOD auto Dump(const File& file, InstId inst_id) -> std::string {
  332. RawStringOstream out;
  333. out << DumpInstSummary(file, inst_id);
  334. if (!inst_id.has_value()) {
  335. return out.TakeStr();
  336. }
  337. Inst inst = file.insts().GetWithAttachedType(inst_id);
  338. if (inst.arg0_and_kind().kind() == IdKind::For<EntityNameId>) {
  339. auto entity_name_id = EntityNameId(inst.arg0());
  340. out << "\n - name:"
  341. << DumpNameIfValid(file,
  342. file.entity_names().Get(entity_name_id).name_id);
  343. }
  344. if (inst.type_id().has_value()) {
  345. out << "\n - type: " << DumpTypeSummary(file, inst.type_id());
  346. }
  347. ConstantId const_id = file.constant_values().GetAttached(inst_id);
  348. if (const_id.has_value()) {
  349. InstId const_inst_id = file.constant_values().GetInstId(const_id);
  350. out << "\n - value: ";
  351. if (const_inst_id == inst_id) {
  352. out << const_id;
  353. } else {
  354. out << DumpConstantSummary(file, const_id);
  355. }
  356. }
  357. out << "\n - loc: " << DumpLocSummary(file, LocId(inst_id));
  358. return out.TakeStr();
  359. }
  360. LLVM_DUMP_METHOD auto Dump(const File& file, InterfaceId interface_id)
  361. -> std::string {
  362. RawStringOstream out;
  363. out << DumpInterfaceSummary(file, interface_id);
  364. if (interface_id.has_value()) {
  365. const auto& interface = file.interfaces().Get(interface_id);
  366. out << "\n - complete: " << (interface.is_complete() ? "true" : "false");
  367. }
  368. return out.TakeStr();
  369. }
  370. LLVM_DUMP_METHOD auto Dump(const File& file, LocId loc_id) -> std::string {
  371. return DumpLocSummary(file, loc_id);
  372. }
  373. LLVM_DUMP_METHOD auto Dump(const File& file, NameId name_id) -> std::string {
  374. RawStringOstream out;
  375. out << name_id << DumpNameIfValid(file, name_id);
  376. return out.TakeStr();
  377. }
  378. LLVM_DUMP_METHOD auto Dump(const File& file, NameScopeId name_scope_id)
  379. -> std::string {
  380. RawStringOstream out;
  381. out << name_scope_id;
  382. if (!name_scope_id.has_value()) {
  383. return out.TakeStr();
  384. }
  385. const auto& name_scope = file.name_scopes().Get(name_scope_id);
  386. out << ": " << name_scope;
  387. if (name_scope.inst_id().has_value()) {
  388. out << " " << file.insts().Get(name_scope.inst_id());
  389. }
  390. out << DumpNameIfValid(file, name_scope.name_id());
  391. for (const auto& entry : name_scope.entries()) {
  392. out << "\n - " << entry.name_id << DumpNameIfValid(file, entry.name_id)
  393. << ": ";
  394. if (entry.result.is_poisoned()) {
  395. out << "<poisoned>";
  396. } else if (entry.result.is_found()) {
  397. switch (entry.result.access_kind()) {
  398. case AccessKind::Public:
  399. out << "public ";
  400. break;
  401. case AccessKind::Protected:
  402. out << "protected ";
  403. break;
  404. case AccessKind::Private:
  405. out << "private ";
  406. break;
  407. }
  408. out << DumpInstSummary(file, entry.result.target_inst_id());
  409. } else {
  410. out << "<not-found>";
  411. }
  412. }
  413. return out.TakeStr();
  414. }
  415. LLVM_DUMP_METHOD auto Dump(const File& file,
  416. NamedConstraintId named_constraint_id)
  417. -> std::string {
  418. RawStringOstream out;
  419. out << DumpNamedConstraintSummary(file, named_constraint_id);
  420. if (named_constraint_id.has_value()) {
  421. const auto& constraint = file.named_constraints().Get(named_constraint_id);
  422. out << "\n - complete: " << (constraint.is_complete() ? "true" : "false");
  423. }
  424. return out.TakeStr();
  425. }
  426. LLVM_DUMP_METHOD auto Dump(const File& file,
  427. RequireImplsBlockId require_impls_block_id)
  428. -> std::string {
  429. RawStringOstream out;
  430. out << require_impls_block_id;
  431. if (require_impls_block_id.has_value()) {
  432. for (auto require_id :
  433. file.require_impls_blocks().Get(require_impls_block_id)) {
  434. out << "\n - " << DumpRequireImplsSummary(file, require_id);
  435. }
  436. }
  437. return out.TakeStr();
  438. }
  439. LLVM_DUMP_METHOD auto Dump(const File& file, RequireImplsId require_impls_id)
  440. -> std::string {
  441. return DumpRequireImplsSummary(file, require_impls_id);
  442. }
  443. static auto DumpEvalBlock(const File& file, llvm::StringRef region_name,
  444. InstBlockId block_id, bool has_error) -> std::string {
  445. RawStringOstream out;
  446. if (block_id.has_value()) {
  447. out << "\nspecific " << region_name << " block"
  448. << (has_error ? " (has error)" : "") << ": " << Dump(file, block_id);
  449. }
  450. return out.TakeStr();
  451. }
  452. LLVM_DUMP_METHOD auto Dump(const File& file, SpecificId specific_id)
  453. -> std::string {
  454. RawStringOstream out;
  455. out << DumpSpecificSummary(file, specific_id);
  456. if (specific_id.has_value()) {
  457. const auto& specific = file.specifics().Get(specific_id);
  458. out << '\n'
  459. << Dump(file, specific.args_id) << '\n'
  460. << DumpGenericSummary(file, specific.generic_id)
  461. << DumpEvalBlock(file, "decl", specific.decl_block_id,
  462. specific.decl_block_has_error)
  463. << DumpEvalBlock(file, "definition", specific.definition_block_id,
  464. specific.definition_block_has_error);
  465. }
  466. return out.TakeStr();
  467. }
  468. LLVM_DUMP_METHOD auto Dump(const File& file,
  469. SpecificInterfaceId specific_interface_id)
  470. -> std::string {
  471. RawStringOstream out;
  472. const auto& interface = file.specific_interfaces().Get(specific_interface_id);
  473. out << specific_interface_id << "\n"
  474. << " - interface: " << DumpInterfaceSummary(file, interface.interface_id)
  475. << "\n"
  476. << " - specific_id: "
  477. << DumpSpecificSummary(file, interface.specific_id);
  478. return out.TakeStr();
  479. }
  480. LLVM_DUMP_METHOD auto Dump(const File& file,
  481. StructTypeFieldsId struct_type_fields_id)
  482. -> std::string {
  483. RawStringOstream out;
  484. out << struct_type_fields_id;
  485. if (struct_type_fields_id.has_value()) {
  486. out << ":";
  487. auto block = file.struct_type_fields().Get(struct_type_fields_id);
  488. for (auto field : block) {
  489. out << "\n - " << field << DumpNameIfValid(file, field.name_id);
  490. if (field.type_inst_id.has_value()) {
  491. out << ": " << StringifyConstantInst(file, field.type_inst_id);
  492. }
  493. }
  494. }
  495. return out.TakeStr();
  496. }
  497. LLVM_DUMP_METHOD auto Dump(const File& file, TypeId type_id) -> std::string {
  498. return DumpTypeSummary(file, type_id);
  499. }
  500. static LLVM_DUMP_METHOD auto Dump(const File& file, const Inst& inst)
  501. -> std::string {
  502. RawStringOstream out;
  503. out << inst;
  504. if (inst.arg0_and_kind().kind() == IdKind::For<EntityNameId>) {
  505. auto entity_name_id = EntityNameId(inst.arg0());
  506. out << "\n - name:"
  507. << DumpNameIfValid(file,
  508. file.entity_names().Get(entity_name_id).name_id);
  509. }
  510. if (inst.type_id().has_value()) {
  511. out << "\n - type: " << DumpTypeSummary(file, inst.type_id());
  512. }
  513. return out.TakeStr();
  514. }
  515. static LLVM_DUMP_METHOD auto Dump(const File& file, const NameScope& scope)
  516. -> std::string {
  517. RawStringOstream out;
  518. out << scope;
  519. if (scope.inst_id().has_value()) {
  520. out << " " << file.insts().Get(scope.inst_id());
  521. }
  522. out << DumpNameIfValid(file, scope.name_id());
  523. for (const auto& entry : scope.entries()) {
  524. out << "\n - " << entry.name_id << DumpNameIfValid(file, entry.name_id)
  525. << ": ";
  526. if (entry.result.is_poisoned()) {
  527. out << "<poisoned>";
  528. } else if (entry.result.is_found()) {
  529. switch (entry.result.access_kind()) {
  530. case AccessKind::Public:
  531. out << "public ";
  532. break;
  533. case AccessKind::Protected:
  534. out << "protected ";
  535. break;
  536. case AccessKind::Private:
  537. out << "private ";
  538. break;
  539. }
  540. out << DumpInstSummary(file, entry.result.target_inst_id());
  541. } else {
  542. out << "<not-found>";
  543. }
  544. }
  545. return out.TakeStr();
  546. }
  547. // Functions that can be used instead of the corresponding constructor, which is
  548. // unavailable during debugging.
  549. LLVM_DUMP_METHOD static auto MakeClassId(int id) -> ClassId {
  550. return ClassId(id);
  551. }
  552. LLVM_DUMP_METHOD static auto MakeConstantId(int id) -> ConstantId {
  553. return ConstantId(id);
  554. }
  555. LLVM_DUMP_METHOD auto MakeSymbolicConstantId(int id) -> ConstantId {
  556. return ConstantId::ForSymbolicConstantId(ConstantId::SymbolicId(id));
  557. }
  558. LLVM_DUMP_METHOD static auto MakeEntityNameId(int id) -> EntityNameId {
  559. return EntityNameId(id);
  560. }
  561. LLVM_DUMP_METHOD static auto MakeFacetTypeId(int id) -> FacetTypeId {
  562. return FacetTypeId(id);
  563. }
  564. LLVM_DUMP_METHOD static auto MakeFunctionId(int id) -> FunctionId {
  565. return FunctionId(id);
  566. }
  567. LLVM_DUMP_METHOD static auto MakeGenericId(int id) -> GenericId {
  568. return GenericId(id);
  569. }
  570. LLVM_DUMP_METHOD static auto MakeImplId(int id) -> ImplId { return ImplId(id); }
  571. LLVM_DUMP_METHOD static auto MakeInstBlockId(int id) -> InstBlockId {
  572. return InstBlockId(id);
  573. }
  574. LLVM_DUMP_METHOD static auto MakeInstId(int id) -> InstId { return InstId(id); }
  575. LLVM_DUMP_METHOD static auto MakeInterfaceId(int id) -> InterfaceId {
  576. return InterfaceId(id);
  577. }
  578. LLVM_DUMP_METHOD static auto MakeNameId(int id) -> NameId { return NameId(id); }
  579. LLVM_DUMP_METHOD static auto MakeNameScopeId(int id) -> NameScopeId {
  580. return NameScopeId(id);
  581. }
  582. LLVM_DUMP_METHOD static auto MakeIdentifiedFacetTypeId(int id)
  583. -> IdentifiedFacetTypeId {
  584. return IdentifiedFacetTypeId(id);
  585. }
  586. LLVM_DUMP_METHOD static auto MakeNamedConstraintId(int id)
  587. -> NamedConstraintId {
  588. return NamedConstraintId(id);
  589. }
  590. LLVM_DUMP_METHOD static auto MakeRequireImplsBlockId(int id)
  591. -> RequireImplsBlockId {
  592. return RequireImplsBlockId(id);
  593. }
  594. LLVM_DUMP_METHOD static auto MakeRequireImplsId(int id) -> RequireImplsId {
  595. return RequireImplsId(id);
  596. }
  597. LLVM_DUMP_METHOD static auto MakeSpecificId(int id) -> SpecificId {
  598. return SpecificId(id);
  599. }
  600. LLVM_DUMP_METHOD static auto MakeSpecificInterfaceId(int id)
  601. -> SpecificInterfaceId {
  602. return SpecificInterfaceId(id);
  603. }
  604. LLVM_DUMP_METHOD static auto MakeStructTypeFieldsId(int id)
  605. -> StructTypeFieldsId {
  606. return StructTypeFieldsId(id);
  607. }
  608. LLVM_DUMP_METHOD static auto MakeTypeId(int id) -> TypeId { return TypeId(id); }
  609. } // namespace Carbon::SemIR
  610. #endif // NDEBUG