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); 53e7872343f18b90e4134fb91a616b138ba6bd6b92Sean Callanan void Leak (lldb::addr_t process_address, Error &error); 549e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan void Free (lldb::addr_t process_address, Error &error); 559e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 569e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan void WriteMemory (lldb::addr_t process_address, const uint8_t *bytes, size_t size, Error &error); 57f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan void WriteScalarToMemory (lldb::addr_t process_address, Scalar &scalar, size_t size, Error &error); 58934d6160f5e62914c20f8e229c5e1ca4d9ead99fSean Callanan void WritePointerToMemory (lldb::addr_t process_address, lldb::addr_t address, Error &error); 599e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan void ReadMemory (uint8_t *bytes, lldb::addr_t process_address, size_t size, Error &error); 60f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan void ReadScalarFromMemory (Scalar &scalar, lldb::addr_t process_address, size_t size, Error &error); 6176f9879afa1508febd5538a63a3fad7f01c6c64fSean Callanan void ReadPointerFromMemory (lldb::addr_t *address, lldb::addr_t process_address, Error &error); 629e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 63e287e900488e20e07ef986ec0524b872fbeafa5dSean Callanan void GetMemoryData (DataExtractor &extractor, lldb::addr_t process_address, size_t size, Error &error); 64e287e900488e20e07ef986ec0524b872fbeafa5dSean Callanan 65f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan lldb::ByteOrder GetByteOrder(); 66f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan uint32_t GetAddressByteSize(); 67f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 68faafd193bf7dc065e5f6fb99e4c538cc452af7e4Sean Callanan // This function can return NULL. 69f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan ExecutionContextScope *GetBestExecutionContextScope(); 70f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 719e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callananprotected: 72faafd193bf7dc065e5f6fb99e4c538cc452af7e4Sean Callanan // This function should only be used if you know you are using the JIT. 73faafd193bf7dc065e5f6fb99e4c538cc452af7e4Sean Callanan // Any other cases should use GetBestExecutionContextScope(). 749e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::ProcessWP GetProcessWP () 759e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan { 769e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan return m_process_wp; 779e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan } 789e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 799e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callananprivate: 809e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan struct Allocation 819e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan { 829e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t m_process_alloc; ///< The (unaligned) base for the remote allocation 839e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t m_process_start; ///< The base address of the allocation in the process 849e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan size_t m_size; ///< The size of the requested allocation 859e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan uint32_t m_permissions; ///< The access permissions on the memory in the process. In the host, the memory is always read/write. 869e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan uint8_t m_alignment; ///< The alignment of the requested allocation 8706761aad61604feba2af78c873b104e0415d9361Sean Callanan DataBufferHeap m_data; 88e7872343f18b90e4134fb91a616b138ba6bd6b92Sean Callanan 89e7872343f18b90e4134fb91a616b138ba6bd6b92Sean Callanan ///< Flags 904b1b8d9e3ae7d4b858e2c1f0ed719655496e6857Sean Callanan AllocationPolicy m_policy; 914b1b8d9e3ae7d4b858e2c1f0ed719655496e6857Sean Callanan bool m_leak; 9206761aad61604feba2af78c873b104e0415d9361Sean Callanan public: 9306761aad61604feba2af78c873b104e0415d9361Sean Callanan Allocation (lldb::addr_t process_alloc, 9406761aad61604feba2af78c873b104e0415d9361Sean Callanan lldb::addr_t process_start, 9506761aad61604feba2af78c873b104e0415d9361Sean Callanan size_t size, 9606761aad61604feba2af78c873b104e0415d9361Sean Callanan uint32_t permissions, 9706761aad61604feba2af78c873b104e0415d9361Sean Callanan uint8_t alignment, 9806761aad61604feba2af78c873b104e0415d9361Sean Callanan AllocationPolicy m_policy); 9906761aad61604feba2af78c873b104e0415d9361Sean Callanan 100da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton Allocation () : 101da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_process_alloc (LLDB_INVALID_ADDRESS), 102da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_process_start (LLDB_INVALID_ADDRESS), 103da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_size (0), 104da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_permissions (0), 105da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton m_alignment (0), 10606761aad61604feba2af78c873b104e0415d9361Sean Callanan m_data (), 107e7872343f18b90e4134fb91a616b138ba6bd6b92Sean Callanan m_policy (eAllocationPolicyInvalid), 108e7872343f18b90e4134fb91a616b138ba6bd6b92Sean Callanan m_leak (false) 109da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton { 110da0e332abdc9dbd058d2d1a02233237df6bee894Greg Clayton } 1119e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan }; 1129e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 1139e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::ProcessWP m_process_wp; 114f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan lldb::TargetWP m_target_wp; 1159e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan typedef std::map<lldb::addr_t, Allocation> AllocationMap; 1169e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan AllocationMap m_allocations; 117f4b59480e8d1056b1638141a6a627b252f657db0Sean Callanan 1189e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan lldb::addr_t FindSpace (size_t size); 1199e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan bool ContainsHostOnlyAllocations (); 1209e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan AllocationMap::iterator FindAllocation (lldb::addr_t addr, size_t size); 12173cb33aa0c9a59cfd42c3cea222378dc9d15abb0Sean Callanan bool IntersectsAllocation (lldb::addr_t addr, size_t size); 1229e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan}; 1239e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 1249e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan} 1259e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan 1269e6f6a6f394bb570c5f1f9a850ec0befe4a59fefSean Callanan#endif 127