Skip to content

Commit e7f4f96

Browse files
committed
Add a DynamicLibDefintionGenerator
1 parent ccaa9de commit e7f4f96

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

src/orcv2.jl

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,40 @@ Base.cconvert(::Type{API.LLVMOrcDefinitionGeneratorRef}, dg::CustomDefinitionGen
224224
# todo: Delete
225225
const CUSTOM_DG_ROOTS = Base.IdSet{CustomDefinitionGenerator}()
226226

227+
function DynamicLibDefinitionGenerator(path)
228+
handle = Libdl.dlopen(path)
229+
230+
function libdl_definitions(kind, JD, lookupFlags, lookupSet)
231+
@assert kind == API.LLVMOrcLookupKindStatic
232+
@assert lookupFlags == API.LLVMOrcJITDylibLookupFlagsMatchAllSymbols
233+
234+
symbols = API.LLVMJITCSymbolMapPair[]
235+
for lookup in lookupSet
236+
if lookup.LookupFlags == API.LLVMOrcSymbolLookupFlagsRequiredSymbol
237+
name = LLVMSymbol(lookup.Name)
238+
ptr = Libdl.dlsym(handle, name; throw_error=false)
239+
240+
if ptr !== C_NULL
241+
LLVM.retain(name)
242+
address = API.LLVMOrcJITTargetAddress(
243+
reinterpret(UInt, ptr))
244+
flags = API.LLVMJITSymbolFlags(
245+
API.LLVMJITSymbolGenericFlagsCallable, 0)
246+
symbol = API.LLVMJITEvaluatedSymbol(address, flags)
247+
push!(symbols, API.LLVMJITCSymbolMapPair(name, symbol))
248+
end
249+
else
250+
@warn "Unkown" lookup.LookupFlags
251+
end
252+
end
253+
mu = absolute_symbols(symbols)
254+
define(JD, mu)
255+
# TODO: API.LLVMErrorSuccess is not a LLVMErrorRef
256+
return reinterpret(API.LLVMErrorRef, API.LLVMErrorSuccess)
257+
end
258+
return LLVM.CustomDefinitionGenerator(libdl_definitions)
259+
end
260+
227261
function lookup_dylib(es::ExecutionSession, name)
228262
ref = API.LLVMOrcExecutionSessionGetJITDylibByName(es, name)
229263
if ref == C_NULL

0 commit comments

Comments
 (0)