code wiki / (root) / nx_smoke_nxc_pipeline.nx

nx_smoke_nxc_pipeline.nx source

↩ module page · 79 lines · 2910 B

1// Replay nxc.nx's pipeline on the baked-in demo, reporting at 2// each stage so we can see exactly where stage 4 is failing. 3// 4// Returns: 5// 1 = lex_source returned NULL 6// 2 = parse_module returned NULL 7// 3-9 = opt/regalloc/riscv stage threw something we'd need to 8// instrument differently (just runs) 9// 100 = OK, asm_pos was 0 (nothing emitted) 10// 101 = OK, asm_pos > 0, code_len == 0 11// 102 = OK, asm_pos > 0, code_len < 0 -- distinguished below 12// 200 = code_len == -1 (unknown mnemonic) 13// 201 = code_len == -2 (pass 1 fail) 14// 202 = code_len == -3 (pass 2 fail) 15// N = code_len when 0 < N < 100 (success) 16 17// nx_safety_envelope: 18// intended_use: AUTO_APPLIED -- primitive-specific tuning queued 19// sil_target: SIL1 20// evidence: [bulk_applied_2026-05-16, see-file-comment-for-detail] 21// verdict: NOT_YET_EVALUATED 22 23import "nx_syscalls.nx" 24import "nx_types.nx" 25import "nx_lex_kinds.nx" 26import "nx_outbuf.nx" 27import "nx_ir.nx" 28import "nx_tokenizer.nx" 29import "nx_parse.nx" 30import "nx_opt.nx" 31import "nx_regalloc.nx" 32import "nx_riscv.nx" 33import "crt0.nx" 34import "nxasm_v2.nx" 35 36func main() -> i64 { 37 let demo: *u8 = "func main() -> i64 { return __syscall(93, 30, 0, 0, 0, 0, 0) }" 38 39 let toks: *Tok = lex_source(demo, 4096) 40 if toks == (0 as *Tok) { return __syscall(93, 1, 0, 0, 0, 0, 0) } 41 42 let m: *Module = parse_module(toks, 0 as *Module) 43 if m == (0 as *Module) { return __syscall(93, 2, 0, 0, 0, 0, 0) } 44 45 let asm_out: *OutBuf = out_new(131072) 46 emit_crt0_start(asm_out) 47 var fi: i64 = 0 48 while fi < m.n_functions { 49 let fn_base: i64 = m.functions as i64 50 let f: *Function = (fn_base + fi * 176) as *Function 51 opt_run(f) 52 let locs_raw: *u8 = sys_mmap(f.n_values * 24 + 64) 53 let locs: *ValueLoc = locs_raw as *ValueLoc 54 let cs_raw: *u8 = sys_mmap(16) 55 let cs: *i64 = cs_raw as *i64 56 *cs = 0 57 let cs_fpr_raw: *u8 = sys_mmap(16) 58 let cs_fpr: *i64 = cs_fpr_raw as *i64 59 *cs_fpr = 0 60 let sb_raw: *u8 = sys_mmap(16) 61 let sb: *i64 = sb_raw as *i64 62 *sb = 0 63 regalloc_function(f, locs, cs, cs_fpr, sb) 64 let name_addr: i64 = f.name_start 65 let fn_name: *u8 = name_addr as *u8 66 emit_function(f, locs, asm_out, fn_name, 16, 8, *cs, *cs_fpr) 67 fi = fi + 1 68 } 69 70 if asm_out.pos == 0 { return __syscall(93, 100, 0, 0, 0, 0, 0) } 71 72 let code_buf: *u8 = sys_mmap(65536) 73 let code_len: i64 = assemble(asm_out.buf, asm_out.pos, code_buf, 65536) 74 if code_len == -1 { return __syscall(93, 200, 0, 0, 0, 0, 0) } 75 if code_len == -2 { return __syscall(93, 201, 0, 0, 0, 0, 0) } 76 if code_len == -3 { return __syscall(93, 202, 0, 0, 0, 0, 0) } 77 if code_len == 0 { return __syscall(93, 101, 0, 0, 0, 0, 0) } 78 return __syscall(93, code_len & 0xFF, 0, 0, 0, 0, 0) 79}