Home | History | Annotate | Download | only in Target
      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 
     20 // Project includes
     21 #include "lldb/lldb-private.h"
     22 #include "lldb/Core/RangeMap.h"
     23 #include "lldb/Host/Mutex.h"
     24 
     25 namespace 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(bool clear_invalid_ranges = false);
     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 
     58         void
     59         AddInvalidRange (lldb::addr_t base_addr, lldb::addr_t byte_size);
     60 
     61         bool
     62         RemoveInvalidRange (lldb::addr_t base_addr, lldb::addr_t byte_size);
     63 
     64     protected:
     65         typedef std::map<lldb::addr_t, lldb::DataBufferSP> BlockMap;
     66         typedef RangeArray<lldb::addr_t, lldb::addr_t, 4> InvalidRanges;
     67         //------------------------------------------------------------------
     68         // Classes that inherit from MemoryCache can see and modify these
     69         //------------------------------------------------------------------
     70         Process &m_process;
     71         uint32_t m_cache_line_byte_size;
     72         Mutex m_mutex;
     73         BlockMap m_cache;
     74         InvalidRanges m_invalid_ranges;
     75     private:
     76         DISALLOW_COPY_AND_ASSIGN (MemoryCache);
     77     };
     78 
     79 
     80     class AllocatedBlock
     81     {
     82     public:
     83         AllocatedBlock (lldb::addr_t addr,
     84                         uint32_t byte_size,
     85                         uint32_t permissions,
     86                         uint32_t chunk_size);
     87 
     88         ~AllocatedBlock ();
     89 
     90         lldb::addr_t
     91         ReserveBlock (uint32_t size);
     92 
     93         bool
     94         FreeBlock (lldb::addr_t addr);
     95 
     96         lldb::addr_t
     97         GetBaseAddress () const
     98         {
     99             return m_addr;
    100         }
    101 
    102         uint32_t
    103         GetByteSize () const
    104         {
    105             return m_byte_size;
    106         }
    107 
    108         uint32_t
    109         GetPermissions () const
    110         {
    111             return m_permissions;
    112         }
    113 
    114         uint32_t
    115         GetChunkSize () const
    116         {
    117             return m_chunk_size;
    118         }
    119 
    120         bool
    121         Contains (lldb::addr_t addr) const
    122         {
    123             return ((addr >= m_addr) && addr < (m_addr + m_byte_size));
    124         }
    125     protected:
    126         uint32_t
    127         TotalChunks () const
    128         {
    129             return m_byte_size / m_chunk_size;
    130         }
    131 
    132         uint32_t
    133         CalculateChunksNeededForSize (uint32_t size) const
    134         {
    135             return (size + m_chunk_size - 1) / m_chunk_size;
    136         }
    137         const lldb::addr_t m_addr;    // Base address of this block of memory
    138         const uint32_t m_byte_size;   // 4GB of chunk should be enough...
    139         const uint32_t m_permissions; // Permissions for this memory (logical OR of lldb::Permissions bits)
    140         const uint32_t m_chunk_size;  // The size of chunks that the memory at m_addr is divied up into
    141         typedef std::map<uint32_t, uint32_t> OffsetToChunkSize;
    142         OffsetToChunkSize m_offset_to_chunk_size;
    143     };
    144 
    145 
    146     //----------------------------------------------------------------------
    147     // A class that can track allocated memory and give out allocated memory
    148     // without us having to make an allocate/deallocate call every time we
    149     // need some memory in a process that is being debugged.
    150     //----------------------------------------------------------------------
    151     class AllocatedMemoryCache
    152     {
    153     public:
    154         //------------------------------------------------------------------
    155         // Constructors and Destructors
    156         //------------------------------------------------------------------
    157         AllocatedMemoryCache (Process &process);
    158 
    159         ~AllocatedMemoryCache ();
    160 
    161         void
    162         Clear();
    163 
    164         lldb::addr_t
    165         AllocateMemory (size_t byte_size,
    166                         uint32_t permissions,
    167                         Error &error);
    168 
    169         bool
    170         DeallocateMemory (lldb::addr_t ptr);
    171 
    172     protected:
    173         typedef std::shared_ptr<AllocatedBlock> AllocatedBlockSP;
    174 
    175         AllocatedBlockSP
    176         AllocatePage (uint32_t byte_size,
    177                       uint32_t permissions,
    178                       uint32_t chunk_size,
    179                       Error &error);
    180 
    181 
    182         //------------------------------------------------------------------
    183         // Classes that inherit from MemoryCache can see and modify these
    184         //------------------------------------------------------------------
    185         Process &m_process;
    186         Mutex m_mutex;
    187         typedef std::multimap<uint32_t, AllocatedBlockSP> PermissionsToBlockMap;
    188         PermissionsToBlockMap m_memory_map;
    189 
    190     private:
    191         DISALLOW_COPY_AND_ASSIGN (AllocatedMemoryCache);
    192     };
    193 
    194 } // namespace lldb_private
    195 
    196 #endif  // liblldb_Memory_h_
    197