【问题标题】:Virtual table in llvm (llvm-py)llvm 中的虚拟表 (llvm-py)
【发布时间】:2013-02-20 11:02:21
【问题描述】:

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

【问题讨论】:

  • 你检查过 Clang 为 C++ vtables 发出了什么吗?
  • 是的,它做了一些名字修饰技巧,使代码很难理解,我想避免它。

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


【解决方案1】:

确实,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 并使用您创建的所有常量表达式对其进行初始化。

【讨论】:

  • 好吧,我已经完全忘记了 ConstantExpr 中提供的这种比特广播方法。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多