From a8d6f8bf30c07edb775e56889f568ca20240bedf Mon Sep 17 00:00:00 2001 From: lemon Date: Tue, 17 Mar 2026 13:22:00 +0100 Subject: REFACTOR: move sources to src/ --- src/ir_stack.c | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/ir_stack.c (limited to 'src/ir_stack.c') diff --git a/src/ir_stack.c b/src/ir_stack.c new file mode 100644 index 0000000..40a7b1d --- /dev/null +++ b/src/ir_stack.c @@ -0,0 +1,33 @@ +#include "ir.h" + +void +lowerstack(struct function *fn) +{ + fn->stksiz = 0; + FREQUIRE(FNUSE); + + struct block *blk = fn->entry; + do { + for (int i = 0; i < blk->ins.n; ++i) { + int t = blk->ins.p[i]; + struct instr *ins = &instrtab[t]; + if (oisalloca(ins->op)) { + uint alignlog2 = ins->op - Oalloca1; + assert(ins->l.i > 0); + uint siz = ins->l.i << alignlog2; + fn->stksiz += siz; + fn->stksiz = alignup(fn->stksiz, 1 << alignlog2); + if (fn->stksiz > (1<<20)-1) error(NULL, "'%s' stack frame too big", fn->name); + *ins = mkinstr(Onop,0,); + replcuses(mkref(RTMP, t), mkref(RSTACK, fn->stksiz)); + } + } + } while ((blk = blk->lnext) != fn->entry); + + if (ccopt.dbg.s) { + bfmt(ccopt.dbgout, "<< After stack >>\n"); + irdump(fn); + } +} + +/* vim:set ts=3 sw=3 expandtab: */ -- cgit v1.2.3