gpt4 book ai didi

c++ - 如何验证 LLVM "ret"指令是否返回无效?

转载 作者:行者123 更新时间:2023-11-30 01:39:06 25 4
gpt4 key购买 nike

我有以下代码片段:

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(...) 处理初始化的 Type * RetTy = Type::getVoidTy(TempContext) RetTy 的“无效”值就好了。但是当 llvm 函数返回非空值时,我无法捕获。


我如何知道指令 I 何时是返回指令并且它在 LLVM IR 中返回 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,已正确检测到指令。

作为替代方案,您可以根据函数 I->getFunction()->getReturnType() 中包含的指令,使用任何指令检索函数的返回类型;但是,这将假定函数格式正确且其 ReturnInst 与其类型匹配并且指令是函数的一部分。

关于c++ - 如何验证 LLVM "ret"指令是否返回无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46497334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com