void FlowGraph::interposeBlock(BasicBlock* bb){ ASSERT(bb->getNumberOfSources() == 1 && bb->getNumberOfTargets() == 1); BasicBlock* sourceBlock = bb->getSourceBlock(0); BasicBlock* targetBlock = bb->getTargetBlock(0); //sourceBlock->print(); //targetBlock->print(); bool linkFound = false; for (uint32_t i = 0; i < sourceBlock->getNumberOfTargets(); i++){ if (sourceBlock->getTargetBlock(i)->getIndex() == targetBlock->getIndex()){ linkFound = true; break; } } if (!linkFound){ function->print(); print(); sourceBlock->print(); targetBlock->print(); } ASSERT(linkFound && "There should be a source -> target block relationship between the blocks passed to this function"); ASSERT(sourceBlock->getBaseAddress() + sourceBlock->getNumberOfBytes() != targetBlock->getBaseAddress() && "Source shouldn't fall through to target"); bb->setBaseAddress(blocks.back()->getBaseAddress() + blocks.back()->getNumberOfBytes()); bb->setIndex(basicBlocks.size()); basicBlocks.append(bb); //PRINT_INFOR("now there are %d bbs in function %s", basicBlocks.size(), function->getName()); //PRINT_INFOR("new block has base addres %#llx", bb->getBaseAddress()); blocks.append(bb); sourceBlock->removeTargetBlock(targetBlock); sourceBlock->addTargetBlock(bb); targetBlock->removeSourceBlock(sourceBlock); targetBlock->addSourceBlock(bb); X86Instruction* jumpToTarget = bb->getLeader(); jumpToTarget->setBaseAddress(blocks.back()->getBaseAddress() + blocks.back()->getSizeInBytes()); jumpToTarget->setIndex(0); ASSERT(sourceBlock->getExitInstruction()); ASSERT(sourceBlock->getExitInstruction()->getAddressAnchor()); ASSERT(sourceBlock->getExitInstruction()->getTargetAddress() == targetBlock->getBaseAddress()); sourceBlock->getExitInstruction()->getAddressAnchor()->updateLink(jumpToTarget); //bb->print(); //bb->printInstructions(); }