IRMemoryMap.h revision da0e332abdc9dbd058d2d1a02233237df6bee894
19e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan//===-- IRExecutionUnit.h ---------------------------------------*- C++ -*-===// 29e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan// 39e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan// The LLVM Compiler Infrastructure 49e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan// 59e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan// This file is distributed under the University of Illinois Open Source 69e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan// License. See LICENSE.TXT for details. 79e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan// 89e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan//===----------------------------------------------------------------------===// 99e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 109e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#ifndef lldb_IRMemoryMap_h_ 119e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#define lldb_IRMemoryMap_h_ 129e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 139e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#include "lldb/lldb-public.h" 149e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#include "lldb/Core/DataBufferHeap.h" 159e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#include "lldb/Core/UserID.h" 169e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 179e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#include <map> 189e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 199e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanannamespace lldb_private 209e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan{ 219e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 229e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan//---------------------------------------------------------------------- 239e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// @class IRMemoryMap IRMemoryMap.h "lldb/Expression/IRMemoryMap.h" 249e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// @brief Encapsulates memory that may exist in the process but must 259e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// also be available in the host process. 269e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// 279e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// This class encapsulates a group of memory objects that must be readable 289e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// or writable from the host process regardless of whether the process 299e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// exists. This allows the IR interpreter as well as JITted code to access 309e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// the same memory. 319e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// 329e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// Point queries against this group of memory objects can be made by the 339e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// address in the tar at which they reside. If the inferior does not 349e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// exist, allocations still get made-up addresses. If an inferior appears 359e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan/// at some point, then those addresses need to be re-mapped. 369e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan//---------------------------------------------------------------------- 379e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callananclass IRMemoryMap 389e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan{ 399e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callananpublic: 40f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan IRMemoryMap (lldb::TargetSP target_sp); 419e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan ~IRMemoryMap (); 429e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 439e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan enum AllocationPolicy { 449e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan eAllocationPolicyInvalid = 0, ///< It is an error for an allocation to have this policy. 459e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan eAllocationPolicyHostOnly, ///< This allocation was created in the host and will never make it into the process. 469e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan ///< It is an error to create other types of allocations while such allocations exist. 479e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan eAllocationPolicyMirror, ///< The intent is that this allocation exist both in the host and the process and have 489e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan ///< the same content in both. 499e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan eAllocationPolicyProcessOnly ///< The intent is that this allocation exist only in the process. 509e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan }; 519e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 529e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t Malloc (size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, Error &error); 539e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan void Free (lldb::addr_t process_address, Error &error); 549e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 559e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan void WriteMemory (lldb::addr_t process_address, const uint8_t *bytes, size_t size, Error &error); 56f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan void WriteScalarToMemory (lldb::addr_t process_address, Scalar &scalar, size_t size, Error &error); 57934d6160f5e62914c20f8e229c5e1ca4d9ead99fSean Callanan void WritePointerToMemory (lldb::addr_t process_address, lldb::addr_t address, Error &error); 589e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan void ReadMemory (uint8_t *bytes, lldb::addr_t process_address, size_t size, Error &error); 59f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan void ReadScalarFromMemory (Scalar &scalar, lldb::addr_t process_address, size_t size, Error &error); 6076f9879afa1508febd5538a63a3fad7f01c6c64fSean Callanan void ReadPointerFromMemory (lldb::addr_t *address, lldb::addr_t process_address, Error &error); 619e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 62e287e900488e20e07ef986ec0524b872fbeafa5dSean Callanan void GetMemoryData (DataExtractor &extractor, lldb::addr_t process_address, size_t size, Error &error); 63e287e900488e20e07ef986ec0524b872fbeafa5dSean Callanan 64f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan lldb::ByteOrder GetByteOrder(); 65f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan uint32_t GetAddressByteSize(); 66f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 67faafd193bf7dc065e5f6fb99e4c538cc452af7e4Sean Callanan // This function can return NULL. 68f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan ExecutionContextScope *GetBestExecutionContextScope(); 69f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 709e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callananprotected: 71faafd193bf7dc065e5f6fb99e4c538cc452af7e4Sean Callanan // This function should only be used if you know you are using the JIT. 72faafd193bf7dc065e5f6fb99e4c538cc452af7e4Sean Callanan // Any other cases should use GetBestExecutionContextScope(). 739e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::ProcessWP GetProcessWP () 749e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan { 759e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan return m_process_wp; 769e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan } 779e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 789e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callananprivate: 799e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan struct Allocation 809e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan { 819e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t m_process_alloc; ///< The (unaligned) base for the remote allocation 829e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t m_process_start; ///< The base address of the allocation in the process 839e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan size_t m_size; ///< The size of the requested allocation 849e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan uint32_t m_permissions; ///< The access permissions on the memory in the process. In the host, the memory is always read/write. 859e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan uint8_t m_alignment; ///< The alignment of the requested allocation 86da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton STD_UNIQUE_PTR(DataBufferHeap) m_data_ap; 879e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan AllocationPolicy m_policy; 88da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton 89da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton Allocation () : 90da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_process_alloc (LLDB_INVALID_ADDRESS), 91da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_process_start (LLDB_INVALID_ADDRESS), 92da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_size (0), 93da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_permissions (0), 94da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_alignment (0), 95da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_data_ap (), 96da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_policy (eAllocationPolicyInvalid) 97da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton { 98da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton } 999e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan }; 1009e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 1019e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::ProcessWP m_process_wp; 102f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan lldb::TargetWP m_target_wp; 1039e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan typedef std::map<lldb::addr_t, Allocation> AllocationMap; 1049e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan AllocationMap m_allocations; 105f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 1069e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t FindSpace (size_t size); 1079e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan bool ContainsHostOnlyAllocations (); 1089e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan AllocationMap::iterator FindAllocation (lldb::addr_t addr, size_t size); 1099e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan}; 1109e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 1119e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan} 1129e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 1139e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#endif 114