Home | History | Annotate | Download | only in Expression
      1 //===-- IRExecutionUnit.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 lldb_IRMemoryMap_h_
     11 #define lldb_IRMemoryMap_h_
     12 
     13 #include "lldb/lldb-public.h"
     14 #include "lldb/Core/DataBufferHeap.h"
     15 #include "lldb/Core/UserID.h"
     16 
     17 #include <map>
     18 
     19 namespace lldb_private
     20 {
     21 
     22 //----------------------------------------------------------------------
     23 /// @class IRMemoryMap IRMemoryMap.h "lldb/Expression/IRMemoryMap.h"
     24 /// @brief Encapsulates memory that may exist in the process but must
     25 ///     also be available in the host process.
     26 ///
     27 /// This class encapsulates a group of memory objects that must be readable
     28 /// or writable from the host process regardless of whether the process
     29 /// exists.  This allows the IR interpreter as well as JITted code to access
     30 /// the same memory.
     31 ///
     32 /// Point queries against this group of memory objects can be made by the
     33 /// address in the tar at which they reside.  If the inferior does not
     34 /// exist, allocations still get made-up addresses.  If an inferior appears
     35 /// at some point, then those addresses need to be re-mapped.
     36 //----------------------------------------------------------------------
     37 class IRMemoryMap
     38 {
     39 public:
     40     IRMemoryMap (lldb::TargetSP target_sp);
     41     ~IRMemoryMap ();
     42 
     43     enum AllocationPolicy {
     44         eAllocationPolicyInvalid        = 0,    ///< It is an error for an allocation to have this policy.
     45         eAllocationPolicyHostOnly,              ///< This allocation was created in the host and will never make it into the process.
     46                                                 ///< It is an error to create other types of allocations while such allocations exist.
     47         eAllocationPolicyMirror,                ///< The intent is that this allocation exist both in the host and the process and have
     48                                                 ///< the same content in both.
     49         eAllocationPolicyProcessOnly            ///< The intent is that this allocation exist only in the process.
     50     };
     51 
     52     lldb::addr_t Malloc (size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, Error &error);
     53     void Leak (lldb::addr_t process_address, Error &error);
     54     void Free (lldb::addr_t process_address, Error &error);
     55 
     56     void WriteMemory (lldb::addr_t process_address, const uint8_t *bytes, size_t size, Error &error);
     57     void WriteScalarToMemory (lldb::addr_t process_address, Scalar &scalar, size_t size, Error &error);
     58     void WritePointerToMemory (lldb::addr_t process_address, lldb::addr_t address, Error &error);
     59     void ReadMemory (uint8_t *bytes, lldb::addr_t process_address, size_t size, Error &error);
     60     void ReadScalarFromMemory (Scalar &scalar, lldb::addr_t process_address, size_t size, Error &error);
     61     void ReadPointerFromMemory (lldb::addr_t *address, lldb::addr_t process_address, Error &error);
     62 
     63     void GetMemoryData (DataExtractor &extractor, lldb::addr_t process_address, size_t size, Error &error);
     64 
     65     lldb::ByteOrder GetByteOrder();
     66     uint32_t GetAddressByteSize();
     67 
     68     // This function can return NULL.
     69     ExecutionContextScope *GetBestExecutionContextScope();
     70 
     71 protected:
     72     // This function should only be used if you know you are using the JIT.
     73     // Any other cases should use GetBestExecutionContextScope().
     74     lldb::ProcessWP GetProcessWP ()
     75     {
     76         return m_process_wp;
     77     }
     78 
     79 private:
     80     struct Allocation
     81     {
     82         lldb::addr_t    m_process_alloc;    ///< The (unaligned) base for the remote allocation
     83         lldb::addr_t    m_process_start;    ///< The base address of the allocation in the process
     84         size_t          m_size;             ///< The size of the requested allocation
     85         uint32_t        m_permissions;      ///< The access permissions on the memory in the process.  In the host, the memory is always read/write.
     86         uint8_t         m_alignment;        ///< The alignment of the requested allocation
     87         DataBufferHeap  m_data;
     88 
     89         ///< Flags
     90         AllocationPolicy    m_policy;
     91         bool                m_leak;
     92     public:
     93         Allocation (lldb::addr_t process_alloc,
     94                     lldb::addr_t process_start,
     95                     size_t size,
     96                     uint32_t permissions,
     97                     uint8_t alignment,
     98                     AllocationPolicy m_policy);
     99 
    100         Allocation () :
    101             m_process_alloc (LLDB_INVALID_ADDRESS),
    102             m_process_start (LLDB_INVALID_ADDRESS),
    103             m_size (0),
    104             m_permissions (0),
    105             m_alignment (0),
    106             m_data (),
    107             m_policy (eAllocationPolicyInvalid),
    108             m_leak (false)
    109         {
    110         }
    111     };
    112 
    113     lldb::ProcessWP                             m_process_wp;
    114     lldb::TargetWP                              m_target_wp;
    115     typedef std::map<lldb::addr_t, Allocation>  AllocationMap;
    116     AllocationMap                               m_allocations;
    117 
    118     lldb::addr_t FindSpace (size_t size);
    119     bool ContainsHostOnlyAllocations ();
    120     AllocationMap::iterator FindAllocation (lldb::addr_t addr, size_t size);
    121     bool IntersectsAllocation (lldb::addr_t addr, size_t size);
    122 };
    123 
    124 }
    125 
    126 #endif
    127