for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) {
GlobalVariable* GV = I;
if(!GV->hasInitializer())
continue;
ConstantArray* array = dyn_cast<ConstantArray>(GV->getInitializer());
if(array){
for(unsigned int i = 0; i < array->getNumOperands(); i++){
ConstantExpr* ce = dyn_cast<ConstantExpr>(array->getOperand(i));
if(ce == 0)
continue;
ce->getAsInstruction(); //if add, get error!!!
}
continue;
}
}
为什么ce-&gt; getAsInstruction()会导致在销毁某个值时保留使用!
答案 0 :(得分:1)
getAsInstruction
会创建一个新的Instruction
,但不会在任何地方插入。如果您转储Module
,则会发现您再次看不到它创建的Instruction
,因为它尚未添加到BasicBlock
。您需要使用
指令* I = ce-&gt; getAsInstruction();
I-&GT;的insertBefore(OtherInstruction);
由于你没有这样做,当Constant
被销毁时,这些Instruction
仍将在内存中,并且它们使用(包含指向)作为操作数的Constants
您的ce
。因此“当一个值[在这种情况下,原始的Constant的操作数]被破坏时,使用仍然存在”。
答案 1 :(得分:0)
那是因为铿锵作弊;为了性能,它会跳过所有llvm内存清理阶段并退出到操作系统。检查无资料的指令永远不会运行。如果我使用opt加载此传递,则会导致在销毁值时保留使用。但是使用clang -mllvm -xxx来使用pass它运行良好。
如果您感兴趣,实际上您可以停止跳过该阶段。 Clang使用不同的命令行(clang -cc1 [other flags])运行自己,你需要修改第二个命令。要获得-cc1行,请在clang后放置标志“ - ###”。它必须是clang的第一个参数, - ###是位置敏感的。这将使干净的-cc1命令打印到终端而不是运行它。编辑该行以删除“-disable-free”然后自己运行它并且clang应该给出与opt相同的错误。