From aeb2bbcb6d4f13d0032d57fd1cb1a92da2acd01e Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 21 Aug 2013 07:28:24 +0000 Subject: MC CFG: Split MCBasicBlocks to mirror atom splitting. When an MCTextAtom is split, all MCBasicBlocks backed by it are automatically split, with a fallthrough between both blocks, and the successors moved to the second block. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188881 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/MCFunction.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'lib/MC/MCFunction.cpp') diff --git a/lib/MC/MCFunction.cpp b/lib/MC/MCFunction.cpp index 300ab5b1a0..85e88e5852 100644 --- a/lib/MC/MCFunction.cpp +++ b/lib/MC/MCFunction.cpp @@ -46,8 +46,9 @@ MCBasicBlock *MCFunction::find(uint64_t StartAddr) { // MCBasicBlock MCBasicBlock::MCBasicBlock(const MCTextAtom &Insts, MCFunction *Parent) - : Insts(&Insts), Parent(Parent) -{} + : Insts(&Insts), Parent(Parent) { + getParent()->getParent()->trackBBForAtom(&Insts, this); +} void MCBasicBlock::addSuccessor(const MCBasicBlock *MCBB) { if (!isSuccessor(MCBB)) @@ -68,3 +69,14 @@ bool MCBasicBlock::isPredecessor(const MCBasicBlock *MCBB) const { return std::find(Predecessors.begin(), Predecessors.end(), MCBB) != Predecessors.end(); } + +void MCBasicBlock::splitBasicBlock(MCBasicBlock *SplitBB) { + assert(Insts->getEndAddr() + 1 == SplitBB->Insts->getBeginAddr() && + "Splitting unrelated basic blocks!"); + SplitBB->addPredecessor(this); + assert(SplitBB->Successors.empty() && + "Split basic block shouldn't already have successors!"); + SplitBB->Successors = Successors; + Successors.clear(); + addSuccessor(SplitBB); +} -- cgit v1.2.3