如何验证 LLVM "ret" 指令 returns 是否无效?
How to verify if LLVM "ret" instruction returns void?
我有以下代码片段:
static LLVMContext TempContext;
Type * RetTy = Type::getVoidTy(TempContext)
for (Instruction *I : ListOfInstructions) {
if (isa<ReturnInst>(I)) {
RetTy = I->getOperand(0)->getType();
break
}
}
在我试图捕获指令的RetTy 的地方,不管是否无效,所以我可以在
上使用它
getOrInsertFunction("TempF", FunctionType::get(RetTy, ArgsTys,false));
只要 ret 指令不是 ret void
,此代码就有效。
我试图添加第二个 if
来检查 void
的情况,但这似乎不起作用,并且执行停止在 FunctionType::get(...)
函数中,打印一个回溯。
for (Instruction *I : ListOfInstructions) {
if (isa<ReturnInst>(I)) {
if ( I->getOperand(0)->getType() != Type::getVoidTy(TempContext)) {
RetTy = I->getOperand(0)->getType();
break
}
}
}
请注意,删除 for
循环一起工作并继续执行,因为函数 FunctionType::get(...)
处理 RetTy
的初始化 Type * RetTy = Type::getVoidTy(TempContext)
"void" 值正好。但是后来我无法捕获 llvm 函数 return 的非空值。
我如何知道指令 I 是 return 指令并且它在 LLVM IR 中是 returning Void?
您当前代码的问题是 ret void
没有操作数,因此调用 getOperand(0)
会访问无效数据。
将您的 if 替换为:
if (ReturnInst *ri = dyn_cast<ReturnInst>(I))
{
if (ri->getNumOperands() == 0)
{
errs() << "VOID: " << *ri << "\n";
}
else
{
errs() << "NON-VOID: " << *ri << "\n";
}
}
现在,此代码将输出 VOID: ret void
,已正确检测到指令。
作为替代方案,您可以使用任何指令检索函数的 return 类型,方法是依赖于函数 I->getFunction()->getReturnType()
中包含的指令;但是,这将假定该函数格式正确且其 ReturnInst 与其类型匹配并且该指令是函数的一部分。
我有以下代码片段:
static LLVMContext TempContext;
Type * RetTy = Type::getVoidTy(TempContext)
for (Instruction *I : ListOfInstructions) {
if (isa<ReturnInst>(I)) {
RetTy = I->getOperand(0)->getType();
break
}
}
在我试图捕获指令的RetTy 的地方,不管是否无效,所以我可以在
上使用它getOrInsertFunction("TempF", FunctionType::get(RetTy, ArgsTys,false));
只要 ret 指令不是 ret void
,此代码就有效。
我试图添加第二个 if
来检查 void
的情况,但这似乎不起作用,并且执行停止在 FunctionType::get(...)
函数中,打印一个回溯。
for (Instruction *I : ListOfInstructions) {
if (isa<ReturnInst>(I)) {
if ( I->getOperand(0)->getType() != Type::getVoidTy(TempContext)) {
RetTy = I->getOperand(0)->getType();
break
}
}
}
请注意,删除 for
循环一起工作并继续执行,因为函数 FunctionType::get(...)
处理 RetTy
的初始化 Type * RetTy = Type::getVoidTy(TempContext)
"void" 值正好。但是后来我无法捕获 llvm 函数 return 的非空值。
我如何知道指令 I 是 return 指令并且它在 LLVM IR 中是 returning Void?
您当前代码的问题是 ret void
没有操作数,因此调用 getOperand(0)
会访问无效数据。
将您的 if 替换为:
if (ReturnInst *ri = dyn_cast<ReturnInst>(I))
{
if (ri->getNumOperands() == 0)
{
errs() << "VOID: " << *ri << "\n";
}
else
{
errs() << "NON-VOID: " << *ri << "\n";
}
}
现在,此代码将输出 VOID: ret void
,已正确检测到指令。
作为替代方案,您可以使用任何指令检索函数的 return 类型,方法是依赖于函数 I->getFunction()->getReturnType()
中包含的指令;但是,这将假定该函数格式正确且其 ReturnInst 与其类型匹配并且该指令是函数的一部分。