C++ LLVM类的功能

10

我正在尝试使用LLVM,但现在我陷入了为类生成代码的困境。

如何使用LLVM创建类的功能?

  • 类操作符是否像函数一样处理?
  • 自动分配如何处理(如C ++)?
  • 如何支持接口,例如Java通过类似C ++的虚拟继承?

你的意思是什么?你是手写中间形式的LLVM字节码,还是怎么样?我认为它不应该以这种方式使用,除非可能进行一些关键的优化,也可以用汇编语言编写。对于像类这样高级的东西,人们会使用适当的前端,最明显的是clang++,并在通用C++中编写类。 - leftaroundabout
1
我正在编写一种编程语言,类似于非常简化的Java。因此,我需要手动编写类功能,以将其连接到我的解析器。 - Tim
你需要将你的类转换成更低级别的东西。你有没有在C语言中编写过面向对象的代码?那非常麻烦,但是可以工作,并且可以让你了解如何在编译器中实现类。- 这个问题实际上与LLVM没有太多关系。尽管事实上,我认为LLVM确实有优化特定模式的功能,这些模式在典型的类实现中出现,因此标签仍然可能是相关的。但是我对此一无所知。 - leftaroundabout
1个回答

16

长版

一般类行为

一个简单的方法是创建结构体,然后将方法建模为常规函数,该函数接收指向表示包含类的结构体的指针 - 实质上是一个this指针 - 作为第一个参数。可以通过分配结构体,然后在分配的数据上调用特殊的初始化函数 - 真正的构造函数 - 来对其进行建模。

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

多态

阅读有关虚拟表的内容;我认为这是最好的起点。您可能会发现编译器基本上:

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

短版

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接