模块

尽管它们在概念上代表相同的事物,但 IR 层 中的模块和 绑定层 中的模块具有不同的作用,并且不公开相同的 API。

IR 层中的模块允许您构建和分组函数,而绑定层中的模块则提供代码的编译、链接和执行访问权限。为了区分它们,绑定层中的模块类被称为 ModuleRef,而非 llvmlite.ir.Module

要从 IR 层转到绑定层,请使用 parse_assembly() 函数。

工厂函数

您可以通过以下工厂函数创建模块

  • llvmlite.binding.parse_assembly(llvmir, context=None)

    解析给定的 llvmir,这是一个包含 LLVM IR 代码的字符串。如果解析成功,将返回一个新的 ModuleRef 实例。

    • context:LLVMContextRef 的一个实例。

      默认为全局上下文。

    示例:您可以通过对 llvmlite.ir.Module 对象调用 str() 来获取 llvmir

  • llvmlite.binding.parse_bitcode(bitcode, context=None)

    解析给定的 bitcode,这是一个包含模块 LLVM 位码的字节串。如果解析成功,将返回一个新的 ModuleRef 实例。

    • context:LLVMContextRef 的一个实例。

      默认为全局上下文。

    示例:您可以通过调用 ModuleRef.as_bitcode() 来获取 bitcode

ModuleRef 类

class llvmlite.binding.ModuleRef

LLVM 模块对象的包装器。提供以下方法和属性

  • as_bitcode()

    将此模块的位码作为字节对象返回。

  • get_function(name)

    获取此模块中给定 name 的函数。

    如果找到,则返回一个 ValueRef。否则,抛出 NameError

  • get_global_variable(name)

    获取此模块中给定 name 的全局变量。

    如果找到,则返回一个 ValueRef。否则,抛出 NameError

  • get_struct_type(name)

    获取此模块中给定 name 的结构类型。

    如果找到,则返回一个 TypeRef。否则,抛出 NameError

  • other 模块链接到此模块中,尽可能解析引用。

    • 如果 preserveTrue,则首先复制另一个模块以保留其内容。

    • 如果 preserveFalse,则在该调用后,另一个模块将不可用。

  • verify()

    验证模块的正确性。如果出错,抛出 RuntimeError

  • data_layout

    此模块的数据布局字符串。此属性可设置。

  • functions

    此模块中定义的函数的迭代器。每个函数都是 ValueRef 实例。

  • global_variables

    此模块中定义的全局变量的迭代器。每个全局变量都是 ValueRef 实例。

  • struct_types

    此模块中定义的结构类型的迭代器。每个类型都是 TypeRef 实例。

  • name

    模块的标识符,作为字符串。此属性可设置。

  • source_file

    模块报告的源文件,作为字符串。此属性不可设置。

  • triple

    此模块的平台“三元组”字符串。此属性可设置。