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):
|
def dylib_address_of_symbol(name):
|
||||||
return api.llvm.sys.DynamicLibrary.SearchForAddressOfSymbol(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)
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
namespace extra{
|
namespace extra{
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
class raw_svector_ostream_helper: public raw_svector_ostream {
|
class raw_svector_ostream_helper: public raw_svector_ostream {
|
||||||
SmallVectorImpl<char> *SV;
|
SmallVectorImpl<char> *SV;
|
||||||
public:
|
public:
|
||||||
|
|
@ -85,7 +85,7 @@ PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args)
|
||||||
{
|
{
|
||||||
using extra::raw_svector_ostream_helper;
|
using extra::raw_svector_ostream_helper;
|
||||||
using llvm::raw_svector_ostream;
|
using llvm::raw_svector_ostream;
|
||||||
|
|
||||||
if (!PyArg_ParseTuple(args, "")) {
|
if (!PyArg_ParseTuple(args, "")) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -99,7 +99,7 @@ PyObject* make_small_vector_from_types(PyObject* self, PyObject* args)
|
||||||
{
|
{
|
||||||
using llvm::Type;
|
using llvm::Type;
|
||||||
typedef llvm::SmallVector<llvm::Type*, 8> SmallVector_Type;
|
typedef llvm::SmallVector<llvm::Type*, 8> SmallVector_Type;
|
||||||
|
|
||||||
SmallVector_Type* SV = new SmallVector_Type;
|
SmallVector_Type* SV = new SmallVector_Type;
|
||||||
Py_ssize_t size = PyTuple_Size(args);
|
Py_ssize_t size = PyTuple_Size(args);
|
||||||
for (Py_ssize_t i = 0; i < size; ++i) {
|
for (Py_ssize_t i = 0; i < size; ++i) {
|
||||||
|
|
@ -420,7 +420,7 @@ PyObject* ExecutionEngine_RunFunction(llvm::ExecutionEngine* EE,
|
||||||
PyErr_SetString(PyExc_RuntimeError, "Failed to index into args?");
|
PyErr_SetString(PyExc_RuntimeError, "Failed to index into args?");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
GenericValue* gv = static_cast<GenericValue*>(
|
GenericValue* gv = static_cast<GenericValue*>(
|
||||||
PyCapsule_GetPointer(obj, GVN));
|
PyCapsule_GetPointer(obj, GVN));
|
||||||
|
|
||||||
|
|
@ -626,7 +626,7 @@ PyObject* Linker_LinkInModule(llvm::Linker* Linker,
|
||||||
if (! failed) {
|
if (! failed) {
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
auto_pyobject buf = PyBytes_FromString(errmsg.c_str());
|
auto_pyobject buf = PyBytes_FromString(errmsg.c_str());
|
||||||
if (NULL == callwrite(ErrMsg, *buf)){
|
if (NULL == callwrite(ErrMsg, *buf)){
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
@ -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{
|
class PassRegistryEnumerator : public llvm::PassRegistrationListener{
|
||||||
public:
|
public:
|
||||||
PyObject* List;
|
PyObject* List;
|
||||||
|
|
@ -988,7 +1009,7 @@ fail:
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
static
|
||||||
PyObject* MCDisassembler_getInstruction(llvm::MCDisassembler *disasm,
|
PyObject* MCDisassembler_getInstruction(llvm::MCDisassembler *disasm,
|
||||||
llvm::MCInst &instr,
|
llvm::MCInst &instr,
|
||||||
const llvm::MemoryObject ®ion,
|
const llvm::MemoryObject ®ion,
|
||||||
uint64_t address
|
uint64_t address
|
||||||
|
|
@ -998,7 +1019,7 @@ PyObject* MCDisassembler_getInstruction(llvm::MCDisassembler *disasm,
|
||||||
llvm::MCDisassembler::DecodeStatus status;
|
llvm::MCDisassembler::DecodeStatus status;
|
||||||
|
|
||||||
size = 0;
|
size = 0;
|
||||||
status = disasm->getInstruction(instr, size, region, address,
|
status = disasm->getInstruction(instr, size, region, address,
|
||||||
llvm::nulls(), llvm::nulls());
|
llvm::nulls(), llvm::nulls());
|
||||||
return Py_BuildValue("(i,i)", int(status), size);
|
return Py_BuildValue("(i,i)", int(status), size);
|
||||||
}
|
}
|
||||||
|
|
@ -1046,5 +1067,5 @@ PyObject* llvm_sys_isBigEndianHost()
|
||||||
else
|
else
|
||||||
Py_RETURN_FALSE;
|
Py_RETURN_FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,3 +26,10 @@ class DynamicLibrary:
|
||||||
cast(str, StringRef), # symbolName
|
cast(str, StringRef), # symbolName
|
||||||
cast(int, VoidPtr), # address
|
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