smoke_nxc_pipeline.nx source
↩ module page · 73 lines · 2696 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
17import "syscalls.nx"
18import "types.nx"
19import "lex_kinds.nx"
20import "outbuf.nx"
21import "ir.nx"
22import "lex.nx"
23import "parse.nx"
24import "opt.nx"
25import "regalloc.nx"
26import "riscv.nx"
27import "crt0.nx"
28import "nxasm_v2.nx"
29
30func main() -> i64 {
31 let demo: *u8 = "func main() -> i64 { return __syscall(93, 30, 0, 0, 0, 0, 0) }"
32
33 let toks: *Tok = lex_source(demo, 4096)
34 if toks == (0 as *Tok) { return __syscall(93, 1, 0, 0, 0, 0, 0) }
35
36 let m: *Module = parse_module(toks, 0 as *Module)
37 if m == (0 as *Module) { return __syscall(93, 2, 0, 0, 0, 0, 0) }
38
39 let asm_out: *OutBuf = out_new(131072)
40 emit_crt0_start(asm_out)
41 var fi: i64 = 0
42 while fi < m.n_functions {
43 let fn_base: i64 = m.functions as i64
44 let f: *Function = (fn_base + fi * 176) as *Function
45 opt_run(f)
46 let locs_raw: *u8 = sys_mmap(f.n_values * 24 + 64)
47 let locs: *ValueLoc = locs_raw as *ValueLoc
48 let cs_raw: *u8 = sys_mmap(16)
49 let cs: *i64 = cs_raw as *i64
50 *cs = 0
51 let cs_fpr_raw: *u8 = sys_mmap(16)
52 let cs_fpr: *i64 = cs_fpr_raw as *i64
53 *cs_fpr = 0
54 let sb_raw: *u8 = sys_mmap(16)
55 let sb: *i64 = sb_raw as *i64
56 *sb = 0
57 regalloc_function(f, locs, cs, cs_fpr, sb)
58 let name_addr: i64 = f.name_start
59 let fn_name: *u8 = name_addr as *u8
60 emit_function(f, locs, asm_out, fn_name, 16, 8, *cs, *cs_fpr)
61 fi = fi + 1
62 }
63
64 if asm_out.pos == 0 { return __syscall(93, 100, 0, 0, 0, 0, 0) }
65
66 let code_buf: *u8 = sys_mmap(65536)
67 let code_len: i64 = assemble(asm_out.buf, asm_out.pos, code_buf, 65536)
68 if code_len == -1 { return __syscall(93, 200, 0, 0, 0, 0, 0) }
69 if code_len == -2 { return __syscall(93, 201, 0, 0, 0, 0, 0) }
70 if code_len == -3 { return __syscall(93, 202, 0, 0, 0, 0, 0) }
71 if code_len == 0 { return __syscall(93, 101, 0, 0, 0, 0, 0) }
72 return __syscall(93, code_len & 0xFF, 0, 0, 0, 0, 0)
73}