From 556aafa5eb681f5500169268d3cdea82a298c2af Mon Sep 17 00:00:00 2001 From: Mel Date: Tue, 19 May 2026 20:47:51 +0200 Subject: Add IR constructors Signed-off-by: Mel --- boot/lower.c | 57 +++++++++------------------------------------------------ 1 file changed, 9 insertions(+), 48 deletions(-) (limited to 'boot/lower.c') diff --git a/boot/lower.c b/boot/lower.c index f3c04d3..fb2d29a 100644 --- a/boot/lower.c +++ b/boot/lower.c @@ -308,10 +308,7 @@ lower_synthesize_structural(struct Lower_Context* ctx, struct Tree_Type* tree_ty type->value.structure.fields = array_new(struct Field, 4); struct Type_Ref inner = lower_intern_type_ref(ctx, tree_type->value.array.element_type); - struct Type_Ref data_ref = { - .type_id = inner.type_id, - .mods = array_new(enum Type_Modifier, 4), - }; + struct Type_Ref data_ref = type_ref_bare(inner.type_id); FOR_EACH_ARRAY (enum Type_Modifier, m, &inner.mods) array_push(&data_ref.mods, m); enum Type_Modifier ptr = TYPE_MOD_REFERENCE; array_push(&data_ref.mods, &ptr); @@ -403,10 +400,7 @@ lower_synthesize_structural(struct Lower_Context* ctx, struct Tree_Type* tree_ty struct Type_Ref lower_intern_type_ref(struct Lower_Context* ctx, struct Tree_Type* tree_type) { - struct Type_Ref ref = { - .type_id = ctx->unit->types.primitive_void_id, - .mods = array_new(enum Type_Modifier, 4), - }; + struct Type_Ref ref = type_ref_bare(ctx->unit->types.primitive_void_id); if (!tree_type || tree_type->type == TREE_TYPE_NONE) return ref; @@ -726,38 +720,6 @@ lower_pass_1(struct Lower_Context* ctx, struct Tree* tree) struct Block* lower_block(struct Lower_Context* ctx, struct Tree_Block* tree_block); struct Statement* lower_statement(struct Lower_Context* ctx, struct Tree_Statement* tree_stmt); -// small helpers used when synthesizing nodes when de-sugaring source. - -struct Expression* -lower_make_name_expression(struct String name, struct Span span) -{ - union Expression_Value v = { 0 }; - v.name.name = name; - - return expression_new(EXPRESSION_NAME, v, span); -} - -struct Expression* -lower_make_integer_literal_expression(int64 value, struct Span span) -{ - union Expression_Value v = { 0 }; - v.integer_literal.value = value; - - return expression_new(EXPRESSION_INTEGER_LITERAL, v, span); -} - -struct Expression* -lower_make_binary_expression( - enum Binary_Operation op, struct Expression* left, struct Expression* right, struct Span span) -{ - union Expression_Value v = { 0 }; - v.binary_operator.operation = op; - v.binary_operator.left_operand = left; - v.binary_operator.right_operand = right; - - return expression_new(EXPRESSION_BINARY_OPERATION, v, span); -} - // turns a source expression into the lowered form. struct Expression* lower_expression(struct Lower_Context* ctx, struct Tree_Expression* tree_expr) @@ -911,7 +873,7 @@ lower_expression(struct Lower_Context* ctx, struct Tree_Expression* tree_expr) fn->synthetic = true; lower_fill_function_signature(ctx, fn, tree_expr); - return lower_make_name_expression(name, tree_expr->span); + return ir_make_name(name, tree_expr->span); } case TREE_EXPRESSION_SUBSCRIPT: case TREE_EXPRESSION_MEMBER: @@ -1219,21 +1181,20 @@ lower_statement(struct Lower_Context* ctx, struct Tree_Statement* tree_stmt) // we synthesize the right condition and step. if (loop->style == TREE_STATEMENT_LOOP_STYLE_FOR_EACH) { struct Tree_Expression* hi = decl->initializer->value.binary_operator.right_operand; - struct Expression* lhs = lower_make_name_expression(name, tree_stmt->span); + struct Expression* lhs = ir_make_name(name, tree_stmt->span); struct Expression* rhs = lower_expression(ctx, hi); synth_cond = nil; // unused; we go straight to the ir form (void)synth_cond; struct Expression* cond_expr = - lower_make_binary_expression(BINARY_LESS_THAN, lhs, rhs, tree_stmt->span); + ir_make_binary(BINARY_LESS_THAN, lhs, rhs, tree_stmt->span); // step: x = x + 1 - struct Expression* iter_lhs = lower_make_name_expression(name, tree_stmt->span); - struct Expression* iter_rhs_left = - lower_make_name_expression(name, tree_stmt->span); - struct Expression* one = lower_make_integer_literal_expression(1, tree_stmt->span); + struct Expression* iter_lhs = ir_make_name(name, tree_stmt->span); + struct Expression* iter_rhs_left = ir_make_name(name, tree_stmt->span); + struct Expression* one = ir_make_integer(1, tree_stmt->span); struct Expression* iter_rhs = - lower_make_binary_expression(BINARY_PLUS, iter_rhs_left, one, tree_stmt->span); + ir_make_binary(BINARY_PLUS, iter_rhs_left, one, tree_stmt->span); union Statement_Value iter_v = { 0 }; iter_v.assign.lhs = iter_lhs; iter_v.assign.rhs = iter_rhs; -- cgit 1.4.1