From 03e76d487df4f62fb92d62aaaf443a6540cc6c09 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 28 Jul 2020 17:14:19 -0500 Subject: [PATCH] small updates; removing onyxir --- docs/plan | 4 +- include/onyxir.h | 58 ------------- include/onyxwasm.h | 1 - onyx | Bin 343368 -> 343360 bytes progs/intrinsics.onyx | 2 + src/onyxir.c | 190 ------------------------------------------ 6 files changed, 4 insertions(+), 251 deletions(-) delete mode 100644 include/onyxir.h delete mode 100644 src/onyxir.c diff --git a/docs/plan b/docs/plan index b3b3a5b7..5da7f559 100644 --- a/docs/plan +++ b/docs/plan @@ -130,13 +130,13 @@ HOW: bar(member2_of_data); } + [X] Procedures as arguments + [ ] Start work on evaluating compile time known values. - An expression marked COMPTIME will be reduced to its value in the parse tree. [ ] Switch statements - [ ] Procedures as arguments - diff --git a/include/onyxir.h b/include/onyxir.h deleted file mode 100644 index 5a506da1..00000000 --- a/include/onyxir.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef ONYXIR_H -#define ONYXIR_H - -#include "bh.h" -#include "onyxastnodes.h" -#include "onyxtypes.h" -#include "onyxmsgs.h" - -typedef struct IrFunction { - AstFunction* ast_func; - Type* type; - bh_arr(AstLocal *) locals; - AstLocal* first_param; - AstNode* body; - - // NOTE: A function can either be either be: - // Normal - // Intrinsic - // Exported - // Foreign - union { - // NOTE: Set if the function is exported - char* exported_name; - - // NOTE: Set if the function is a foreign - struct { - char* foreign_module; - char* foreign_name; - }; - - // NOTE: Set if the function is intrinsic - OnyxIntrinsic intrinsic; - }; - - u32 is_exported : 1; - u32 is_foreign : 1; - u32 is_intrinsic : 1; - -} IrFunction; - -typedef struct IrContext { - // NOTE: Properties used after ir generation is done - bh_allocator allocator; - - bh_arr(IrFunction *) functions; - - // NOTE: Properties used while ir is generating - IrFunction* curr_function; - - OnyxMessages* msgs; -} IrContext; - - -IrContext ir_context_create(bh_allocator allocator); -void ir_context_free(IrContext* context); -void ir_generate(IrContext* context, ProgramInfo parse_output); - -#endif // #ifndef ONYXIR_H diff --git a/include/onyxwasm.h b/include/onyxwasm.h index c8e4831e..6be722bd 100644 --- a/include/onyxwasm.h +++ b/include/onyxwasm.h @@ -5,7 +5,6 @@ #include "onyxastnodes.h" #include "onyxmsgs.h" -#include "onyxir.h" typedef u8 WasmType; diff --git a/onyx b/onyx index aa0c500c5c352a22e519fb53040b201c67f25efe..4aefaecbf229c99399ff5e4553c603684a32ed2e 100755 GIT binary patch delta 7854 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 delta 7895 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 P6X&d^-Oh(QI#d4(390g2 diff --git a/progs/intrinsics.onyx b/progs/intrinsics.onyx index cb4fce4d..cf4364dc 100644 --- a/progs/intrinsics.onyx +++ b/progs/intrinsics.onyx @@ -1,3 +1,5 @@ +package intrinsics + memory_size :: proc #intrinsic -> i32 --- memory_grow :: proc #intrinsic (val: i32) -> i32 --- diff --git a/src/onyxir.c b/src/onyxir.c deleted file mode 100644 index e326eed7..00000000 --- a/src/onyxir.c +++ /dev/null @@ -1,190 +0,0 @@ -#include "onyxir.h" - -#define IR_FUNC(kind, ...) static void ir_ ## kind (IrContext* c, __VA_ARGS__) - -IR_FUNC(function, AstFunction* ast_func); -IR_FUNC(function_body, AstFunction* fd); -IR_FUNC(block, AstBlock* block); -IR_FUNC(statement, AstNode* stmt); -IR_FUNC(assign_lval, AstTyped* lval); -IR_FUNC(assignment, AstAssign* assign); -IR_FUNC(if, AstIf* if_node); -IR_FUNC(while, AstWhile* while_node); -IR_FUNC(binop, AstBinaryOp* binop); -IR_FUNC(unaryop, AstUnaryOp* unop); -IR_FUNC(call, AstCall* call); -IR_FUNC(intrinsic_call, AstIntrinsicCall* call); -IR_FUNC(expression, AstTyped* expr); -IR_FUNC(cast, AstUnaryOp* cast); -IR_FUNC(return, AstReturn* ret); - -static OnyxIntrinsic intrinsic_lookup(char* name) { - if (!strcmp("memory_size", name)) return ONYX_INTRINSIC_MEMORY_SIZE; - else if (!strcmp("memory_grow", name)) return ONYX_INTRINSIC_MEMORY_GROW; - - else if (!strcmp("clz_i32", name)) return ONYX_INTRINSIC_I32_CLZ; - else if (!strcmp("ctz_i32", name)) return ONYX_INTRINSIC_I32_CTZ; - else if (!strcmp("popcnt_i32", name)) return ONYX_INTRINSIC_I32_POPCNT; - else if (!strcmp("and_i32", name)) return ONYX_INTRINSIC_I32_AND; - else if (!strcmp("or_i32", name)) return ONYX_INTRINSIC_I32_OR; - else if (!strcmp("xor_i32", name)) return ONYX_INTRINSIC_I32_XOR; - else if (!strcmp("shl_i32", name)) return ONYX_INTRINSIC_I32_SHL; - else if (!strcmp("slr_i32", name)) return ONYX_INTRINSIC_I32_SLR; - else if (!strcmp("sar_i32", name)) return ONYX_INTRINSIC_I32_SAR; - else if (!strcmp("rotl_i32", name)) return ONYX_INTRINSIC_I32_ROTL; - else if (!strcmp("rotr_i32", name)) return ONYX_INTRINSIC_I32_ROTR; - - else if (!strcmp("clz_i64", name)) return ONYX_INTRINSIC_I64_CLZ; - else if (!strcmp("ctz_i64", name)) return ONYX_INTRINSIC_I64_CTZ; - else if (!strcmp("popcnt_i64", name)) return ONYX_INTRINSIC_I64_POPCNT; - else if (!strcmp("and_i64", name)) return ONYX_INTRINSIC_I64_AND; - else if (!strcmp("or_i64", name)) return ONYX_INTRINSIC_I64_OR; - else if (!strcmp("xor_i64", name)) return ONYX_INTRINSIC_I64_XOR; - else if (!strcmp("shl_i64", name)) return ONYX_INTRINSIC_I64_SHL; - else if (!strcmp("slr_i64", name)) return ONYX_INTRINSIC_I64_SLR; - else if (!strcmp("sar_i64", name)) return ONYX_INTRINSIC_I64_SAR; - else if (!strcmp("rotl_i64", name)) return ONYX_INTRINSIC_I64_ROTL; - else if (!strcmp("rotr_i64", name)) return ONYX_INTRINSIC_I64_ROTR; - - else if (!strcmp("abs_f32", name)) return ONYX_INTRINSIC_F32_ABS; - else if (!strcmp("ceil_f32", name)) return ONYX_INTRINSIC_F32_CEIL; - else if (!strcmp("floor_f32", name)) return ONYX_INTRINSIC_F32_FLOOR; - else if (!strcmp("trunc_f32", name)) return ONYX_INTRINSIC_F32_TRUNC; - else if (!strcmp("nearest_f32", name)) return ONYX_INTRINSIC_F32_NEAREST; - else if (!strcmp("sqrt_f32", name)) return ONYX_INTRINSIC_F32_SQRT; - else if (!strcmp("min_f32", name)) return ONYX_INTRINSIC_F32_MIN; - else if (!strcmp("max_f32", name)) return ONYX_INTRINSIC_F32_MAX; - else if (!strcmp("copysign_f32", name)) return ONYX_INTRINSIC_F32_COPYSIGN; - - else if (!strcmp("abs_f64", name)) return ONYX_INTRINSIC_F64_ABS; - else if (!strcmp("ceil_f64", name)) return ONYX_INTRINSIC_F64_CEIL; - else if (!strcmp("floor_f64", name)) return ONYX_INTRINSIC_F64_FLOOR; - else if (!strcmp("trunc_f64", name)) return ONYX_INTRINSIC_F64_TRUNC; - else if (!strcmp("nearest_f64", name)) return ONYX_INTRINSIC_F64_NEAREST; - else if (!strcmp("sqrt_f64", name)) return ONYX_INTRINSIC_F64_SQRT; - else if (!strcmp("min_f64", name)) return ONYX_INTRINSIC_F64_MIN; - else if (!strcmp("max_f64", name)) return ONYX_INTRINSIC_F64_MAX; - else if (!strcmp("copysign_f64", name)) return ONYX_INTRINSIC_F64_COPYSIGN; - else return ONYX_INTRINSIC_UNDEFINED; -} - -static void ir_add_local(IrContext* c, AstLocal* local) { - bh_arr_push(c->curr_function->locals, local); -} - -IR_FUNC(ir_function, AstFunction* ast_func) { - IrFunction* func = bh_alloc_item(c->allocator, IrFunction); - - func->ast_func = ast_func; - func->body = ast_func->body->body; - func->first_param = ast_func->params; - - // NOTE: This is actually the return type (for now) - func->type = ast_func->base.type; - - func->locals = NULL; - bh_arr_new(c->allocator, func->locals, 4); - - func->is_exported = (ast_func->base.flags & Ast_Flag_Exported) != 0; - func->is_foreign = (ast_func->base.flags & Ast_Flag_Foreign) != 0; - func->is_intrinsic = (ast_func->base.flags & Ast_Flag_Intrinsic) != 0; - - if (func->is_intrinsic) { - token_toggle_end(ast_func->base.token); - func->intrinsic = intrinsic_lookup(ast_func->base.token->text); - token_toggle_end(ast_func->base.token); - } - - else if (func->is_exported) { - token_toggle_end(ast_func->base.token); - func->exported_name = bh_aprintf(c->allocator, "%s", ast_func->base.token->text); - token_toggle_end(ast_func->base.token); - } - - else if (func->is_foreign) { - token_toggle_end(ast_func->foreign_module); - func->foreign_module = bh_aprintf(c->allocator, "%s", ast_func->foreign_module); - token_toggle_end(ast_func->foreign_module); - - token_toggle_end(ast_func->foreign_name); - func->foreign_module = bh_aprintf(c->allocator, "%s", ast_func->foreign_name); - token_toggle_end(ast_func->foreign_name); - } - - if (func->body != NULL) { - c->curr_function = func; - } -} - -IR_FUNC(function_body, AstFunction* fd) { - if (fd->body == NULL) return; - ir_block(c, fd->body); -} - -IR_FUNC(block, AstBlock* block) { - forll (AstLocal, local, block->locals->last_local, prev_local) { - ir_add_local(c, local); - } - - forll (AstNode, stmt, block->body, next) { - ir_statement(c, stmt); - } -} - -IR_FUNC(statement, AstNode* stmt) { - switch (stmt->kind) { - case Ast_Kind_Return: return ir_return(c, (AstReturn *) stmt); - case Ast_Kind_Assignment: return ir_assignment(c, (AstAssign *) stmt); - case Ast_Kind_If: return ir_if(c, (AstIf *) stmt); - case Ast_Kind_While: return ir_while(c, (AstWhile *) stmt); - case Ast_Kind_Block: return ir_block(c, (AstBlock *) stmt); - - default: break; - } -} - -IR_FUNC(if, AstIf* if_node) { - if (if_node->true_block.as_if->base.kind == Ast_Kind_Block) { - ir_block(c, if_node->true_block.as_block); - } - - if (if_node->false_block.as_if->base.kind == Ast_Kind_Block) { - ir_block(c, if_node->false_block.as_block); - } -} - -IR_FUNC(while, AstWhile* while_node) { - ir_block(c, while_node->body); -} - -// NOTE: Currently, these functions don't have anything to -// do so they are empty and not called. When I have a reason -// to use them, I will populate their bodies -IR_FUNC(assign_lval, AstTyped* lval) {} -IR_FUNC(assignment, AstAssign* assign) {} -IR_FUNC(binop, AstBinaryOp* binop) {} -IR_FUNC(unaryop, AstUnaryOp* unop) {} -IR_FUNC(expression, AstTyped* expr) {} -IR_FUNC(cast, AstUnaryOp* cast) {} -IR_FUNC(return, AstReturn* ret) {} - -IrContext ir_context_create(bh_allocator allocator) { - IrContext context = { - .allocator = allocator, - .functions = NULL, - - .curr_function = NULL, - }; - - bh_arr_new(allocator, context.functions, 4); - - return context; -} - -void ir_context_free(IrContext* context) { - bh_arr_free(context.functions); -} - -void ir_generate(IrContext* context, ParserOutput parse_output) { - -} -- 2.25.1