From 7dac32d07d54231ba203f7c32f3a9f8e6730810f Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Wed, 21 Aug 2013 07:27:55 +0000 Subject: [PATCH] MC CFG: Keep pointer to parent MCModule in created MCFunctions. Also, drive-by cleaning around createFunction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188875 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCFunction.h | 7 ++++--- include/llvm/MC/MCModule.h | 5 +++-- lib/MC/MCFunction.cpp | 6 +++--- lib/MC/MCModule.cpp | 8 ++++++-- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/include/llvm/MC/MCFunction.h b/include/llvm/MC/MCFunction.h index b85011eda7e..4c75cd4c25f 100644 --- a/include/llvm/MC/MCFunction.h +++ b/include/llvm/MC/MCFunction.h @@ -74,21 +74,22 @@ public: }; /// \brief Represents a function in machine code, containing MCBasicBlocks. -/// MCFunctions are created using MCModule::createFunction. +/// MCFunctions are created by MCModule. class MCFunction { MCFunction (const MCFunction&) LLVM_DELETED_FUNCTION; MCFunction& operator=(const MCFunction&) LLVM_DELETED_FUNCTION; std::string Name; + MCModule *ParentModule; typedef std::vector BasicBlockListTy; BasicBlockListTy Blocks; // MCModule owns the function. friend class MCModule; - MCFunction(StringRef Name); -public: + MCFunction(StringRef Name, MCModule *Parent); ~MCFunction(); +public: /// \brief Create an MCBasicBlock backed by Insts and add it to this function. /// \param Insts Sequence of straight-line code backing the basic block. /// \returns The newly created basic block. diff --git a/include/llvm/MC/MCModule.h b/include/llvm/MC/MCModule.h index 02f8ca05b41..6d493628b7c 100644 --- a/include/llvm/MC/MCModule.h +++ b/include/llvm/MC/MCModule.h @@ -23,6 +23,7 @@ namespace llvm { class MCAtom; +class MCBasicBlock; class MCDataAtom; class MCFunction; class MCObjectDisassembler; @@ -88,8 +89,8 @@ public: atom_iterator atom_end() { return Atoms.end(); } /// @} - /// \name Create a new MCFunction. - MCFunction *createFunction(const StringRef &Name); + /// \brief Create a new MCFunction. + MCFunction *createFunction(StringRef Name); /// \name Access to the owned function list. /// @{ diff --git a/lib/MC/MCFunction.cpp b/lib/MC/MCFunction.cpp index 473d07bf994..cb2504668a3 100644 --- a/lib/MC/MCFunction.cpp +++ b/lib/MC/MCFunction.cpp @@ -9,15 +9,15 @@ #include "llvm/MC/MCFunction.h" #include "llvm/MC/MCAtom.h" -#include "llvm/Support/raw_ostream.h" +#include "llvm/MC/MCModule.h" #include using namespace llvm; // MCFunction -MCFunction::MCFunction(StringRef Name) - : Name(Name) +MCFunction::MCFunction(StringRef Name, MCModule *Parent) + : Name(Name), ParentModule(Parent) {} MCFunction::~MCFunction() { diff --git a/lib/MC/MCModule.cpp b/lib/MC/MCModule.cpp index 5890b4bd028..9a9d90e5b6a 100644 --- a/lib/MC/MCModule.cpp +++ b/lib/MC/MCModule.cpp @@ -54,9 +54,13 @@ void MCModule::remap(MCAtom *Atom, uint64_t NewBegin, uint64_t NewEnd) { assert(*I == Atom && "Previous atom mapping was invalid!"); Atoms.erase(I); + // FIXME: special case NewBegin == Atom->Begin + // Insert the new mapping. AtomListTy::iterator NewI = std::lower_bound(atom_begin(), atom_end(), NewBegin, AtomComp); + assert((NewI == atom_end() || (*NewI)->getBeginAddr() > Atom->End) + && "Offset range already occupied!"); Atoms.insert(NewI, Atom); // Update the atom internal bounds. @@ -80,8 +84,8 @@ MCAtom *MCModule::findAtomContaining(uint64_t Addr) { return 0; } -MCFunction *MCModule::createFunction(const StringRef &Name) { - Functions.push_back(new MCFunction(Name)); +MCFunction *MCModule::createFunction(StringRef Name) { + Functions.push_back(new MCFunction(Name, this)); return Functions.back(); }