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



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

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

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

首先,%0只是一个标签。如果我们想明确地给它起一个名字,有一个叫做 LLVM 通行证 instnamer .以下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.
}

希望这有帮助..

调用Inst独立于Value,因此您可以通过getName()获取Name。但是,如果该值是 uname(具有类似于 %0 的名称),那么这将不起作用,因为 thet 没有有意义的值要返回。所以如果你想得到一个名字,你需要给它一个名字。

最新更新