BasicBlock *Program::createBasicBlock(ByteAddr address) { if (BasicBlock *result = getBasicBlockStartingAt(address)) { return result; } else if (BasicBlock *basicBlock = getBasicBlockCovering(address)) { removeRange(basicBlock); std::size_t i = 0; for (std::size_t size = basicBlock->statements().size(); i < size; ++i) { if (basicBlock->statements()[i]->instruction()->addr() >= address) { break; } } BasicBlock *result = takeOwnership(basicBlock->split(i, address)); addRange(basicBlock); addRange(result); return result; } else { BasicBlock *result = takeOwnership(std::make_unique<BasicBlock>(address)); addRange(result); return result; } }
BasicBlock *Program::createBasicBlock(ByteAddr address) { if (BasicBlock *result = getBasicBlockStartingAt(address)) { return result; } else if (BasicBlock *basicBlock = getBasicBlockCovering(address)) { removeRange(basicBlock); auto iterator = std::find_if(basicBlock->statements().begin(), basicBlock->statements().end(), [address](const Statement *statement) { return statement->instruction()->addr() >= address; }); BasicBlock *result = takeOwnership(basicBlock->split(iterator, address)); addRange(basicBlock); addRange(result); return result; } else { BasicBlock *result = takeOwnership(std::make_unique<BasicBlock>(address)); addRange(result); return result; } }
TIterator3 & operator = (TIterator3 const & other) { takeOwnership(other); return *this; }
BasicBlock *Program::createBasicBlock() { return takeOwnership(std::make_unique<BasicBlock>()); }