llvm中的虚拟表(llvm-py)

时间:2013-02-20 11:02:21

标签: python compiler-construction llvm vtable llvm-ir

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

1 个答案:

答案 0 :(得分:4)

事实上,IRBuilder没有公开界面来做到这一点,但你可以手动创建 - 例如通过使用GlobalVariable的构造函数。您可以使用转换常量表达式将所有指针存储在数组中,即通过生成:

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

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