我正在使用llvm-py为一些人工创建DIY编译器,并且需要在全局范围内有一个虚拟方法表。我的概念是有几个函数指针数组(每个类一个)。不幸的是,没有用于全局作用域的LLVM IR Builder,我不能使用ptrtoint来使所有数组元素具有统一类型(否则我会将函数地址存储为64位整型,并在调用之前将它们转换为适当的类型)。你知道任何合理的解决方案吗?它也可以用C++ LLVM api来说明,因为llvm-py非常相似。虚拟表在llvm(llvm-py)
4
A
回答
4
实际上,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
相关问题
- 1. C++虚拟表崩溃LLVM/XCode
- 2. 在OSX上安装llvmpy
- 3. 虚拟表C++
- 4. 虚拟表
- 5. 在llvm中识别虚拟呼叫站点
- 6. 虚拟表格指针和虚拟表格模拟
- 7. 虚拟方法表
- 8. 虚拟PHP表格
- 9. iOS编程与Clang和llvm一起虚拟吗?
- 10. 什么是对象文件上下文中的LLVM虚拟节?
- 11. llvmpy Ubuntu服务器上12.04
- 12. 虚拟表格/发送表
- 13. 虚基在虚拟函数表中的偏移为虚拟继承
- 14. C++虚拟表错误?
- 15. MySQL LEFT OUTER JOIN虚拟表
- 16. 虚拟列表控件(MFC)
- 17. 虚拟表单vs Ajax POST
- 18. 列表框不虚拟化
- 19. Intersystems缓存虚拟表
- 20. 什么是oracle虚拟表?
- 21. 虚拟表格指针
- 22. 如何破解虚拟表?
- 23. 混乱通过虚拟表
- 24. mysql加入虚拟表
- 25. 列表中的虚拟值作为虚拟列
- 26. 可能为虚拟函数实现旁路虚拟表?
- 27. 寻找虚拟注册表/虚拟文件系统项目
- 28. C++对虚拟表虚拟descructors和类的类型信息
- 29. 在虚拟主机
- 30. 在虚拟机上
你检查过Clang发布C++ vtables吗? – delnan 2013-02-20 11:29:34
是的,它做了一些名字捣蛋的技巧,使代码很难理解,我想避免它。 – 2013-02-20 15:54:56