gpt4 book ai didi

c++ - 解析和修改 LLVM IR 代码

转载 作者:可可西里 更新时间:2023-11-01 14:53:43 28 4
gpt4 key购买 nike

我想阅读(解析)LLVM IR 代码(保存在文本文件中)并向其中添加一些我自己的代码。我需要一些这样做的例子,也就是说,这是如何通过使用 LLVM 为此目的提供的库来完成的。所以基本上我想要的是将 IR 代码从文本文件读入内存(也许 LLVM 库以 AST 形式表示它,我不知道),进行修改,比如在 AST 中添加更多节点然后最后写返回 IR 文本文件中的 AST。

虽然我需要阅读和修改 IR 代码,但如果有人可以提供或推荐我阅读(解析)它的一些示例,我将不胜感激。

最佳答案

首先,纠正一个明显的误解:LLVM 是一个用于操作 IR 格式代码的框架。看不到 AST (*) - 你读取 IR,转换/操作/分析它,然后你写回 IR。

阅读 IR 非常简单:

int main(int argc, char** argv)
{
if (argc < 2) {
errs() << "Expected an argument - IR file name\n";
exit(1);
}

LLVMContext &Context = getGlobalContext();
SMDiagnostic Err;
Module *Mod = ParseIRFile(argv[1], Err, Context);

if (!Mod) {
Err.print(argv[0], errs());
return 1;
}

[...]
}

这段代码接受一个文件名。这应该是一个 LLVM IR 文件(文本)。然后继续将其解析为 Module,代表 LLVM 内部内存格式的 IR 模块。然后可以使用 LLVM 拥有的各种传递或您自己添加的传递来操纵它。查看 LLVM 代码库中的一些示例(例如 lib/Transforms/Hello/Hello.cpp)并阅读此 - http://llvm.org/docs/WritingAnLLVMPass.html .

将 IR 吐回到文件中甚至更容易。 Module 类只是将自身写入流:

 some_stream << *Mod;

就是这样。

现在,如果您对要对 IR 代码进行的特定修改有任何特定问题,您真的应该问一些更有针对性的问题。我希望这个答案能告诉您如何解析 IR 并将其写回。


(*) IR 在 LLVM 中没有 AST 表示,因为它是一种简单的类汇编语言。如果您更上一层楼,使用 C 或 C++,您可以使用 Clang 将其解析为 AST,然后在 AST 级别进行操作。然后 Clang 知道如何从其 AST 生成 LLVM IR。但是,您必须在此处从 C/C++ 开始,而不是 LLVM IR。如果您只关心 LLVM IR,请忘掉 AST。

关于c++ - 解析和修改 LLVM IR 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9167347/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com