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

ari*_*ari 4 compiler-construction llvm

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

Oak*_*Oak 5

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

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


Ber*_*poh 5

首先,这%0只是一个标签。如果我们想明确地给它一个名字,有一个名为 的 LLVM 通道instnamerinstnamer我使用以下 cmd 使用pass显式给出每个标签的名称

$ 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
Run Code Online (Sandbox Code Playgroud)

然后在你的 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.
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助..


use*_*198 1

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