os

An operating system
git clone https://erai.gay/code/os/
Log | Files | Refs | README | LICENSE

commit bbb46f48f0edd74cdc9ecc2310a20c7c31d7072d
parent c78d6b84c9732f62dd0076445727d5807ae1944e
Author: erai <erai@omiltem.net>
Date:   Wed,  7 May 2025 14:05:35 -0400

use libc for bootstrap

Diffstat:
Mcc0.c | 1379++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Mcc1.om | 8++++++++
Mdecl.om | 1+
Mircout.om | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
4 files changed, 901 insertions(+), 551 deletions(-)

diff --git a/cc0.c b/cc0.c @@ -109,6 +109,7 @@ u zircblock(); u zircbody(); u zirccall(); u zircdecl(); +u zircdeclstdlib(); u zircdefine(); u zircforward(); u zircline(); @@ -117,6 +118,7 @@ u zircop_neg(); u zircopyloc(); u zircout(); u zircretval(); +u zircstdlib(); u zircstr(); u zircuse(); u zirexpr_fold(); @@ -464,30 +466,19 @@ u zunify(); u zunlink(); u zwrite(); u zwriteout(); -s syscall(); -int main(int argc, char**argv) { return z_start((u)argc, (u)argv, 0); } -u zsyscall(u n, u a, u b, u c, u d, u e, u f) { return syscall(n, a, b, c, d, e, f); } -u z_start(u vargc, u vargv, u venvp) { - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - v3 = (u)zmain; - v4 = vargc; - v5 = vargv; - v6 = venvp; - v7 = ((u(*)())v3)(v4, v5, v6); - v7; - v8 = (u)zexit; - v9 = 0UL; - v10 = ((u(*)())v8)(v9); - v10; - return 0UL; -} +extern u syscall(); +extern void exit(); +extern s read(); +extern s write(); +extern u mmap(); +extern int close(); +extern int unlink(); +extern int open(); +extern char **environ; +int main(int argc, char**argv) { + return zmain((u)argc, (u)argv, (u)environ); +} +/* no glue for _start using stdlib */ u zadd_section(u vc, u vname, u vtype) { u vs = 0; u vn = 0; @@ -2538,25 +2529,7 @@ b7: v2 = 1UL; goto b8; } u zclose(u vfd) { - u v1 = 0; - u v2 = 0; - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - v1 = (u)zsyscall; - v2 = 3UL; - v3 = vfd; - v4 = 0UL; - v5 = 0UL; - v6 = 0UL; - v7 = 0UL; - v8 = 0UL; - v9 = ((u(*)())v1)(v2, v3, v4, v5, v6, v7, v8); - return v9; + return (u)close((int)vfd); } u zcomp_setup(u va, u verr) { u vc = 0; @@ -3006,7 +2979,7 @@ b82: v61 = 0UL; goto b84; b76: v60 = 1UL; goto b77; -b60: if (!*(u*)(vd + 120UL)) goto b66; +b60: if (!*(u*)(vd + 128UL)) goto b66; v49 = (u)zlayout_struct; v50 = vc; v51 = vd; @@ -3288,6 +3261,10 @@ u zdefextern(u vc, u vn) { u v17 = 0; u v18 = 0; u v19 = 0; + u v20 = 0; + u v21 = 0; + u v22 = 0; + u v23 = 0; *(u*)(vc + 24UL) = *(u*)(vn + 24UL); *(u*)(vc + 32UL) = *(u*)(vn + 32UL); *(u*)(vc + 40UL) = *(u*)(vn + 40UL); @@ -3304,17 +3281,24 @@ u zdefextern(u vc, u vn) { v13 = 1UL; v14 = ((u(*)())v9)(v10, v11, v12, v13); vd = v14; - if (!*(u*)(vd + 72UL)) goto b5; - v15 = (u)zunify; - v16 = vc; - v17 = *(u*)(vd + 80UL); - v18 = vt; - v19 = ((u(*)())v15)(v16, v17, v18); - v19; + v15 = (u)zstrcmp; + v16 = *(u*)(vn + 24UL); + v17 = (u)"syscall.om"; + v18 = ((u(*)())v15)(v16, v17); + if (v18 != 0UL) goto b5; + *(u*)(vd + 120UL) = 1UL; +b3: if (!*(u*)(vd + 72UL)) goto b9; + v19 = (u)zunify; + v20 = vc; + v21 = *(u*)(vd + 80UL); + v22 = vt; + v23 = ((u(*)())v19)(v20, v21, v22); + v23; return vd; -b5: *(u*)(vd + 72UL) = 1UL; +b9: *(u*)(vd + 72UL) = 1UL; *(u*)(vd + 80UL) = vt; return vd; +b5: goto b3; } u zdefine_enum_tag(u vc, u vname, u vvalue) { u vd = 0; @@ -3335,14 +3319,14 @@ u zdefine_enum_tag(u vc, u vname, u vvalue) { v8 = 1UL; v9 = ((u(*)())v4)(v5, v6, v7, v8); vd = v9; - if (!*(u*)(vd + 184UL)) goto b4; + if (!*(u*)(vd + 192UL)) goto b4; v10 = (u)zcdie; v11 = vc; v12 = (u)"duplicate enum"; v13 = ((u(*)())v10)(v11, v12); v13; -b2: *(u*)(vd + 184UL) = 1UL; - *(u*)(vd + 192UL) = vvalue; +b2: *(u*)(vd + 192UL) = 1UL; + *(u*)(vd + 200UL) = vvalue; return 0UL; b4: goto b2; } @@ -3455,19 +3439,19 @@ b1: v25 = (u)zfind; v29 = 1UL; v30 = ((u(*)())v25)(v26, v27, v28, v29); vd = v30; - if (!*(u*)(vd + 120UL)) goto b30; + if (!*(u*)(vd + 128UL)) goto b30; v31 = (u)zcdie; v32 = vc; v33 = (u)"duplicate struct"; v34 = ((u(*)())v31)(v32, v33); v34; -b28: *(u*)(vd + 120UL) = 1UL; - *(u*)(vd + 144UL) = vn; +b28: *(u*)(vd + 128UL) = 1UL; + *(u*)(vd + 152UL) = vn; v35 = (u)zprototype; v36 = vc; v37 = *(u*)(vn + 8UL); v38 = ((u(*)())v35)(v36, v37); - *(u*)(vd + 152UL) = v38; + *(u*)(vd + 160UL) = v38; return 0UL; b30: goto b28; b3: goto b1; @@ -3574,14 +3558,14 @@ b10: *(u*)(vc + 24UL) = *(u*)(vn + 24UL); v23 = 1UL; v24 = ((u(*)())v19)(v20, v21, v22, v23); vv = v24; - if (!*(u*)(vv + 200UL)) goto b18; + if (!*(u*)(vv + 208UL)) goto b18; v25 = (u)zcdie; v26 = vc; v27 = (u)"duplicate argument"; v28 = ((u(*)())v25)(v26, v27); v28; -b16: *(u*)(vv + 200UL) = 1UL; - *(u*)(vv + 208UL) = vt; +b16: *(u*)(vv + 208UL) = 1UL; + *(u*)(vv + 216UL) = vt; vn = *(u*)(vn + 16UL); goto b6; b18: goto b16; @@ -3654,19 +3638,19 @@ b1: v25 = (u)zfind; v29 = 1UL; v30 = ((u(*)())v25)(v26, v27, v28, v29); vd = v30; - if (!*(u*)(vd + 120UL)) goto b30; + if (!*(u*)(vd + 128UL)) goto b30; v31 = (u)zcdie; v32 = vc; v33 = (u)"duplicate struct"; v34 = ((u(*)())v31)(v32, v33); v34; -b28: *(u*)(vd + 120UL) = 1UL; - *(u*)(vd + 144UL) = vn; +b28: *(u*)(vd + 128UL) = 1UL; + *(u*)(vd + 152UL) = vn; v35 = (u)zprototype; v36 = vc; v37 = *(u*)(vn + 8UL); v38 = ((u(*)())v35)(v36, v37); - *(u*)(vd + 152UL) = v38; + *(u*)(vd + 160UL) = v38; return 0UL; b30: goto b28; b3: goto b1; @@ -3722,7 +3706,7 @@ b7: v3 = 0UL; goto b9; } u zdfa_minimize(u vc, u vd) { - u v_ctx[5] = {0}; + u v_ctx[6] = {0}; u vctx = 0; u v4 = 0; u v5 = 0; @@ -13852,7 +13836,7 @@ b2: v16 = (u)zas_emit; v21 = *(u*)(vc + 48UL); v22 = 137UL; v23 = 4UL; - v24 = *(u*)(vv + 176UL); + v24 = *(u*)(vv + 184UL); v25 = ((u(*)())v20)(v21, v22, v23, v24); v25; v26 = (u)zfind; @@ -13881,7 +13865,7 @@ b20: v39 = (u)zas_emit; v44 = *(u*)(vc + 48UL); v45 = 139UL; v46 = 4UL; - v47 = *(u*)(vv + 176UL); + v47 = *(u*)(vv + 184UL); v48 = ((u(*)())v43)(v44, v45, v46, v47); v48; v49 = (u)zfind; @@ -13908,7 +13892,7 @@ b38: v62 = (u)zas_modrm; v66 = 4UL; v67 = 0UL; v68 = 0UL; - v69 = *(u*)(vv + 176UL); + v69 = *(u*)(vv + 184UL); v70 = ((u(*)())v62)(v63, v64, v65, v66, v67, v68, v69); v70; v71 = (u)zas_modri; @@ -14175,7 +14159,7 @@ b80: v297 = (u)zas_emit; v302 = *(u*)(vc + 48UL); v303 = 139UL; v304 = 0UL; - v305 = *(u*)(vv + 176UL); + v305 = *(u*)(vv + 184UL); v306 = ((u(*)())v301)(v302, v303, v304, v305); v306; v307 = (u)zas_modrm; @@ -14435,7 +14419,7 @@ b107: goto b105; b109: v356 = 0UL; goto b111; b82: goto b80; -b84: if (!*(u*)(vv + 160UL)) goto b92; +b84: if (!*(u*)(vv + 168UL)) goto b92; v292 = 0UL; b93: if (!v292) goto b90; v290 = 1UL; @@ -14447,7 +14431,7 @@ b92: v292 = 1UL; b88: v291 = 1UL; goto b89; b40: goto b38; -b42: if (!*(u*)(vv + 160UL)) goto b50; +b42: if (!*(u*)(vv + 168UL)) goto b50; v57 = 0UL; b51: if (!v57) goto b48; v55 = 1UL; @@ -14459,7 +14443,7 @@ b50: v57 = 1UL; b46: v56 = 1UL; goto b47; b22: goto b20; -b24: if (!*(u*)(vv + 160UL)) goto b32; +b24: if (!*(u*)(vv + 168UL)) goto b32; v34 = 0UL; b33: if (!v34) goto b30; v32 = 1UL; @@ -14471,7 +14455,7 @@ b32: v34 = 1UL; b28: v33 = 1UL; goto b29; b4: goto b2; -b6: if (!*(u*)(vv + 160UL)) goto b14; +b6: if (!*(u*)(vv + 168UL)) goto b14; v11 = 0UL; b15: if (!v11) goto b12; v9 = 1UL; @@ -14551,26 +14535,7 @@ b8: vnew_cap = vnew_cap * 2UL + 16UL; goto b4; } u zexit(u vn) { - u v1 = 0; - u v2 = 0; - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - v1 = (u)zsyscall; - v2 = 60UL; - v3 = vn; - v4 = 0UL; - v5 = 0UL; - v6 = 0UL; - v7 = 0UL; - v8 = 0UL; - v9 = ((u(*)())v1)(v2, v3, v4, v5, v6, v7, v8); - v9; - return 0UL; + exit((int)vn); } u zexpr_to_ir(u vic, u vn) { u va = 0; @@ -15334,12 +15299,12 @@ b30: if (vkind != 0UL) goto b33; v59 = ((u(*)())v54)(v55, v56, v57, v58); vv = v59; if (!vv) goto b39; - if (!*(u*)(vv + 184UL)) goto b39; + if (!*(u*)(vv + 192UL)) goto b39; v60 = 1UL; b41: if (!v60) goto b37; v61 = (u)zmkirconst; v62 = vic; - v63 = *(u*)(vv + 192UL); + v63 = *(u*)(vv + 200UL); v64 = ((u(*)())v61)(v62, v63); vo = v64; return vo; @@ -15394,7 +15359,7 @@ b33: if (vkind != 9UL) goto b58; vv = v93; b59: v113 = (u)zmkirconst; v114 = vic; - v115 = *(u*)(vv + 176UL); + v115 = *(u*)(vv + 184UL); v116 = ((u(*)())v113)(v114, v115); vc = v116; v117 = (u)zmkirop; @@ -16281,7 +16246,7 @@ b47: if (!v22) goto b44; return 0UL; b44: v23 = (u)zalloc; v24 = *(u*)(vc + 0UL); - v25 = 232UL; + v25 = 240UL; v26 = ((u(*)())v23)(v24, v25); vd = v26; *(u*)(vd + 32UL) = vname; @@ -16301,10 +16266,9 @@ b44: v23 = (u)zalloc; v35 = ((u(*)())v33)(v34); *(u*)(vd + 88UL) = v35; *(u*)(vd + 96UL) = 0UL; - *(u*)(vd + 120UL) = 0UL; *(u*)(vd + 128UL) = 0UL; *(u*)(vd + 136UL) = 0UL; - *(u*)(vd + 160UL) = 0UL; + *(u*)(vd + 144UL) = 0UL; *(u*)(vd + 168UL) = 0UL; *(u*)(vd + 176UL) = 0UL; *(u*)(vd + 184UL) = 0UL; @@ -16312,10 +16276,11 @@ b44: v23 = (u)zalloc; *(u*)(vd + 200UL) = 0UL; *(u*)(vd + 208UL) = 0UL; *(u*)(vd + 216UL) = 0UL; + *(u*)(vd + 224UL) = 0UL; v36 = (u)zmklabel; v37 = *(u*)(vc + 48UL); v38 = ((u(*)())v36)(v37); - *(u*)(vd + 224UL) = v38; + *(u*)(vd + 232UL) = v38; return vd; b46: v22 = 1UL; goto b47; @@ -27419,13 +27384,13 @@ b31: if (vkind != 31UL) goto b34; v29 = 1UL; v30 = ((u(*)())v25)(v26, v27, v28, v29); vv = v30; - if (!*(u*)(vv + 216UL)) goto b38; + if (!*(u*)(vv + 224UL)) goto b38; v31 = (u)zcdie; v32 = vc; v33 = (u)"duplicate goto"; v34 = ((u(*)())v31)(v32, v33); v34; -b36: *(u*)(vv + 216UL) = 1UL; +b36: *(u*)(vv + 224UL) = 1UL; return 0UL; b38: goto b36; b34: if (vkind == 30UL) goto b41; @@ -27444,14 +27409,14 @@ b41: vname = *(u*)(*(u*)(vn + 8UL) + 56UL); v43 = 1UL; v44 = ((u(*)())v39)(v40, v41, v42, v43); vv = v44; - if (!*(u*)(vv + 200UL)) goto b46; + if (!*(u*)(vv + 208UL)) goto b46; v45 = (u)zcdie; v46 = vc; v47 = (u)"duplicate variable"; v48 = ((u(*)())v45)(v46, v47); v48; -b44: *(u*)(vv + 208UL) = vt; - *(u*)(vv + 200UL) = 1UL; +b44: *(u*)(vv + 216UL) = vt; + *(u*)(vv + 208UL) = 1UL; return 0UL; b46: goto b44; b5: v7 = 1UL; @@ -29265,254 +29230,376 @@ b8: viv = *(u*)(*(u*)(vic + 128UL) + vi * 8UL); b11: goto b4; b13: goto b11; } -u zircdefine(u vc, u vd) { - u vi = 0; - u vic = 0; - u viv = 0; - u vtop = 0; - u vsize = 0; - u vid = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - u v11 = 0; - u v12 = 0; - u v13 = 0; - u v14 = 0; - u v15 = 0; - u v16 = 0; - u v17 = 0; - u v18 = 0; - u v19 = 0; - u v20 = 0; - u v21 = 0; - u v22 = 0; - u v23 = 0; - u v24 = 0; - u v25 = 0; - u v26 = 0; - u v27 = 0; - u v28 = 0; - u v29 = 0; - u v30 = 0; - u v31 = 0; - u v32 = 0; - u v33 = 0; - u v34 = 0; - u v35 = 0; - u v36 = 0; - u v37 = 0; - u v38 = 0; - u v39 = 0; - u v40 = 0; - u v41 = 0; - u v42 = 0; - u v43 = 0; - u v44 = 0; - u v45 = 0; - u v46 = 0; - u v47 = 0; - u v48 = 0; - u v49 = 0; - u v50 = 0; - u v51 = 0; - u v52 = 0; - u v53 = 0; - u v54 = 0; - u v55 = 0; - u v56 = 0; - u v57 = 0; - u v58 = 0; - u v59 = 0; - u v60 = 0; - u v61 = 0; - u v62 = 0; - u v63 = 0; - u v64 = 0; - u v65 = 0; - u v66 = 0; - u v67 = 0; - u v68 = 0; - u v69 = 0; - u v70 = 0; - u v71 = 0; - u v72 = 0; - u v73 = 0; - u v74 = 0; - u v75 = 0; - u v76 = 0; - u v77 = 0; - u v78 = 0; - u v79 = 0; - u v80 = 0; - u v81 = 0; - u v82 = 0; - vic = *(u*)(vd + 112UL); - if (!vic) goto b5; - v8 = 0UL; -b6: if (!v8) goto b3; - return 0UL; -b3: vi = 0UL; -b7: if (vi != *(u*)(vic + 136UL)) goto b11; - vtop = *(u*)(*(u*)(vic + 64UL) + 0UL * 8UL); - v9 = (u)zircuse; - v10 = vc; - v11 = vic; - v12 = vtop; - v13 = ((u(*)())v9)(v10, v11, v12); - v13; - v14 = (u)zircdecl; - v15 = vc; - v16 = vic; - v17 = ((u(*)())v14)(v15, v16); - v17; - v18 = (u)zfputs; - v19 = *(u*)(vc + 72UL); - v20 = (u)" {\012"; - v21 = ((u(*)())v18)(v19, v20); - v21; - vi = *(u*)(vic + 152UL); -b15: if (vi != *(u*)(vic + 136UL)) goto b19; - v71 = (u)zircbody; - v72 = vc; - v73 = vic; - v74 = vtop; - v75 = ((u(*)())v71)(v72, v73, v74); - v75; - v76 = (u)zirreset; - v77 = vtop; - v78 = ((u(*)())v76)(v77); - v78; - v79 = (u)zfputs; - v80 = *(u*)(vc + 72UL); - v81 = (u)"}\012"; - v82 = ((u(*)())v79)(v80, v81); - v82; - return 0UL; -b19: viv = *(u*)(*(u*)(vic + 128UL) + vi * 8UL); - if (!*(u*)(viv + 48UL)) goto b22; - vi = vi + 1UL; - goto b15; -b22: v22 = (u)zfputs; - v23 = *(u*)(vc + 72UL); - v24 = (u)"\011"; - v25 = ((u(*)())v22)(v23, v24); - v25; - v26 = (u)zfputs; - v27 = *(u*)(vc + 72UL); - v28 = (u)"u "; - v29 = ((u(*)())v26)(v27, v28); - v29; - if (!*(u*)(viv + 0UL)) goto b27; - v30 = (u)zfputs; - v31 = *(u*)(vc + 72UL); - v32 = (u)"v"; - v33 = ((u(*)())v30)(v31, v32); - v33; - v34 = (u)zfputs; - v35 = *(u*)(vc + 72UL); - v36 = *(u*)(viv + 0UL); - v37 = ((u(*)())v34)(v35, v36); - v37; -b25: if (!*(u*)(viv + 24UL)) goto b36; - if (*(u*)(*(u*)(viv + 24UL) + 0UL) == 1UL) goto b36; - v46 = 1UL; -b38: if (!v46) goto b34; - v47 = (u)ztype_sizeof; - v48 = vc; - v49 = *(u*)(viv + 24UL); - v50 = ((u(*)())v47)(v48, v49); - vsize = v50; -b32: if (vsize != 8UL) goto b42; - v51 = (u)zfputs; - v52 = *(u*)(vc + 72UL); - v53 = (u)" = 0"; - v54 = ((u(*)())v51)(v52, v53); - v54; -b40: v67 = (u)zfputs; - v68 = *(u*)(vc + 72UL); - v69 = (u)";\012"; - v70 = ((u(*)())v67)(v68, v69); - v70; - vi = vi + 1UL; - goto b15; -b42: v55 = (u)zfputs; - v56 = *(u*)(vc + 72UL); - v57 = (u)"["; - v58 = ((u(*)())v55)(v56, v57); - v58; - v59 = (u)zfputd; - v60 = *(u*)(vc + 72UL); - v61 = (u)((s)(vsize + 7UL) / (s)8UL); - v62 = ((u(*)())v59)(v60, v61); - v62; - v63 = (u)zfputs; - v64 = *(u*)(vc + 72UL); - v65 = (u)"] = {0}"; - v66 = ((u(*)())v63)(v64, v65); - v66; - goto b40; -b34: vsize = 8UL; - goto b32; -b36: v46 = 0UL; - goto b38; -b27: v38 = (u)zfputs; - v39 = *(u*)(vc + 72UL); - v40 = (u)"v"; - v41 = ((u(*)())v38)(v39, v40); - v41; - v42 = (u)zfputd; - v43 = *(u*)(vc + 72UL); - v44 = vi; - v45 = ((u(*)())v42)(v43, v44); - v45; - goto b25; -b11: viv = *(u*)(*(u*)(vic + 128UL) + vi * 8UL); - vi = vi + 1UL; - goto b7; -b5: v8 = 1UL; - goto b6; -} -u zircforward(u vc, u vd) { - u vic = 0; - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - u v11 = 0; - u v12 = 0; - u v13 = 0; - u v14 = 0; - u v15 = 0; - vic = *(u*)(vd + 112UL); - if (!vic) goto b5; - v3 = 0UL; -b6: if (!v3) goto b3; - return 0UL; -b3: v4 = (u)zfputs; - v5 = *(u*)(vc + 72UL); - v6 = (u)"u z"; - v7 = ((u(*)())v4)(v5, v6); - v7; - v8 = (u)zfputs; - v9 = *(u*)(vc + 72UL); - v10 = *(u*)(vic + 24UL); - v11 = ((u(*)())v8)(v9, v10); - v11; - v12 = (u)zfputs; - v13 = *(u*)(vc + 72UL); - v14 = (u)"();\012"; - v15 = ((u(*)())v12)(v13, v14); - v15; - return 0UL; -b5: v3 = 1UL; - goto b6; -} -u zircline(u vc, u vop) { +u zircdeclstdlib(u vc) { + u v1 = 0; + u v2 = 0; + u v3 = 0; + u v4 = 0; + u v5 = 0; + u v6 = 0; + u v7 = 0; + u v8 = 0; + u v9 = 0; + u v10 = 0; + u v11 = 0; + u v12 = 0; + u v13 = 0; + u v14 = 0; + u v15 = 0; + u v16 = 0; + u v17 = 0; + u v18 = 0; + u v19 = 0; + u v20 = 0; + u v21 = 0; + u v22 = 0; + u v23 = 0; + u v24 = 0; + u v25 = 0; + u v26 = 0; + u v27 = 0; + u v28 = 0; + u v29 = 0; + u v30 = 0; + u v31 = 0; + u v32 = 0; + u v33 = 0; + u v34 = 0; + u v35 = 0; + u v36 = 0; + u v37 = 0; + u v38 = 0; + u v39 = 0; + u v40 = 0; + u v41 = 0; + u v42 = 0; + u v43 = 0; + u v44 = 0; + u v45 = 0; + u v46 = 0; + u v47 = 0; + u v48 = 0; + v1 = (u)zfputs; + v2 = *(u*)(vc + 72UL); + v3 = (u)"extern u syscall();\012"; + v4 = ((u(*)())v1)(v2, v3); + v4; + v5 = (u)zfputs; + v6 = *(u*)(vc + 72UL); + v7 = (u)"extern void exit();\012"; + v8 = ((u(*)())v5)(v6, v7); + v8; + v9 = (u)zfputs; + v10 = *(u*)(vc + 72UL); + v11 = (u)"extern s read();\012"; + v12 = ((u(*)())v9)(v10, v11); + v12; + v13 = (u)zfputs; + v14 = *(u*)(vc + 72UL); + v15 = (u)"extern s write();\012"; + v16 = ((u(*)())v13)(v14, v15); + v16; + v17 = (u)zfputs; + v18 = *(u*)(vc + 72UL); + v19 = (u)"extern u mmap();\012"; + v20 = ((u(*)())v17)(v18, v19); + v20; + v21 = (u)zfputs; + v22 = *(u*)(vc + 72UL); + v23 = (u)"extern int close();\012"; + v24 = ((u(*)())v21)(v22, v23); + v24; + v25 = (u)zfputs; + v26 = *(u*)(vc + 72UL); + v27 = (u)"extern int unlink();\012"; + v28 = ((u(*)())v25)(v26, v27); + v28; + v29 = (u)zfputs; + v30 = *(u*)(vc + 72UL); + v31 = (u)"extern int open();\012"; + v32 = ((u(*)())v29)(v30, v31); + v32; + v33 = (u)zfputs; + v34 = *(u*)(vc + 72UL); + v35 = (u)"extern char **environ;\012"; + v36 = ((u(*)())v33)(v34, v35); + v36; + v37 = (u)zfputs; + v38 = *(u*)(vc + 72UL); + v39 = (u)"int main(int argc, char**argv) {\012"; + v40 = ((u(*)())v37)(v38, v39); + v40; + v41 = (u)zfputs; + v42 = *(u*)(vc + 72UL); + v43 = (u)"\011return zmain((u)argc, (u)argv, (u)environ);\012"; + v44 = ((u(*)())v41)(v42, v43); + v44; + v45 = (u)zfputs; + v46 = *(u*)(vc + 72UL); + v47 = (u)"}\012"; + v48 = ((u(*)())v45)(v46, v47); + v48; + return 0UL; +} +u zircdefine(u vc, u vd) { + u vi = 0; + u vic = 0; + u viv = 0; + u vtop = 0; + u vsize = 0; + u vid = 0; + u v8 = 0; + u v9 = 0; + u v10 = 0; + u v11 = 0; + u v12 = 0; + u v13 = 0; + u v14 = 0; + u v15 = 0; + u v16 = 0; + u v17 = 0; + u v18 = 0; + u v19 = 0; + u v20 = 0; + u v21 = 0; + u v22 = 0; + u v23 = 0; + u v24 = 0; + u v25 = 0; + u v26 = 0; + u v27 = 0; + u v28 = 0; + u v29 = 0; + u v30 = 0; + u v31 = 0; + u v32 = 0; + u v33 = 0; + u v34 = 0; + u v35 = 0; + u v36 = 0; + u v37 = 0; + u v38 = 0; + u v39 = 0; + u v40 = 0; + u v41 = 0; + u v42 = 0; + u v43 = 0; + u v44 = 0; + u v45 = 0; + u v46 = 0; + u v47 = 0; + u v48 = 0; + u v49 = 0; + u v50 = 0; + u v51 = 0; + u v52 = 0; + u v53 = 0; + u v54 = 0; + u v55 = 0; + u v56 = 0; + u v57 = 0; + u v58 = 0; + u v59 = 0; + u v60 = 0; + u v61 = 0; + u v62 = 0; + u v63 = 0; + u v64 = 0; + u v65 = 0; + u v66 = 0; + u v67 = 0; + u v68 = 0; + u v69 = 0; + u v70 = 0; + u v71 = 0; + u v72 = 0; + u v73 = 0; + u v74 = 0; + u v75 = 0; + u v76 = 0; + u v77 = 0; + u v78 = 0; + u v79 = 0; + u v80 = 0; + u v81 = 0; + u v82 = 0; + u v83 = 0; + u v84 = 0; + u v85 = 0; + u v86 = 0; + if (!*(u*)(vd + 120UL)) goto b3; + v8 = (u)zircstdlib; + v9 = vc; + v10 = vd; + v11 = ((u(*)())v8)(v9, v10); + v11; + return 0UL; +b3: vic = *(u*)(vd + 112UL); + if (!vic) goto b9; + v12 = 0UL; +b10: if (!v12) goto b7; + return 0UL; +b7: vi = 0UL; +b11: if (vi != *(u*)(vic + 136UL)) goto b15; + vtop = *(u*)(*(u*)(vic + 64UL) + 0UL * 8UL); + v13 = (u)zircuse; + v14 = vc; + v15 = vic; + v16 = vtop; + v17 = ((u(*)())v13)(v14, v15, v16); + v17; + v18 = (u)zircdecl; + v19 = vc; + v20 = vic; + v21 = ((u(*)())v18)(v19, v20); + v21; + v22 = (u)zfputs; + v23 = *(u*)(vc + 72UL); + v24 = (u)" {\012"; + v25 = ((u(*)())v22)(v23, v24); + v25; + vi = *(u*)(vic + 152UL); +b19: if (vi != *(u*)(vic + 136UL)) goto b23; + v75 = (u)zircbody; + v76 = vc; + v77 = vic; + v78 = vtop; + v79 = ((u(*)())v75)(v76, v77, v78); + v79; + v80 = (u)zirreset; + v81 = vtop; + v82 = ((u(*)())v80)(v81); + v82; + v83 = (u)zfputs; + v84 = *(u*)(vc + 72UL); + v85 = (u)"}\012"; + v86 = ((u(*)())v83)(v84, v85); + v86; + return 0UL; +b23: viv = *(u*)(*(u*)(vic + 128UL) + vi * 8UL); + if (!*(u*)(viv + 48UL)) goto b26; + vi = vi + 1UL; + goto b19; +b26: v26 = (u)zfputs; + v27 = *(u*)(vc + 72UL); + v28 = (u)"\011"; + v29 = ((u(*)())v26)(v27, v28); + v29; + v30 = (u)zfputs; + v31 = *(u*)(vc + 72UL); + v32 = (u)"u "; + v33 = ((u(*)())v30)(v31, v32); + v33; + if (!*(u*)(viv + 0UL)) goto b31; + v34 = (u)zfputs; + v35 = *(u*)(vc + 72UL); + v36 = (u)"v"; + v37 = ((u(*)())v34)(v35, v36); + v37; + v38 = (u)zfputs; + v39 = *(u*)(vc + 72UL); + v40 = *(u*)(viv + 0UL); + v41 = ((u(*)())v38)(v39, v40); + v41; +b29: if (!*(u*)(viv + 24UL)) goto b40; + if (*(u*)(*(u*)(viv + 24UL) + 0UL) == 1UL) goto b40; + v50 = 1UL; +b42: if (!v50) goto b38; + v51 = (u)ztype_sizeof; + v52 = vc; + v53 = *(u*)(viv + 24UL); + v54 = ((u(*)())v51)(v52, v53); + vsize = v54; +b36: if (vsize != 8UL) goto b46; + v55 = (u)zfputs; + v56 = *(u*)(vc + 72UL); + v57 = (u)" = 0"; + v58 = ((u(*)())v55)(v56, v57); + v58; +b44: v71 = (u)zfputs; + v72 = *(u*)(vc + 72UL); + v73 = (u)";\012"; + v74 = ((u(*)())v71)(v72, v73); + v74; + vi = vi + 1UL; + goto b19; +b46: v59 = (u)zfputs; + v60 = *(u*)(vc + 72UL); + v61 = (u)"["; + v62 = ((u(*)())v59)(v60, v61); + v62; + v63 = (u)zfputd; + v64 = *(u*)(vc + 72UL); + v65 = (u)((s)(vsize + 8UL + 1UL) / (s)8UL); + v66 = ((u(*)())v63)(v64, v65); + v66; + v67 = (u)zfputs; + v68 = *(u*)(vc + 72UL); + v69 = (u)"] = {0}"; + v70 = ((u(*)())v67)(v68, v69); + v70; + goto b44; +b38: vsize = 8UL; + goto b36; +b40: v50 = 0UL; + goto b42; +b31: v42 = (u)zfputs; + v43 = *(u*)(vc + 72UL); + v44 = (u)"v"; + v45 = ((u(*)())v42)(v43, v44); + v45; + v46 = (u)zfputd; + v47 = *(u*)(vc + 72UL); + v48 = vi; + v49 = ((u(*)())v46)(v47, v48); + v49; + goto b29; +b15: viv = *(u*)(*(u*)(vic + 128UL) + vi * 8UL); + vi = vi + 1UL; + goto b11; +b9: v12 = 1UL; + goto b10; +} +u zircforward(u vc, u vd) { + u vic = 0; + u v3 = 0; + u v4 = 0; + u v5 = 0; + u v6 = 0; + u v7 = 0; + u v8 = 0; + u v9 = 0; + u v10 = 0; + u v11 = 0; + u v12 = 0; + u v13 = 0; + u v14 = 0; + u v15 = 0; + vic = *(u*)(vd + 112UL); + if (!vic) goto b5; + v3 = 0UL; +b6: if (!v3) goto b3; + return 0UL; +b3: v4 = (u)zfputs; + v5 = *(u*)(vc + 72UL); + v6 = (u)"u z"; + v7 = ((u(*)())v4)(v5, v6); + v7; + v8 = (u)zfputs; + v9 = *(u*)(vc + 72UL); + v10 = *(u*)(vic + 24UL); + v11 = ((u(*)())v8)(v9, v10); + v11; + v12 = (u)zfputs; + v13 = *(u*)(vc + 72UL); + v14 = (u)"();\012"; + v15 = ((u(*)())v12)(v13, v14); + v15; + return 0UL; +b5: v3 = 1UL; + goto b6; +} +u zircline(u vc, u vop) { u v2 = 0; u v3 = 0; u v4 = 0; @@ -31204,15 +31291,6 @@ u zircout(u vc) { u v43 = 0; u v44 = 0; u v45 = 0; - u v46 = 0; - u v47 = 0; - u v48 = 0; - u v49 = 0; - u v50 = 0; - u v51 = 0; - u v52 = 0; - u v53 = 0; - u v54 = 0; v2 = (u)zfputs; v3 = *(u*)(vc + 72UL); v4 = (u)"typedef unsigned char b;\012"; @@ -31235,53 +31313,42 @@ u zircout(u vc) { b5: if (!vd) goto b11; v17 = 0UL; b12: if (!v17) goto b9; - v27 = (u)zfputs; - v28 = *(u*)(vc + 72UL); - v29 = (u)"s syscall();\012"; - v30 = ((u(*)())v27)(v28, v29); - v30; - v31 = (u)zfputs; - v32 = *(u*)(vc + 72UL); - v33 = (u)"int main(int argc, char**argv) { return z_start((u)argc, (u)argv, 0); }\012"; - v34 = ((u(*)())v31)(v32, v33); - v34; - v35 = (u)zfputs; - v36 = *(u*)(vc + 72UL); - v37 = (u)"u zsyscall(u n, u a, u b, u c, u d, u e, u f) { return syscall(n, a, b, c, d, e, f); }\012"; + v27 = (u)zircdeclstdlib; + v28 = vc; + v29 = ((u(*)())v27)(v28); + v29; + v30 = (u)zfirst_decl; + v31 = vc; + v32 = ((u(*)())v30)(v31); + vd = v32; +b24: if (!vd) goto b30; + v33 = 0UL; +b31: if (!v33) goto b28; + v43 = (u)zfflush; + v44 = *(u*)(vc + 72UL); + v45 = ((u(*)())v43)(v44); + v45; + return 0UL; +b28: if (!*(u*)(vd + 96UL)) goto b36; + if (!*(u*)(vd + 72UL)) goto b36; + v34 = 1UL; +b38: if (!v34) goto b34; + v35 = (u)zircdefine; + v36 = vc; + v37 = vd; v38 = ((u(*)())v35)(v36, v37); v38; - v39 = (u)zfirst_decl; +b32: v39 = (u)znext_decl; v40 = vc; - v41 = ((u(*)())v39)(v40); - vd = v41; -b26: if (!vd) goto b32; - v42 = 0UL; -b33: if (!v42) goto b30; - v52 = (u)zfflush; - v53 = *(u*)(vc + 72UL); - v54 = ((u(*)())v52)(v53); - v54; - return 0UL; -b30: if (!*(u*)(vd + 96UL)) goto b38; - if (!*(u*)(vd + 72UL)) goto b38; - v43 = 1UL; -b40: if (!v43) goto b36; - v44 = (u)zircdefine; - v45 = vc; - v46 = vd; - v47 = ((u(*)())v44)(v45, v46); - v47; -b34: v48 = (u)znext_decl; - v49 = vc; - v50 = vd; - v51 = ((u(*)())v48)(v49, v50); - vd = v51; - goto b26; -b36: goto b34; -b38: v43 = 0UL; - goto b40; -b32: v42 = 1UL; - goto b33; + v41 = vd; + v42 = ((u(*)())v39)(v40, v41); + vd = v42; + goto b24; +b34: goto b32; +b36: v34 = 0UL; + goto b38; +b30: v33 = 1UL; + goto b31; b9: if (!*(u*)(vd + 96UL)) goto b17; if (!*(u*)(vd + 72UL)) goto b17; v18 = 1UL; @@ -31340,6 +31407,313 @@ b5: vop = *(u*)(*(u*)(vib + 8UL) + vi * 8UL); b8: vi = vi + 1UL; goto b1; } +u zircstdlib(u vc, u vd) { + u v2 = 0; + u v3 = 0; + u v4 = 0; + u v5 = 0; + u v6 = 0; + u v7 = 0; + u v8 = 0; + u v9 = 0; + u v10 = 0; + u v11 = 0; + u v12 = 0; + u v13 = 0; + u v14 = 0; + u v15 = 0; + u v16 = 0; + u v17 = 0; + u v18 = 0; + u v19 = 0; + u v20 = 0; + u v21 = 0; + u v22 = 0; + u v23 = 0; + u v24 = 0; + u v25 = 0; + u v26 = 0; + u v27 = 0; + u v28 = 0; + u v29 = 0; + u v30 = 0; + u v31 = 0; + u v32 = 0; + u v33 = 0; + u v34 = 0; + u v35 = 0; + u v36 = 0; + u v37 = 0; + u v38 = 0; + u v39 = 0; + u v40 = 0; + u v41 = 0; + u v42 = 0; + u v43 = 0; + u v44 = 0; + u v45 = 0; + u v46 = 0; + u v47 = 0; + u v48 = 0; + u v49 = 0; + u v50 = 0; + u v51 = 0; + u v52 = 0; + u v53 = 0; + u v54 = 0; + u v55 = 0; + u v56 = 0; + u v57 = 0; + u v58 = 0; + u v59 = 0; + u v60 = 0; + u v61 = 0; + u v62 = 0; + u v63 = 0; + u v64 = 0; + u v65 = 0; + u v66 = 0; + u v67 = 0; + u v68 = 0; + u v69 = 0; + u v70 = 0; + u v71 = 0; + u v72 = 0; + u v73 = 0; + u v74 = 0; + u v75 = 0; + u v76 = 0; + u v77 = 0; + u v78 = 0; + u v79 = 0; + u v80 = 0; + u v81 = 0; + u v82 = 0; + u v83 = 0; + u v84 = 0; + u v85 = 0; + u v86 = 0; + u v87 = 0; + u v88 = 0; + u v89 = 0; + u v90 = 0; + u v91 = 0; + u v92 = 0; + u v93 = 0; + u v94 = 0; + u v95 = 0; + u v96 = 0; + u v97 = 0; + u v98 = 0; + u v99 = 0; + u v100 = 0; + u v101 = 0; + u v102 = 0; + u v103 = 0; + u v104 = 0; + u v105 = 0; + u v106 = 0; + u v107 = 0; + u v108 = 0; + u v109 = 0; + u v110 = 0; + u v111 = 0; + u v112 = 0; + u v113 = 0; + u v114 = 0; + u v115 = 0; + u v116 = 0; + u v117 = 0; + u v118 = 0; + u v119 = 0; + u v120 = 0; + u v121 = 0; + u v122 = 0; + u v123 = 0; + u v124 = 0; + u v125 = 0; + u v126 = 0; + u v127 = 0; + u v128 = 0; + u v129 = 0; + u v130 = 0; + u v131 = 0; + u v132 = 0; + v2 = (u)zstrcmp; + v3 = *(u*)(vd + 32UL); + v4 = (u)"syscall"; + v5 = ((u(*)())v2)(v3, v4); + if (v5 != 0UL) goto b3; + v6 = (u)zfputs; + v7 = *(u*)(vc + 72UL); + v8 = (u)"/* no glue for syscall using stdlib */\012"; + v9 = ((u(*)())v6)(v7, v8); + v9; +b1: return 0UL; +b3: v10 = (u)zstrcmp; + v11 = *(u*)(vd + 32UL); + v12 = (u)"_start"; + v13 = ((u(*)())v10)(v11, v12); + if (v13 != 0UL) goto b7; + v14 = (u)zfputs; + v15 = *(u*)(vc + 72UL); + v16 = (u)"/* no glue for _start using stdlib */\012"; + v17 = ((u(*)())v14)(v15, v16); + v17; + goto b1; +b7: v18 = (u)zstrcmp; + v19 = *(u*)(vd + 32UL); + v20 = (u)"exit"; + v21 = ((u(*)())v18)(v19, v20); + if (v21 != 0UL) goto b11; + v22 = (u)zfputs; + v23 = *(u*)(vc + 72UL); + v24 = (u)"u zexit(u vn) {\012"; + v25 = ((u(*)())v22)(v23, v24); + v25; + v26 = (u)zfputs; + v27 = *(u*)(vc + 72UL); + v28 = (u)"\011exit((int)vn);\012"; + v29 = ((u(*)())v26)(v27, v28); + v29; + v30 = (u)zfputs; + v31 = *(u*)(vc + 72UL); + v32 = (u)"}\012"; + v33 = ((u(*)())v30)(v31, v32); + v33; + goto b1; +b11: v34 = (u)zstrcmp; + v35 = *(u*)(vd + 32UL); + v36 = (u)"read"; + v37 = ((u(*)())v34)(v35, v36); + if (v37 != 0UL) goto b17; + v38 = (u)zfputs; + v39 = *(u*)(vc + 72UL); + v40 = (u)"u zread(u vfd, u vbuf, u vn) {\012"; + v41 = ((u(*)())v38)(v39, v40); + v41; + v42 = (u)zfputs; + v43 = *(u*)(vc + 72UL); + v44 = (u)"\011return (u)read((int)vfd, (void*)vbuf, (unsigned long)vn);\012"; + v45 = ((u(*)())v42)(v43, v44); + v45; + v46 = (u)zfputs; + v47 = *(u*)(vc + 72UL); + v48 = (u)"}\012"; + v49 = ((u(*)())v46)(v47, v48); + v49; + goto b1; +b17: v50 = (u)zstrcmp; + v51 = *(u*)(vd + 32UL); + v52 = (u)"write"; + v53 = ((u(*)())v50)(v51, v52); + if (v53 != 0UL) goto b23; + v54 = (u)zfputs; + v55 = *(u*)(vc + 72UL); + v56 = (u)"u zwrite(u vfd, u vbuf, u vn) {\012"; + v57 = ((u(*)())v54)(v55, v56); + v57; + v58 = (u)zfputs; + v59 = *(u*)(vc + 72UL); + v60 = (u)"\011return (u)write((int)vfd, (void*)vbuf, (unsigned long)vn);\012"; + v61 = ((u(*)())v58)(v59, v60); + v61; + v62 = (u)zfputs; + v63 = *(u*)(vc + 72UL); + v64 = (u)"}\012"; + v65 = ((u(*)())v62)(v63, v64); + v65; + goto b1; +b23: v66 = (u)zstrcmp; + v67 = *(u*)(vd + 32UL); + v68 = (u)"mmap"; + v69 = ((u(*)())v66)(v67, v68); + if (v69 != 0UL) goto b29; + v70 = (u)zfputs; + v71 = *(u*)(vc + 72UL); + v72 = (u)"u zmmap(u vaddr, u vlen, u vprot, u vflags, u vfd, u voff) {\012"; + v73 = ((u(*)())v70)(v71, v72); + v73; + v74 = (u)zfputs; + v75 = *(u*)(vc + 72UL); + v76 = (u)"\011return (u)mmap((void*)vaddr, (unsigned long)vlen, (int)vprot, (int)vflags, (int)vfd, (long)voff);\012"; + v77 = ((u(*)())v74)(v75, v76); + v77; + v78 = (u)zfputs; + v79 = *(u*)(vc + 72UL); + v80 = (u)"}\012"; + v81 = ((u(*)())v78)(v79, v80); + v81; + goto b1; +b29: v82 = (u)zstrcmp; + v83 = *(u*)(vd + 32UL); + v84 = (u)"close"; + v85 = ((u(*)())v82)(v83, v84); + if (v85 != 0UL) goto b35; + v86 = (u)zfputs; + v87 = *(u*)(vc + 72UL); + v88 = (u)"u zclose(u vfd) {\012"; + v89 = ((u(*)())v86)(v87, v88); + v89; + v90 = (u)zfputs; + v91 = *(u*)(vc + 72UL); + v92 = (u)"\011return (u)close((int)vfd);\012"; + v93 = ((u(*)())v90)(v91, v92); + v93; + v94 = (u)zfputs; + v95 = *(u*)(vc + 72UL); + v96 = (u)"}\012"; + v97 = ((u(*)())v94)(v95, v96); + v97; + goto b1; +b35: v98 = (u)zstrcmp; + v99 = *(u*)(vd + 32UL); + v100 = (u)"unlink"; + v101 = ((u(*)())v98)(v99, v100); + if (v101 != 0UL) goto b41; + v102 = (u)zfputs; + v103 = *(u*)(vc + 72UL); + v104 = (u)"u zunlink(u vname) {\012"; + v105 = ((u(*)())v102)(v103, v104); + v105; + v106 = (u)zfputs; + v107 = *(u*)(vc + 72UL); + v108 = (u)"\011return (u)unlink((char *)vname);\012"; + v109 = ((u(*)())v106)(v107, v108); + v109; + v110 = (u)zfputs; + v111 = *(u*)(vc + 72UL); + v112 = (u)"}\012"; + v113 = ((u(*)())v110)(v111, v112); + v113; + goto b1; +b41: v114 = (u)zstrcmp; + v115 = *(u*)(vd + 32UL); + v116 = (u)"open"; + v117 = ((u(*)())v114)(v115, v116); + if (v117 != 0UL) goto b47; + v118 = (u)zfputs; + v119 = *(u*)(vc + 72UL); + v120 = (u)"u zopen(u vname, u vflags, u vmode) {\012"; + v121 = ((u(*)())v118)(v119, v120); + v121; + v122 = (u)zfputs; + v123 = *(u*)(vc + 72UL); + v124 = (u)"\011return (u)open((char *)vname, (int)vflags, (int)vmode);\012"; + v125 = ((u(*)())v122)(v123, v124); + v125; + v126 = (u)zfputs; + v127 = *(u*)(vc + 72UL); + v128 = (u)"}\012"; + v129 = ((u(*)())v126)(v127, v128); + v129; + goto b1; +b47: v130 = (u)zdie; + v131 = (u)"unimplemented stdlib glue"; + v132 = ((u(*)())v130)(v131); + v132; + goto b1; +} u zircstr(u vc, u vs, u vn) { u vi = 0; u vch = 0; @@ -35263,7 +35637,7 @@ b7: v3 = 1UL; goto b8; } u zlalr_alt_nonterminal(u vlc, u va, u vs) { - u vuse[9] = {0}; + u vuse[10] = {0}; u vi = 0; u v5 = 0; u v6 = 0; @@ -35909,7 +36283,7 @@ b18: vi = vi + 1UL; b20: goto b18; } u zlalr_compiler(u vc, u vpn, u verr) { - u v_lc[16] = {0}; + u v_lc[17] = {0}; u vlc = 0; u v5 = 0; u v6 = 0; @@ -36045,7 +36419,7 @@ b7: v7 = 1UL; } u zlalr_findout(u vlc, u vw, u vsym) { u vd = 0; - u vr[9] = {0}; + u vr[10] = {0}; u vdir = 0; u v6 = 0; u v7 = 0; @@ -36231,7 +36605,7 @@ u zlalr_goto(u vlc, u vi) { u vprod = 0; u valt = 0; u vsym = 0; - u vr[9] = {0}; + u vr[10] = {0}; u vj = 0; u v11 = 0; u v12 = 0; @@ -36390,7 +36764,7 @@ b13: return 0UL; } u zlalr_items(u vlc) { u vi = 0; - u vinit_state[9] = {0}; + u vinit_state[10] = {0}; u v3 = 0; u v4 = 0; u v5 = 0; @@ -36607,7 +36981,7 @@ u zlalr_lookahead(u vlc) { u vqueue = 0; u vw = 0; u vq = 0; - u vr[8] = {0}; + u vr[9] = {0}; u vsym = 0; u vrest_sym = 0; u valt = 0; @@ -37331,12 +37705,12 @@ b10: v39 = (u)zlalr_alt_terminal; v40 = vlc; v41 = va; v42 = *(u*)(vpn + 56UL); - v43 = *(u*)(vv + 192UL); + v43 = *(u*)(vv + 200UL); v44 = ((u(*)())v39)(v40, v41, v42, v43); v44; return 0UL; b12: goto b10; -b14: if (!*(u*)(vv + 184UL)) goto b22; +b14: if (!*(u*)(vv + 192UL)) goto b22; v23 = 0UL; b23: if (!v23) goto b20; v21 = 1UL; @@ -37561,8 +37935,8 @@ u zlayout_struct(u vc, u vd) { u v27 = 0; u v28 = 0; u v29 = 0; - if (!*(u*)(vd + 136UL)) goto b3; - if (*(u*)(vd + 136UL) != 2UL) goto b6; + if (!*(u*)(vd + 144UL)) goto b3; + if (*(u*)(vd + 144UL) != 2UL) goto b6; v7 = (u)zcdie; v8 = vc; v9 = (u)"circular struct definition"; @@ -37570,14 +37944,14 @@ u zlayout_struct(u vc, u vd) { v10; b4: return 0UL; b6: goto b4; -b3: *(u*)(vd + 136UL) = 2UL; - vm = *(u*)(*(u*)(vd + 144UL) + 16UL); +b3: *(u*)(vd + 144UL) = 2UL; + vm = *(u*)(*(u*)(vd + 152UL) + 16UL); voffset = 0UL; b8: if (!vm) goto b14; v11 = 0UL; b15: if (!v11) goto b12; - *(u*)(vd + 128UL) = voffset; - *(u*)(vd + 136UL) = 1UL; + *(u*)(vd + 136UL) = voffset; + *(u*)(vd + 144UL) = 1UL; return 0UL; b12: *(u*)(vc + 24UL) = *(u*)(*(u*)(vm + 8UL) + 24UL); *(u*)(vc + 32UL) = *(u*)(*(u*)(vm + 8UL) + 32UL); @@ -37595,15 +37969,15 @@ b12: *(u*)(vc + 24UL) = *(u*)(*(u*)(vm + 8UL) + 24UL); v20 = 1UL; v21 = ((u(*)())v16)(v17, v18, v19, v20); vmd = v21; - if (!*(u*)(vd + 160UL)) goto b20; + if (!*(u*)(vd + 168UL)) goto b20; v22 = (u)zcdie; v23 = vc; v24 = (u)"duplicate member"; v25 = ((u(*)())v22)(v23, v24); v25; -b18: *(u*)(vmd + 160UL) = 1UL; - *(u*)(vmd + 168UL) = vt; - *(u*)(vmd + 176UL) = voffset; +b18: *(u*)(vmd + 168UL) = 1UL; + *(u*)(vmd + 176UL) = vt; + *(u*)(vmd + 184UL) = voffset; v26 = (u)ztype_sizeof; v27 = vc; v28 = vt; @@ -37645,8 +38019,8 @@ u zlayout_union(u vc, u vd) { u v28 = 0; u v29 = 0; u v30 = 0; - if (!*(u*)(vd + 136UL)) goto b3; - if (*(u*)(vd + 136UL) != 2UL) goto b6; + if (!*(u*)(vd + 144UL)) goto b3; + if (*(u*)(vd + 144UL) != 2UL) goto b6; v8 = (u)zcdie; v9 = vc; v10 = (u)"circular struct definition"; @@ -37654,14 +38028,14 @@ u zlayout_union(u vc, u vd) { v11; b4: return 0UL; b6: goto b4; -b3: *(u*)(vd + 136UL) = 2UL; - vm = *(u*)(*(u*)(vd + 144UL) + 16UL); +b3: *(u*)(vd + 144UL) = 2UL; + vm = *(u*)(*(u*)(vd + 152UL) + 16UL); vsize = 0UL; b8: if (!vm) goto b14; v12 = 0UL; b15: if (!v12) goto b12; - *(u*)(vd + 128UL) = vsize; - *(u*)(vd + 136UL) = 1UL; + *(u*)(vd + 136UL) = vsize; + *(u*)(vd + 144UL) = 1UL; return 0UL; b12: *(u*)(vc + 24UL) = *(u*)(*(u*)(vm + 8UL) + 24UL); *(u*)(vc + 32UL) = *(u*)(*(u*)(vm + 8UL) + 32UL); @@ -37679,15 +38053,15 @@ b12: *(u*)(vc + 24UL) = *(u*)(*(u*)(vm + 8UL) + 24UL); v21 = 1UL; v22 = ((u(*)())v17)(v18, v19, v20, v21); vmd = v22; - if (!*(u*)(vd + 160UL)) goto b20; + if (!*(u*)(vd + 168UL)) goto b20; v23 = (u)zcdie; v24 = vc; v25 = (u)"duplicate member"; v26 = ((u(*)())v23)(v24, v25); v26; -b18: *(u*)(vmd + 160UL) = 1UL; - *(u*)(vmd + 168UL) = vt; - *(u*)(vmd + 176UL) = 0UL; +b18: *(u*)(vmd + 168UL) = 1UL; + *(u*)(vmd + 176UL) = vt; + *(u*)(vmd + 184UL) = 0UL; v27 = (u)ztype_sizeof; v28 = vc; v29 = vt; @@ -38324,7 +38698,7 @@ u zlexer_action_9(u vctx) { return 9UL; } u zlexer_codegen(u vc, u vd) { - u v_cg[8] = {0}; + u v_cg[9] = {0}; u vcg = 0; u vi = 0; u vch = 0; @@ -39384,7 +39758,7 @@ b6: v11 = (u)znfa_lit; goto b2; } u zlexer_explode(u vc, u vn) { - u v_k[5] = {0}; + u v_k[6] = {0}; u vk = 0; u vret = 0; u v5 = 0; @@ -40735,25 +41109,7 @@ u zmktype_union(u vc, u vst) { return v8; } u zmmap(u vaddr, u vlen, u vprot, u vflags, u vfd, u voff) { - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - u v11 = 0; - u v12 = 0; - u v13 = 0; - u v14 = 0; - v6 = (u)zsyscall; - v7 = 9UL; - v8 = vaddr; - v9 = vlen; - v10 = vprot; - v11 = vflags; - v12 = vfd; - v13 = voff; - v14 = ((u(*)())v6)(v7, v8, v9, v10, v11, v12, v13); - return v14; + return (u)mmap((void*)vaddr, (unsigned long)vlen, (int)vprot, (int)vflags, (int)vfd, (long)voff); } u znext_decl(u vc, u vd) { u v2 = 0; @@ -41405,25 +41761,7 @@ b222: if (vkind != 75UL) goto b225; b225: return (u)"(invalid)"; } u zopen(u vname, u vflags, u vmode) { - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - u v11 = 0; - v3 = (u)zsyscall; - v4 = 2UL; - v5 = vname; - v6 = vflags; - v7 = vmode; - v8 = 0UL; - v9 = 0UL; - v10 = 0UL; - v11 = ((u(*)())v3)(v4, v5, v6, v7, v8, v9, v10); - return v11; + return (u)open((char *)vname, (int)vflags, (int)vmode); } u zopen_call_out(u vc, u vfilename) { u vfd = 0; @@ -44802,7 +45140,7 @@ b41: if (!v40) goto b37; v45 = (u)"unknown struct"; v46 = ((u(*)())v43)(v44, v45); v46; -b35: if (*(u*)(*(u*)(vst + 144UL) + 0UL) != 17UL) goto b52; +b35: if (*(u*)(*(u*)(vst + 152UL) + 0UL) != 17UL) goto b52; v47 = (u)zmktype_struct; v48 = vc; v49 = vst; @@ -44814,7 +45152,7 @@ b52: v51 = (u)zmktype_union; v54 = ((u(*)())v51)(v52, v53); return v54; b37: goto b35; -b39: if (!*(u*)(vst + 120UL)) goto b47; +b39: if (!*(u*)(vst + 128UL)) goto b47; v42 = 0UL; b48: if (!v42) goto b45; v40 = 1UL; @@ -45181,25 +45519,7 @@ b6: *(u*)vtree = vn; b3: goto b1; } u zread(u vfd, u vbuf, u vn) { - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - u v11 = 0; - v3 = (u)zsyscall; - v4 = 0UL; - v5 = vfd; - v6 = vbuf; - v7 = vn; - v8 = 0UL; - v9 = 0UL; - v10 = 0UL; - v11 = ((u(*)())v3)(v4, v5, v6, v7, v8, v9, v10); - return v11; + return (u)read((int)vfd, (void*)vbuf, (unsigned long)vn); } u zreadall(u vfd, u vlen, u va) { u vbuf = 0; @@ -45673,7 +45993,7 @@ b5: v5 = 1UL; goto b6; } u zstmt_to_ir(u vic, u vn) { - u vloopctx[3] = {0}; + u vloopctx[4] = {0}; u vcond_body = 0; u vcond_next = 0; u vcond_out = 0; @@ -46039,6 +46359,7 @@ b1: if ((u)*(b*)(vs + vret * 1UL) != 0UL) goto b5; b5: vret = vret + 1UL; goto b1; } +/* no glue for syscall using stdlib */ u ztype_isint(u vt) { u v1 = 0; if (*(u*)(vt + 0UL) != 2UL) goto b2; @@ -46096,14 +46417,14 @@ b11: if (vkind != 7UL) goto b13; v5 = *(u*)(vt + 8UL); v6 = ((u(*)())v3)(v4, v5); v6; - return *(u*)(*(u*)(vt + 8UL) + 128UL); + return *(u*)(*(u*)(vt + 8UL) + 136UL); b13: if (vkind != 8UL) goto b16; v7 = (u)zlayout_union; v8 = vc; v9 = *(u*)(vt + 8UL); v10 = ((u(*)())v7)(v8, v9); v10; - return *(u*)(*(u*)(vt + 8UL) + 128UL); + return *(u*)(*(u*)(vt + 8UL) + 136UL); b16: v11 = (u)zcdie; v12 = vc; v13 = (u)"sizeof: invalid type"; @@ -47230,7 +47551,7 @@ b71: if (*(u*)(*(u*)(vn + 8UL) + 0UL) != 0UL) goto b77; v91 = ((u(*)())v86)(v87, v88, v89, v90); vv = v91; if (!vv) goto b83; - if (!*(u*)(vv + 184UL)) goto b83; + if (!*(u*)(vv + 192UL)) goto b83; v92 = 1UL; b85: if (!v92) goto b81; v93 = (u)zcdie; @@ -47246,10 +47567,10 @@ b79: v97 = (u)zfind; v102 = ((u(*)())v97)(v98, v99, v100, v101); vv = v102; if (!vv) goto b92; - if (!*(u*)(vv + 200UL)) goto b92; + if (!*(u*)(vv + 208UL)) goto b92; v103 = 1UL; b94: if (!v103) goto b90; - *(u*)(*(u*)(vn + 8UL) + 64UL) = *(u*)(vv + 208UL); + *(u*)(*(u*)(vn + 8UL) + 64UL) = *(u*)(vv + 216UL); b88:b75: if (*(u*)(*(u*)(*(u*)(vn + 8UL) + 64UL) + 0UL) == 6UL) goto b136; v141 = (u)zcdie; v142 = vc; @@ -47396,10 +47717,10 @@ b173: if (!v183) goto b169; v188 = (u)"no such member"; v189 = ((u(*)())v186)(v187, v188); v189; -b167: *(u*)(vn + 64UL) = *(u*)(vv + 168UL); +b167: *(u*)(vn + 64UL) = *(u*)(vv + 176UL); goto b1; b169: goto b167; -b171: if (!*(u*)(vv + 160UL)) goto b179; +b171: if (!*(u*)(vv + 168UL)) goto b179; v185 = 0UL; b180: if (!v185) goto b177; v183 = 1UL; @@ -47442,7 +47763,7 @@ b144: if (vkind != 0UL) goto b183; v195 = ((u(*)())v190)(v191, v192, v193, v194); vv = v195; if (!vv) goto b189; - if (!*(u*)(vv + 184UL)) goto b189; + if (!*(u*)(vv + 192UL)) goto b189; v196 = 1UL; b191: if (!v196) goto b187; v197 = (u)zmktype0; @@ -47459,10 +47780,10 @@ b187: v201 = (u)zfind; v206 = ((u(*)())v201)(v202, v203, v204, v205); vv = v206; if (!vv) goto b198; - if (!*(u*)(vv + 200UL)) goto b198; + if (!*(u*)(vv + 208UL)) goto b198; v207 = 1UL; b200: if (!v207) goto b196; - *(u*)(vn + 64UL) = *(u*)(vv + 208UL); + *(u*)(vn + 64UL) = *(u*)(vv + 216UL); return 0UL; b196: v208 = (u)zfind; v209 = vc; @@ -48915,7 +49236,7 @@ b69: if (!v64) goto b65; v70; b63: goto b7; b65: goto b63; -b67: if (!*(u*)(vv + 216UL)) goto b75; +b67: if (!*(u*)(vv + 224UL)) goto b75; v66 = 0UL; b76: if (!v66) goto b73; v64 = 1UL; @@ -49244,46 +49565,10 @@ b12: v5 = 0UL; goto b14; } u zunlink(u vname) { - u v1 = 0; - u v2 = 0; - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - v1 = (u)zsyscall; - v2 = 87UL; - v3 = vname; - v4 = 0UL; - v5 = 0UL; - v6 = 0UL; - v7 = 0UL; - v8 = 0UL; - v9 = ((u(*)())v1)(v2, v3, v4, v5, v6, v7, v8); - return v9; + return (u)unlink((char *)vname); } u zwrite(u vfd, u vbuf, u vn) { - u v3 = 0; - u v4 = 0; - u v5 = 0; - u v6 = 0; - u v7 = 0; - u v8 = 0; - u v9 = 0; - u v10 = 0; - u v11 = 0; - v3 = (u)zsyscall; - v4 = 1UL; - v5 = vfd; - v6 = vbuf; - v7 = vn; - v8 = 0UL; - v9 = 0UL; - v10 = 0UL; - v11 = ((u(*)())v3)(v4, v5, v6, v7, v8, v9, v10); - return v11; + return (u)write((int)vfd, (void*)vbuf, (unsigned long)vn); } u zwriteout(u vc, u vstart, u vkstart) { u vb = 0; diff --git a/cc1.om b/cc1.om @@ -375,6 +375,14 @@ func defextern(c: *compiler, n: *node): *decl { d = find(c, name, nil, 1); + // TODO This is a quick hack but it's short. + // Mark functions in syscall.om as coming from stdlib + // This changes the behavior of ircout to link to libc + // for these functions. + if strcmp(n.filename, "syscall.om") == 0 { + d.func_stdlib = 1; + } + if d.func_defined { unify(c, d.func_type, t); return d; diff --git a/decl.om b/decl.om @@ -14,6 +14,7 @@ struct decl { func_used: int; func_def: *node; func_ir: *irfunc; + func_stdlib: int; struct_defined: int; struct_size: int; diff --git a/ircout.om b/ircout.om @@ -19,10 +19,8 @@ func ircout(c: *compiler) { d = next_decl(c, d); } - // Real entry point to translated entry point - fputs(c.cout, "s syscall();\n"); - fputs(c.cout, "int main(int argc, char**argv) { return z_start((u)argc, (u)argv, 0); }\n"); - fputs(c.cout, "u zsyscall(u n, u a, u b, u c, u d, u e, u f) { return syscall(n, a, b, c, d, e, f); }\n"); + // Emit stdlib declarations + ircdeclstdlib(c); // Define used functions d = first_decl(c); @@ -41,6 +39,59 @@ func ircout(c: *compiler) { fflush(c.cout); } +func ircdeclstdlib(c: *compiler) { + fputs(c.cout, "extern u syscall();\n"); + fputs(c.cout, "extern void exit();\n"); + fputs(c.cout, "extern s read();\n"); + fputs(c.cout, "extern s write();\n"); + fputs(c.cout, "extern u mmap();\n"); + fputs(c.cout, "extern int close();\n"); + fputs(c.cout, "extern int unlink();\n"); + fputs(c.cout, "extern int open();\n"); + fputs(c.cout, "extern char **environ;\n"); + fputs(c.cout, "int main(int argc, char**argv) {\n"); + fputs(c.cout, "\treturn zmain((u)argc, (u)argv, (u)environ);\n"); + fputs(c.cout, "}\n"); +} + +func ircstdlib(c: *compiler, d: *decl) { + if strcmp(d.name, "syscall") == 0 { + fputs(c.cout, "/* no glue for syscall using stdlib */\n"); + } else if strcmp(d.name, "_start") == 0 { + fputs(c.cout, "/* no glue for _start using stdlib */\n"); + } else if strcmp(d.name, "exit") == 0 { + fputs(c.cout, "u zexit(u vn) {\n"); + fputs(c.cout, "\texit((int)vn);\n"); + fputs(c.cout, "}\n"); + } else if strcmp(d.name, "read") == 0 { + fputs(c.cout, "u zread(u vfd, u vbuf, u vn) {\n"); + fputs(c.cout, "\treturn (u)read((int)vfd, (void*)vbuf, (unsigned long)vn);\n"); + fputs(c.cout, "}\n"); + } else if strcmp(d.name, "write") == 0 { + fputs(c.cout, "u zwrite(u vfd, u vbuf, u vn) {\n"); + fputs(c.cout, "\treturn (u)write((int)vfd, (void*)vbuf, (unsigned long)vn);\n"); + fputs(c.cout, "}\n"); + } else if strcmp(d.name, "mmap") == 0 { + fputs(c.cout, "u zmmap(u vaddr, u vlen, u vprot, u vflags, u vfd, u voff) {\n"); + fputs(c.cout, "\treturn (u)mmap((void*)vaddr, (unsigned long)vlen, (int)vprot, (int)vflags, (int)vfd, (long)voff);\n"); + fputs(c.cout, "}\n"); + } else if strcmp(d.name, "close") == 0 { + fputs(c.cout, "u zclose(u vfd) {\n"); + fputs(c.cout, "\treturn (u)close((int)vfd);\n"); + fputs(c.cout, "}\n"); + } else if strcmp(d.name, "unlink") == 0 { + fputs(c.cout, "u zunlink(u vname) {\n"); + fputs(c.cout, "\treturn (u)unlink((char *)vname);\n"); + fputs(c.cout, "}\n"); + } else if strcmp(d.name, "open") == 0 { + fputs(c.cout, "u zopen(u vname, u vflags, u vmode) {\n"); + fputs(c.cout, "\treturn (u)open((char *)vname, (int)vflags, (int)vmode);\n"); + fputs(c.cout, "}\n"); + } else { + die("unimplemented stdlib glue"); + } +} + func ircdecl(c: *compiler, ic: *irfunc) { var i: int; var iv: *irvar; @@ -91,6 +142,11 @@ func ircdefine(c: *compiler, d: *decl) { var size: int; var id: int; + if d.func_stdlib { + ircstdlib(c, d); + return; + } + ic = d.func_ir; if !ic { return;