解析和修改LLVM IR代码

Met*_*est 11 c c++ llvm

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

虽然我需要阅读和修改IR代码,但如果有人能够提供或推荐我刚刚读取(解析)它的一些示例,我将非常感激.

Eli*_*sky 26

首先,要解决一个明显的误解: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;
    }

    [...]
  }
Run Code Online (Sandbox Code Playgroud)

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

将IR吐回文件更加容易.该Module班只是自身写入流:

 some_stream << *Mod;
Run Code Online (Sandbox Code Playgroud)

而已.

现在,如果您对要对IR代码进行的具体修改有任何具体问题,那么您应该提出更具针对性的问题.我希望这个答案向您展示如何解析IR并将其写回.


(*)IR在LLVM中没有AST表示,因为它是一种简单的类汇编语言.如果你向上一步,使用C或C++,你可以使用Clang将其解析为AST,然后在AST级别进行操作.然后Clang知道如何从AST生成LLVM IR.但是,您必须从这里开始使用C/C++,而不是LLVM IR.如果你关心的是LLVM IR,那就忘了AST.