_selfhost_compile_42.nx source
↩ module page · 69 lines · 2178 B
1// _selfhost_compile_42.nx -- end-to-end self-host validation.
2//
3// Compiles NishiLang source `func main() -> i64 { return 42 }` to
4// x86_64 assembly using the NishiLang-in-NishiLang pipeline (nx_nlex
5// + nx_nparse + nx_nir + nx_nx86), then writes the asm bytes to
6// stdout (fd=1) via sys_write.
7//
8// The bench harness captures stdout, runs it through gas + ld, executes
9// the resulting ELF, and verifies the exit code is 42.
10//
11// This closes the validation loop: our NishiLang compiler produces an
12// actually-running binary.
13
14import "syscalls.nx"
15import "nx_nlex.nx"
16import "nx_nparse.nx"
17import "nx_nir.nx"
18import "nx_nx86.nx"
19
20func main() -> i64 {
21 let src: *u8 = sys_mmap(64)
22 src[0] = 102 as u8 // f
23 src[1] = 117 as u8 // u
24 src[2] = 110 as u8 // n
25 src[3] = 99 as u8 // c
26 src[4] = 32 as u8
27 src[5] = 109 as u8 // m
28 src[6] = 97 as u8 // a
29 src[7] = 105 as u8 // i
30 src[8] = 110 as u8 // n
31 src[9] = 40 as u8 // (
32 src[10] = 41 as u8 // )
33 src[11] = 32 as u8
34 src[12] = 45 as u8 // -
35 src[13] = 62 as u8 // >
36 src[14] = 32 as u8
37 src[15] = 105 as u8 // i
38 src[16] = 54 as u8 // 6
39 src[17] = 52 as u8 // 4
40 src[18] = 32 as u8
41 src[19] = 123 as u8 // {
42 src[20] = 32 as u8
43 src[21] = 114 as u8 // r
44 src[22] = 101 as u8 // e
45 src[23] = 116 as u8 // t
46 src[24] = 117 as u8 // u
47 src[25] = 114 as u8 // r
48 src[26] = 110 as u8 // n
49 src[27] = 32 as u8
50 src[28] = 52 as u8 // 4
51 src[29] = 50 as u8 // 2
52 src[30] = 32 as u8
53 src[31] = 125 as u8 // }
54
55 let lex: *NxNLexer = nx_nlex_new(src, 32, 32)
56 nx_nlex_run(lex)
57 let parser: *NxNParser = nx_nparse_new(lex, 32)
58 let func_idx: i64 = nx_nparse_run(parser)
59 if func_idx < 0 { return 1 }
60 let ir: *NxIrFunc = nx_nir_lower_func(parser, func_idx, 32)
61 if ir == (0 as *NxIrFunc) { return 2 }
62
63 let asm: *NxAsmBuf = nx_asm_new(4096)
64 nx_nx86_emit_func(asm, src, ir)
65
66 // Write asm bytes to stdout for the harness to capture.
67 sys_write(1, asm.buf, asm.len)
68 return 0
69}