运行LLVM传递时出现分段错误。我需要在基本块的迭代“for”循环之外使用BBterminators数组。在迭代循环时,似乎LLVM不保护地址(注意:TerminatorInst *BasicBlock::getTerminator()
),因此我需要将BBterminators保留在Instruction
类型的变量中,而不是Instruction *
。如何将整个Instructions
复制到BBterminators
?
for (Function::iterator II = F.begin(), EE = F.end(); II != EE; ++II, ++ii)
{
BasicBlock* BB = (dyn_cast<BasicBlock>(II));
if (BB->getTerminator())
{
Instruction *current = BB->getTerminator();
Instruction *previous = current->getPrevNode();
if (current->getOpcode() == Instruction::Br)
{
BBterminators[ii] = current;
其中Instruction **BBterminators = new Instruction *[100];
答案 0 :(得分:4)
我不确定你在这里“保护”是什么意思。迭代BB并查看它们的终结符肯定不会使指令指针无效,所以只要你不安全删除任何东西就可以保留它们。在任何情况下,您也可以通过调用Instruction*
来复制clone
个对象(请注意Instruction
是不可复制的,具有复制ctor和赋值运算符的设计)。像这样:
virtual bool runOnFunction(Function &F) {
std::vector<Instruction*> terminators;
for (Function::iterator bb = F.begin(), bb_e = F.end(); bb != bb_e; ++bb) {
terminators.push_back(bb->getTerminator()->clone());
}
...
...
}
完成后,不要忘记发布副本。
答案 1 :(得分:0)
介绍条件
if ( !(II->empty()) && II->back().isTerminator() )
在计算之前