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