LLVM IR:获取LVALUE操作数

时间:2016-11-24 20:56:28

标签: c++ llvm-ir

我有以下指示:

%ptrA = getelementptr float, float addrspace(1)* %A, i32 %id

我可以使用%A%id获取操作数getOperand(0)getOperand(1)。我想知道getOperand是否适用于%ptrA?如果是,那会是getOperand(3)吗?

------------------------------------编辑---------- ------------------

所以我改变了我的代码如下:

for (Instruction &I : instructions(F)){
    if (cast<Operator>(I).getOpcode() == Instruction::GetElementPtr){
        Value* AddrPointer = cast<Value>(I);

我一直收到错误:

error: cannot convert ‘llvm::Value’ to ‘llvm::Value*’ in initialization
       Value* AddrPointer = cast<Value>(I);
                                         ^

我发现类型不匹配存在一些问题。

谢谢。

1 个答案:

答案 0 :(得分:3)

你的问题缺乏相当多的背景,但我假设你正在使用代表特定llvm::Instruction *指令的getelementptr。不,getOperand()将不允许您访问%ptrA。通常,getOperand()仅允许访问指令的操作数或参数,但不允许访问其返回值。在IR中,%ptrA并不像传统汇编那样是指令的操作数,但可以被认为更像是指令的返回值

您尝试做的语法实际上非常方便。 llvm::Instruction对象本身表示自己的返回值。实际上,llvm::Instructionllvm::Value的派生类。您可以使用llvm::castllvm::Value作为模板参数,结果实际上是llvm::Value *,表示getelementptr的返回值。

llvm::Instruction * instruc;

//next line assumes instruc has your getelementptr instruction

llvm::Value * returnval = llvm::cast<llvm::Value>(instruc);
//returnval now contains the result of the instruction
//you could potentially create new instructions with IRBuilder using returnval as an argument, and %ptrA would actually be passed as an operand to those instructions

此外,许多实际创建指令的函数(例如llvm::IRBuilder::Create*指令)甚至不返回llvm::Instruction *,而是返回llvm::Value * s。这非常方便,因为大多数情况下,如果您需要将指令的返回值提供给另一个指令,您可以简单地将您调用的Create函数的返回值传递给下一个Create功能,无需任何铸造。