code wiki / _hdl_build / nx_aliasfix_gate.nx
nx_aliasfix_gate.nx source
↩ module page · 72 lines · 4854 B
1// nx_aliasfix_gate.nx -- the GATE that proves T#nx-int-alias-size-0 is fixed, end to end, with the
2// REBUILT sovereign toolchain (compiler /tmp/nx_cc_aliasfix.elf = nx_nxc.nx with alias resolution +
3// assembler /tmp/nxasm_x86_v2.elf = nxasm with the raised label cap). Builds+runs 4 modules and reads
4// each exit reliably via sys_wait4 (no shell $? trap). Expected: all exit 0. NO gcc, NO .sh.
5// license_tier: ORIGINAL
6import "nx_syscalls.nx"
7
8func ag_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
9func ag_putn(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)} let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1} sys_write(1,bb,k); return 0 }
10func ag_cat(d: *u8, o: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8){d[o+i]=s[i];i=i+1} return o+i }
11
12func ag_run(path: *u8, argv: *i64, redir_out: i64, redir_err: i64) -> i64 {
13 let pid: i64 = sys_fork()
14 if pid == 0 {
15 if redir_out >= 0 { sys_dup3(redir_out, 1, 0) }
16 if redir_err >= 0 { sys_dup3(redir_err, 2, 0) }
17 let envp: *i64 = sys_mmap(16) as *i64; envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0
18 sys_execve(path, argv, envp); sys_exit(127)
19 }
20 let st: *i64 = sys_mmap(16) as *i64
21 sys_wait4(pid, st, 0)
22 return (st[0] >> 8) & 0xff
23}
24
25func ag_filesize(path: *u8) -> i64 {
26 let fd: i64 = sys_openat_rd(path); if fd < 0 { return 0 }
27 let buf: *u8 = sys_mmap(4096); var total: i64=0; var n: i64=sys_read(fd,buf,4096)
28 while n>0 { total=total+n; n=sys_read(fd,buf,4096) } sys_close(fd); return total
29}
30
31// build module `name` (path `src`) with the rebuilt compiler+assembler; return run-exit or negative build code.
32func ag_build_run(name: *u8, src: *u8, cc: *u8, as_tool: *u8, devnull: i64) -> i64 {
33 let spath: *u8 = sys_mmap(256); var o: i64=0
34 o = ag_cat(spath,o,"/tmp/ag_" as *u8); o = ag_cat(spath,o,name); o = ag_cat(spath,o,".s" as *u8); spath[o]=0 as u8
35 let elf: *u8 = sys_mmap(256); o=0
36 o = ag_cat(elf,o,"/tmp/ag_" as *u8); o = ag_cat(elf,o,name); o = ag_cat(elf,o,".elf" as *u8); elf[o]=0 as u8
37 let sfd: i64 = sys_openat_wr(spath, 0x1a4)
38 let cca: *i64 = sys_mmap(32) as *i64; cca[0]=cc as i64; cca[1]=src as i64; cca[2]=0
39 ag_run(cc, cca, sfd, devnull); sys_close(sfd)
40 if ag_filesize(spath) <= 128 { return 0 - 3 }
41 let aa: *i64 = sys_mmap(32) as *i64; aa[0]=as_tool as i64; aa[1]=spath as i64; aa[2]=elf as i64; aa[3]=0
42 let rca: i64 = ag_run(as_tool, aa, 0 - 1, devnull)
43 if rca != 0 { return 0 - 4 }
44 let ra: *i64 = sys_mmap(16) as *i64; ra[0]=elf as i64; ra[1]=0
45 return ag_run(elf, ra, devnull, devnull)
46}
47
48func main() -> i64 {
49 // the REBUILT sovereign compiler (today's source: LICM single-pass fix = fast, alias fix = correct)
50 // + the v2 assembler (16MiB buffer + 65536 label cap, needed for christus's 1.08MB .s).
51 // NOT nx_cc_known_good (C bootstrap, forbidden on the build path).
52 let cc: *u8 = "/tmp/nx_cc_fast.elf" as *u8
53 let as_tool: *u8 = "/tmp/nxasm_x86_v2.elf" as *u8
54 let devnull: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4)
55 ag_puts("=== ALIAS-FIX GATE (rebuilt nx_cc + nxasm, no gcc/sh) ===\n" as *u8)
56
57 // (name, source-path) pairs -- the alias guard + the christus stack
58 let n1: *u8 = "nx_type_alias_test" as *u8; let s1: *u8 = "runtime/nx_type_alias_test.nx" as *u8
59 let n2: *u8 = "nx_mesh_christus_probe" as *u8; let s2: *u8 = "runtime/nx_mesh_christus_probe.nx" as *u8
60 let n3: *u8 = "nx_christus_integration_test" as *u8; let s3: *u8 = "runtime/nx_christus_integration_test.nx" as *u8
61 let n4: *u8 = "nx_fab_slice_test" as *u8; let s4: *u8 = "runtime/_hdl_build/nx_fab_slice_test.nx" as *u8
62
63 var pass: i64 = 0
64 let r1: i64 = ag_build_run(n1, s1, cc, as_tool, devnull); ag_puts(" ") ; ag_puts(n1); ag_puts(" exit=") ; ag_putn(r1); if r1==0 {ag_puts(" PASS\n"); pass=pass+1} else {ag_puts(" FAIL\n")}
65 let r2: i64 = ag_build_run(n2, s2, cc, as_tool, devnull); ag_puts(" ") ; ag_puts(n2); ag_puts(" exit=") ; ag_putn(r2); if r2==4 {ag_puts(" PASS(n_tris=4)\n"); pass=pass+1} else {ag_puts(" FAIL(want 4)\n")}
66 let r3: i64 = ag_build_run(n3, s3, cc, as_tool, devnull); ag_puts(" ") ; ag_puts(n3); ag_puts(" exit=") ; ag_putn(r3); if r3==0 {ag_puts(" PASS\n"); pass=pass+1} else {ag_puts(" FAIL\n")}
67 let r4: i64 = ag_build_run(n4, s4, cc, as_tool, devnull); ag_puts(" ") ; ag_puts(n4); ag_puts(" exit=") ; ag_putn(r4); if r4==0 {ag_puts(" PASS\n"); pass=pass+1} else {ag_puts(" FAIL\n")}
68
69 ag_puts("GATE pass=") ; ag_putn(pass); ag_puts("/4\n")
70 if pass == 4 { ag_puts("ALIAS-FIX GATE ALL-PASS\n"); sys_exit(0) }
71 sys_exit(1); return 1
72}