对于 LLVM IR 指令,如 %cmp7 = icmp eq i32 %6 %7
我想获取所有三个寄存器/符号名称(即 %cmp %6 and %7
)
现在我可以得到字符串 %cmp
通过命令 pi->getName()
其中 pi 是指令指针。但是当我尝试获取 oprand 名称时,我得到了 空字符串 通过键入 pi->getOperand(0)->getName()
.
我试过isa<Instruction>(pi->getOperand(0))
检查这是否是一条指令并且它返回 true 但是 pi->getOperand(0)->hasName()
返回错误。事情让我感到奇怪的是,为什么这两个 pi
和 pi->getOperand(0)
是说明,但只有 pi
有名字吗?
有什么想法可以通过 API 获取操作数名称(字符串 %6
和 %7
此处)?
我使用的 LLVM 版本是 3.4.2
最佳答案
名称对于 LLVM 指令是可选的,实际上是 icmp
的两个操作数在这种情况下,指令没有名称,因此是空字符串。
当您将 LLVM 模块打印到 .ll 文件时,作者会分配一个 %<num>
为每条指令命名以使其易于阅读,但这只是作者在打印期间所做的事情,该字符串在实际模块中不存在。
关于LLVM 获取指令的操作数和左值名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24434771/