smoke_nxc_pipeline15.nx source
↩ module page · 42 lines · 1479 B
1// Same as pipeline13 but allocate huge locs to rule out overflow.
2import "syscalls.nx"
3import "types.nx"
4import "lex_kinds.nx"
5import "outbuf.nx"
6import "ir.nx"
7import "lex.nx"
8import "parse.nx"
9import "opt.nx"
10import "regalloc.nx"
11import "elf_writer.nx"
12
13func main() -> i64 {
14 let demo: *u8 = "func main() -> i64 { return __syscall(93, 30, 0, 0, 0, 0, 0) }"
15 let toks: *Tok = lex_source(demo, 4096)
16 let m: *Module = parse_module(toks, 0 as *Module)
17 var fi: i64 = 0
18 while fi < m.n_functions {
19 let fn_base: i64 = m.functions as i64
20 let f: *Function = (fn_base + fi * 176) as *Function
21 opt_run(f)
22 // Huge locs allocation to rule out slot overflow.
23 let locs_raw: *u8 = sys_mmap(65536)
24 let locs: *ValueLoc = locs_raw as *ValueLoc
25 let cs_raw: *u8 = sys_mmap(64)
26 let cs: *i64 = cs_raw as *i64
27 *cs = 0
28 let cs_fpr_raw: *u8 = sys_mmap(16)
29 let cs_fpr: *i64 = cs_fpr_raw as *i64
30 *cs_fpr = 0
31 let sb_raw: *u8 = sys_mmap(64)
32 let sb: *i64 = sb_raw as *i64
33 *sb = 0
34 regalloc_function(f, locs, cs, cs_fpr, sb)
35 fi = fi + 1
36 }
37 let fresh_code: *u8 = sys_mmap(64)
38 fresh_code[0] = 0x67; fresh_code[1] = 0x80; fresh_code[2] = 0; fresh_code[3] = 0
39 let n: i64 = write_elf(fresh_code, 4, 2)
40 if n < 0 { return __syscall(93, 50, 0, 0, 0, 0, 0) }
41 return __syscall(93, 42, 0, 0, 0, 0, 0)
42}