我正在学习一个llvm代码,在那里我发现了一行,
const ExtractValueInst *EI = cast<ExtractValueInst>(I);
st.setValue(I, st.getValue(EI->getAggregateOperand()));
现在,我明白为什么cast<…>正在使用,但我不能与ExtarctValueInst相关,你能给我一个例子吗?这是IR中的指令,什么是等效的C代码?我也想知道getAggregateOperand()函数也。提前谢谢你。
假设您有一个函数返回一个32位整数,该整数实际上不是一个整数,而是一组较小的位域和/或bool。可能底部六位是0-63范围内的整数,第七个位是布尔值,等等。
你在某个地方调用了这个函数,在调用的下面,你有代码使用了i6,这是返回值的一部分。因此,您可以创建一个extractvalue来从复合返回值中提取一个值。(如果组合在主存中,您可能会创建getelementptr/load对,但由于它最有可能在CPU寄存器中创建extractvalue。)
这是非常常用的,例如在异常处理;catch子句只有一个形参,该形参由两部分组成,catch子句测试这两部分中的一个,以确定是捕获异常还是传递异常。