@@ -224,6 +224,40 @@ Base.cconvert(::Type{API.LLVMOrcDefinitionGeneratorRef}, dg::CustomDefinitionGen
224
224
# todo: Delete
225
225
const CUSTOM_DG_ROOTS = Base. IdSet {CustomDefinitionGenerator} ()
226
226
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
+
227
261
function lookup_dylib (es:: ExecutionSession , name)
228
262
ref = API. LLVMOrcExecutionSessionGetJITDylibByName (es, name)
229
263
if ref == C_NULL
0 commit comments