2015-11-06 63 views
2

我想获取getelementptr指令引用的数组的名称。这似乎当阵列被索引到工作到在实际的C代码使用一个中间变量,像这样获取LLVM getelementptr的操作数名称

int a = 0; 
i[a] = 3; 

在这种情况下,出现以下位码

%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom 
store i32 3, i32* %arrayidx, align 4 

在这种情况下我可以遍历通过getelementptr指令的操作数 ,并通过第一个操作数的getName()方法找到数组(i)的名称。

但是,如果在源中,数组是指数直接作为这样,

i[0] = 3; 

然后,产生位码是如下

store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4 

在这里,我不知道怎么走数组名称(i)来自位码。 存储指令的第二个操作数的类型设置为PointerTy。第二个操作数的包含类型是一个int。这两个都是预期的,因为操作数是i32 *。但是,在这种情况下,我不确定如何获取getelementptr指令的句柄来迭代操作数。

编辑:我应该指出,在阵列i是一个全球性的

回答

1

在第一个例子中,store指令的第二操作数是getelementptr指令,但是在第二示例中,这是一个getelementptr恒定表达式,因为指针和索引都是常量。

因此,在第一种情况下,如果得到StoreInst的指针操作数,则会得到一个GetElementPtrInst。在第二种情况下,您将得到一个ConstantExpr,其getOpcode()方法返回Instruction::GetElementPtr

您可以使用GEPOperator在代码中统一处理这两种情况。您可以使用dyn_cast<GEPOperator>(I),它可以为指令和常量执行正确的操作。 (注 - Operator不是LLVM IR概念 - 它只是一个C++抽象概念,可用于帮助您处理指令或常量表达式(可能发生在演员表,GEP或算术运算),但你不关心这个区别。)