LLVM中的虚拟表(llvm-py)

4 投票
1 回答
937 浏览
提问于 2025-04-17 16:29

我正在使用llvm-py来创建一个DIY编译器,主要是为了处理一些人工智能相关的内容。我想在全局范围内有一个虚方法表。我的想法是为每个类准备几个函数指针数组。不幸的是,LLVM IR Builder在全局范围内并不可用,我无法使用ptrtoint来确保所有数组元素的类型一致(否则我就得把函数地址存储为64位整数,然后在调用之前再转换成合适的类型)。你知道有什么合理的解决方案吗?用C++的LLVM API也可以说明,因为llvm-py和它非常相似。

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,并用你创建的所有常量表达式来初始化它。

撰写回答