code wiki / (root) / smoke_nxc_pipeline2.nx

smoke_nxc_pipeline2.nx source

↩ module page · 59 lines · 2143 B

1// Same as smoke_nxc_pipeline.nx but skip the crt0 stub to see if 2// the failure is in the prepended `call main` reference. 3 4import "syscalls.nx" 5import "types.nx" 6import "lex_kinds.nx" 7import "outbuf.nx" 8import "ir.nx" 9import "lex.nx" 10import "parse.nx" 11import "opt.nx" 12import "regalloc.nx" 13import "riscv.nx" 14import "nxasm_v2.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 if toks == (0 as *Tok) { return __syscall(93, 1, 0, 0, 0, 0, 0) } 21 22 let m: *Module = parse_module(toks, 0 as *Module) 23 if m == (0 as *Module) { return __syscall(93, 2, 0, 0, 0, 0, 0) } 24 25 let asm_out: *OutBuf = out_new(131072) 26 // NO crt0 prefix this time. 27 var fi: i64 = 0 28 while fi < m.n_functions { 29 let fn_base: i64 = m.functions as i64 30 let f: *Function = (fn_base + fi * 176) as *Function 31 opt_run(f) 32 let locs_raw: *u8 = sys_mmap(f.n_values * 24 + 64) 33 let locs: *ValueLoc = locs_raw as *ValueLoc 34 let cs_raw: *u8 = sys_mmap(16) 35 let cs: *i64 = cs_raw as *i64 36 *cs = 0 37 let cs_fpr_raw: *u8 = sys_mmap(16) 38 let cs_fpr: *i64 = cs_fpr_raw as *i64 39 *cs_fpr = 0 40 let sb_raw: *u8 = sys_mmap(16) 41 let sb: *i64 = sb_raw as *i64 42 *sb = 0 43 regalloc_function(f, locs, cs, cs_fpr, sb) 44 let name_addr: i64 = f.name_start 45 let fn_name: *u8 = name_addr as *u8 46 emit_function(f, locs, asm_out, fn_name, 16, 8, *cs, *cs_fpr) 47 fi = fi + 1 48 } 49 50 if asm_out.pos == 0 { return __syscall(93, 100, 0, 0, 0, 0, 0) } 51 52 let code_buf: *u8 = sys_mmap(65536) 53 let code_len: i64 = assemble(asm_out.buf, asm_out.pos, code_buf, 65536) 54 if code_len == -1 { return __syscall(93, 200, 0, 0, 0, 0, 0) } 55 if code_len == -2 { return __syscall(93, 201, 0, 0, 0, 0, 0) } 56 if code_len == -3 { return __syscall(93, 202, 0, 0, 0, 0, 0) } 57 if code_len == 0 { return __syscall(93, 101, 0, 0, 0, 0, 0) } 58 return __syscall(93, code_len & 0xFF, 0, 0, 0, 0, 0) 59}