From 47d43f5a583dc2d474e553afe0cb682d878231b1 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Thu, 11 Dec 2025 03:06:22 +0900 Subject: Revert "feat: minimal wasm backend" This reverts commit f64ab73b841377f044e727ee1d9e0bcf55c6b626. --- Makefile | 1 - flake.nix | 1 - src/cli.c | 6 +-- src/cli.h | 1 - src/codegen_wasm.c | 119 ----------------------------------------------------- src/codegen_wasm.h | 8 ---- src/main.c | 11 +---- tests/wasm.sh | 25 ----------- 8 files changed, 2 insertions(+), 170 deletions(-) delete mode 100644 src/codegen_wasm.c delete mode 100644 src/codegen_wasm.h delete mode 100644 tests/wasm.sh diff --git a/Makefile b/Makefile index 514eef9..6709299 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,6 @@ OBJECTS := \ $(BUILD_DIR)/ast.o \ $(BUILD_DIR)/cli.o \ $(BUILD_DIR)/codegen.o \ - $(BUILD_DIR)/codegen_wasm.o \ $(BUILD_DIR)/common.o \ $(BUILD_DIR)/fs.o \ $(BUILD_DIR)/io.o \ diff --git a/flake.nix b/flake.nix index 689cd59..82e041b 100644 --- a/flake.nix +++ b/flake.nix @@ -49,7 +49,6 @@ devShells.default = pkgs.mkShell { packages = [ pkgs.just - pkgs.wabt ]; # Disable some kinds of hardening to disable GCC optimization. # cf. https://nixos.wiki/wiki/C#Hardening_flags diff --git a/src/cli.c b/src/cli.c index e6ae89f..5448d3f 100644 --- a/src/cli.c +++ b/src/cli.c @@ -14,7 +14,6 @@ CliArgs* parse_cli_args(int argc, char** argv) { int positional_arguments_start = -1; bool opt_c = false; bool opt_E = false; - bool opt_wasm = false; bool opt_MMD = false; StrArray include_dirs; strings_init(&include_dirs); @@ -63,8 +62,6 @@ CliArgs* parse_cli_args(int argc, char** argv) { exit(0); } else if (strcmp(argv[i], "--std=gnu23") == 0) { // ignore --std=gnu23 - } else if (strcmp(argv[i], "--wasm") == 0) { - opt_wasm = true; } else { fatal_error("unknown option: %s", argv[i]); } @@ -76,11 +73,10 @@ CliArgs* parse_cli_args(int argc, char** argv) { CliArgs* a = calloc(1, sizeof(CliArgs)); a->input_filename = argv[positional_arguments_start]; a->output_filename = output_filename; - a->output_assembly = !output_filename || str_ends_with(output_filename, ".s") || opt_wasm; + a->output_assembly = !output_filename || str_ends_with(output_filename, ".s"); a->only_compile = opt_c; a->preprocess_only = opt_E; a->totally_deligate_to_gcc = false; - a->wasm = opt_wasm; a->gcc_command = NULL; a->generate_deps = opt_MMD; a->include_dirs = include_dirs; diff --git a/src/cli.h b/src/cli.h index d97874c..f52964c 100644 --- a/src/cli.h +++ b/src/cli.h @@ -11,7 +11,6 @@ typedef struct { bool preprocess_only; bool generate_deps; bool totally_deligate_to_gcc; - bool wasm; const char* gcc_command; StrArray include_dirs; } CliArgs; 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 -#include -#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"); -} diff --git a/src/codegen_wasm.h b/src/codegen_wasm.h deleted file mode 100644 index 1089154..0000000 --- a/src/codegen_wasm.h +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef DUCC_CODEGEN_WASM_H -#define DUCC_CODEGEN_WASM_H - -#include "ast.h" - -void codegen_wasm(Program* prog, FILE* out); - -#endif diff --git a/src/main.c b/src/main.c index e8e1030..92066cf 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,6 @@ #include "ast.h" #include "cli.h" #include "codegen.h" -#include "codegen_wasm.h" #include "common.h" #include "fs.h" #include "io.h" @@ -45,17 +44,9 @@ int main(int argc, char** argv) { assembly_filename = temp_filename; } FILE* assembly_file = assembly_filename ? fopen(assembly_filename, "wb") : stdout; - if (cli_args->wasm) { - codegen_wasm(prog, assembly_file); - } else { - codegen(prog, assembly_file); - } + codegen(prog, assembly_file); fclose(assembly_file); - if (cli_args->wasm) { - return 0; - } - if (!cli_args->output_assembly) { char cmd_buf[256]; if (cli_args->only_compile) { diff --git a/tests/wasm.sh b/tests/wasm.sh deleted file mode 100644 index d024989..0000000 --- a/tests/wasm.sh +++ /dev/null @@ -1,25 +0,0 @@ -cat > main.c <<'EOF' -int add(int a, int b) { - return a + b; -} -EOF - -"$ducc" "${CFLAGS:-}" --wasm -o main.wat main.c - -wat2wasm main.wat -o main.wasm - -cat > main.mjs <<'EOF' -import { readFile } from 'fs/promises'; - -const wasmBuffer = await readFile('./main.wasm'); -const { instance } = await WebAssembly.instantiate(wasmBuffer); - -console.log(instance.exports.add(3, 5)); -EOF -node main.mjs > output - -cat > expected <<'EOF' -8 -EOF - -diff -u expected output -- cgit v1.2.3-70-g09d2