diff options
author | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2013-08-21 07:28:24 +0000 |
---|---|---|
committer | Ahmed Bougacha <ahmed.bougacha@gmail.com> | 2013-08-21 07:28:24 +0000 |
commit | ff12d02d5107f9e10a3879beab3ba91c4da66061 (patch) | |
tree | 2bfe2e9415ef56d9db8c80989319446463f820b4 /llvm/lib/MC/MCFunction.cpp | |
parent | d3fc5b96481e2f769f1e83ea53c3fafe057f5582 (diff) | |
download | bcm5719-llvm-ff12d02d5107f9e10a3879beab3ba91c4da66061.tar.gz bcm5719-llvm-ff12d02d5107f9e10a3879beab3ba91c4da66061.zip |
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.
llvm-svn: 188881
Diffstat (limited to 'llvm/lib/MC/MCFunction.cpp')
-rw-r--r-- | llvm/lib/MC/MCFunction.cpp | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/MC/MCFunction.cpp b/llvm/lib/MC/MCFunction.cpp index 300ab5b1a0e..85e88e5852d 100644 --- a/llvm/lib/MC/MCFunction.cpp +++ b/llvm/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); +} |