什么是 LLVM ExtractValueInst?
what is LLVM ExtractValueInst?
我正在研究一个 llvm 代码,在那里我找到了一行,
const ExtractValueInst *EI = cast<ExtractValueInst>(I);
st.setValue(I, st.getValue(EI->getAggregateOperand()));
现在,我明白了为什么要使用 cast<...>,但我无法与 ExtarctValueInst 联系起来,你能给我举个例子吗,IR 中的这条指令是什么,等价的 C 代码是什么?我也想知道 getAggregateOperand() 函数。提前谢谢你。
假设您有一个函数,它 return 是一个 32 位整数,它实际上不是一个整数,而是一组较小的位域 and/or 布尔值。也许后六位是0-63范围内的整数,第七位是布尔值等
您在某个地方调用了该函数,在调用下方一点处,您有使用 i6 的代码,它是 return 值的一部分。因此,您创建了一个 extractvalue 以从复合 return 值中提取一个值。 (如果组合在主内存中,您可能会创建一个 getelementptr/load 对,但由于它很可能在 CPU 寄存器中,因此您创建了一个提取值。)
这很常用,例如在异常处理中; catch 子句有一个参数,它是两个东西的组合,catch 子句测试两个组件之一以确定是捕获异常还是传递异常。
我正在研究一个 llvm 代码,在那里我找到了一行,
const ExtractValueInst *EI = cast<ExtractValueInst>(I);
st.setValue(I, st.getValue(EI->getAggregateOperand()));
现在,我明白了为什么要使用 cast<...>,但我无法与 ExtarctValueInst 联系起来,你能给我举个例子吗,IR 中的这条指令是什么,等价的 C 代码是什么?我也想知道 getAggregateOperand() 函数。提前谢谢你。
假设您有一个函数,它 return 是一个 32 位整数,它实际上不是一个整数,而是一组较小的位域 and/or 布尔值。也许后六位是0-63范围内的整数,第七位是布尔值等
您在某个地方调用了该函数,在调用下方一点处,您有使用 i6 的代码,它是 return 值的一部分。因此,您创建了一个 extractvalue 以从复合 return 值中提取一个值。 (如果组合在主内存中,您可能会创建一个 getelementptr/load 对,但由于它很可能在 CPU 寄存器中,因此您创建了一个提取值。)
这很常用,例如在异常处理中; catch 子句有一个参数,它是两个东西的组合,catch 子句测试两个组件之一以确定是捕获异常还是传递异常。