/* 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 [entry_point] */ #include "spl_ir.h" #include "spl_syscall.h" #include "spl_vm.h" #include int main(int argc, const char **argv) { if (argc < 2) { fprintf(stderr, "Usage: spl_cli [entry_point]\n"); return 1; } const char *path = argv[1]; const char *entry = argc >= 3 ? argv[2] : "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 (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; }