IRMemoryMap.h revision e287e900488e20e07ef986ec0524b872fbeafa5d
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 19namespace 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//---------------------------------------------------------------------- 37class IRMemoryMap 38{ 39public: 40 IRMemoryMap (lldb::ProcessSP process_sp); 41 IRMemoryMap (lldb::TargetSP target_sp); 42 ~IRMemoryMap (); 43 44 enum AllocationPolicy { 45 eAllocationPolicyInvalid = 0, ///< It is an error for an allocation to have this policy. 46 eAllocationPolicyHostOnly, ///< This allocation was created in the host and will never make it into the process. 47 ///< It is an error to create other types of allocations while such allocations exist. 48 eAllocationPolicyMirror, ///< The intent is that this allocation exist both in the host and the process and have 49 ///< the same content in both. 50 eAllocationPolicyProcessOnly ///< The intent is that this allocation exist only in the process. 51 }; 52 53 lldb::addr_t Malloc (size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, 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 62 void GetMemoryData (DataExtractor &extractor, lldb::addr_t process_address, size_t size, Error &error); 63 64 lldb::ByteOrder GetByteOrder(); 65 uint32_t GetAddressByteSize(); 66 67 ExecutionContextScope *GetBestExecutionContextScope(); 68 69protected: 70 lldb::ProcessWP GetProcessWP () 71 { 72 return m_process_wp; 73 } 74 75private: 76 struct Allocation 77 { 78 lldb::addr_t m_process_alloc; ///< The (unaligned) base for the remote allocation 79 lldb::addr_t m_process_start; ///< The base address of the allocation in the process 80 size_t m_size; ///< The size of the requested allocation 81 uint32_t m_permissions; ///< The access permissions on the memory in the process. In the host, the memory is always read/write. 82 uint8_t m_alignment; ///< The alignment of the requested allocation 83 84 std::unique_ptr<DataBufferHeap> m_data; 85 86 AllocationPolicy m_policy; 87 }; 88 89 lldb::ProcessWP m_process_wp; 90 lldb::TargetWP m_target_wp; 91 typedef std::map<lldb::addr_t, Allocation> AllocationMap; 92 AllocationMap m_allocations; 93 94 lldb::addr_t FindSpace (size_t size); 95 bool ContainsHostOnlyAllocations (); 96 AllocationMap::iterator FindAllocation (lldb::addr_t addr, size_t size); 97}; 98 99} 100 101#endif 102