Skip to content

Commit d762ef8

Browse files
committed
Finish deferred IR after optimization.
1 parent 1f1790f commit d762ef8

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/driver.jl

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,10 @@ const __llvm_initialized = Ref(false)
257257
# deferred code generation
258258
do_deferred_codegen = !only_entry && deferred_codegen &&
259259
haskey(functions(ir), "deferred_codegen")
260+
deferred_jobs = Dict{CompilerJob, String}(job => entry_fn)
260261
if do_deferred_codegen
261262
dyn_marker = functions(ir)["deferred_codegen"]
262263

263-
cache = Dict{CompilerJob, String}(job => entry_fn)
264-
265264
# iterative compilation (non-recursive)
266265
changed = true
267266
while changed
@@ -286,7 +285,7 @@ const __llvm_initialized = Ref(false)
286285
# compile and link
287286
for dyn_job in keys(worklist)
288287
# cached compilation
289-
dyn_entry_fn = get!(cache, dyn_job) do
288+
dyn_entry_fn = get!(deferred_jobs, dyn_job) do
290289
dyn_ir, dyn_meta = codegen(:llvm, dyn_job; optimize=false,
291290
deferred_codegen=false, parent_job=job, ctx)
292291
dyn_entry_fn = LLVM.name(dyn_meta.entry)
@@ -372,7 +371,18 @@ const __llvm_initialized = Ref(false)
372371
end
373372
end
374373

375-
entry = finish_ir!(job, ir, entry)
374+
# finish the module
375+
#
376+
# we want to finish the module after optimization, so we cannot do so during
377+
# deferred code generation. instead, process the deferred jobs here.
378+
if deferred_codegen
379+
entry = finish_ir!(job, ir, entry)
380+
381+
for (deferred_job, deferred_fn) in deferred_jobs
382+
deferred_job == job && continue
383+
finish_ir!(deferred_job, ir, functions(ir)[deferred_fn])
384+
end
385+
end
376386

377387
# replace non-entry function definitions with a declaration
378388
# NOTE: we can't do this before optimization, because the definitions of called

0 commit comments

Comments
 (0)