diff options
| author | 2026-04-17 21:21:55 +0200 | |
|---|---|---|
| committer | 2026-04-17 21:21:55 +0200 | |
| commit | 3cd04b7ea9e7d33ec6b50524f97ada82ecdfebbe (patch) | |
| tree | fa7898bf7da28689244daa4e8b534574b8ca4c83 /src | |
| parent | 8a78aee7e3d55399d9de3086632bb367c4bea676 (diff) | |
support extern inline "definitions"
Diffstat (limited to 'src')
| -rw-r--r-- | src/c.c | 1 | ||||
| -rw-r--r-- | src/ir.c | 1 | ||||
| -rw-r--r-- | src/ir_inliner.c | 18 |
3 files changed, 12 insertions, 8 deletions
@@ -5000,7 +5000,6 @@ tldecl(CComp *cm) decl.isdef = 1; int idecl = putdecl(cm, &decl); Decl *d = &declsbuf.p[idecl]; - if (d->inlin && decl.scls != SCSTATIC) fatal(&d->span, "non-static inline is unimplemented"); Function fn = { &cm->fnarena, .name = d->sym, .globl = d->scls != SCSTATIC, .fnty = decl.ty, .retty = td->ret, .inlin = d->inlin }; irinit(&fn); function(cm, &fn, st.pnames, st.pspans, st.pqual); @@ -697,6 +697,7 @@ irfini(Function *fn) freearena(fn->passarena); return; } + assert(!(fn->globl && fn->inlin /* extern inline */)); irfini_end(fn); } 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 { |