Add binding for dynamic library loading
This commit is contained in:
parent
ce696c9b4e
commit
6578412437
3 changed files with 60 additions and 8 deletions
24
llvm/ee.py
24
llvm/ee.py
|
|
@ -238,3 +238,27 @@ def dylib_add_symbol(name, ptr):
|
|||
|
||||
def dylib_address_of_symbol(name):
|
||||
return api.llvm.sys.DynamicLibrary.SearchForAddressOfSymbol(name)
|
||||
|
||||
def dylib_import_library(filename):
|
||||
"""Permanently import a dynamic library.
|
||||
|
||||
Returns a DynamicLibrary object
|
||||
|
||||
Raises RuntimeError
|
||||
"""
|
||||
return DynamicLibrary(filename)
|
||||
|
||||
|
||||
class DynamicLibrary(object):
|
||||
def __init__(self, filename):
|
||||
"""
|
||||
Raises RuntimeError
|
||||
"""
|
||||
self._ptr = api.llvm.sys.DynamicLibrary.getPermanentLibrary(
|
||||
filename)
|
||||
|
||||
def get_address_of_symbol(self, symbol):
|
||||
"""
|
||||
Get the address of `symbol` (str) as integer
|
||||
"""
|
||||
return self._ptr.getAddressOfSymbol(symbol)
|
||||
|
|
|
|||
|
|
@ -861,6 +861,27 @@ PyObject* DynamicLibrary_LoadLibraryPermanently(const char * Filename,
|
|||
}
|
||||
}
|
||||
|
||||
static
|
||||
PyObject* DynamicLibrary_getPermanentLibrary(const char * Filename,
|
||||
PyObject* ErrMsg = 0)
|
||||
{
|
||||
using namespace llvm::sys;
|
||||
std::string errmsg;
|
||||
DynamicLibrary dylib = DynamicLibrary::getPermanentLibrary(Filename, &errmsg);
|
||||
if (!dylib.isValid()) {
|
||||
if (ErrMsg) {
|
||||
auto_pyobject buf = PyBytes_FromString(errmsg.c_str());
|
||||
if (!callwrite(ErrMsg, *buf))
|
||||
return NULL;
|
||||
}
|
||||
PyErr_SetString(PyExc_RuntimeError, errmsg.c_str());
|
||||
return NULL;
|
||||
}
|
||||
return pycapsule_new(new DynamicLibrary(dylib),
|
||||
"llvm::sys::DynamicLibrary",
|
||||
"llvm::sys::DynamicLibrary");
|
||||
}
|
||||
|
||||
class PassRegistryEnumerator : public llvm::PassRegistrationListener{
|
||||
public:
|
||||
PyObject* List;
|
||||
|
|
|
|||
|
|
@ -26,3 +26,10 @@ class DynamicLibrary:
|
|||
cast(str, StringRef), # symbolName
|
||||
cast(int, VoidPtr), # address
|
||||
)
|
||||
|
||||
getPermanentLibrary = CustomStaticMethod(
|
||||
'DynamicLibrary_getPermanentLibrary',
|
||||
PyObjectPtr,
|
||||
cast(str, ConstCharPtr), # filename
|
||||
PyObjectPtr, # std::string * errmsg = 0
|
||||
).require_only(1)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue