获取 LLVM getelementptr 的操作数名称
Get operand name of a LLVM getelementptr in
我正在尝试获取 getelementptr 指令引用的数组的名称。当数组被索引到使用实际 c 代码中的中间变量时,这似乎有效
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;
那么生成的bitcode如下
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 是一个全局数组
在第一个例子中,store
指令的第二个操作数是getelementptr
指令,但在第二个例子中,它是getelementptr
常量表达式,因为指针和索引都是常量
因此,在第一种情况下,如果您获得 StoreInst
的指针操作数,您将获得 GetElementPtrInst
. In the second case, you'll get a ConstantExpr
其 getOpcode()
方法 returns Instruction::GetElementPtr
.
您可以使用 GEPOperator
在您的代码中统一处理这两种情况。您可以使用 dyn_cast<GEPOperator>(I)
,它会为指令和常量表达式做正确的事情。
(注意——Operator
不是一个 LLVM IR 概念——它只是一个 C++ 抽象来帮助你处理指令或常量表达式(这可能发生在强制转换、GEP 或算术运算)但您不关心它们之间的区别。)
我正在尝试获取 getelementptr 指令引用的数组的名称。当数组被索引到使用实际 c 代码中的中间变量时,这似乎有效
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;
那么生成的bitcode如下
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 是一个全局数组
在第一个例子中,store
指令的第二个操作数是getelementptr
指令,但在第二个例子中,它是getelementptr
常量表达式,因为指针和索引都是常量
因此,在第一种情况下,如果您获得 StoreInst
的指针操作数,您将获得 GetElementPtrInst
. In the second case, you'll get a ConstantExpr
其 getOpcode()
方法 returns Instruction::GetElementPtr
.
您可以使用 GEPOperator
在您的代码中统一处理这两种情况。您可以使用 dyn_cast<GEPOperator>(I)
,它会为指令和常量表达式做正确的事情。
(注意——Operator
不是一个 LLVM IR 概念——它只是一个 C++ 抽象来帮助你处理指令或常量表达式(这可能发生在强制转换、GEP 或算术运算)但您不关心它们之间的区别。)