python - llvm 中的虚拟表 (llvm-py)

标签 python compiler-construction llvm vtable llvm-ir

我正在使用 llvm-py 为一些人工创建一个 DIY 编译器,并且需要在全局范围内有一个虚拟方法表。我的概念是有几个函数指针数组(每个类一个)。不幸的是,没有用于全局范围的 LLVM IR Builder,我不能使用 ptrtoint 来获得所有数组元素的统一类型(否则我会将函数地址存储为 64 位整数,并在调用之前将它们转换为适当的类型)。你知道任何合理的解决方案吗?也可以用C++ LLVM api来说明,因为llvm-py非常相似。

最佳答案

事实上,IRBuilder 并没有暴露一个接口(interface)来做到这一点,但你可以手动创建它——例如通过使用 GlobalVariable 的构造函数。您可以使用转换常量表达式将所有指针存储在数组中,即通过生成:

@global = global [4 x i64*] [
  i64* bitcast (void()* @f to i64*),
  i64* bitcast (float(i32)* @g to i64*),
  ...
]

因此,使用 ConstantExpr::getBitCast() 生成从 Function 到数组元素类型的转换(最好是指针,我不查看存储 i64 的优势)。然后在模块中创建一个新的 GlobalVariable 并使用您创建的所有常量表达式对其进行初始化。

关于python - llvm 中的虚拟表 (llvm-py),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14978233/

相关文章:

python - 为什么 scikit-learn 对不同的回归器要求不同的数据形状?

c - 如何从给定 LLVM IR 的源代码中获取变量的所有行号?

xcode - LLVM 环境变量在哪里或如何配置 LLVM 环境?

c++ - LLVM 段错误/需要使用指令而不是指令*

python - 将 2 个图像转换为 numpy 数组并逐像素比较

python - 在 Python 中使用 Xlsxwriter 合并 Excel 单元格

python - cqlengine multilpe 键空间

compiler-construction - 对于LLVM,SCC代表什么?

C 创建一个新的 int 类型

compiler-construction - 使用哈希表在类中存储方法有什么优点?