From 3012ac538725a2b7faff75d0c317b2bd9e99fcf9 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 21 Aug 2013 07:27:59 +0000 Subject: [PATCH] MC CFG: Add more MCFunction container methods (find, empty). llvm-svn: 188876 --- llvm/include/llvm/MC/MCFunction.h | 10 ++++++++-- llvm/lib/MC/MCFunction.cpp | 12 ++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/llvm/include/llvm/MC/MCFunction.h b/llvm/include/llvm/MC/MCFunction.h index 4c75cd4..a87b948 100644 --- a/llvm/include/llvm/MC/MCFunction.h +++ b/llvm/include/llvm/MC/MCFunction.h @@ -97,13 +97,15 @@ public: StringRef getName() const { return Name; } - /// \name Access to the function's basic blocks. No ordering is enforced. + /// \name Access to the function's basic blocks. No ordering is enforced, + /// except that the first block is the entry block. /// @{ /// \brief Get the entry point basic block. const MCBasicBlock *getEntryBlock() const { return front(); } MCBasicBlock *getEntryBlock() { return front(); } - // NOTE: Dereferencing iterators gives pointers, so maybe a list is best here. + bool empty() const { return Blocks.empty(); } + typedef BasicBlockListTy::const_iterator const_iterator; typedef BasicBlockListTy:: iterator iterator; const_iterator begin() const { return Blocks.begin(); } @@ -115,6 +117,10 @@ public: MCBasicBlock* front() { return Blocks.front(); } const MCBasicBlock* back() const { return Blocks.back(); } MCBasicBlock* back() { return Blocks.back(); } + + /// \brief Find the basic block, if any, that starts at \p StartAddr. + const MCBasicBlock *find(uint64_t StartAddr) const; + MCBasicBlock *find(uint64_t StartAddr); /// @} }; diff --git a/llvm/lib/MC/MCFunction.cpp b/llvm/lib/MC/MCFunction.cpp index cb25046..5011d5f 100644 --- a/llvm/lib/MC/MCFunction.cpp +++ b/llvm/lib/MC/MCFunction.cpp @@ -30,6 +30,18 @@ MCBasicBlock &MCFunction::createBlock(const MCTextAtom &TA) { return *Blocks.back(); } +const MCBasicBlock *MCFunction::find(uint64_t StartAddr) const { + for (const_iterator I = begin(), E = end(); I != E; ++I) + if ((*I)->getInsts()->getBeginAddr() == StartAddr) + return (*I); + return 0; +} + +MCBasicBlock *MCFunction::find(uint64_t StartAddr) { + return const_cast( + const_cast(this)->find(StartAddr)); +} + // MCBasicBlock MCBasicBlock::MCBasicBlock(const MCTextAtom &Insts, MCFunction *Parent) -- 2.7.4