Skip to content

Commit ccaa9de

Browse files
committed
Add CustomDefinitionGenerator
1 parent eeeabc2 commit ccaa9de

File tree

1 file changed

+34
-3
lines changed

1 file changed

+34
-3
lines changed

src/orcv2.jl

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,13 @@ function JITDylib(es::ExecutionSession, name; bare=false)
176176
JITDylib(ref)
177177
end
178178

179-
@checked struct DefinitionGenerator
179+
abstract type AbstractDefinitionGenerator end
180+
@checked struct DefinitionGenerator <: AbstractDefinitionGenerator
180181
ref::API.LLVMOrcDefinitionGeneratorRef
181182
end
182183
Base.unsafe_convert(::Type{API.LLVMOrcDefinitionGeneratorRef}, dg::DefinitionGenerator) = dg.ref
183184

184-
function add!(jd::JITDylib, dg::DefinitionGenerator)
185+
function add!(jd::JITDylib, dg::AbstractDefinitionGenerator)
185186
API.LLVMOrcJITDylibAddGenerator(jd, dg)
186187
end
187188

@@ -191,7 +192,37 @@ function CreateDynamicLibrarySearchGeneratorForProcess(prefix)
191192
DefinitionGenerator(ref[])
192193
end
193194

194-
# LLVMOrcCreateCustomCAPIDefinitionGenerator(F, Ctx)
195+
# We can do this async by copying content of `LookupState` and setting it to
196+
# C_NULL and returning ErrorSuccess. We then would need to call `LookupContinue`
197+
# but that function seems to be missing from teh CAPI.
198+
# Note LookupSet get's destroyed when we return here
199+
function DefinitionGeneratorTryToGenerateFunction(GeneratorObj::API.LLVMOrcDefinitionGeneratorRef, ctx::Ptr{Cvoid}, LookupState::Ptr{API.LLVMOrcLookupStateRef}, Kind::API.LLVMOrcLookupKind, JD::API.LLVMOrcJITDylibRef, JDLookupFlags::API.LLVMOrcJITDylibLookupFlags, LookupSet::API.LLVMOrcCLookupSet, LookupSetSize::Csize_t)::API.LLVMErrorRef
200+
dg = Base.unsafe_pointer_to_objref(ctx)::CustomDefinitionGenerator
201+
@assert dg.dg.ref === GeneratorObj
202+
lookupSet = Base.unsafe_wrap(Array, LookupSet, LookupSetSize, own=false)
203+
return dg.callback(Kind, JITDylib(JD), JDLookupFlags, lookupSet)::API.LLVMErrorRef
204+
end
205+
206+
mutable struct CustomDefinitionGenerator <: AbstractDefinitionGenerator
207+
callback
208+
dg::DefinitionGenerator
209+
function CustomDefinitionGenerator(callback)
210+
this = new(callback)
211+
push!(CUSTOM_DG_ROOTS, this)
212+
213+
ref = API.LLVMOrcCreateCustomCAPIDefinitionGenerator(
214+
@cfunction(DefinitionGeneratorTryToGenerateFunction, API.LLVMErrorRef, (API.LLVMOrcDefinitionGeneratorRef, Ptr{Cvoid}, Ptr{API.LLVMOrcLookupStateRef}, API.LLVMOrcLookupKind, API.LLVMOrcJITDylibRef, API.LLVMOrcJITDylibLookupFlags, API.LLVMOrcCLookupSet, Csize_t)),
215+
Base.pointer_from_objref(this)
216+
)
217+
218+
this.dg = DefinitionGenerator(ref)
219+
return this
220+
end
221+
end
222+
Base.cconvert(::Type{API.LLVMOrcDefinitionGeneratorRef}, dg::CustomDefinitionGenerator) = dg.dg
223+
224+
# todo: Delete
225+
const CUSTOM_DG_ROOTS = Base.IdSet{CustomDefinitionGenerator}()
195226

196227
function lookup_dylib(es::ExecutionSession, name)
197228
ref = API.LLVMOrcExecutionSessionGetJITDylibByName(es, name)

0 commit comments

Comments
 (0)