MC CFG: Add a few needed methods, mainly MCModule::findFirstAtomAfter.

While there, do some minor cleanup.

llvm-svn: 188880
This commit is contained in:
Ahmed Bougacha 2013-08-21 07:28:17 +00:00
parent ffeecb5c80
commit d3fc5b9648
4 changed files with 30 additions and 5 deletions

View File

@ -97,6 +97,12 @@ public:
StringRef getName() const { return Name; } StringRef getName() const { return Name; }
/// \name Get the owning MC Module.
/// @{
const MCModule *getParent() const { return ParentModule; }
MCModule *getParent() { return ParentModule; }
/// @}
/// \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. /// except that the first block is the entry block.
/// @{ /// @{

View File

@ -43,7 +43,9 @@ class MCModule {
typedef std::vector<MCAtom*> AtomListTy; typedef std::vector<MCAtom*> AtomListTy;
AtomListTy Atoms; AtomListTy Atoms;
// For access to map/remap.
friend class MCAtom; friend class MCAtom;
/// \brief Remap \p Atom to the given range, and update its Begin/End fields. /// \brief Remap \p Atom to the given range, and update its Begin/End fields.
/// \param Atom An atom belonging to this module. /// \param Atom An atom belonging to this module.
/// An atom should always use this method to update its bounds, because this /// An atom should always use this method to update its bounds, because this
@ -83,6 +85,8 @@ public:
/// @{ /// @{
const MCAtom *findAtomContaining(uint64_t Addr) const; const MCAtom *findAtomContaining(uint64_t Addr) const;
MCAtom *findAtomContaining(uint64_t Addr); MCAtom *findAtomContaining(uint64_t Addr);
const MCAtom *findFirstAtomAfter(uint64_t Addr) const;
MCAtom *findFirstAtomAfter(uint64_t Addr);
typedef AtomListTy::const_iterator const_atom_iterator; typedef AtomListTy::const_iterator const_atom_iterator;
typedef AtomListTy:: iterator atom_iterator; typedef AtomListTy:: iterator atom_iterator;

View File

@ -26,8 +26,9 @@ MCFunction::~MCFunction() {
} }
MCBasicBlock &MCFunction::createBlock(const MCTextAtom &TA) { MCBasicBlock &MCFunction::createBlock(const MCTextAtom &TA) {
Blocks.push_back(new MCBasicBlock(TA, this)); MCBasicBlock *MCBB = new MCBasicBlock(TA, this);
return *Blocks.back(); Blocks.push_back(MCBB);
return *MCBB;
} }
const MCBasicBlock *MCFunction::find(uint64_t StartAddr) const { const MCBasicBlock *MCFunction::find(uint64_t StartAddr) const {

View File

@ -18,6 +18,10 @@ static bool AtomComp(const MCAtom *L, uint64_t Addr) {
return L->getEndAddr() < Addr; return L->getEndAddr() < Addr;
} }
static bool AtomCompInv(uint64_t Addr, const MCAtom *R) {
return Addr < R->getEndAddr();
}
void MCModule::map(MCAtom *NewAtom) { void MCModule::map(MCAtom *NewAtom) {
uint64_t Begin = NewAtom->Begin; uint64_t Begin = NewAtom->Begin;
@ -77,13 +81,23 @@ const MCAtom *MCModule::findAtomContaining(uint64_t Addr) const {
} }
MCAtom *MCModule::findAtomContaining(uint64_t Addr) { MCAtom *MCModule::findAtomContaining(uint64_t Addr) {
AtomListTy::iterator I = std::lower_bound(atom_begin(), atom_end(), return const_cast<MCAtom*>(
Addr, AtomComp); const_cast<const MCModule *>(this)->findAtomContaining(Addr));
if (I != atom_end() && (*I)->getBeginAddr() <= Addr) }
const MCAtom *MCModule::findFirstAtomAfter(uint64_t Addr) const {
AtomListTy::const_iterator I = std::upper_bound(atom_begin(), atom_end(),
Addr, AtomCompInv);
if (I != atom_end())
return *I; return *I;
return 0; return 0;
} }
MCAtom *MCModule::findFirstAtomAfter(uint64_t Addr) {
return const_cast<MCAtom*>(
const_cast<const MCModule *>(this)->findFirstAtomAfter(Addr));
}
MCFunction *MCModule::createFunction(StringRef Name) { MCFunction *MCModule::createFunction(StringRef Name) {
Functions.push_back(new MCFunction(Name, this)); Functions.push_back(new MCFunction(Name, this));
return Functions.back(); return Functions.back();