断言失败:(use_empty()&&"当值被销毁时保持使用!")

时间:2015-08-11 06:14:54

标签: llvm llvm-ir

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()会导致在销毁某个值时保留使用!

2 个答案:

答案 0 :(得分:1)

getAsInstruction会创建一个新的Instruction,但不会在任何地方插入。如果您转储Module,则会发现您再次看不到它创建的Instruction,因为它尚未添加到BasicBlock。您需要使用

之类的内容选择指令的去向
  

指令* I = ce-&gt; getAsInstruction();
  I-&GT;的insertBefore(OtherInstruction);

由于你没有这样做,当Constant被销毁时,这些Instruction仍将在内存中,并且它们使用(包含指向)作为操作数的Constants您的ce。因此“当一个值[在这种情况下,原始的Constant的操作数]被破坏时,使用仍然存在”。

答案 1 :(得分:0)

  

如果我使用opt加载此传递,则会导致在销毁值时保留使用。但是使用clang -mllvm -xxx来使用pass它运行良好。

那是因为铿锵作弊;为了性能,它会跳过所有llvm内存清理阶段并退出到操作系统。检查无资料的指令永远不会运行。

如果您感兴趣,实际上您可以停止跳过该阶段。 Clang使用不同的命令行(clang -cc1 [other flags])运行自己,你需要修改第二个命令。要获得-cc1行,请在clang后放置标志“ - ###”。它必须是clang的第一个参数, - ###是位置敏感的。这将使干净的-cc1命令打印到终端而不是运行它。编辑该行以删除“-disable-free”然后自己运行它并且clang应该给出与opt相同的错误。