commit bbb46f48f0edd74cdc9ecc2310a20c7c31d7072d
parent c78d6b84c9732f62dd0076445727d5807ae1944e
Author: erai <erai@omiltem.net>
Date: Wed, 7 May 2025 14:05:35 -0400
use libc for bootstrap
Diffstat:
M | cc0.c | | | 1379 | ++++++++++++++++++++++++++++++++++++++++++++++++------------------------------- |
M | cc1.om | | | 8 | ++++++++ |
M | decl.om | | | 1 | + |
M | ircout.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;