我有这个字节代码片段:
define void @setGlobal(i32 %a) #0 {
entry:
%a.addr = alloca i32, align 4
store i32 %a, i32* %a.addr, align 4
%0 = load i32* %a.addr, align 4
store i32 %0, i32* @Global, align 4
%1 = load i32* %a.addr, align 4
store i32 %1, i32* getelementptr inbounds ([5 x i32]* @GlobalVec, i32 0, i64 0), align 4
store i32 2, i32* getelementptr inbounds ([5 x i32]* @GlobalVec, i32 0, i64 2), align 4
ret void
}
Run Code Online (Sandbox Code Playgroud)
我使用此代码从“store i32 %1,i32 * getelementptr inbounds([5 x i32] * @GlobalVec,i32 0,i64 0),对齐4”中查找getelementptr:
for (Module::iterator F = p_Module.begin(), endF = p_Module.end(); F != endF; ++F) {
for (Function::iterator BB = F->begin(), endBB = F->end(); BB != endBB; ++BB) {
for (BasicBlock::iterator I = BB->begin(), endI = BB->end(); I
!= endI; ++I) {
if (StoreInst* SI = dyn_cast<StoreInst>(I)) {
if (Instruction *gep = dyn_cast<Instruction>(SI->getOperand(1)))
{
if (gep->getOpcode() == Instruction::GetElementPtr)
{
//do something
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
此代码找不到 getelementptr。我究竟做错了什么?
您的位代码片段中没有任何getelementptr
说明,这就是您找不到它们的原因。
这两种看起来像getelementptr
指令的情况实际上是常量表达式- 明显的标志是它们作为另一条指令 ( store
) 的一部分出现,这不是常规指令可以做到的事情。
因此,如果您想搜索该表达式,您需要查找typeGetElementPtrConstantExpr
,而不是GetElementPtrInst
。
归档时间: |
|
查看次数: |
1247 次 |
最近记录: |