def run_pass(self, state): targetctx = state.targetctx library = state.library interp = state.func_ir # why is it called this?! typemap = state.typemap restype = state.return_type calltypes = state.calltypes flags = state.flags metadata = state.metadata msg = ("Function %s failed at nopython " "mode lowering" % (state.func_id.func_name,)) with fallback_context(state, msg): # Lowering fndesc = \ funcdesc.PythonFunctionDescriptor.from_specialized_function( interp, typemap, restype, calltypes, mangler=targetctx.mangler, inline=flags.forceinline, noalias=flags.noalias) with targetctx.push_code_library(library): lower = lowering.Lower(targetctx, library, fndesc, interp, metadata=metadata) lower.lower() if not flags.no_cpython_wrapper: lower.create_cpython_wrapper(flags.release_gil) if not flags.no_cfunc_wrapper: # skip cfunc wrapper generation if unsupported # argument or return types are used for t in state.args: if isinstance(t, (types.Omitted, types.Generator)): break else: if isinstance(restype, (types.Optional, types.Generator)): pass else: lower.create_cfunc_wrapper() env = lower.env call_helper = lower.call_helper del lower from numba.core.compiler import _LowerResult # TODO: move this if flags.no_compile: state['cr'] = _LowerResult(fndesc, call_helper, cfunc=None, env=env) else: # Prepare for execution cfunc = targetctx.get_executable(library, fndesc, env) # Insert native function for use by other jitted-functions. # We also register its library to allow for inlining. targetctx.insert_user_function(cfunc, fndesc, [library]) state['cr'] = _LowerResult(fndesc, call_helper, cfunc=cfunc, env=env) return True
def run_pass(self, state): if state.library is None: codegen = state.targetctx.codegen() state.library = codegen.create_library(state.func_id.func_qualname) # Enable object caching upfront, so that the library can # be later serialized. state.library.enable_object_caching() library = state.library targetctx = state.targetctx interp = state.func_ir # why is it called this?! typemap = state.typemap restype = state.return_type calltypes = state.calltypes flags = state.flags metadata = state.metadata pre_stats = llvm.passmanagers.dump_refprune_stats() msg = ("Function %s failed at nopython " "mode lowering" % (state.func_id.func_name, )) with fallback_context(state, msg): # Lowering fndesc = \ funcdesc.PythonFunctionDescriptor.from_specialized_function( interp, typemap, restype, calltypes, mangler=targetctx.mangler, inline=flags.forceinline, noalias=flags.noalias) with targetctx.push_code_library(library): lower = lowering.Lower(targetctx, library, fndesc, interp, metadata=metadata) lower.lower() if not flags.no_cpython_wrapper: lower.create_cpython_wrapper(flags.release_gil) if not flags.no_cfunc_wrapper: # skip cfunc wrapper generation if unsupported # argument or return types are used for t in state.args: if isinstance(t, (types.Omitted, types.Generator)): break else: if isinstance(restype, (types.Optional, types.Generator)): pass else: lower.create_cfunc_wrapper() env = lower.env call_helper = lower.call_helper del lower from numba.core.compiler import _LowerResult # TODO: move this if flags.no_compile: state['cr'] = _LowerResult(fndesc, call_helper, cfunc=None, env=env) else: # Prepare for execution cfunc = targetctx.get_executable(library, fndesc, env) # Insert native function for use by other jitted-functions. # We also register its library to allow for inlining. targetctx.insert_user_function(cfunc, fndesc, [library]) state['cr'] = _LowerResult(fndesc, call_helper, cfunc=cfunc, env=env) # capture pruning stats post_stats = llvm.passmanagers.dump_refprune_stats() metadata['prune_stats'] = post_stats - pre_stats # Save the LLVM pass timings metadata['llvm_pass_timings'] = library.recorded_timings return True