【发布时间】:2017-09-29 21:48:02
【问题描述】:
我有以下sn-p的代码:
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 函数返回非 void 值时,我无法捕获。
我如何知道 I 指令何时是返回指令并且它在 LLVM IR 中返回 Void?
【问题讨论】:
标签: c++ compiler-construction llvm llvm-ir