虚拟表在llvm(llvm-py)

问题描述:

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

+3

你检查过Clang发布C++ vtables吗? – delnan 2013-02-20 11:29:34

+0

是的,它做了一些名字捣蛋的技巧,使代码很难理解,我想避免它。 – 2013-02-20 15:54:56

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

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

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

+0

好的,我已经完全忘记了ConstantExpr中提供的bitcast方法。非常感谢! – 2013-02-20 15:56:19