1//===- MemoryRegion.h -----------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#ifndef LD_MEMORY_REGION_H 10#define LD_MEMORY_REGION_H 11#ifdef ENABLE_UNITTEST 12#include <gtest.h> 13#endif 14 15#include <mcld/ADT/Uncopyable.h> 16#include <mcld/ADT/SizeTraits.h> 17#include <mcld/ADT/TypeTraits.h> 18#include <mcld/Support/FileSystem.h> 19#include <mcld/Support/MemoryArea.h> 20#include <llvm/ADT/ilist.h> 21#include <llvm/ADT/StringRef.h> 22 23namespace mcld 24{ 25 26/** \class MemoryRegion 27 * \brief MemoryRegion is a range of virtual memory which is mapped onto a 28 * range of files which is opened by MemoryArea. 29 * 30 * MemoryArea maps a file onto virtual memory. Clients can get a range of 31 * mapped memory space by requesting a MemoryRegion from MemoryArea, and 32 * read/write the mapped file through the MemoryRegion. 33 * 34 * When two different MemoryRegion may overlap memory space, race condition 35 * may occurs. Clients must call MemoryRegion::sync() explicit to tell the 36 * MemoryArea when to synchronize the virtual memory space with the mapped 37 * file. 38 */ 39class MemoryRegion : private Uncopyable 40{ 41friend class RegionFactory; 42friend class MemoryArea; 43 44public: 45typedef NonConstTraits<mcld::sys::fs::detail::Address>::value_type Address; 46typedef ConstTraits<mcld::sys::fs::detail::Address>::value_type ConstAddress; 47typedef NonConstTraits<mcld::sys::fs::detail::Offset>::value_type Offset; 48typedef ConstTraits<mcld::sys::fs::detail::Offset>::value_type ConstOffset; 49 50private: 51 MemoryRegion(MemoryArea::Space* pParentSpace, 52 const Address pVMAStart, 53 size_t pSize); 54 55 // drift - leave parent space 56 void drift(); 57 58 MemoryArea::Space* parent() 59 { return m_pParentSpace; } 60 61 const MemoryArea::Space* parent() const 62 { return m_pParentSpace; } 63 64public: 65 ~MemoryRegion(); 66 67 Address start() 68 { return m_VMAStart; } 69 70 ConstAddress start() const 71 { return m_VMAStart; } 72 73 Address end() 74 { return m_VMAStart+m_Length; } 75 76 ConstAddress end() const 77 { return m_VMAStart+m_Length; } 78 79 size_t size() const 80 { return m_Length; } 81 82 Address getBuffer(Offset pOffset = 0) 83 { return m_VMAStart+pOffset; } 84 85 ConstAddress getBuffer(Offset pOffset = 0) const 86 { return m_VMAStart+pOffset; } 87 88private: 89 MemoryArea::Space* m_pParentSpace; 90 Address m_VMAStart; 91 size_t m_Length; 92}; 93 94} // namespace of mcld 95 96#endif 97 98