diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-07-02 19:49:34 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-07-02 19:49:34 +0000 |
commit | cbc5ac7a7ed5895a1d6b56f21d4a7ea936b50d91 (patch) | |
tree | e568e1e28c66578dda980f6f92aa947ff97c4578 /llvm/lib/MC/MCAnalysis/MCFunction.cpp | |
parent | 2ab92cf8f091e5262f9e2aa86318560a008359cd (diff) | |
download | bcm5719-llvm-cbc5ac7a7ed5895a1d6b56f21d4a7ea936b50d91.tar.gz bcm5719-llvm-cbc5ac7a7ed5895a1d6b56f21d4a7ea936b50d91.zip |
Move CFG building code to a new lib/MC/MCAnalysis library.
The new library is 150KB on a Release+Asserts build, so it is quiet a bit of
code that regular users of MC don't need to link with now.
llvm-svn: 212209
Diffstat (limited to 'llvm/lib/MC/MCAnalysis/MCFunction.cpp')
-rw-r--r-- | llvm/lib/MC/MCAnalysis/MCFunction.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/llvm/lib/MC/MCAnalysis/MCFunction.cpp b/llvm/lib/MC/MCAnalysis/MCFunction.cpp new file mode 100644 index 00000000000..4e09d1a52da --- /dev/null +++ b/llvm/lib/MC/MCAnalysis/MCFunction.cpp @@ -0,0 +1,76 @@ +//===-- lib/MC/MCFunction.cpp -----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCAnalysis/MCFunction.h" +#include "llvm/MC/MCAnalysis/MCAtom.h" +#include "llvm/MC/MCAnalysis/MCModule.h" +#include <algorithm> + +using namespace llvm; + +// MCFunction + +MCFunction::MCFunction(StringRef Name, MCModule *Parent) + : Name(Name), ParentModule(Parent) +{} + +MCBasicBlock &MCFunction::createBlock(const MCTextAtom &TA) { + std::unique_ptr<MCBasicBlock> MCBB(new MCBasicBlock(TA, this)); + Blocks.push_back(std::move(MCBB)); + return *Blocks.back(); +} + +MCBasicBlock *MCFunction::find(uint64_t StartAddr) { + for (const_iterator I = begin(), E = end(); I != E; ++I) + if ((*I)->getInsts()->getBeginAddr() == StartAddr) + return I->get(); + return nullptr; +} + +const MCBasicBlock *MCFunction::find(uint64_t StartAddr) const { + return const_cast<MCFunction *>(this)->find(StartAddr); +} + +// MCBasicBlock + +MCBasicBlock::MCBasicBlock(const MCTextAtom &Insts, MCFunction *Parent) + : Insts(&Insts), Parent(Parent) { + getParent()->getParent()->trackBBForAtom(&Insts, this); +} + +void MCBasicBlock::addSuccessor(const MCBasicBlock *MCBB) { + if (!isSuccessor(MCBB)) + Successors.push_back(MCBB); +} + +bool MCBasicBlock::isSuccessor(const MCBasicBlock *MCBB) const { + return std::find(Successors.begin(), Successors.end(), + MCBB) != Successors.end(); +} + +void MCBasicBlock::addPredecessor(const MCBasicBlock *MCBB) { + if (!isPredecessor(MCBB)) + Predecessors.push_back(MCBB); +} + +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); +} |