4

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

4

1 回答 1

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在模块中创建一个新的并使用您创建的所有常量表达式对其进行初始化。

于 2013-02-20T12:07:15.770 回答