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}