From 3c298797556f7595d83f8296bd2ecb08c38dcd5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Fri, 12 Jun 2026 11:24:50 -0600 Subject: [PATCH 1/5] remove result --- result | 1 - 1 file changed, 1 deletion(-) delete mode 120000 result diff --git a/result b/result deleted file mode 120000 index 3e48ba1..0000000 --- a/result +++ /dev/null @@ -1 +0,0 @@ -/nix/store/662p38x2aqlrk0hnx0nskcj4100as900-qbe-git \ No newline at end of file -- 2.53.0 From 4f12bcc476a5f42c1685b9727e28014024a916dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Thu, 11 Jun 2026 11:57:17 -0600 Subject: [PATCH 2/5] idk --- .dir-locals.el | 2 ++ all.h | 1 + parse.c | 8 ++++++++ test/tail.ssa | 8 ++++++++ 4 files changed, 19 insertions(+) create mode 100644 .dir-locals.el create mode 100644 test/tail.ssa diff --git a/.dir-locals.el b/.dir-locals.el new file mode 100644 index 0000000..b12eab1 --- /dev/null +++ b/.dir-locals.el @@ -0,0 +1,2 @@ +((c-mode . ((tab-width . 4) + (indent-tabs-mode . t)))) diff --git a/all.h b/all.h index 7e67bc0..5d352b6 100644 --- a/all.h +++ b/all.h @@ -160,6 +160,7 @@ enum J { X(retw) X(retl) X(rets) X(retd) \ X(retsb) X(retub) X(retsh) X(retuh) \ X(retc) X(ret0) X(jmp) X(jnz) \ + X(tail) \ X(jfieq) X(jfine) X(jfisge) X(jfisgt) \ X(jfisle) X(jfislt) X(jfiuge) X(jfiugt) \ X(jfiule) X(jfiult) X(jffeq) X(jffge) \ diff --git a/parse.c b/parse.c index 5d8d039..4042172 100644 --- a/parse.c +++ b/parse.c @@ -53,6 +53,7 @@ enum Token { Tphi, Tjmp, Tjnz, + Ttail, Tret, Thlt, Texport, @@ -113,6 +114,7 @@ static char *kwmap[Ntok] = { [Tphi] = "phi", [Tjmp] = "jmp", [Tjnz] = "jnz", + [Ttail] = "tail", [Tret] = "ret", [Thlt] = "hlt", [Texport] = "export", @@ -664,6 +666,9 @@ parseline(PState ps) curb->jmp.arg = r; } goto Close; + case Ttail: + curb->jmp.type = Jtail; + goto Close; case Tjmp: curb->jmp.type = Jjmp; goto Jump; @@ -1434,6 +1439,9 @@ printfn(Fn *fn, FILE *f) if (b->s1 != b->link) fprintf(f, "\tjmp @%s\n", b->s1->name); break; + case Jtail: + fprintf (f, "\ttail\n"); + break; default: fprintf(f, "\t%s ", jtoa[b->jmp.type]); if (b->jmp.type == Jjnz) { diff --git a/test/tail.ssa b/test/tail.ssa new file mode 100644 index 0000000..35534ed --- /dev/null +++ b/test/tail.ssa @@ -0,0 +1,8 @@ +function w $factorial (w %n, w %acc) { +@start + jnz %n, @z, @nz +@z + ret %acc +@nz + tail +} \ No newline at end of file -- 2.53.0 From a9aca0f00bbd8cf9b284957b7a8f5894919847f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Thu, 11 Jun 2026 12:38:01 -0600 Subject: [PATCH 3/5] idk --- parse.c | 9 +++++++-- test/tail.ssa | 4 +++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/parse.c b/parse.c index 4042172..957949b 100644 --- a/parse.c +++ b/parse.c @@ -53,7 +53,7 @@ enum Token { Tphi, Tjmp, Tjnz, - Ttail, + Ttail, Tret, Thlt, Texport, @@ -668,6 +668,10 @@ parseline(PState ps) goto Close; case Ttail: curb->jmp.type = Jtail; + curb->jmp.arg = parseref (); + /* Ins *restore = curi; */ + parserefl(1); + /* curi = restore; */ goto Close; case Tjmp: curb->jmp.type = Jjmp; @@ -1440,7 +1444,8 @@ printfn(Fn *fn, FILE *f) fprintf(f, "\tjmp @%s\n", b->s1->name); break; case Jtail: - fprintf (f, "\ttail\n"); + fprintf (f, "\ttail "); + printref (b->jmp.arg, fn, f); break; default: fprintf(f, "\t%s ", jtoa[b->jmp.type]); diff --git a/test/tail.ssa b/test/tail.ssa index 35534ed..17d254b 100644 --- a/test/tail.ssa +++ b/test/tail.ssa @@ -4,5 +4,7 @@ function w $factorial (w %n, w %acc) { @z ret %acc @nz - tail + %n_next =w sub %n, 1 + %acc_next =w mul %n, %acc + tail $factorial (w %n_next, w %acc) } \ No newline at end of file -- 2.53.0 From 30e73fcba17ba0cbb97357774da69bb1b03eab5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Fri, 12 Jun 2026 11:19:34 -0600 Subject: [PATCH 4/5] idk --- main.c | 1 + parse.c | 1 + 2 files changed, 2 insertions(+) diff --git a/main.c b/main.c index c413dc2..b611667 100644 --- a/main.c +++ b/main.c @@ -60,6 +60,7 @@ func(Fn *fn) if (debug['P']) { fprintf(stderr, "\n> After parsing:\n"); printfn(fn, stderr); + exit (1); } T.abi0(fn); fillcfg(fn); diff --git a/parse.c b/parse.c index 957949b..a099ef0 100644 --- a/parse.c +++ b/parse.c @@ -1446,6 +1446,7 @@ printfn(Fn *fn, FILE *f) case Jtail: fprintf (f, "\ttail "); printref (b->jmp.arg, fn, f); + fprintf (f, "%d (%d)", i->op, Oarg); break; default: fprintf(f, "\t%s ", jtoa[b->jmp.type]); -- 2.53.0 From c051b402dd577541048bf734f9c7f4a016ee811d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Fri, 12 Jun 2026 13:28:10 -0600 Subject: [PATCH 5/5] exits successfully lol --- .gitignore | 3 ++- all.h | 5 ++--- amd64/isel.c | 3 ++- amd64/sysv.c | 14 ++++++++++---- dump-enums.c | 0 flake.nix | 6 +----- main.c | 2 +- parse.c | 2 +- test/call-factorial.ssa | 11 +++++++++++ test/tail.ssa | 2 +- util.c | 9 +++++++-- 11 files changed, 38 insertions(+), 19 deletions(-) create mode 100644 dump-enums.c create mode 100644 test/call-factorial.ssa diff --git a/.gitignore b/.gitignore index 9050e80..c0e0ed1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ config.h *~ .direnv result -.cache \ No newline at end of file +.cache +.fuse_hidden* diff --git a/all.h b/all.h index 5d352b6..078c1a0 100644 --- a/all.h +++ b/all.h @@ -159,13 +159,12 @@ enum J { #define JMPS(X) \ X(retw) X(retl) X(rets) X(retd) \ X(retsb) X(retub) X(retsh) X(retuh) \ - X(retc) X(ret0) X(jmp) X(jnz) \ - X(tail) \ + X(retc) X(ret0) X(jmp) X(jnz) \ X(jfieq) X(jfine) X(jfisge) X(jfisgt) \ X(jfisle) X(jfislt) X(jfiuge) X(jfiugt) \ X(jfiule) X(jfiult) X(jffeq) X(jffge) \ X(jffgt) X(jffle) X(jfflt) X(jffne) \ - X(jffo) X(jffuo) X(hlt) + X(jffo) X(jffuo) X(hlt) X(tail) #define X(j) J##j, JMPS(X) #undef X diff --git a/amd64/isel.c b/amd64/isel.c index 379244a..7201b09 100644 --- a/amd64/isel.c +++ b/amd64/isel.c @@ -602,7 +602,8 @@ seljmp(Blk *b, Fn *fn) if (b->jmp.type == Jret0 || b->jmp.type == Jjmp - || b->jmp.type == Jhlt) + || b->jmp.type == Jhlt + || b->jmp.type == Jtail) return; assert(b->jmp.type == Jjnz); r = b->jmp.arg; diff --git a/amd64/sysv.c b/amd64/sysv.c index 68f548c..da78cd9 100644 --- a/amd64/sysv.c +++ b/amd64/sysv.c @@ -167,7 +167,7 @@ argsclass(Ins *i0, Ins *i1, AClass *ac, int op, AClass *aret, Ref *env) nsse = 8; varc = 0; envc = 0; - for (i=i0, a=ac; iop - op + Oarg) { case Oarg: if (KBASE(i->cls) == 0) @@ -211,8 +211,9 @@ argsclass(Ins *i0, Ins *i1, AClass *ac, int op, AClass *aret, Ref *env) varc = 1; break; default: - die("unreachable"); + die("218 unreachable"); } + } if (varc && envc) err("sysv abi does not support variadic env calls"); @@ -686,7 +687,7 @@ amd64_sysv_abi(Fn *fn) continue; curi = &insb[NIns]; selret(b, fn); - for (i=&b->ins[b->nins]; i!=b->ins;) + for (i=&b->ins[b->nins]; i!=b->ins;) { switch ((--i)->op) { default: emiti(*i); @@ -706,8 +707,13 @@ amd64_sysv_abi(Fn *fn) break; case Oarg: case Oargc: - die("unreachable"); + if (b->jmp.type != Jtail) { + die("710 unreachable"); + } else { + + } } + } if (b == fn->start) for (; ral; ral=ral->link) emiti(ral->i); diff --git a/dump-enums.c b/dump-enums.c new file mode 100644 index 0000000..e69de29 diff --git a/flake.nix b/flake.nix index d8ff59a..992e1e4 100644 --- a/flake.nix +++ b/flake.nix @@ -34,12 +34,8 @@ gcc clang-analyzer clang-tools + gdbgui ]; - # shellHook = '' - # [[ ! -z "$LD_LIBRARY_PATH" ]] \ - # && export LD_LIBRARY_PATH=:$LD_LIBRARY_PATH - # export LD_LIBRARY_PATH="${self.packages.${system}.default.libllvm.lib}/lib$LD_LIBRARY_PATH" - # ''; }; }); }; diff --git a/main.c b/main.c index b611667..1afdfec 100644 --- a/main.c +++ b/main.c @@ -17,6 +17,7 @@ char debug['Z'+1] = { ['L'] = 0, /* liveness */ ['S'] = 0, /* spilling */ ['R'] = 0, /* reg. allocation */ + ['E'] = 0, /* enums */ }; extern Target T_amd64_sysv; @@ -60,7 +61,6 @@ func(Fn *fn) if (debug['P']) { fprintf(stderr, "\n> After parsing:\n"); printfn(fn, stderr); - exit (1); } T.abi0(fn); fillcfg(fn); diff --git a/parse.c b/parse.c index a099ef0..799c427 100644 --- a/parse.c +++ b/parse.c @@ -1446,7 +1446,7 @@ printfn(Fn *fn, FILE *f) case Jtail: fprintf (f, "\ttail "); printref (b->jmp.arg, fn, f); - fprintf (f, "%d (%d)", i->op, Oarg); + fprintf (f, "\n"); break; default: fprintf(f, "\t%s ", jtoa[b->jmp.type]); diff --git a/test/call-factorial.ssa b/test/call-factorial.ssa new file mode 100644 index 0000000..70c3598 --- /dev/null +++ b/test/call-factorial.ssa @@ -0,0 +1,11 @@ +function w $factorial (w %n, w %acc) { +@start + jnz %n, @nz, @z +@z + ret %acc +@nz + %n_next =w sub %n, 1 + %acc_next =w mul %n, %acc + %r =w call $factorial (w %n_next, w %acc) + ret %r +} \ No newline at end of file diff --git a/test/tail.ssa b/test/tail.ssa index 17d254b..44c6b6b 100644 --- a/test/tail.ssa +++ b/test/tail.ssa @@ -1,6 +1,6 @@ function w $factorial (w %n, w %acc) { @start - jnz %n, @z, @nz + jnz %n, @nz, @z @z ret %acc @nz diff --git a/util.c b/util.c index 00bd92b..8ba30d0 100644 --- a/util.c +++ b/util.c @@ -261,6 +261,7 @@ igroup(Blk *b, Ins *i, Ins **i0, Ins **i1) ib = b->ins; ie = ib + b->nins; + switch (i->op) { case Oblit0: *i0 = i; @@ -285,8 +286,12 @@ igroup(Blk *b, Ins *i, Ins **i0, Ins **i1) *i0 = i; for (; iop != Ocall; i++) ; - assert(i < ie); - *i1 = i + 1; + if (b->jmp.type == Jtail) { + *i1 = ie; + } else { + assert(i < ie); + *i1 = i + 1; + } return; case Osel1: for (; i>ib && (i-1)->op == Osel1; i--) -- 2.53.0