Memory.h revision 613b8739a4d489b7f1c571288d5786768c024205
1//===-- Memory.h ------------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_Memory_h_ 11#define liblldb_Memory_h_ 12 13// C Includes 14// C++ Includes 15#include <map> 16#include <vector> 17 18// Other libraries and framework includes 19//#include "llvm/ADT/BitVector.h" 20 21// Project includes 22#include "lldb/lldb-private.h" 23#include "lldb/Host/Mutex.h" 24 25namespace lldb_private { 26 //---------------------------------------------------------------------- 27 // A class to track memory that was read from a live process between 28 // runs. 29 //---------------------------------------------------------------------- 30 class MemoryCache 31 { 32 public: 33 //------------------------------------------------------------------ 34 // Constructors and Destructors 35 //------------------------------------------------------------------ 36 MemoryCache (Process &process); 37 38 ~MemoryCache (); 39 40 void 41 Clear(); 42 43 void 44 Flush (lldb::addr_t addr, size_t size); 45 46 size_t 47 Read (lldb::addr_t addr, 48 void *dst, 49 size_t dst_len, 50 Error &error); 51 52 uint32_t 53 GetMemoryCacheLineSize() const 54 { 55 return m_cache_line_byte_size ; 56 } 57 protected: 58 typedef std::map<lldb::addr_t, lldb::DataBufferSP> collection; 59 //------------------------------------------------------------------ 60 // Classes that inherit from MemoryCache can see and modify these 61 //------------------------------------------------------------------ 62 Process &m_process; 63 uint32_t m_cache_line_byte_size; 64 Mutex m_cache_mutex; 65 collection m_cache; 66 67 private: 68 DISALLOW_COPY_AND_ASSIGN (MemoryCache); 69 }; 70 71 72 class AllocatedBlock 73 { 74 public: 75 AllocatedBlock (lldb::addr_t addr, 76 uint32_t byte_size, 77 uint32_t permissions, 78 uint32_t chunk_size); 79 80 ~AllocatedBlock (); 81 82 lldb::addr_t 83 ReserveBlock (uint32_t size); 84 85 bool 86 FreeBlock (lldb::addr_t addr); 87 88 lldb::addr_t 89 GetBaseAddress () const 90 { 91 return m_addr; 92 } 93 94 uint32_t 95 GetByteSize () const 96 { 97 return m_byte_size; 98 } 99 100 uint32_t 101 GetPermissions () const 102 { 103 return m_permissions; 104 } 105 106 uint32_t 107 GetChunkSize () const 108 { 109 return m_chunk_size; 110 } 111 112 bool 113 Contains (lldb::addr_t addr) const 114 { 115 return ((addr >= m_addr) && addr < (m_addr + m_byte_size)); 116 } 117 protected: 118 uint32_t 119 TotalChunks () const 120 { 121 return m_byte_size / m_chunk_size; 122 } 123 124 uint32_t 125 CalculateChunksNeededForSize (uint32_t size) const 126 { 127 return (size + m_chunk_size - 1) / m_chunk_size; 128 } 129 const lldb::addr_t m_addr; // Base address of this block of memory 130 const uint32_t m_byte_size; // 4GB of chunk should be enough... 131 const uint32_t m_permissions; // Permissions for this memory (logical OR of lldb::Permissions bits) 132 const uint32_t m_chunk_size; // The size of chunks that the memory at m_addr is divied up into 133 typedef std::map<uint32_t, uint32_t> OffsetToChunkSize; 134 OffsetToChunkSize m_offset_to_chunk_size; 135 //llvm::BitVector m_allocated; 136 }; 137 138 139 //---------------------------------------------------------------------- 140 // A class that can track allocated memory and give out allocated memory 141 // without us having to make an allocate/deallocate call every time we 142 // need some memory in a process that is being debugged. 143 //---------------------------------------------------------------------- 144 class AllocatedMemoryCache 145 { 146 public: 147 //------------------------------------------------------------------ 148 // Constructors and Destructors 149 //------------------------------------------------------------------ 150 AllocatedMemoryCache (Process &process); 151 152 ~AllocatedMemoryCache (); 153 154 void 155 Clear(); 156 157 lldb::addr_t 158 AllocateMemory (size_t byte_size, 159 uint32_t permissions, 160 Error &error); 161 162 bool 163 DeallocateMemory (lldb::addr_t ptr); 164 165 protected: 166 typedef lldb::SharedPtr<AllocatedBlock>::Type AllocatedBlockSP; 167 168 AllocatedBlockSP 169 AllocatePage (uint32_t byte_size, 170 uint32_t permissions, 171 uint32_t chunk_size, 172 Error &error); 173 174 175 //------------------------------------------------------------------ 176 // Classes that inherit from MemoryCache can see and modify these 177 //------------------------------------------------------------------ 178 Process &m_process; 179 Mutex m_mutex; 180 typedef std::multimap<uint32_t, AllocatedBlockSP> PermissionsToBlockMap; 181 PermissionsToBlockMap m_memory_map; 182 183 private: 184 DISALLOW_COPY_AND_ASSIGN (AllocatedMemoryCache); 185 }; 186 187} // namespace lldb_private 188 189#endif // liblldb_Memory_h_ 190