/* spl_cli.c — SIR VM launcher * * Loads a compiled .sir binary and runs it via the SIR VM. * Built-in syscalls are auto-registered via spl_syscall_register(). * * Usage: * spl_cli [-d] [entry_point] */ #include "spl_mcode.h" #include "spl_syscall.h" #include "spl_vm.h" #include #include int main(int argc, const char **argv) { int debug_mode = 0; int arg_idx = 1; if (argc >= 2 && strcmp(argv[1], "-d") == 0) { debug_mode = 1; arg_idx = 2; } if (arg_idx >= argc) { fprintf(stderr, "Usage: spl_cli [-d] [entry_point]\n"); return 1; } const char *path = argv[arg_idx]; const char *entry = argc >= arg_idx + 2 ? argv[arg_idx + 1] : "main"; spl_prog_t prog; if (spl_prog_load_from_file(path, &prog) != 0) { fprintf(stderr, "spl_cli: cannot load '%s'\n", path); return 1; } spl_syscall_register(&prog); spl_vm_t vm; spl_vm_init(&vm); if (debug_mode) spl_vm_set_debug(&vm, 1); 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, argc, argv, NULL) != 0) { fprintf(stderr, "vm: entry point '%s' not found\n", entry); spl_prog_drop(&prog); return 1; } int ret = spl_vm_run_until(&vm, 0); spl_vm_drop(&vm); spl_prog_drop(&prog); if (ret < 0) { fprintf(stderr, "spl_cli: VM error (exit_code=%d)\n", vm.exit_code); return (int)vm.exit_code; } return (int)vm.exit_code; }