From 9571aefbe0d4e363f79b55a5e37e2b85557279ac Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Fri, 4 Jan 2013 15:15:41 -0600 Subject: [PATCH] Add ExecutionEngine.add_global_mapping --- llvm/_core.cpp | 25 +++++++++++++++++++++++++ llvm/ee.py | 4 ++++ llvm/test_llvmpy.py | 24 ++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/llvm/_core.cpp b/llvm/_core.cpp index cb7ae76..5440960 100644 --- a/llvm/_core.cpp +++ b/llvm/_core.cpp @@ -1342,6 +1342,30 @@ _wLLVMGetPointerToGlobal(PyObject *self, PyObject *args) LLVMPY_CATCH_ALL } +static PyObject * +_wLLVMAddGlobalMapping(PyObject *self, PyObject *args) +{ + LLVMPY_TRY + PyObject *obj_ee; + PyObject *obj_val; + long int address; + + if (!PyArg_ParseTuple(args, "OOl", &obj_ee, &obj_val, &address)) + return NULL; + + const LLVMExecutionEngineRef ee = pycap_get( obj_ee ); + const LLVMValueRef val = pycap_get( obj_val ); + + if (address == (unsigned long long)-1) + return NULL; + + LLVMAddGlobalMapping(ee, val, (void*) address); + + Py_RETURN_NONE; + + LLVMPY_CATCH_ALL +} + /* the args should have been ptr, num */ LLVMGenericValueRef LLVMRunFunction2(LLVMExecutionEngineRef EE, LLVMValueRef F, LLVMGenericValueRef *Args, unsigned NumArgs) @@ -2096,6 +2120,7 @@ static PyMethodDef core_methods[] = { _method( LLVMRunFunction2 ) _method( LLVMGetPointerToFunction ) _method( LLVMGetPointerToGlobal ) + _method( LLVMAddGlobalMapping ) _method( LLVMGetExecutionEngineTargetData ) _method( LLVMRunStaticConstructors ) _method( LLVMRunStaticDestructors ) diff --git a/llvm/ee.py b/llvm/ee.py index 2d0b94b..8d778df 100644 --- a/llvm/ee.py +++ b/llvm/ee.py @@ -230,6 +230,10 @@ class ExecutionEngine(llvm.Handle): core.check_is_global_value(val) return _core.LLVMGetPointerToGlobal(self.ptr, val.ptr) + def add_global_mapping(self, gvar, addr): + assert addr >= 0, "Address cannot not be negative" + _core.LLVMAddGlobalMapping(self.ptr, gvar.ptr, addr) + def run_static_ctors(self): _core.LLVMRunStaticConstructors(self.ptr) diff --git a/llvm/test_llvmpy.py b/llvm/test_llvmpy.py index e717dc5..9b6b1a6 100644 --- a/llvm/test_llvmpy.py +++ b/llvm/test_llvmpy.py @@ -464,6 +464,30 @@ class TestExecutionEngine(unittest.TestCase): casted = cast(c_void_p(ptr), POINTER(c_int)) self.assertEqual(X, casted[0]) + def test_add_global_mapping(self): + module = lc.Module.new(str(self)) + gvar = module.add_global_variable(Type.int(), 'hello') + + fnty = lc.Type.function(Type.int(), []) + foo = module.add_function(fnty, name='foo') + bldr = lc.Builder.new(foo.append_basic_block('entry')) + bldr.ret(bldr.load(gvar)) + + ee = le.ExecutionEngine.new(module) + from ctypes import c_int, addressof, CFUNCTYPE + value = 0xABCD + value_ctype = c_int(value) + value_pointer = addressof(value_ctype) + + ee.add_global_mapping(gvar, value_pointer) + + foo_addr = ee.get_pointer_to_function(foo) + prototype = CFUNCTYPE(c_int) + foo_callable = prototype(foo_addr) + self.assertEqual(foo_callable(), value) + + + tests.append(TestExecutionEngine) # ---------------------------------------------------------------------------