178 lines
5.1 KiB
C
178 lines
5.1 KiB
C
#include "spl_ast2ir.h"
|
|
|
|
static spl_type_id_t tid_from_def(const spl_sema_t *sema, spl_def_id_t def) {
|
|
spl_def_node_t *d = spl_type_def(sema->type, def);
|
|
return d ? d->type_id : 0;
|
|
}
|
|
|
|
static spl_ir_node_ref_t transit(spl_ir_builder_t *ir, const spl_sema_t *sema,
|
|
spl_ast_node_ref_t ref) {
|
|
if (ref == 0)
|
|
return 0;
|
|
Assert(sema != NULL);
|
|
spl_ast_node_t *n = spl_ast_node(sema->ast, ref);
|
|
spl_ir_node_ref_t ret = 0;
|
|
Assert(n != NULL);
|
|
|
|
switch (n->kind) {
|
|
case SPL_AST_NONE:
|
|
UNREACHABLE();
|
|
break;
|
|
case SPL_AST_CONTAINER_MEMBERS: {
|
|
vec_for(n->container_members, i) { transit(ir, sema, vec_at(n->container_members, i)); }
|
|
} break;
|
|
case SPL_AST_FN_DECL:
|
|
TODO();
|
|
break;
|
|
case SPL_AST_FN_DEFINE: {
|
|
spl_def_node_t *def = spl_type_def(sema->type, n->resolved_def_id);
|
|
Assert(def != NULL);
|
|
spl_ir_builder_fn_new(ir, n->fn_decl.name, def->type_id);
|
|
vec_for(n->fn_decl.block, i) { transit(ir, sema, vec_at(n->fn_decl.block, i)); }
|
|
} break;
|
|
case SPL_AST_TYPE_DECL:
|
|
TODO();
|
|
break;
|
|
case SPL_AST_VAR_DECL: {
|
|
TODO();
|
|
} break;
|
|
case SPL_AST_CONST_DECL:
|
|
case SPL_AST_MEMBER_DECL:
|
|
TODO();
|
|
break;
|
|
case SPL_AST__COMPTIME_STMT:
|
|
case SPL_AST__DIRECTIVE_BLOCK:
|
|
case SPL_AST_PARAM_DECL:
|
|
break;
|
|
case SPL_AST_ATTR_ITEM:
|
|
case SPL_AST_ARGG_INIT_ITEM:
|
|
case SPL_AST_IF_STATEMENT:
|
|
case SPL_AST_IFVAR_STATEMENT:
|
|
case SPL_AST_WHILE_STATEMENT:
|
|
case SPL_AST_LOOP_STATEMENT:
|
|
case SPL_AST_FOR_STATEMENT:
|
|
case SPL_AST_MATCH_STATEMENT:
|
|
TODO();
|
|
break;
|
|
case SPL_AST_RET_STATEMENT: {
|
|
if (n->ret_statement.expr) {
|
|
ret = transit(ir, sema, n->ret_statement.expr);
|
|
}
|
|
ret = spl_ir_builder_control_ret(ir, n->resolved_type_id, ret);
|
|
} break;
|
|
case SPL_AST_BREAK_STATEMENT:
|
|
case SPL_AST_CONTINUE_STATEMENT:
|
|
case SPL_AST_DEFER_STATEMENT:
|
|
case SPL_AST_TRY_STATEMENT:
|
|
case SPL_AST_CATCH_STATEMENT:
|
|
case SPL_AST_ERRDEFER_STATEMEMT:
|
|
case SPL_AST_EXPR_STATEMENT:
|
|
case SPL_AST_PACKED_EXPR:
|
|
case SPL_AST_ASSIGN_EXPR:
|
|
case SPL_AST_ASSIGN_ADD_EXPR:
|
|
case SPL_AST_ASSIGN_SUB_EXPR:
|
|
case SPL_AST_ASSIGN_MUL_EXPR:
|
|
case SPL_AST_ASSIGN_DIV_EXPR:
|
|
case SPL_AST_ASSIGN_MOD_EXPR:
|
|
case SPL_AST_ASSIGN_AND_EXPR:
|
|
case SPL_AST_ASSIGN_OR_EXPR:
|
|
case SPL_AST_ASSIGN_XOR_EXPR:
|
|
case SPL_AST_ASSIGN_LSHIFT_EXPR:
|
|
case SPL_AST_ASSIGN_USHIFT_EXPR:
|
|
case SPL_AST_BOOL_OR_EXPR:
|
|
case SPL_AST_BOOL_AND_EXPR:
|
|
case SPL_AST_BIT_OR_EXPR:
|
|
case SPL_AST_BIT_XOR_EXPR:
|
|
case SPL_AST_BIT_AND_EXPR:
|
|
case SPL_AST_CMP_EQ_EXPR:
|
|
case SPL_AST_CMP_NE_EXPR:
|
|
case SPL_AST_CMP_LE_EXPR:
|
|
case SPL_AST_CMP_GE_EXPR:
|
|
case SPL_AST_CMP_LT_EXPR:
|
|
case SPL_AST_CMP_GT_EXPR:
|
|
case SPL_AST_RANGE_EXPR:
|
|
case SPL_AST_LSHIFT_EXPR:
|
|
case SPL_AST_RSHIFT_EXPR:
|
|
case SPL_AST_ADD_EXPR:
|
|
case SPL_AST_SUB_EXPR:
|
|
case SPL_AST_MUL_EXPR:
|
|
case SPL_AST_DIV_EXPR:
|
|
case SPL_AST_MOD_EXPR:
|
|
case SPL_AST_MINUS_EXPR:
|
|
case SPL_AST_NOT_EXPR:
|
|
case SPL_AST_BIT_NOT_EXPR:
|
|
case SPL_AST_ADDRESS_EXPR:
|
|
case SPL_AST_CALL_EXPR:
|
|
case SPL_AST_FIELD_EXPR:
|
|
case SPL_AST_DEREF_EXPR:
|
|
case SPL_AST_INDEX_EXPR:
|
|
case SPL_AST_SLICE_EXPR:
|
|
case SPL_AST_AS_EXPR:
|
|
TODO();
|
|
break;
|
|
case SPL_AST_EXPR_INTEGER_LIT: {
|
|
ret = spl_ir_builder_type_const_int(ir, n->resolved_type_id, n->primary_expr.integer_expr);
|
|
break;
|
|
}
|
|
case SPL_AST_EXPR_FLOAT_LIT:
|
|
case SPL_AST_EXPR_CHAR_LIT:
|
|
case SPL_AST_EXPR_STRING_LIT:
|
|
case SPL_AST_EXPR_TRUE:
|
|
case SPL_AST_EXPR_FALSE:
|
|
case SPL_AST_EXPR_NULL:
|
|
case SPL_AST_EXPR_UNDEFINED:
|
|
break;
|
|
case SPL_AST_EXPR_IDENT: {
|
|
} break;
|
|
case SPL_AST_ARGGREGATE_INIT:
|
|
case SPL_AST_EXPR_EXPR:
|
|
case SPL_AST_ARRAY_LIT:
|
|
case SPL_AST_BUILTIN_EXPR:
|
|
case SPL_AST_BLOCK_EXPR:
|
|
case SPL_AST_BASE_TYPE_FN:
|
|
case SPL_AST_BASE_TYPE_PATH:
|
|
TODO();
|
|
break;
|
|
case SPL_AST_TYPE_POINTER:
|
|
case SPL_AST_TYPE_ARRAY:
|
|
case SPL_AST_TYPE_SLICE:
|
|
case SPL_AST_TYPE_STRUCT:
|
|
case SPL_AST_TYPE_UNION:
|
|
case SPL_AST_TYPE_SHAPE:
|
|
case SPL_AST_TYPE_ENUM:
|
|
case SPL_AST_TYPE_VOID:
|
|
case SPL_AST_TYPE_BOOL:
|
|
case SPL_AST_TYPE_OPAQUE:
|
|
case SPL_AST_TYPE_I8:
|
|
case SPL_AST_TYPE_U8:
|
|
case SPL_AST_TYPE_I16:
|
|
case SPL_AST_TYPE_U16:
|
|
case SPL_AST_TYPE_I32:
|
|
case SPL_AST_TYPE_U32:
|
|
case SPL_AST_TYPE_I64:
|
|
case SPL_AST_TYPE_U64:
|
|
case SPL_AST_TYPE_ISIZE:
|
|
case SPL_AST_TYPE_USIZE:
|
|
case SPL_AST_TYPE__F32:
|
|
case SPL_AST_TYPE__F64:
|
|
case SPL_AST_TYPE_ANY:
|
|
case SPL_AST_TYPE_IDENT:
|
|
TODO();
|
|
break;
|
|
case SPL_AST_COUNT:
|
|
UNREACHABLE();
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
void spl_ast2ir_init(spl_ast2ir_t *ast2ir, spl_ir_builder_t *ir, const spl_sema_t *sema) {
|
|
ast2ir->sema = sema;
|
|
ast2ir->ir = ir;
|
|
ast2ir->err_count = 0;
|
|
}
|
|
|
|
void spl_ast2ir_drop(spl_ast2ir_t *ast2ir) {}
|
|
|
|
void spl_ast2ir_run(spl_ast2ir_t *ctx) { transit(ctx->ir, ctx->sema, ctx->sema->ast->root); }
|