LLVM Builder 相对于手动构建 IR 代码的优势是什么?

What is the advantage of LLVM Builder over manual construction of IR code?

我是 LLVM 的新手,正在尝试学习本身就很难的基础知识。

我现在已经到了尝试在 IR 中编写简单程序的地步。该文档对 IR 代码的语法和用法非常清楚。现在,我已经学习了 2 或 3 个教程,当然也了解了构建器框架。然而,这非常复杂。

首先,构建器系统有两个接口,C++和C接口。乍一看,两者似乎都提供相同的功能。出现的第一个问题当然是,应该使用哪个?一个比另一个有优势吗?这是品味问题吗?我找不到答案,所以我决定使用 C++ 接口。

坦率地说,这个构建器框架更难理解。所以现在我不仅面临学习 IR 代码以及如何正确使用它,而且在它之上还有构建器界面,这让事情变得更加混乱

例如:根据我对基本 IR 语言的学习,我会天真地去写类似这样的东西:

%1 = add i32 42, %0 

这很清楚。我只花了 3 个小时找出如何使用构建器框架来做到这一点,我的答案甚至都不令人满意,因为我必须首先使用 alloca 调用分配存储空间,然后给我留下通过指针写入的代码。

据我了解,IR 语言和底层 SSA 系统应该像上面那样使用伪寄存器,而不是使用我的代码显式分配的内存地址。

因此,经过相当多的实验后,我认为在我的程序中手动生成 IR 代码可能更好、更容易。

我的问题是:在 IR 构建器框架中是否有任何主要优势使得强烈建议使用它而不是手动方法?或者它只是应该更容易使用,仅此而已?

谢谢

IR 构建器应该使 IR 构建更容易,仅此而已。它跟踪基本块中的插入点,通常使用它会导致代码更短。

但不要太担心它:完全可以只用普通的 C++ API 调用来创建 IR。您还应该熟悉 LLVM 中的 C++ 后端,它将 IR 转换为构造它所需的 C++ API 调用序列 - 这非常有用。例如,将此 online Clang demo - select "LLVM C++ API code" 视为目标。