9

我正在玩 LLVM,但现在我被困在为类生成代码上。

如何使用 LLVM 创建类功能?

  • 类运算符是否像函数一样处理?
  • 如何处理自动分配(如 C++)?
  • 如何通过像 C++ 这样的虚拟继承来支持像 Java 这样的接口?
4

1 回答 1

13

长版

一般类行为

一种直接的方法是创建结构,然后将方法建模为常规函数,这些函数接收指向表示包含类的结构的指针——本质上是一个this指针——作为第一个参数。分配可以通过分配结构然后在分配的数据上调用特殊的初始化函数(实际上是构造函数)来建模。

继承可以通过构建一个结构来完成,该结构包含一个特殊的“父”字段(或多个字段,用于多重继承),其类型与基类的结构类型相同。

多态性

阅读有关虚拟表的信息;我认为他们是最好的起点。你可以发现编译器基本上是:

  1. 在内存中创建一个静态表,从函数“名称”映射到它的实现,
  2. 添加指向指向此类表的类结构的指针,
  3. 每当调用虚拟方法时,将其编译为间接调用,该调用从适当的虚拟表条目中取消引用地址。

简洁版本

编写一些使用 C++ 中的类的代码,然后使用 Clang 将其编译为 LLVM IR 并查看生成的代码。

于 2013-01-13T21:41:40.623 回答