code wiki / (root) / smoke_nxc_pipeline10.nx

smoke_nxc_pipeline10.nx source

↩ module page · 51 lines · 1740 B

1// Pipeline through stage 3 only, then write_elf with fresh code. 2 3import "syscalls.nx" 4import "types.nx" 5import "lex_kinds.nx" 6import "outbuf.nx" 7import "ir.nx" 8import "lex.nx" 9import "parse.nx" 10import "opt.nx" 11import "regalloc.nx" 12import "riscv.nx" 13import "crt0.nx" 14import "elf_writer.nx" 15 16func main() -> i64 { 17 let demo: *u8 = "func main() -> i64 { return __syscall(93, 30, 0, 0, 0, 0, 0) }" 18 19 let toks: *Tok = lex_source(demo, 4096) 20 let m: *Module = parse_module(toks, 0 as *Module) 21 let asm_out: *OutBuf = out_new(131072) 22 emit_crt0_start(asm_out) 23 var fi: i64 = 0 24 while fi < m.n_functions { 25 let fn_base: i64 = m.functions as i64 26 let f: *Function = (fn_base + fi * 176) as *Function 27 opt_run(f) 28 let locs_raw: *u8 = sys_mmap(f.n_values * 24 + 64) 29 let locs: *ValueLoc = locs_raw as *ValueLoc 30 let cs_raw: *u8 = sys_mmap(16) 31 let cs: *i64 = cs_raw as *i64 32 *cs = 0 33 let cs_fpr_raw: *u8 = sys_mmap(16) 34 let cs_fpr: *i64 = cs_fpr_raw as *i64 35 *cs_fpr = 0 36 let sb_raw: *u8 = sys_mmap(16) 37 let sb: *i64 = sb_raw as *i64 38 *sb = 0 39 regalloc_function(f, locs, cs, cs_fpr, sb) 40 let name_addr: i64 = f.name_start 41 let fn_name: *u8 = name_addr as *u8 42 emit_function(f, locs, asm_out, fn_name, 16, 8, *cs, *cs_fpr) 43 fi = fi + 1 44 } 45 // Skip stage 4 (assemble). 46 let fresh_code: *u8 = sys_mmap(64) 47 fresh_code[0] = 0x67; fresh_code[1] = 0x80; fresh_code[2] = 0; fresh_code[3] = 0 48 let n: i64 = write_elf(fresh_code, 4, 2) 49 if n < 0 { return __syscall(93, 50, 0, 0, 0, 0, 0) } 50 return __syscall(93, 42, 0, 0, 0, 0, 0) 51}