2012-12-19 94 views
2

運行LLVM傳遞時出現分段錯誤。我需要在基本塊的循環「for」循環之外使用BBterminators數組。看來LLVM在遍歷循環時不保護地址(注意:TerminatorInst *BasicBlock::getTerminator()),所以我需要將BBterminators保留在Instruction類型的變量中,而不是Instruction *。如何將整個Instructions複製到BBterminatorsLLVM分段錯誤/需要使用指令而不是指令*

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

計算的

之前引入一個條件

if (!(II->empty()) && II->back().isTerminator()) 

4

我不知道你所說的 「保護」 在這裏的意思。遍歷BB並查看它們的終止符當然不會使指令指針無效,所以只要您安全地不刪除任何內容,就可以保留它們。在任何情況下,您也可以通過調用clone來複制Instruction*對象(請注意,Instruction不能通過設計與copy 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()); 
    } 
    ... 
    ... 
} 

一旦你完成它,不要忘了釋放你的副本向量。