From 789ebeb7d097d2824ff62c73438af4cb77f882bc Mon Sep 17 00:00:00 2001 From: Mistivia Date: Fri, 15 Nov 2024 21:22:20 +0800 Subject: finish project framework --- .gitignore | 5 +++++ Makefile | 4 +++- compile_commands.json | 43 +++++++++++++++++++++++++++++++++++++++++++ scripts/runall.sh | 9 +++++++++ src/fvm.c | 3 +++ src/fvm.h | 2 ++ src/main.c | 5 +++++ tests/test_opcodes.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 compile_commands.json create mode 100755 scripts/runall.sh create mode 100644 src/main.c create mode 100644 tests/test_opcodes.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8bc6794 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +foo +*.o +*.d +*.bin +.cache diff --git a/Makefile b/Makefile index 4095f31..1a79f46 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -target = foo +target = fvm cflags = -g ldflags = -lm cc = gcc @@ -10,6 +10,8 @@ tests_bin=$(tests:.c=.bin) all: $(target) +full: all $(tests_bin) + $(target): $(obj) src/main.o $(cc) $(cflags) $(ldflags) -o $@ $^ diff --git a/compile_commands.json b/compile_commands.json new file mode 100644 index 0000000..5702bfd --- /dev/null +++ b/compile_commands.json @@ -0,0 +1,43 @@ +[ + { + "arguments": [ + "/usr/bin/gcc", + "-c", + "-g", + "-o", + "src/fvm.o", + "src/fvm.c" + ], + "directory": "/home/mistivia/repos/fvm", + "file": "/home/mistivia/repos/fvm/src/fvm.c", + "output": "/home/mistivia/repos/fvm/src/fvm.o" + }, + { + "arguments": [ + "/usr/bin/gcc", + "-c", + "-g", + "-o", + "src/main.o", + "src/main.c" + ], + "directory": "/home/mistivia/repos/fvm", + "file": "/home/mistivia/repos/fvm/src/main.c", + "output": "/home/mistivia/repos/fvm/src/main.o" + }, + { + "arguments": [ + "/usr/bin/gcc", + "-c", + "-Isrc/", + "-g", + "src/fvm.o", + "-o", + "tests/test_opcodes.bin", + "tests/test_opcodes.c" + ], + "directory": "/home/mistivia/repos/fvm", + "file": "/home/mistivia/repos/fvm/tests/test_opcodes.c", + "output": "/home/mistivia/repos/fvm/tests/test_opcodes.bin" + } +] diff --git a/scripts/runall.sh b/scripts/runall.sh new file mode 100755 index 0000000..3fdc745 --- /dev/null +++ b/scripts/runall.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +for var in "$@"; do + ./$var + if [ $? -ne 0 ]; then + exit 255 + fi +done + diff --git a/src/fvm.c b/src/fvm.c index 3f1e3fb..858bd4a 100644 --- a/src/fvm.c +++ b/src/fvm.c @@ -409,6 +409,9 @@ int fvm_execute(struct fvm *vm) { fvm_pushf(vm, (fvm_float_t)x); vm->pc++; break; + case FVM_OP_EXIT: + a = fvm_pop(vm); + return a; default: fprintf(stderr, "unknown opcode.\n"); break; diff --git a/src/fvm.h b/src/fvm.h index 40c71e2..bfa5888 100644 --- a/src/fvm.h +++ b/src/fvm.h @@ -90,6 +90,8 @@ enum fvm_op { FVM_OP_FTI, FVM_OP_ITF, + + FVM_OP_EXIT, }; int fvm_init(struct fvm *vm, void *code, int64_t stack_size); diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..62742b5 --- /dev/null +++ b/src/main.c @@ -0,0 +1,5 @@ +#include "fvm.h" + +int main() { + return 0; +} diff --git a/tests/test_opcodes.c b/tests/test_opcodes.c new file mode 100644 index 0000000..27bfbf3 --- /dev/null +++ b/tests/test_opcodes.c @@ -0,0 +1,45 @@ +#include +#include + +#include "fvm.h" + +char code[4096]; +char stack[4096]; +int code_cursor = 0; +struct fvm vm; + +static void reset() { + vm.pc = (int64_t)code; + vm.sp = (int64_t)stack + 4095; + vm.bp = (int64_t)stack + 4095; + code_cursor = 0; +} + +static void emit_op(enum fvm_op op) { + code[code_cursor] = (char)op; + code_cursor++; +} +static void emit_num(int64_t x) { + *(int64_t*)(code + code_cursor) = x; + code_cursor += 8; +} + +void test_imm() { + printf("[TEST] imm\n"); + + reset(); + + emit_op(FVM_OP_IMM); + emit_num(3); + emit_op(FVM_OP_EXIT); + + assert(fvm_execute(&vm) == 3); + + printf("[PASS] imm\n"); +} + +int main() +{ + test_imm(); + return 0; +} -- cgit v1.0