def get_executable(self, library, fndesc, env): """ Returns ------- (cfunc, fnptr) - cfunc callable function (Can be None) - fnptr callable function address - env an execution environment (from _dynfunc) """ func = library.get_function(fndesc.llvm_func_name) wrapper = library.get_function(fndesc.llvm_cpython_wrapper_name) # Code generation baseptr = library.get_pointer_to_function(func.name) fnptr = library.get_pointer_to_function(wrapper.name) cfunc = _dynfunc.make_function(fndesc.lookup_module(), fndesc.qualname.split('.')[-1], fndesc.doc, fnptr, env) if fndesc.native: self.native_funcs[cfunc] = fndesc.llvm_func_name, baseptr return cfunc
def get_executable(self, library, fndesc, env): """ Returns ------- (cfunc, fnptr) - cfunc callable function (Can be None) - fnptr callable function address - env an execution environment (from _dynfunc) """ # Code generation baseptr = library.get_pointer_to_function(fndesc.llvm_func_name) fnptr = library.get_pointer_to_function( fndesc.llvm_cpython_wrapper_name) # Note: we avoid reusing the original docstring to avoid encoding # issues on Python 2, see issue #1908 doc = "compiled wrapper for %r" % (fndesc.qualname, ) cfunc = _dynfunc.make_function( fndesc.lookup_module(), fndesc.qualname.split('.')[-1], doc, fnptr, env, # objects to keepalive with the function ( library, )) return cfunc
def get_executable(self, library, fndesc, env): """ Returns ------- (cfunc, fnptr) - cfunc callable function (Can be None) - fnptr callable function address - env an execution environment (from _dynfunc) """ # Code generation baseptr = library.get_pointer_to_function(fndesc.llvm_func_name) fnptr = library.get_pointer_to_function(fndesc.llvm_cpython_wrapper_name) # Note: we avoid reusing the original docstring to avoid encoding # issues on Python 2, see issue #1908 doc = "compiled wrapper for %r" % (fndesc.qualname,) cfunc = _dynfunc.make_function(fndesc.lookup_module(), fndesc.qualname.split('.')[-1], doc, fnptr, env, # objects to keepalive with the function (library,) ) return cfunc
def prepare_for_call(self, func, fndesc, env): wrapper, api = PyCallWrapper(self, func.module, func, fndesc, exceptions=self.exceptions).build() self.optimize(func.module) if config.DUMP_OPTIMIZED: print(("OPTIMIZED DUMP %s" % fndesc).center(80, '-')) print(func.module) print('=' * 80) if config.DUMP_ASSEMBLY: print(("ASSEMBLY %s" % fndesc).center(80, '-')) print(self.tm.emit_assembly(func.module)) print('=' * 80) # Code gen self.engine.add_module(func.module) baseptr = self.engine.get_pointer_to_function(func) fnptr = self.engine.get_pointer_to_function(wrapper) cfunc = _dynfunc.make_function(fndesc.lookup_module(), fndesc.qualname.split('.')[-1], fndesc.doc, fnptr, env) if fndesc.native: self.native_funcs[cfunc] = fndesc.mangled_name, baseptr return cfunc
def prepare_for_call(self, func, fndesc): wrapper, api = PyCallWrapper(self, func.module, func, fndesc).build() self.optimize(func.module) if config.DUMP_OPTIMIZED: print( ("OPTIMIZED DUMP %s" % fndesc.qualified_name).center(80, '-')) print(func.module) print('=' * 80) if config.DUMP_ASSEMBLY: print(("ASSEMBLY %s" % fndesc.qualified_name).center(80, '-')) print(self.tm.emit_assembly(func.module)) print('=' * 80) # Map module.__dict__ le.dylib_add_symbol(".pymodule.dict." + fndesc.pymod.__name__, id(fndesc.pymod.__dict__)) # Code gen self.engine.add_module(func.module) baseptr = self.engine.get_pointer_to_function(func) fnptr = self.engine.get_pointer_to_function(wrapper) cfunc = _dynfunc.make_function(fndesc.pymod, fndesc.name, fndesc.doc, fnptr) if fndesc.native: self.native_funcs[cfunc] = fndesc.mangled_name, baseptr return cfunc, fnptr
def get_executable(self, library, fndesc, env): """ Returns ------- (cfunc, fnptr) - cfunc callable function (Can be None) - fnptr callable function address - env an execution environment (from _dynfunc) """ # Code generation baseptr = library.get_pointer_to_function(fndesc.llvm_func_name) fnptr = library.get_pointer_to_function(fndesc.llvm_cpython_wrapper_name) cfunc = _dynfunc.make_function(fndesc.lookup_module(), fndesc.qualname.split('.')[-1], fndesc.doc, fnptr, env, # objects to keepalive with the function (library,) ) return cfunc
def get_executable(self, library, fndesc, env): """ Returns ------- (cfunc, fnptr) - cfunc callable function (Can be None) - fnptr callable function address - env an execution environment (from _dynfunc) """ # Code generation baseptr = library.get_pointer_to_function(fndesc.llvm_func_name) fnptr = library.get_pointer_to_function( fndesc.llvm_cpython_wrapper_name) cfunc = _dynfunc.make_function( fndesc.lookup_module(), fndesc.qualname.split('.')[-1], fndesc.doc, fnptr, env, # objects to keepalive with the function ( library, )) return cfunc
def prepare_for_call(self, func, fndesc): wrapper, api = PyCallWrapper(self, func.module, func, fndesc).build() self.optimize(func.module) if config.DUMP_OPTIMIZED: print(("OPTIMIZED DUMP %s" % fndesc.qualified_name).center(80,'-')) print(func.module) print('=' * 80) if config.DUMP_ASSEMBLY: print(("ASSEMBLY %s" % fndesc.qualified_name).center(80, '-')) print(self.tm.emit_assembly(func.module)) print('=' * 80) # Map module.__dict__ le.dylib_add_symbol(".pymodule.dict." + fndesc.pymod.__name__, id(fndesc.pymod.__dict__)) # Code gen self.engine.add_module(func.module) baseptr = self.engine.get_pointer_to_function(func) fnptr = self.engine.get_pointer_to_function(wrapper) cfunc = _dynfunc.make_function(fndesc.pymod, fndesc.name, fndesc.doc, fnptr) if fndesc.native: self.native_funcs[cfunc] = fndesc.mangled_name, baseptr return cfunc, fnptr