add binding to dynamiclibrary namespace for multimodule linking
This commit is contained in:
parent
319984f0e0
commit
c0e9dedc90
2 changed files with 51 additions and 0 deletions
|
|
@ -1373,6 +1373,43 @@ class TestMCJIT(TestCase):
|
|||
callee = CFUNCTYPE(c_int, c_int, c_int)(ptr)
|
||||
self.assertEqual(321 + 123, callee(321, 123))
|
||||
|
||||
def test_multi_module_linking(self):
|
||||
# generate external library module
|
||||
m = Module.new('external-library-module')
|
||||
fnty = Type.function(Type.int(), [Type.int(), Type.int()])
|
||||
libfname = 'myadd'
|
||||
func = m.add_function(fnty, libfname)
|
||||
bb = func.append_basic_block('')
|
||||
bldr = Builder.new(bb)
|
||||
bldr.ret(bldr.add(*func.args))
|
||||
func.verify()
|
||||
|
||||
# JIT the lib module and bind dynamic symbol
|
||||
libengine = EngineBuilder.new(m).mcjit(True).create()
|
||||
myadd_ptr = libengine.get_pointer_to_function(func)
|
||||
le.dylib_add_symbol(libfname, myadd_ptr)
|
||||
|
||||
# reference external library
|
||||
m = Module.new('user')
|
||||
fnty = Type.function(Type.int(), [Type.int(), Type.int()])
|
||||
func = m.add_function(fnty, 'foo')
|
||||
bb = func.append_basic_block('')
|
||||
bldr = Builder.new(bb)
|
||||
extadd = m.get_or_insert_function(fnty, name=libfname)
|
||||
bldr.ret(bldr.call(extadd, func.args))
|
||||
func.verify()
|
||||
|
||||
# JIT the user module
|
||||
engine = EngineBuilder.new(m).mcjit(True).create()
|
||||
ptr = engine.get_pointer_to_function(func)
|
||||
self.assertEqual(myadd_ptr,
|
||||
engine.get_pointer_to_named_function(libfname))
|
||||
|
||||
from ctypes import c_int, CFUNCTYPE
|
||||
callee = CFUNCTYPE(c_int, c_int, c_int)(ptr)
|
||||
self.assertEqual(321 + 123, callee(321, 123))
|
||||
|
||||
|
||||
if llvm.version >= (3, 3):
|
||||
# MCJIT broken in 3.2
|
||||
# The test will segfault in OSX?
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue