@@ -93,7 +93,7 @@ function compile_unhooked(output::Symbol, @nospecialize(job::CompilerJob))
9393 else
9494 error (" Unknown assembly format $output " )
9595 end
96- asm, asm_meta = emit_asm (job, ir, format)
96+ asm, asm_meta = emit_asm (job, ir, ir_meta . host_references, format)
9797
9898 if output == :asm || output == :obj
9999 return asm, (; asm_meta... , ir_meta... , ir)
@@ -192,6 +192,7 @@ const __llvm_initialized = Ref(false)
192192 # finalize the current module. this needs to happen before linking deferred modules,
193193 # since those modules have been finalized themselves, and we don't want to re-finalize.
194194 entry = finish_module! (job, ir, entry)
195+ host_references = classify_gvs! (ir, gv_to_value)
195196
196197 # deferred code generation
197198 has_deferred_jobs = job. config. toplevel && ! job. config. only_entry &&
@@ -245,11 +246,9 @@ const __llvm_initialized = Ref(false)
245246 dyn_ir, dyn_meta = @invokelatest deferred_codegen (dyn_job, job)
246247 dyn_entry_fn = LLVM. name (dyn_meta. entry)
247248 merge! (compiled, dyn_meta. compiled)
248- if haskey (dyn_meta, :gv_to_value )
249- merge! (gv_to_value, dyn_meta. gv_to_value)
250- end
251249 @assert context (dyn_ir) == context (ir)
252- link! (ir, dyn_ir)
250+ link_with_host_references! (ir, host_references, dyn_ir,
251+ dyn_meta. host_references)
253252 changed = true
254253 dyn_entry_fn
255254 end
@@ -292,7 +291,7 @@ const __llvm_initialized = Ref(false)
292291 if job. config. toplevel && job. config. libraries
293292 # load the runtime outside of a timing block (because it recurses into the compiler)
294293 if ! uses_julia_runtime (job)
295- runtime = load_runtime (job)
294+ runtime, runtime_references = load_runtime (job)
296295 end
297296
298297 @tracepoint " Library linking" begin
@@ -301,7 +300,8 @@ const __llvm_initialized = Ref(false)
301300
302301 # GPU run-time library
303302 if ! uses_julia_runtime (job)
304- @tracepoint " runtime library" link! (ir, runtime; only_needed= true )
303+ @tracepoint " runtime library" link_with_host_references! (
304+ ir, host_references, runtime, runtime_references; only_needed= true )
305305 end
306306 end
307307 end
@@ -334,13 +334,12 @@ const __llvm_initialized = Ref(false)
334334
335335 finish_linked_module! (job, ir)
336336
337- # Materialize isbits and Bool boxes; bake addresses for other objects.
338- portable = relocate_gvs! (ir, gv_to_value)
339- portable || mark_session_dependent! (job)
337+ host_references. embedded_pointer |= ! materialize_bool_singletons! (ir)
338+ host_references. embedded_pointer && mark_session_dependent! (job)
340339
341340 if job. config. optimize
342341 @tracepoint " optimization" begin
343- optimize! (job, ir; job. config. opt_level)
342+ optimize! (job, ir, host_references ; job. config. opt_level)
344343
345344 # deferred codegen has some special optimization requirements,
346345 # which also need to happen _after_ regular optimization.
@@ -405,26 +404,27 @@ const __llvm_initialized = Ref(false)
405404
406405 if job. config. toplevel && job. config. validate
407406 @tracepoint " validation" begin
408- check_ir (job, ir)
407+ check_ir (job, ir, host_references )
409408 end
410409 end
411410
412411 if should_verify ()
413412 @tracepoint " verification" verify (ir)
414413 end
415414
416- return ir, (; entry, compiled, gv_to_value )
415+ return ir, (; entry, compiled, host_references )
417416end
418417
419418@locked function emit_asm (@nospecialize (job:: CompilerJob ), ir:: LLVM.Module ,
420- format:: LLVM.API.LLVMCodeGenFileType )
419+ refs :: HostReferences , format:: LLVM.API.LLVMCodeGenFileType )
421420 # NOTE: strip after validation to get better errors
422421 if job. config. strip
423422 @tracepoint " Debug info removal" strip_debuginfo! (ir)
424423 end
425424
426425 @tracepoint " LLVM back-end" begin
427- @tracepoint " preparation" prepare_execution! (job, ir)
426+ @tracepoint " preparation" prepare_execution! (job, ir, refs)
427+ refs. embedded_pointer && mark_session_dependent! (job)
428428
429429 code = @tracepoint " machine-code generation" mcgen (job, ir, format)
430430 end
0 commit comments