/* spc_vm.c — VM launcher for stage 1 */ #include "../stage0/spl_ir.h" #include "../stage0/spl_syscall.h" #include "../stage0/spl_vm.h" #include "spl_comp.h" #include #include int main(int argc, const char **argv) { int argi = 1; if (argi >= argc) { fprintf(stderr, "Usage: spc_vm [entry] [--trace]\n"); return 1; } const char *path = argv[argi++]; /* Parse flags: --entry , --trace */ const char *entry = "main"; int trace = 0; for (int i = argi; i < argc; i += 1) { if (strcmp(argv[i], "--entry") == 0 && i + 1 < argc) { entry = argv[++i]; } else if (strcmp(argv[i], "--trace") == 0) { trace = 1; } } /* Adjust argv so the SPL program sees path as argv[0] and * remaining positional args as argv[1..], just like a native exe. */ int spl_argc = argc - (argi - 1); const char **spl_argv = argv + (argi - 1); spl_prog_t prog; if (spl_prog_load_from_file(path, &prog) != 0) { fprintf(stderr, "spc_vm: cannot load '%s'\n", path); return 1; } spl_syscall_register(&prog); spl_comp_register(&prog); spl_vm_t vm; spl_vm_init(&vm); if (spl_vm_load_prog(&vm, &prog) != 0) { fprintf(stderr, "vm: prog '%s' not found\n", entry); spl_prog_drop(&prog); return 1; } if (spl_vm_prepare(&vm, entry, spl_argc, spl_argv, NULL) != 0) { fprintf(stderr, "vm: entry point '%s' not found\n", entry); spl_prog_drop(&prog); return 1; } spl_vm_set_trace(&vm, trace); int ret = spl_vm_run_until(&vm, 0); spl_vm_drop(&vm); spl_prog_drop(&prog); if (ret < 0) return (int)vm.exit_code; return (int)vm.exit_code; }