code wiki / (root) / smoke_nxc_pipeline7.nx

smoke_nxc_pipeline7.nx source

↩ module page · 64 lines · 2303 B

1// Add stage 5 (write_elf) to the pipeline replay. Writes to fd 3 2// (a pipe / dummy fd that we don't care about — kernel returns 3// EBADF, sys_write returns negative). We just want to confirm 4// write_elf can be CALLED without crashing. 5 6import "syscalls.nx" 7import "types.nx" 8import "lex_kinds.nx" 9import "outbuf.nx" 10import "ir.nx" 11import "lex.nx" 12import "parse.nx" 13import "opt.nx" 14import "regalloc.nx" 15import "riscv.nx" 16import "crt0.nx" 17import "nxasm_v2.nx" 18import "elf_writer.nx" 19 20func main() -> i64 { 21 let demo: *u8 = "func main() -> i64 { return __syscall(93, 30, 0, 0, 0, 0, 0) }" 22 23 let toks: *Tok = lex_source(demo, 4096) 24 if toks == (0 as *Tok) { return __syscall(93, 1, 0, 0, 0, 0, 0) } 25 26 let m: *Module = parse_module(toks, 0 as *Module) 27 if m == (0 as *Module) { return __syscall(93, 2, 0, 0, 0, 0, 0) } 28 29 let asm_out: *OutBuf = out_new(131072) 30 emit_crt0_start(asm_out) 31 var fi: i64 = 0 32 while fi < m.n_functions { 33 let fn_base: i64 = m.functions as i64 34 let f: *Function = (fn_base + fi * 176) as *Function 35 opt_run(f) 36 let locs_raw: *u8 = sys_mmap(f.n_values * 24 + 64) 37 let locs: *ValueLoc = locs_raw as *ValueLoc 38 let cs_raw: *u8 = sys_mmap(16) 39 let cs: *i64 = cs_raw as *i64 40 *cs = 0 41 let cs_fpr_raw: *u8 = sys_mmap(16) 42 let cs_fpr: *i64 = cs_fpr_raw as *i64 43 *cs_fpr = 0 44 let sb_raw: *u8 = sys_mmap(16) 45 let sb: *i64 = sb_raw as *i64 46 *sb = 0 47 regalloc_function(f, locs, cs, cs_fpr, sb) 48 let name_addr: i64 = f.name_start 49 let fn_name: *u8 = name_addr as *u8 50 emit_function(f, locs, asm_out, fn_name, 16, 8, *cs, *cs_fpr) 51 fi = fi + 1 52 } 53 54 let code_buf: *u8 = sys_mmap(65536) 55 let code_len: i64 = assemble(asm_out.buf, asm_out.pos, code_buf, 65536) 56 if code_len <= 0 { return __syscall(93, 100, 0, 0, 0, 0, 0) } 57 58 // Stage 5: write_elf to a discarded fd. We just want to know 59 // if it crashes or completes. 60 let n_written: i64 = write_elf(code_buf, code_len, 1) 61 // If we got here without crashing, exit with a marker. 62 if n_written < 0 { return __syscall(93, 50, 0, 0, 0, 0, 0) } 63 return __syscall(93, 42, 0, 0, 0, 0, 0) 64}