Change the builtin enum approach to enforce addition. (#2584)

It feels like every time I add a builtin, I forget to add it to the builtin IR. This approach enforces the addition of builtin nodes, and also takes advantage of the normalized structure to set types appropriately (I think the new approach is simpler on this aspect).
This commit is contained in:
Jon Ross-Perkins
2023-02-08 14:17:26 -08:00
committed by GitHub
parent 4fa71e32f5
commit b2c60b4f53
5 changed files with 51 additions and 37 deletions
+9 -23
View File
@@ -14,33 +14,19 @@ namespace Carbon {
auto SemanticsIR::MakeBuiltinIR() -> SemanticsIR {
SemanticsIR semantics(/*builtin_ir=*/nullptr);
auto block_id = semantics.AddNodeBlock();
semantics.nodes_.reserve(SemanticsBuiltinKind::ValidCount);
constexpr int32_t TypeOfTypeType = 0;
auto type_type = semantics.AddNode(
block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::TypeType,
SemanticsNodeId(TypeOfTypeType)));
CARBON_CHECK(type_type.index == TypeOfTypeType)
<< "TypeType's type must be self-referential.";
#define CARBON_SEMANTICS_BUILTIN_KIND(Name, Type) \
semantics.nodes_.push_back(SemanticsNode::MakeBuiltin( \
SemanticsBuiltinKind::Name, SemanticsNodeId::Builtin##Type));
#include "toolchain/semantics/semantics_builtin_kind.def"
constexpr int32_t TypeOfInvalidType = 1;
auto invalid_type = semantics.AddNode(
block_id, SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::InvalidType,
SemanticsNodeId(TypeOfInvalidType)));
CARBON_CHECK(invalid_type.index == TypeOfInvalidType)
<< "InvalidType's type must be self-referential.";
semantics.AddNode(
block_id,
SemanticsNode::MakeBuiltin(SemanticsBuiltinKind::IntegerType, type_type));
semantics.AddNode(block_id, SemanticsNode::MakeBuiltin(
SemanticsBuiltinKind::RealType, type_type));
CARBON_CHECK(semantics.node_blocks_.size() == 2)
<< "BuildBuiltins should produce 2 blocks, actual: "
CARBON_CHECK(semantics.node_blocks_.size() == 1)
<< "BuildBuiltins should only have the empty block, actual: "
<< semantics.node_blocks_.size();
CARBON_CHECK(semantics.nodes_.size() == SemanticsBuiltinKind::ValidCount)
<< "BuildBuiltins should produce " << SemanticsBuiltinKind::ValidCount
<< " nodes, actual: " << semantics.nodes_.size();
return semantics;
}