@@ -257,11 +257,10 @@ const __llvm_initialized = Ref(false)
257
257
# deferred code generation
258
258
do_deferred_codegen = ! only_entry && deferred_codegen &&
259
259
haskey (functions (ir), " deferred_codegen" )
260
+ deferred_jobs = Dict {CompilerJob, String} (job => entry_fn)
260
261
if do_deferred_codegen
261
262
dyn_marker = functions (ir)[" deferred_codegen" ]
262
263
263
- cache = Dict {CompilerJob, String} (job => entry_fn)
264
-
265
264
# iterative compilation (non-recursive)
266
265
changed = true
267
266
while changed
@@ -286,7 +285,7 @@ const __llvm_initialized = Ref(false)
286
285
# compile and link
287
286
for dyn_job in keys (worklist)
288
287
# cached compilation
289
- dyn_entry_fn = get! (cache , dyn_job) do
288
+ dyn_entry_fn = get! (deferred_jobs , dyn_job) do
290
289
dyn_ir, dyn_meta = codegen (:llvm , dyn_job; optimize= false ,
291
290
deferred_codegen= false , parent_job= job, ctx)
292
291
dyn_entry_fn = LLVM. name (dyn_meta. entry)
@@ -372,7 +371,18 @@ const __llvm_initialized = Ref(false)
372
371
end
373
372
end
374
373
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
376
386
377
387
# replace non-entry function definitions with a declaration
378
388
# NOTE: we can't do this before optimization, because the definitions of called
0 commit comments