stage1 部分功能测试00,01,02,06成功
This commit is contained in:
67
stage1/splc_cli.c
Normal file
67
stage1/splc_cli.c
Normal file
@@ -0,0 +1,67 @@
|
||||
/* 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 <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main(int argc, const char **argv) {
|
||||
int argi = 1;
|
||||
|
||||
if (argi >= argc) {
|
||||
fprintf(stderr, "Usage: spc_vm <file.sir> [entry] [--trace]\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
const char *path = argv[argi++];
|
||||
|
||||
/* Parse flags: --entry <name>, --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;
|
||||
}
|
||||
Reference in New Issue
Block a user