我是LLVM的新手并且正在尝试学习本身非常难的基础知识。
我现在已经达到了尝试在IR中编写简单程序的程度。文档非常清楚IR代码的语法和用法。现在,我已经完成了2到3个教程,当然是介绍了构建器框架。然而,这非常复杂。
首先,构建器系统有两个接口,即C ++和C接口。两者似乎乍一看都提供相同的功能。出现的第一个问题当然是应该使用哪一个?一个优于另一个有优势吗?这是品味问题吗?我无法找到答案所以我决定使用C ++界面。
坦率地说,这个构建器框架更难理解。所以现在我不仅要面对学习IR代码以及如何正确使用IR代码,而且还要使用构建器界面,这会使事情变得更加混乱
例如:从我对基本IR语言的学习中,我会天真地去写一些类似的东西:
%1 = add i32 42, %0
非常清楚。我只花了3个小时找到如何使用构建器框架来完成它,我的答案甚至都不令人满意,因为我必须首先使用alloca调用分配存储,然后给我留下通过指针写入的代码。
据我了解,IR语言和底层SSA系统应该使用上面那样的伪存储器,而不是使用我的代码明确分配的内存地址。
经过相当多的实验后,我得出的结论是,我认为在我的程序中手动生成IR代码可能更好更容易。
我的问题是:在IR构建器框架中是否有任何主要优势使得在手动方法中使用它更加明智?或者它应该更容易使用,这就是全部?
由于
答案 0 :(得分:3)
IR构建器应该使IR构造更容易,就是这样。它跟踪基本块中的插入点,通常使用它会导致代码更短。
但是不要太担心它:完全可以用简单的C ++ API调用来创建IR。您还应该熟悉LLVM中的C ++后端,它将IR转换为构造它所需的C ++ API调用序列 - 它非常有用。有关示例,请参阅此online Clang demo - 选择“LLVM C ++ API代码”作为目标。