@@ -224,6 +224,40 @@ Base.cconvert(::Type{API.LLVMOrcDefinitionGeneratorRef}, dg::CustomDefinitionGen
224224# todo: Delete
225225const 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+
227261function lookup_dylib (es:: ExecutionSession , name)
228262 ref = API. LLVMOrcExecutionSessionGetJITDylibByName (es, name)
229263 if ref == C_NULL
0 commit comments