aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/c.c1
-rw-r--r--src/ir.c1
-rw-r--r--src/ir_inliner.c18
3 files changed, 12 insertions, 8 deletions
diff --git a/src/c.c b/src/c.c
index 20c53ff..0715a76 100644
--- a/src/c.c
+++ b/src/c.c
@@ -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);
diff --git a/src/ir.c b/src/ir.c
index 4639b86..af54d3c 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -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 {