aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/ir.c
diff options
context:
space:
mode:
authorlemon <lsof@mailbox.org>2026-03-23 23:38:53 +0100
committerlemon <lsof@mailbox.org>2026-03-23 23:43:52 +0100
commit62d995124c0cc2eaeec79e18edc3e044f3e524c9 (patch)
tree4c79a80efca09f8050109aa0440ec75351d72c17 /src/ir.c
parent8630aeb8b43c507cd00f5b091ddcee4def464f4d (diff)
IR: emit inline function standalone bodies lazily
If a function is stashed for inlining and inlined in all of its callsites or unused, it never ends up in the object file. If any symbol reference to it is emitted, then it must be de-inlined (rematerialized), and this is done near the end before emitting the actual object file.
Diffstat (limited to 'src/ir.c')
-rw-r--r--src/ir.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/ir.c b/src/ir.c
index 4f3a43d..f515adb 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -688,8 +688,16 @@ irfini(Function *fn)
freearena(fn->passarena);
}
if (maybeinlinee(fn)) {
- // goto Fin; XXX do this by having inline function rematerialization when symbol is actually referenced
+ freearena(fn->passarena);
+ return;
}
+
+ irfini_end(fn);
+}
+
+void
+irfini_end(Function *fn)
+{
lowerstack(fn);
freearena(fn->passarena);
if (ccopt.dbg.o) {
@@ -702,7 +710,6 @@ irfini(Function *fn)
if (objout.code)
mctarg->emit(fn);
-//Fin:
freearena(fn->passarena);
freefn(fn);
}