Skip to content

Commit 8559d5b

Browse files
authored
Merge pull request #870 from JuliaGPU/tb/nightly
Fixes for nightly
2 parents a17a5b3 + 08514a8 commit 8559d5b

2 files changed

Lines changed: 50 additions & 15 deletions

File tree

src/mcgen.jl

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,17 @@ function (self::ResolveCPUReferences)(mod::LLVM.Module)
3535
for f in functions(mod)
3636
fn = LLVM.name(f)
3737
if isdeclaration(f) && !LLVM.isintrinsic(f) && startswith(fn, "jl_")
38-
# eagerly resolve the address of the binding
39-
address = ccall(:jl_cglobal, Any, (Any, Any), fn, UInt)
40-
dereferenced = unsafe_load(address)
41-
dereferenced = LLVM.ConstantInt(dereferenced)
38+
# lazily resolve the address of the binding; some symbols only exist
39+
# within the JIT (e.g. `jl_get_pgcstack_resolved`) and cannot be looked up,
40+
# but such symbols are only ever called, not loaded from.
41+
dereferenced = nothing
42+
function resolve_binding()
43+
if dereferenced === nothing
44+
address = ccall(:jl_cglobal, Any, (Any, Any), fn, UInt)
45+
dereferenced = LLVM.ConstantInt(unsafe_load(address))
46+
end
47+
dereferenced
48+
end
4249

4350
function replace_bindings!(value)
4451
changed = false
@@ -49,7 +56,7 @@ function (self::ResolveCPUReferences)(mod::LLVM.Module)
4956
changed |= replace_bindings!(val)
5057
elseif isa(val, LLVM.LoadInst)
5158
# resolve
52-
replace_uses!(val, dereferenced)
59+
replace_uses!(val, resolve_binding())
5360
erase!(val)
5461
# FIXME: iterator invalidation?
5562
changed = true

test/native.jl

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,11 @@ end
324324
end
325325

326326
@testset "unbound typevars" begin
327-
mod = @eval module $(gensym())
328-
invalid_kernel() where {unbound} = return
327+
# suppress the warning Julia emits when defining a method with an unbound typevar
328+
mod = redirect_stderr(devnull) do
329+
@eval module $(gensym())
330+
invalid_kernel() where {unbound} = return
331+
end
329332
end
330333
@test_throws KernelError Native.code_llvm(devnull, mod.invalid_kernel, Tuple{})
331334
end
@@ -456,20 +459,27 @@ end
456459
Native.code_llvm(mod.g, Tuple{Int64}; dump_module=true, kernel=true)
457460
end
458461

459-
@test @filecheck(begin
460-
@check_not "@{{(julia|j)_expensive_[0-9]+}}"
461-
Native.code_llvm(mod.g, Tuple{Int64}; dump_module=true, kernel=true, always_inline=true)
462-
end) broken=broken
462+
# suppress FileCheck diagnostics when the failure is known and expected
463+
quiet(f) = broken ? redirect_stderr(f, devnull) : f()
464+
465+
@test quiet() do
466+
@filecheck begin
467+
@check_not "@{{(julia|j)_expensive_[0-9]+}}"
468+
Native.code_llvm(mod.g, Tuple{Int64}; dump_module=true, kernel=true, always_inline=true)
469+
end
470+
end broken=broken
463471

464472
@test @filecheck begin
465473
@check "@{{(julia|j)_expensive_[0-9]+}}"
466474
Native.code_llvm(mod.h, Tuple{Int64}; dump_module=true, kernel=true)
467475
end
468476

469-
@test @filecheck(begin
470-
@check_not "@{{(julia|j)_expensive_[0-9]+}}"
471-
Native.code_llvm(mod.h, Tuple{Int64}; dump_module=true, kernel=true, always_inline=true)
472-
end) broken=broken
477+
@test quiet() do
478+
@filecheck begin
479+
@check_not "@{{(julia|j)_expensive_[0-9]+}}"
480+
Native.code_llvm(mod.h, Tuple{Int64}; dump_module=true, kernel=true, always_inline=true)
481+
end
482+
end broken=broken
473483
end
474484

475485
@testset "function attributes" begin
@@ -495,6 +505,24 @@ end
495505
end
496506
end
497507

508+
@testset "CPU reference resolution" begin
509+
# JIT-private symbols like `jl_get_pgcstack_resolved` (JuliaLang/julia#61527) cannot
510+
# be looked up using `jl_cglobal`, so we should only resolve bindings that are
511+
# actually loaded from, leaving called functions alone.
512+
job, _ = Native.create_job(identity, (Nothing,))
513+
JuliaContext() do ctx
514+
mod = parse(LLVM.Module, """
515+
declare void @jl_get_pgcstack_resolved()
516+
517+
define void @entry() {
518+
call void @jl_get_pgcstack_resolved()
519+
ret void
520+
}""")
521+
GPUCompiler.prepare_execution!(job, mod)
522+
@test haskey(functions(mod), "jl_get_pgcstack_resolved")
523+
end
524+
end
525+
498526
end
499527

500528
############################################################################################

0 commit comments

Comments
 (0)