From 3cd04b7ea9e7d33ec6b50524f97ada82ecdfebbe Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 17 Apr 2026 21:21:55 +0200 Subject: support extern inline "definitions" --- src/ir_inliner.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'src/ir_inliner.c') diff --git a/src/ir_inliner.c b/src/ir_inliner.c index c3ebab4..ad7c680 100644 --- a/src/ir_inliner.c +++ b/src/ir_inliner.c @@ -26,12 +26,14 @@ maybeinlinee(Function *fn) { extern int ninstrtab, nfreeinstr; - // TODO better heuristics - if (ccopt.o < OPT1) return 0; - if (!(fn->inlin || (ccopt.o >= OPT2))) return 0; - if (ninstrtab - nfreeinstr > MAX_INLINED_FN_NINS) return 0; - if (fn->nblk > MAX_INLINED_FN_NBLK) return 0; - if (fn->nabiret > 1) return 0; /* TODO 2reg scalar return */ + if (!(fn->inlin && fn->globl)) { + // TODO better heuristics + if (ccopt.o < OPT1) return 0; + if (!(fn->inlin || (ccopt.o >= OPT2))) return 0; + if (ninstrtab - nfreeinstr > MAX_INLINED_FN_NINS) return 0; + if (fn->nblk > MAX_INLINED_FN_NBLK) return 0; + if (fn->nabiret > 1) return 0; /* TODO 2reg scalar return */ + } if (!savearena) { enum { N = 1<<12 }; @@ -51,7 +53,9 @@ maybeinlinee(Function *fn) sv->nabiarg = fn->nabiarg; sv->nabiret = fn->nabiret; memcpy(sv->abiret, fn->abiret, sizeof sv->abiret); - Block *bmap[MAX_INLINED_FN_NBLK]; + Block *_bmap[MAX_INLINED_FN_NBLK], + **bmap = fn->nblk < MAX_INLINED_FN_NBLK + ? _bmap : alloc(&savearena, fn->nblk * sizeof *bmap, 0); Block *b = fn->entry; int id = 0; do { -- cgit v1.2.3