aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ir_inliner.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-04-17 21:21:55 +0200
committerlemon <lsof@mailbox.org>2026-04-17 21:21:55 +0200
commit3cd04b7ea9e7d33ec6b50524f97ada82ecdfebbe (patch)
treefa7898bf7da28689244daa4e8b534574b8ca4c83 /src/ir_inliner.c
parent8a78aee7e3d55399d9de3086632bb367c4bea676 (diff)
support extern inline "definitions"
Diffstat (limited to 'src/ir_inliner.c')
-rw-r--r--src/ir_inliner.c18
1 files changed, 11 insertions, 7 deletions
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 {