smoke_nxc_pipeline9.nx source
↩ module page · 57 lines · 2037 B
1// Pipeline first, but call write_elf with a FRESH code buffer
2// (not the one from assemble) -- to isolate whether memory
3// corruption from the pipeline damages later allocations.
4
5import "syscalls.nx"
6import "types.nx"
7import "lex_kinds.nx"
8import "outbuf.nx"
9import "ir.nx"
10import "lex.nx"
11import "parse.nx"
12import "opt.nx"
13import "regalloc.nx"
14import "riscv.nx"
15import "crt0.nx"
16import "nxasm_v2.nx"
17import "elf_writer.nx"
18
19func main() -> i64 {
20 let demo: *u8 = "func main() -> i64 { return __syscall(93, 30, 0, 0, 0, 0, 0) }"
21
22 let toks: *Tok = lex_source(demo, 4096)
23 let m: *Module = parse_module(toks, 0 as *Module)
24 let asm_out: *OutBuf = out_new(131072)
25 emit_crt0_start(asm_out)
26 var fi: i64 = 0
27 while fi < m.n_functions {
28 let fn_base: i64 = m.functions as i64
29 let f: *Function = (fn_base + fi * 176) as *Function
30 opt_run(f)
31 let locs_raw: *u8 = sys_mmap(f.n_values * 24 + 64)
32 let locs: *ValueLoc = locs_raw as *ValueLoc
33 let cs_raw: *u8 = sys_mmap(16)
34 let cs: *i64 = cs_raw as *i64
35 *cs = 0
36 let cs_fpr_raw: *u8 = sys_mmap(16)
37 let cs_fpr: *i64 = cs_fpr_raw as *i64
38 *cs_fpr = 0
39 let sb_raw: *u8 = sys_mmap(16)
40 let sb: *i64 = sb_raw as *i64
41 *sb = 0
42 regalloc_function(f, locs, cs, cs_fpr, sb)
43 let name_addr: i64 = f.name_start
44 let fn_name: *u8 = name_addr as *u8
45 emit_function(f, locs, asm_out, fn_name, 16, 8, *cs, *cs_fpr)
46 fi = fi + 1
47 }
48 let code_buf: *u8 = sys_mmap(65536)
49 let code_len: i64 = assemble(asm_out.buf, asm_out.pos, code_buf, 65536)
50
51 // Now call write_elf with a FRESH 4-byte buffer (not code_buf).
52 let fresh_code: *u8 = sys_mmap(64)
53 fresh_code[0] = 0x67; fresh_code[1] = 0x80; fresh_code[2] = 0; fresh_code[3] = 0
54 let n: i64 = write_elf(fresh_code, 4, 2)
55 if n < 0 { return __syscall(93, 50, 0, 0, 0, 0, 0) }
56 return __syscall(93, 42, 0, 0, 0, 0, 0)
57}