如何从llvm中的加载指令中获取寄存器名称

时间:2014-01-04 20:15:37

标签: compiler-construction llvm

我正在尝试从LoadInst指针获取存储装载结果的寄存器的名称。
例如,如果我的loadInst指针指向此指令%0 =加载i32 *%i,对齐4 那么我应该如何从指令中获得%0?

3 个答案:

答案 0 :(得分:5)

%0是指令的名称,而不是寄存器名称 - LLVM中间表示中没有寄存器。

在任何情况下,所有指令都继承自定义Value方法的getName()类,这就是您应该调用的内容。但是,请记住,通常许多指令都是未命名的,因此getName()不会返回任何有用的内容 - %0等名称仅在将模块作为文本发出时指定,并且在此之前不存在

答案 1 :(得分:3)

首先,%0只是一个标签。如果我们想要明确地给它命名,那么有一个名为instnamer的LLVM传递。以下cmd用于使用instnamer传递

明确指定每个标签的名称
$ clang++  -std=c++11 -g -emit-llvm -c hello.c -o hello.bc
$ opt -instnamer -load ../your/path/to/library.so -passname   <hello.bc> hello.bc

然后在你的LLVM传递中,即LLVM API:

if (LoadInst *loadInst = dyn_cast<LoadInst>(&I)) {
   loadInst->dump();
   errs()<<loadInst->getName(); // This is your %temp0  not %0 anymore the pass explicitly rewritten the LLVM IR to %temp0.
}

希望这会有所帮助..

答案 2 :(得分:1)

callInst从Value中获取,因此您可以通过getName()获取Name。但是,值是未命名的(具有类似%0的名称)然后这将不起作用,因为它不是有意义的返回值。因此,如果你想得到一个名字,你需要给它一个名字。