|
from ctypes import c_void_p, c_char_p, c_bool, POINTER |
|
|
|
from llvmlite.binding import ffi |
|
from llvmlite.binding.common import _encode_string |
|
|
|
|
|
def address_of_symbol(name): |
|
""" |
|
Get the in-process address of symbol named *name*. |
|
An integer is returned, or None if the symbol isn't found. |
|
""" |
|
return ffi.lib.LLVMPY_SearchAddressOfSymbol(_encode_string(name)) |
|
|
|
|
|
def add_symbol(name, address): |
|
""" |
|
Register the *address* of global symbol *name*. This will make |
|
it usable (e.g. callable) from LLVM-compiled functions. |
|
""" |
|
ffi.lib.LLVMPY_AddSymbol(_encode_string(name), c_void_p(address)) |
|
|
|
|
|
def load_library_permanently(filename): |
|
""" |
|
Load an external library |
|
""" |
|
with ffi.OutputString() as outerr: |
|
if ffi.lib.LLVMPY_LoadLibraryPermanently( |
|
_encode_string(filename), outerr): |
|
raise RuntimeError(str(outerr)) |
|
|
|
|
|
|
|
|
|
|
|
ffi.lib.LLVMPY_AddSymbol.argtypes = [ |
|
c_char_p, |
|
c_void_p, |
|
] |
|
|
|
ffi.lib.LLVMPY_SearchAddressOfSymbol.argtypes = [c_char_p] |
|
ffi.lib.LLVMPY_SearchAddressOfSymbol.restype = c_void_p |
|
|
|
ffi.lib.LLVMPY_LoadLibraryPermanently.argtypes = [c_char_p, POINTER(c_char_p)] |
|
ffi.lib.LLVMPY_LoadLibraryPermanently.restype = c_bool |
|
|