1124e1821033a4b3220f552229652d9460ed90673Owen Anderson//===-- llvm/MC/MCModule.h - MCModule class ---------------------*- C++ -*-===// 2124e1821033a4b3220f552229652d9460ed90673Owen Anderson// 3124e1821033a4b3220f552229652d9460ed90673Owen Anderson// The LLVM Compiler Infrastructure 4124e1821033a4b3220f552229652d9460ed90673Owen Anderson// 5124e1821033a4b3220f552229652d9460ed90673Owen Anderson// This file is distributed under the University of Illinois Open Source 6124e1821033a4b3220f552229652d9460ed90673Owen Anderson// License. See LICENSE.TXT for details. 7124e1821033a4b3220f552229652d9460ed90673Owen Anderson// 8124e1821033a4b3220f552229652d9460ed90673Owen Anderson//===----------------------------------------------------------------------===// 9124e1821033a4b3220f552229652d9460ed90673Owen Anderson// 10124e1821033a4b3220f552229652d9460ed90673Owen Anderson// This file contains the declaration of the MCModule class, which is used to 11124e1821033a4b3220f552229652d9460ed90673Owen Anderson// represent a complete, disassembled object file or executable. 12124e1821033a4b3220f552229652d9460ed90673Owen Anderson// 13124e1821033a4b3220f552229652d9460ed90673Owen Anderson//===----------------------------------------------------------------------===// 14124e1821033a4b3220f552229652d9460ed90673Owen Anderson 15124e1821033a4b3220f552229652d9460ed90673Owen Anderson#ifndef LLVM_MC_MCMODULE_H 16124e1821033a4b3220f552229652d9460ed90673Owen Anderson#define LLVM_MC_MCMODULE_H 17124e1821033a4b3220f552229652d9460ed90673Owen Anderson 18ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include "llvm/ADT/StringRef.h" 19ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include "llvm/Support/Compiler.h" 20124e1821033a4b3220f552229652d9460ed90673Owen Anderson#include "llvm/Support/DataTypes.h" 21ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include <vector> 22124e1821033a4b3220f552229652d9460ed90673Owen Anderson 23124e1821033a4b3220f552229652d9460ed90673Owen Andersonnamespace llvm { 24124e1821033a4b3220f552229652d9460ed90673Owen Anderson 25124e1821033a4b3220f552229652d9460ed90673Owen Andersonclass MCAtom; 26ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCDataAtom; 27ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCFunction; 28ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCObjectDisassembler; 29ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCTextAtom; 30124e1821033a4b3220f552229652d9460ed90673Owen Anderson 31ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// \brief A completely disassembled object file or executable. 32ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// It comprises a list of MCAtom's, each representing a contiguous range of 33ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// either instructions or data. 34ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// An MCModule is created using MCObjectDisassembler::buildModule. 35124e1821033a4b3220f552229652d9460ed90673Owen Andersonclass MCModule { 36ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Atom tracking 37ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 38124e1821033a4b3220f552229652d9460ed90673Owen Anderson 39ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \brief Atoms in this module, sorted by begin address. 40ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// FIXME: This doesn't handle overlapping atoms (which happen when a basic 41ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// block starts in the middle of an instruction of another basic block.) 42ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef std::vector<MCAtom*> AtomListTy; 43ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha AtomListTy Atoms; 44124e1821033a4b3220f552229652d9460ed90673Owen Anderson 45124e1821033a4b3220f552229652d9460ed90673Owen Anderson friend class MCAtom; 46ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \brief Remap \p Atom to the given range, and update its Begin/End fields. 47ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \param Atom An atom belonging to this module. 48ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// An atom should always use this method to update its bounds, because this 49ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// enables the owning MCModule to keep track of its atoms. 50124e1821033a4b3220f552229652d9460ed90673Owen Anderson void remap(MCAtom *Atom, uint64_t NewBegin, uint64_t NewEnd); 51124e1821033a4b3220f552229652d9460ed90673Owen Anderson 52ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \brief Insert an atom in the module, using its Begin and End addresses. 53ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha void map(MCAtom *NewAtom); 54ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 55ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 56ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Function tracking 57ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 58ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef std::vector<MCFunction*> FunctionListTy; 59ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha FunctionListTy Functions; 60ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 61ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 62ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCModule (const MCModule &) LLVM_DELETED_FUNCTION; 63ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCModule& operator=(const MCModule &) LLVM_DELETED_FUNCTION; 64ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 65ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha // MCObjectDisassembler creates MCModules. 66ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha friend class MCObjectDisassembler; 67ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCModule() : Atoms() { } 68ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 69124e1821033a4b3220f552229652d9460ed90673Owen Andersonpublic: 70ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha ~MCModule(); 71124e1821033a4b3220f552229652d9460ed90673Owen Anderson 72ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Create a new MCAtom covering the specified offset range. 73ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 74ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCTextAtom *createTextAtom(uint64_t Begin, uint64_t End); 75ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCDataAtom *createDataAtom(uint64_t Begin, uint64_t End); 76ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 77ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 78ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Access to the owned atom list, ordered by begin address. 79ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 80ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCAtom *findAtomContaining(uint64_t Addr) const; 81ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCAtom *findAtomContaining(uint64_t Addr); 82ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 83ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef AtomListTy::const_iterator const_atom_iterator; 84ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef AtomListTy:: iterator atom_iterator; 85ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const_atom_iterator atom_begin() const { return Atoms.begin(); } 86ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha atom_iterator atom_begin() { return Atoms.begin(); } 87ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const_atom_iterator atom_end() const { return Atoms.end(); } 88ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha atom_iterator atom_end() { return Atoms.end(); } 89ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 90ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 91ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Create a new MCFunction. 92ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCFunction *createFunction(const StringRef &Name); 93ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 94ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Access to the owned function list. 95ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 96ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef FunctionListTy::const_iterator const_func_iterator; 97ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef FunctionListTy:: iterator func_iterator; 98ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const_func_iterator func_begin() const { return Functions.begin(); } 99ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha func_iterator func_begin() { return Functions.begin(); } 100ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const_func_iterator func_end() const { return Functions.end(); } 101ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha func_iterator func_end() { return Functions.end(); } 102ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 103124e1821033a4b3220f552229652d9460ed90673Owen Anderson}; 104124e1821033a4b3220f552229652d9460ed90673Owen Anderson 105124e1821033a4b3220f552229652d9460ed90673Owen Anderson} 106124e1821033a4b3220f552229652d9460ed90673Owen Anderson 107124e1821033a4b3220f552229652d9460ed90673Owen Anderson#endif 108