//===- Space.h ------------------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef MCLD_MEMORY_SPACE_H #define MCLD_MEMORY_SPACE_H #ifdef ENABLE_UNITTEST #include <gtest.h> #endif #include <llvm/Support/DataTypes.h> #include <llvm/ADT/ilist.h> #include <llvm/ADT/ilist_node.h> #include <mcld/ADT/TypeTraits.h> namespace mcld { class FileHandle; class MemoryRegion; /** \class Space * \brief Space contains a chunk of memory space that does not overlap with * the other Space. * */ class Space : public llvm::ilist_node<Space> { public: enum Type { ALLOCATED_ARRAY, MMAPED, EXTERNAL, UNALLOCATED }; typedef NonConstTraits<uint8_t>::pointer Address; typedef ConstTraits<uint8_t>::pointer ConstAddress; // llvm::iplist functions public: // llvm::iplist needs default constructor to make a sentinel. // Normal users should use @ref Space::createSpace function. Space(); // llvm::iplist needs public destructor to delete the sentinel. // Normal users should use @ref Space::releaseSpace function. ~Space(); // This constructor is opened for the clients who want to control the // details. In MCLinker, this constructor is used no where. Space(Type pType, void* pMemBuffer, size_t pSize); public: void setStart(size_t pOffset) { m_StartOffset = pOffset; } Address memory() { return m_Data; } ConstAddress memory() const { return m_Data; } size_t start() const { return m_StartOffset; } size_t size() const { return m_Size; } Type type() const { return m_Type; } void addRegion(MemoryRegion& pRegion) { ++m_RegionCount; } void removeRegion(MemoryRegion& pRegion) { --m_RegionCount; } size_t numOfRegions() const { return m_RegionCount; } static Space* createSpace(FileHandle& pHandler, size_t pOffset, size_t pSize); static void releaseSpace(Space* pSpace, FileHandle& pHandler); static void syncSpace(Space* pSpace, FileHandle& pHandler); private: Address m_Data; uint32_t m_StartOffset; uint32_t m_Size; uint16_t m_RegionCount; Type m_Type : 2; }; } // namespace of mcld #endif