• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- Space.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 MCLD_MEMORY_SPACE_H
10 #define MCLD_MEMORY_SPACE_H
11 #ifdef ENABLE_UNITTEST
12 #include <gtest.h>
13 #endif
14 #include <llvm/Support/DataTypes.h>
15 #include <mcld/ADT/TypeTraits.h>
16 
17 namespace mcld {
18 
19 class FileHandle;
20 class MemoryRegion;
21 
22 /** \class Space
23  *  \brief Space contains a chunk of memory space that does not overlap with
24  *  the other Space.
25  *
26  */
27 class Space
28 {
29 public:
30   enum Type
31   {
32     ALLOCATED_ARRAY,
33     MMAPED,
34     EXTERNAL,
35     UNALLOCATED
36   };
37 
38   typedef NonConstTraits<uint8_t>::pointer Address;
39   typedef ConstTraits<uint8_t>::pointer ConstAddress;
40 
41 private:
42   Space();
43 
44   ~Space();
45 
46   Space(Type pType, void* pMemBuffer, size_t pSize);
47 
48 public:
setStart(size_t pOffset)49   void setStart(size_t pOffset)
50   { m_StartOffset = pOffset; }
51 
memory()52   Address memory()
53   { return m_Data; }
54 
memory()55   ConstAddress memory() const
56   { return m_Data; }
57 
start()58   size_t start() const
59   { return m_StartOffset; }
60 
size()61   size_t size() const
62   { return m_Size; }
63 
type()64   Type type() const
65   { return m_Type; }
66 
addRegion(MemoryRegion & pRegion)67   void addRegion(MemoryRegion& pRegion)
68   { ++m_RegionCount; }
69 
removeRegion(MemoryRegion & pRegion)70   void removeRegion(MemoryRegion& pRegion)
71   { --m_RegionCount; }
72 
numOfRegions()73   size_t numOfRegions() const
74   { return m_RegionCount; }
75 
76   /// Create - Create a Space from external memory
77   static Space* Create(void* pMemBuffer, size_t pSize);
78 
79   /// Create - Create a Space from FileHandler
80   static Space* Create(FileHandle& pHandler, size_t pOffset, size_t pSize);
81 
82   static void Destroy(Space*& pSpace);
83 
84   static void Release(Space* pSpace, FileHandle& pHandler);
85 
86   static void Sync(Space* pSpace, FileHandle& pHandler);
87 
88 private:
89   Address m_Data;
90   uint32_t m_StartOffset;
91   uint32_t m_Size;
92   uint16_t m_RegionCount;
93   Type m_Type : 2;
94 };
95 
96 } // namespace of mcld
97 
98 #endif
99 
100