diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-11 03:06:22 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-11 03:06:22 +0900 |
| commit | 47d43f5a583dc2d474e553afe0cb682d878231b1 (patch) | |
| tree | e4de770f9960a117feef631caec7d208c8a1796b /src/codegen_wasm.c | |
| parent | f64ab73b841377f044e727ee1d9e0bcf55c6b626 (diff) | |
| download | ducc-47d43f5a583dc2d474e553afe0cb682d878231b1.tar.gz ducc-47d43f5a583dc2d474e553afe0cb682d878231b1.tar.zst ducc-47d43f5a583dc2d474e553afe0cb682d878231b1.zip | |
Revert "feat: minimal wasm backend"
This reverts commit f64ab73b841377f044e727ee1d9e0bcf55c6b626.
Diffstat (limited to 'src/codegen_wasm.c')
| -rw-r--r-- | src/codegen_wasm.c | 119 |
1 files changed, 0 insertions, 119 deletions
diff --git a/src/codegen_wasm.c b/src/codegen_wasm.c deleted file mode 100644 index 1072b67..0000000 --- a/src/codegen_wasm.c +++ /dev/null @@ -1,119 +0,0 @@ -#include <stdlib.h> -#include <string.h> -#include "codegen.h" -#include "common.h" -#include "preprocess.h" - -typedef enum { - GenMode_lval, - GenMode_rval, -} GenMode; - -typedef struct { - FILE* out; - int next_label; - int* loop_labels; - AstNode* current_func; - int switch_label; -} CodeGen; - -static CodeGen* codegen_new(FILE* out) { - CodeGen* g = calloc(1, sizeof(CodeGen)); - g->out = out; - g->next_label = 1; - g->loop_labels = calloc(1024, sizeof(int)); - g->switch_label = -1; - return g; -} - -static void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode); -static void codegen_stmt(CodeGen* g, AstNode* ast); - -static void codegen_func_prologue(CodeGen* g, AstNode* ast) { - for (int i = 0; i < ast->node_params->node_len; ++i) { - fprintf(g->out, " (param $l_%s i32)", ast->node_params->node_items[i].name); - } - fprintf(g->out, " (result i32)\n"); -} - -static void codegen_func_epilogue(CodeGen* g, AstNode* ast) { -} - -static void codegen_binary_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) { - codegen_expr(g, ast->node_lhs, gen_mode); - codegen_expr(g, ast->node_rhs, gen_mode); - if (ast->node_op == TokenKind_plus) { - fprintf(g->out, "i32.add\n"); - } else { - unreachable(); - } -} - -static void codegen_lvar(CodeGen* g, AstNode* ast, GenMode gen_mode) { - fprintf(g->out, " local.get $l_%s\n", ast->name); -} - -static void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) { - if (ast->kind == AstNodeKind_binary_expr) { - codegen_binary_expr(g, ast, gen_mode); - } else if (ast->kind == AstNodeKind_lvar) { - codegen_lvar(g, ast, gen_mode); - } else { - unreachable(); - } -} - -static void codegen_return_stmt(CodeGen* g, AstNode* ast) { - if (ast->node_expr) { - codegen_expr(g, ast->node_expr, GenMode_rval); - } - codegen_func_epilogue(g, ast); -} - -static void codegen_nop(CodeGen* g, AstNode* ast) { -} - -static void codegen_block_stmt(CodeGen* g, AstNode* ast) { - for (int i = 0; i < ast->node_len; ++i) { - AstNode* stmt = ast->node_items + i; - codegen_stmt(g, stmt); - } -} - -static void codegen_stmt(CodeGen* g, AstNode* ast) { - if (ast->kind == AstNodeKind_list) { - codegen_block_stmt(g, ast); - } else if (ast->kind == AstNodeKind_return_stmt) { - codegen_return_stmt(g, ast); - } else if (ast->kind == AstNodeKind_nop) { - codegen_nop(g, ast); - } else { - unreachable(); - } -} - -static void codegen_func(CodeGen* g, AstNode* ast) { - g->current_func = ast; - - fprintf(g->out, "(func (export \"%s\") \n", ast->name); - - codegen_func_prologue(g, ast); - codegen_stmt(g, ast->node_body); - codegen_func_epilogue(g, ast); - - fprintf(g->out, ")\n"); - g->current_func = NULL; -} - -void codegen_wasm(Program* prog, FILE* out) { - CodeGen* g = codegen_new(out); - - fprintf(g->out, "(module\n"); - - for (int i = 0; i < prog->funcs->node_len; ++i) { - AstNode* func = prog->funcs->node_items + i; - codegen_func(g, func); - } - - fprintf(g->out, ")\n"); -} |
