Exemple #1
0
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;
    }
}
Exemple #2
0
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;
 }
Exemple #4
0
BasicBlock *Program::createBasicBlock() {
    return takeOwnership(std::make_unique<BasicBlock>());
}