code wiki / (root) / _selfhost_compile_42.nx

_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}