inst_kind.def 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  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. //
  5. // This is an X-macro header. It does not use `#include` guards, and instead is
  6. // designed to be `#include`ed after the x-macro is defined in order for its
  7. // inclusion to expand to the desired output. Macro definitions are cleaned up
  8. // at the end of this file.
  9. //
  10. // This macro should be defined before including this header:
  11. // - CARBON_SEM_IR_INST_KIND(Name)
  12. // Invoked for each kind of semantic instruction.
  13. //
  14. // The invocation of the above macro will be wrapped in one macro from each of
  15. // the following sets, which by default expand to their argument:
  16. //
  17. // Whether the instruction can define a type:
  18. // - CARBON_SEM_IR_INST_KIND_TYPE_ALWAYS(...)
  19. // Invoked for each instruction that is always of type `type`, and might
  20. // define a type constant.
  21. // - CARBON_SEM_IR_INST_KIND_TYPE_MAYBE(...)
  22. // Invoked for each instruction that is sometimes of type `type`, and might
  23. // define a type constant.
  24. // - CARBON_SEM_IR_INST_KIND_TYPE_NEVER(...)
  25. // Invoked for each instruction that can never define a type constant. Note
  26. // that such instructions can still have type `type`, but are not the
  27. // canonical definition of any type.
  28. //
  29. // Whether the instruction can define a constant, see `InstConstantKind`:
  30. // - CARBON_SEM_IR_INST_KIND_CONSTANT_NEVER(...)
  31. // Invoked when `constant_kind()` is `InstConstantKind::Never`.
  32. // - CARBON_SEM_IR_INST_KIND_CONSTANT_SYMBOLIC_ONLY(...)
  33. // Invoked when `constant_kind()` is `InstConstantKind::SymbolicOnly`.
  34. // - CARBON_SEM_IR_INST_KIND_CONSTANT_CONDITIONAL(...)
  35. // Invoked when `constant_kind()` is `InstConstantKind::Conditional`.
  36. // - CARBON_SEM_IR_INST_KIND_CONSTANT_ALWAYS(...)
  37. // Invoked when `constant_kind()` is `InstConstantKind::Always`.
  38. //
  39. // Defining these is optional.
  40. #ifndef CARBON_SEM_IR_INST_KIND
  41. #error "Must define the x-macro to use this file."
  42. #endif
  43. #ifndef CARBON_SEM_IR_INST_KIND_TYPE_NEVER
  44. #define CARBON_SEM_IR_INST_KIND_TYPE_NEVER(...) __VA_ARGS__
  45. #endif
  46. #ifndef CARBON_SEM_IR_INST_KIND_TYPE_MAYBE
  47. #define CARBON_SEM_IR_INST_KIND_TYPE_MAYBE(...) __VA_ARGS__
  48. #endif
  49. #ifndef CARBON_SEM_IR_INST_KIND_TYPE_ALWAYS
  50. #define CARBON_SEM_IR_INST_KIND_TYPE_ALWAYS(...) __VA_ARGS__
  51. #endif
  52. #ifndef CARBON_SEM_IR_INST_KIND_CONSTANT_NEVER
  53. #define CARBON_SEM_IR_INST_KIND_CONSTANT_NEVER(...) __VA_ARGS__
  54. #endif
  55. #ifndef CARBON_SEM_IR_INST_KIND_CONSTANT_SYMBOLIC_ONLY
  56. #define CARBON_SEM_IR_INST_KIND_CONSTANT_SYMBOLIC_ONLY(...) __VA_ARGS__
  57. #endif
  58. #ifndef CARBON_SEM_IR_INST_KIND_CONSTANT_CONDITIONAL
  59. #define CARBON_SEM_IR_INST_KIND_CONSTANT_CONDITIONAL(...) __VA_ARGS__
  60. #endif
  61. #ifndef CARBON_SEM_IR_INST_KIND_CONSTANT_ALWAYS
  62. #define CARBON_SEM_IR_INST_KIND_CONSTANT_ALWAYS(...) __VA_ARGS__
  63. #endif
  64. #define CARBON_SEM_IR_INST_KIND_IMPL(Name, IsType, IsConstant) \
  65. CARBON_SEM_IR_INST_KIND_##IsType( \
  66. CARBON_SEM_IR_INST_KIND_##IsConstant(CARBON_SEM_IR_INST_KIND(Name)))
  67. // For each instruction kind declared here there is a matching definition in
  68. // `typed_insts.h`.
  69. CARBON_SEM_IR_INST_KIND_IMPL(AdaptDecl, TYPE_NEVER, CONSTANT_NEVER)
  70. CARBON_SEM_IR_INST_KIND_IMPL(AddrOf, TYPE_NEVER, CONSTANT_CONDITIONAL)
  71. CARBON_SEM_IR_INST_KIND_IMPL(AddrPattern, TYPE_NEVER, CONSTANT_NEVER)
  72. CARBON_SEM_IR_INST_KIND_IMPL(ArrayIndex, TYPE_NEVER, CONSTANT_NEVER)
  73. CARBON_SEM_IR_INST_KIND_IMPL(ArrayInit, TYPE_NEVER, CONSTANT_NEVER)
  74. CARBON_SEM_IR_INST_KIND_IMPL(ArrayType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  75. CARBON_SEM_IR_INST_KIND_IMPL(AsCompatible, TYPE_NEVER, CONSTANT_NEVER)
  76. CARBON_SEM_IR_INST_KIND_IMPL(Assign, TYPE_NEVER, CONSTANT_NEVER)
  77. CARBON_SEM_IR_INST_KIND_IMPL(AssociatedConstantDecl, TYPE_NEVER, CONSTANT_NEVER)
  78. CARBON_SEM_IR_INST_KIND_IMPL(AssociatedEntity, TYPE_NEVER, CONSTANT_ALWAYS)
  79. CARBON_SEM_IR_INST_KIND_IMPL(AssociatedEntityType, TYPE_ALWAYS,
  80. CONSTANT_CONDITIONAL)
  81. CARBON_SEM_IR_INST_KIND_IMPL(BaseDecl, TYPE_NEVER, CONSTANT_ALWAYS)
  82. CARBON_SEM_IR_INST_KIND_IMPL(BindAlias, TYPE_NEVER, CONSTANT_NEVER)
  83. CARBON_SEM_IR_INST_KIND_IMPL(BindName, TYPE_NEVER, CONSTANT_NEVER)
  84. CARBON_SEM_IR_INST_KIND_IMPL(BindSymbolicName, TYPE_MAYBE,
  85. CONSTANT_SYMBOLIC_ONLY)
  86. CARBON_SEM_IR_INST_KIND_IMPL(BindValue, TYPE_NEVER, CONSTANT_NEVER)
  87. CARBON_SEM_IR_INST_KIND_IMPL(BlockArg, TYPE_NEVER, CONSTANT_NEVER)
  88. CARBON_SEM_IR_INST_KIND_IMPL(BoolLiteral, TYPE_NEVER, CONSTANT_ALWAYS)
  89. CARBON_SEM_IR_INST_KIND_IMPL(BoundMethod, TYPE_NEVER, CONSTANT_CONDITIONAL)
  90. CARBON_SEM_IR_INST_KIND_IMPL(Branch, TYPE_NEVER, CONSTANT_NEVER)
  91. CARBON_SEM_IR_INST_KIND_IMPL(BranchIf, TYPE_NEVER, CONSTANT_NEVER)
  92. CARBON_SEM_IR_INST_KIND_IMPL(BranchWithArg, TYPE_NEVER, CONSTANT_NEVER)
  93. CARBON_SEM_IR_INST_KIND_IMPL(Builtin, TYPE_ALWAYS, CONSTANT_ALWAYS)
  94. CARBON_SEM_IR_INST_KIND_IMPL(Call, TYPE_NEVER, CONSTANT_NEVER)
  95. CARBON_SEM_IR_INST_KIND_IMPL(ClassDecl, TYPE_NEVER, CONSTANT_NEVER)
  96. CARBON_SEM_IR_INST_KIND_IMPL(ClassElementAccess, TYPE_NEVER, CONSTANT_NEVER)
  97. CARBON_SEM_IR_INST_KIND_IMPL(ClassInit, TYPE_NEVER, CONSTANT_NEVER)
  98. CARBON_SEM_IR_INST_KIND_IMPL(ClassType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  99. CARBON_SEM_IR_INST_KIND_IMPL(ConstType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  100. CARBON_SEM_IR_INST_KIND_IMPL(Converted, TYPE_NEVER, CONSTANT_NEVER)
  101. CARBON_SEM_IR_INST_KIND_IMPL(Deref, TYPE_NEVER, CONSTANT_NEVER)
  102. CARBON_SEM_IR_INST_KIND_IMPL(FacetTypeAccess, TYPE_NEVER, CONSTANT_NEVER)
  103. CARBON_SEM_IR_INST_KIND_IMPL(FieldDecl, TYPE_NEVER, CONSTANT_ALWAYS)
  104. CARBON_SEM_IR_INST_KIND_IMPL(FloatLiteral, TYPE_NEVER, CONSTANT_ALWAYS)
  105. CARBON_SEM_IR_INST_KIND_IMPL(FloatType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  106. CARBON_SEM_IR_INST_KIND_IMPL(FunctionDecl, TYPE_NEVER, CONSTANT_NEVER)
  107. CARBON_SEM_IR_INST_KIND_IMPL(FunctionType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  108. CARBON_SEM_IR_INST_KIND_IMPL(GenericClassType, TYPE_ALWAYS,
  109. CONSTANT_CONDITIONAL)
  110. CARBON_SEM_IR_INST_KIND_IMPL(ImplDecl, TYPE_NEVER, CONSTANT_NEVER)
  111. CARBON_SEM_IR_INST_KIND_IMPL(ImportRefUnloaded, TYPE_NEVER, CONSTANT_NEVER)
  112. CARBON_SEM_IR_INST_KIND_IMPL(ImportRefLoaded, TYPE_NEVER, CONSTANT_NEVER)
  113. CARBON_SEM_IR_INST_KIND_IMPL(InitializeFrom, TYPE_NEVER, CONSTANT_NEVER)
  114. CARBON_SEM_IR_INST_KIND_IMPL(InterfaceDecl, TYPE_NEVER, CONSTANT_NEVER)
  115. CARBON_SEM_IR_INST_KIND_IMPL(InterfaceType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  116. CARBON_SEM_IR_INST_KIND_IMPL(InterfaceWitness, TYPE_NEVER, CONSTANT_CONDITIONAL)
  117. CARBON_SEM_IR_INST_KIND_IMPL(InterfaceWitnessAccess, TYPE_MAYBE,
  118. CONSTANT_SYMBOLIC_ONLY)
  119. CARBON_SEM_IR_INST_KIND_IMPL(IntLiteral, TYPE_NEVER, CONSTANT_ALWAYS)
  120. CARBON_SEM_IR_INST_KIND_IMPL(IntType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  121. CARBON_SEM_IR_INST_KIND_IMPL(NameRef, TYPE_NEVER, CONSTANT_NEVER)
  122. CARBON_SEM_IR_INST_KIND_IMPL(Namespace, TYPE_NEVER, CONSTANT_ALWAYS)
  123. CARBON_SEM_IR_INST_KIND_IMPL(Param, TYPE_NEVER, CONSTANT_NEVER)
  124. CARBON_SEM_IR_INST_KIND_IMPL(PointerType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  125. CARBON_SEM_IR_INST_KIND_IMPL(RealLiteral, TYPE_NEVER, CONSTANT_ALWAYS)
  126. CARBON_SEM_IR_INST_KIND_IMPL(ReturnExpr, TYPE_NEVER, CONSTANT_NEVER)
  127. CARBON_SEM_IR_INST_KIND_IMPL(Return, TYPE_NEVER, CONSTANT_NEVER)
  128. CARBON_SEM_IR_INST_KIND_IMPL(SpliceBlock, TYPE_NEVER, CONSTANT_NEVER)
  129. CARBON_SEM_IR_INST_KIND_IMPL(StringLiteral, TYPE_NEVER, CONSTANT_ALWAYS)
  130. CARBON_SEM_IR_INST_KIND_IMPL(StructAccess, TYPE_NEVER, CONSTANT_NEVER)
  131. CARBON_SEM_IR_INST_KIND_IMPL(StructInit, TYPE_NEVER, CONSTANT_NEVER)
  132. CARBON_SEM_IR_INST_KIND_IMPL(StructLiteral, TYPE_NEVER, CONSTANT_NEVER)
  133. CARBON_SEM_IR_INST_KIND_IMPL(StructType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  134. CARBON_SEM_IR_INST_KIND_IMPL(StructTypeField, TYPE_NEVER, CONSTANT_CONDITIONAL)
  135. CARBON_SEM_IR_INST_KIND_IMPL(StructValue, TYPE_NEVER, CONSTANT_CONDITIONAL)
  136. CARBON_SEM_IR_INST_KIND_IMPL(TemporaryStorage, TYPE_NEVER, CONSTANT_NEVER)
  137. CARBON_SEM_IR_INST_KIND_IMPL(Temporary, TYPE_NEVER, CONSTANT_NEVER)
  138. CARBON_SEM_IR_INST_KIND_IMPL(TupleAccess, TYPE_NEVER, CONSTANT_NEVER)
  139. CARBON_SEM_IR_INST_KIND_IMPL(TupleIndex, TYPE_NEVER, CONSTANT_NEVER)
  140. CARBON_SEM_IR_INST_KIND_IMPL(TupleInit, TYPE_NEVER, CONSTANT_NEVER)
  141. CARBON_SEM_IR_INST_KIND_IMPL(TupleLiteral, TYPE_NEVER, CONSTANT_NEVER)
  142. CARBON_SEM_IR_INST_KIND_IMPL(TupleType, TYPE_ALWAYS, CONSTANT_CONDITIONAL)
  143. CARBON_SEM_IR_INST_KIND_IMPL(TupleValue, TYPE_NEVER, CONSTANT_CONDITIONAL)
  144. CARBON_SEM_IR_INST_KIND_IMPL(UnaryOperatorNot, TYPE_NEVER, CONSTANT_NEVER)
  145. CARBON_SEM_IR_INST_KIND_IMPL(UnboundElementType, TYPE_ALWAYS,
  146. CONSTANT_CONDITIONAL)
  147. CARBON_SEM_IR_INST_KIND_IMPL(ValueAsRef, TYPE_NEVER, CONSTANT_NEVER)
  148. CARBON_SEM_IR_INST_KIND_IMPL(ValueOfInitializer, TYPE_NEVER, CONSTANT_NEVER)
  149. CARBON_SEM_IR_INST_KIND_IMPL(VarStorage, TYPE_NEVER, CONSTANT_NEVER)
  150. #undef CARBON_SEM_IR_INST_KIND_TYPE_ALWAYS
  151. #undef CARBON_SEM_IR_INST_KIND_TYPE_MAYBE
  152. #undef CARBON_SEM_IR_INST_KIND_TYPE_NEVER
  153. #undef CARBON_SEM_IR_INST_KIND_CONSTANT_NEVER
  154. #undef CARBON_SEM_IR_INST_KIND_CONSTANT_SYMBOLIC_ONLY
  155. #undef CARBON_SEM_IR_INST_KIND_CONSTANT_CONDITIONAL
  156. #undef CARBON_SEM_IR_INST_KIND_CONSTANT_ALWAYS
  157. #undef CARBON_SEM_IR_INST_KIND_IMPL
  158. #undef CARBON_SEM_IR_INST_KIND