执行引擎

执行引擎是实际代码生成和执行发生的地方。目前只公开了一个执行引擎,即 MCJIT

函数

  • llvmlite.binding.create_mcjit_compiler(module, target_machine, use_lmm=None)

    从给定的 moduletarget_machine 创建一个由 MCJIT 提供支持的引擎。

    lmm 控制是否使用 llvmlite 内存管理器。如果未提供,将使用平台的默认选择(在 64 位 ARM 系统上为 True,否则为 False)。

    • module 不需要包含任何代码。

    • 返回一个 ExecutionEngine 实例。

  • llvmlite.binding.check_jit_execution()

    确保系统允许为 JIT 编译的代码创建可执行内存范围。如果 SELinux 等安全机制阻止,则会引发异常。否则,函数将静默返回。

    提前调用此函数有助于诊断系统配置问题,而不是让 JIT 编译的函数神秘崩溃。

ExecutionEngine 类

class llvmlite.binding.ExecutionEngine

LLVM 执行引擎的一个封装。以下方法和属性可用:

  • add_module(module)

    添加 module(一个 ModuleRef 实例)用于代码生成。调用此方法时,模块的所有权将转移到执行引擎。

  • finalize_object()

    确保执行引擎拥有的所有模块都已完全处理并可用于执行。

  • get_function_address(name)

    以整数形式返回函数 name 的地址。如果 name 的符号不存在,则在 LLVM 中这是一个致命错误。

  • get_global_value_address(name)

    以整数形式返回全局值 name 的地址。如果 name 的符号不存在,则在 LLVM 中这是一个致命错误。

  • remove_module(module)

    从执行引擎拥有的模块中移除 module(一个 ModuleRef 实例)。这允许在不销毁执行引擎的情况下释放模块拥有的资源。

  • add_object_file(object_file)

    将指定目标文件中的符号添加到执行引擎。

    • object_file str 或 ObjectFileRef: 目标文件路径

      或目标文件实例。此调用后,目标文件实例将不可用。

  • set_object_cache(notify_func=None, getbuffer_func=None)

    为该引擎设置对象缓存回调。

    • 如果提供 notify_func,则在引擎完成编译模块时调用它。它将获得 (module, buffer) 参数

      • module 是一个 ModuleRef 实例。

      • buffer 是为模块生成的代码的字节对象。

      返回值将被忽略。

    • 如果提供 getbuffer_func,则在引擎开始编译模块之前调用它。它将获得一个参数,module,一个正在编译的模块的 ModuleRef 实例。

      • 它可以返回 None,在这种情况下,模块将正常编译。

      • 它可以返回模块的本地代码的字节对象,从而完全绕过编译。

  • target_data

    执行引擎使用的 TargetData