aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Target/Memory.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/lldb/Target/Memory.h')
-rw-r--r--include/lldb/Target/Memory.h309
1 files changed, 131 insertions, 178 deletions
diff --git a/include/lldb/Target/Memory.h b/include/lldb/Target/Memory.h
index f4d776a43c99..57275bbda593 100644
--- a/include/lldb/Target/Memory.h
+++ b/include/lldb/Target/Memory.h
@@ -19,187 +19,140 @@
// Other libraries and framework includes
// Project includes
-#include "lldb/lldb-private.h"
#include "lldb/Core/RangeMap.h"
+#include "lldb/lldb-private.h"
namespace lldb_private {
- //----------------------------------------------------------------------
- // A class to track memory that was read from a live process between
- // runs.
- //----------------------------------------------------------------------
- class MemoryCache
- {
- public:
- //------------------------------------------------------------------
- // Constructors and Destructors
- //------------------------------------------------------------------
- MemoryCache (Process &process);
-
- ~MemoryCache ();
-
- void
- Clear(bool clear_invalid_ranges = false);
-
- void
- Flush (lldb::addr_t addr, size_t size);
-
- size_t
- Read (lldb::addr_t addr,
- void *dst,
- size_t dst_len,
- Error &error);
-
- uint32_t
- GetMemoryCacheLineSize() const
- {
- return m_L2_cache_line_byte_size ;
- }
-
- void
- AddInvalidRange (lldb::addr_t base_addr, lldb::addr_t byte_size);
-
- bool
- RemoveInvalidRange (lldb::addr_t base_addr, lldb::addr_t byte_size);
-
- // Allow external sources to populate data into the L1 memory cache
- void
- AddL1CacheData(lldb::addr_t addr, const void *src, size_t src_len);
-
- void
- AddL1CacheData(lldb::addr_t addr, const lldb::DataBufferSP &data_buffer_sp);
-
- protected:
- typedef std::map<lldb::addr_t, lldb::DataBufferSP> BlockMap;
- typedef RangeArray<lldb::addr_t, lldb::addr_t, 4> InvalidRanges;
- typedef Range<lldb::addr_t, lldb::addr_t> AddrRange;
- //------------------------------------------------------------------
- // Classes that inherit from MemoryCache can see and modify these
- //------------------------------------------------------------------
- std::recursive_mutex m_mutex;
- BlockMap m_L1_cache; // A first level memory cache whose chunk sizes vary that will be used only if the memory read fits entirely in a chunk
- BlockMap m_L2_cache; // A memory cache of fixed size chinks (m_L2_cache_line_byte_size bytes in size each)
- InvalidRanges m_invalid_ranges;
- Process &m_process;
- uint32_t m_L2_cache_line_byte_size;
- private:
- DISALLOW_COPY_AND_ASSIGN (MemoryCache);
- };
-
-
- class AllocatedBlock
- {
- public:
- AllocatedBlock (lldb::addr_t addr,
- uint32_t byte_size,
- uint32_t permissions,
- uint32_t chunk_size);
-
- ~AllocatedBlock ();
-
- lldb::addr_t
- ReserveBlock (uint32_t size);
-
- bool
- FreeBlock (lldb::addr_t addr);
-
- lldb::addr_t
- GetBaseAddress () const
- {
- return m_addr;
- }
-
- uint32_t
- GetByteSize () const
- {
- return m_byte_size;
- }
-
- uint32_t
- GetPermissions () const
- {
- return m_permissions;
- }
-
- uint32_t
- GetChunkSize () const
- {
- return m_chunk_size;
- }
-
- bool
- Contains (lldb::addr_t addr) const
- {
- return ((addr >= m_addr) && addr < (m_addr + m_byte_size));
- }
- protected:
- uint32_t
- TotalChunks () const
- {
- return m_byte_size / m_chunk_size;
- }
-
- uint32_t
- CalculateChunksNeededForSize (uint32_t size) const
- {
- return (size + m_chunk_size - 1) / m_chunk_size;
- }
- const lldb::addr_t m_addr; // Base address of this block of memory
- const uint32_t m_byte_size; // 4GB of chunk should be enough...
- const uint32_t m_permissions; // Permissions for this memory (logical OR of lldb::Permissions bits)
- const uint32_t m_chunk_size; // The size of chunks that the memory at m_addr is divied up into
- typedef std::map<uint32_t, uint32_t> OffsetToChunkSize;
- OffsetToChunkSize m_offset_to_chunk_size;
- };
-
-
- //----------------------------------------------------------------------
- // A class that can track allocated memory and give out allocated memory
- // without us having to make an allocate/deallocate call every time we
- // need some memory in a process that is being debugged.
- //----------------------------------------------------------------------
- class AllocatedMemoryCache
- {
- public:
- //------------------------------------------------------------------
- // Constructors and Destructors
- //------------------------------------------------------------------
- AllocatedMemoryCache (Process &process);
-
- ~AllocatedMemoryCache ();
-
- void
- Clear();
-
- lldb::addr_t
- AllocateMemory (size_t byte_size,
- uint32_t permissions,
- Error &error);
-
- bool
- DeallocateMemory (lldb::addr_t ptr);
-
- protected:
- typedef std::shared_ptr<AllocatedBlock> AllocatedBlockSP;
-
- AllocatedBlockSP
- AllocatePage (uint32_t byte_size,
- uint32_t permissions,
- uint32_t chunk_size,
- Error &error);
-
-
- //------------------------------------------------------------------
- // Classes that inherit from MemoryCache can see and modify these
- //------------------------------------------------------------------
- Process &m_process;
- std::recursive_mutex m_mutex;
- typedef std::multimap<uint32_t, AllocatedBlockSP> PermissionsToBlockMap;
- PermissionsToBlockMap m_memory_map;
-
- private:
- DISALLOW_COPY_AND_ASSIGN (AllocatedMemoryCache);
- };
+//----------------------------------------------------------------------
+// A class to track memory that was read from a live process between
+// runs.
+//----------------------------------------------------------------------
+class MemoryCache {
+public:
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
+ MemoryCache(Process &process);
+
+ ~MemoryCache();
+
+ void Clear(bool clear_invalid_ranges = false);
+
+ void Flush(lldb::addr_t addr, size_t size);
+
+ size_t Read(lldb::addr_t addr, void *dst, size_t dst_len, Error &error);
+
+ uint32_t GetMemoryCacheLineSize() const { return m_L2_cache_line_byte_size; }
+
+ void AddInvalidRange(lldb::addr_t base_addr, lldb::addr_t byte_size);
+
+ bool RemoveInvalidRange(lldb::addr_t base_addr, lldb::addr_t byte_size);
+
+ // Allow external sources to populate data into the L1 memory cache
+ void AddL1CacheData(lldb::addr_t addr, const void *src, size_t src_len);
+
+ void AddL1CacheData(lldb::addr_t addr,
+ const lldb::DataBufferSP &data_buffer_sp);
+
+protected:
+ typedef std::map<lldb::addr_t, lldb::DataBufferSP> BlockMap;
+ typedef RangeArray<lldb::addr_t, lldb::addr_t, 4> InvalidRanges;
+ typedef Range<lldb::addr_t, lldb::addr_t> AddrRange;
+ //------------------------------------------------------------------
+ // Classes that inherit from MemoryCache can see and modify these
+ //------------------------------------------------------------------
+ std::recursive_mutex m_mutex;
+ BlockMap m_L1_cache; // A first level memory cache whose chunk sizes vary that
+ // will be used only if the memory read fits entirely in
+ // a chunk
+ BlockMap m_L2_cache; // A memory cache of fixed size chinks
+ // (m_L2_cache_line_byte_size bytes in size each)
+ InvalidRanges m_invalid_ranges;
+ Process &m_process;
+ uint32_t m_L2_cache_line_byte_size;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(MemoryCache);
+};
+
+class AllocatedBlock {
+public:
+ AllocatedBlock(lldb::addr_t addr, uint32_t byte_size, uint32_t permissions,
+ uint32_t chunk_size);
+
+ ~AllocatedBlock();
+
+ lldb::addr_t ReserveBlock(uint32_t size);
+
+ bool FreeBlock(lldb::addr_t addr);
+
+ lldb::addr_t GetBaseAddress() const { return m_addr; }
+
+ uint32_t GetByteSize() const { return m_byte_size; }
+
+ uint32_t GetPermissions() const { return m_permissions; }
+
+ uint32_t GetChunkSize() const { return m_chunk_size; }
+
+ bool Contains(lldb::addr_t addr) const {
+ return ((addr >= m_addr) && addr < (m_addr + m_byte_size));
+ }
+
+protected:
+ uint32_t TotalChunks() const { return m_byte_size / m_chunk_size; }
+
+ uint32_t CalculateChunksNeededForSize(uint32_t size) const {
+ return (size + m_chunk_size - 1) / m_chunk_size;
+ }
+ const lldb::addr_t m_addr; // Base address of this block of memory
+ const uint32_t m_byte_size; // 4GB of chunk should be enough...
+ const uint32_t m_permissions; // Permissions for this memory (logical OR of
+ // lldb::Permissions bits)
+ const uint32_t m_chunk_size; // The size of chunks that the memory at m_addr
+ // is divied up into
+ typedef std::map<uint32_t, uint32_t> OffsetToChunkSize;
+ OffsetToChunkSize m_offset_to_chunk_size;
+};
+
+//----------------------------------------------------------------------
+// A class that can track allocated memory and give out allocated memory
+// without us having to make an allocate/deallocate call every time we
+// need some memory in a process that is being debugged.
+//----------------------------------------------------------------------
+class AllocatedMemoryCache {
+public:
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
+ AllocatedMemoryCache(Process &process);
+
+ ~AllocatedMemoryCache();
+
+ void Clear();
+
+ lldb::addr_t AllocateMemory(size_t byte_size, uint32_t permissions,
+ Error &error);
+
+ bool DeallocateMemory(lldb::addr_t ptr);
+
+protected:
+ typedef std::shared_ptr<AllocatedBlock> AllocatedBlockSP;
+
+ AllocatedBlockSP AllocatePage(uint32_t byte_size, uint32_t permissions,
+ uint32_t chunk_size, Error &error);
+
+ //------------------------------------------------------------------
+ // Classes that inherit from MemoryCache can see and modify these
+ //------------------------------------------------------------------
+ Process &m_process;
+ std::recursive_mutex m_mutex;
+ typedef std::multimap<uint32_t, AllocatedBlockSP> PermissionsToBlockMap;
+ PermissionsToBlockMap m_memory_map;
+
+private:
+ DISALLOW_COPY_AND_ASSIGN(AllocatedMemoryCache);
+};
} // namespace lldb_private
-#endif // liblldb_Memory_h_
+#endif // liblldb_Memory_h_