32 AllocationMap::iterator iter;
38 if (iter->second.m_leak)
41 Free(iter->first, err);
62 const bool process_is_alive = process_sp && process_sp->IsAlive();
68 if (process_is_alive && process_sp->CanJIT()) {
71 ret = process_sp->AllocateMemory(size, lldb::ePermissionsReadable |
72 lldb::ePermissionsWritable,
91 size_t alloc_size = back->second.m_size;
92 ret = llvm::alignTo(addr + alloc_size, 4096);
95 uint64_t end_of_memory;
98 end_of_memory = 0xffffull;
101 end_of_memory = 0xffffffffull;
104 end_of_memory = 0xffffffffffffffffull;
114 if (process_is_alive) {
116 Status err = process_sp->GetMemoryRegionInfo(ret, region_info);
140 err = process_sp->GetMemoryRegionInfo(
143 lldbassert(0 &&
"GetMemoryRegionInfo() succeeded, then failed");
155 uint64_t alloc_address = target_sp->GetExprAllocAddress();
156 if (alloc_address > 0) {
157 if (alloc_address >= end_of_memory) {
158 lldbassert(0 &&
"The allocation address for expression evaluation must "
159 "be within process address space");
166 switch (address_byte_size) {
174 ret = 0xdead0fff00000000ull;
185 size_t alloc_size = back->second.m_size;
186 uint64_t align = target_sp->GetExprAllocAlign();
189 ret = llvm::alignTo(addr + alloc_size, align);
195IRMemoryMap::AllocationMap::iterator
200 AllocationMap::iterator iter =
m_allocations.lower_bound(addr);
208 if (iter->first <= addr && iter->first + iter->second.m_size >= addr + size)
218 AllocationMap::const_iterator iter =
m_allocations.lower_bound(addr);
229 iter->second.m_size))
236 iter->second.m_size))
255 return (addr2 < (addr1 + size1)) && (addr1 < (addr2 + size2));
262 return process_sp->GetByteOrder();
267 return target_sp->GetArchitecture().GetByteOrder();
276 return process_sp->GetAddressByteSize();
281 return target_sp->GetArchitecture().GetAddressByteSize();
290 return process_sp.get();
295 return target_sp.get();
302 uint32_t permissions, uint8_t alignment,
309 llvm_unreachable(
"Invalid AllocationPolicy");
319llvm::Expected<lldb::addr_t>
329 size_t allocation_size;
334 allocation_size = alignment;
337 allocation_size = llvm::alignTo(size, alignment);
342 allocation_size += alignment - 1;
347 return llvm::createStringError(
348 llvm::inconvertibleErrorCode(),
349 "Couldn't malloc: invalid allocation policy");
351 allocation_address =
FindSpace(allocation_size);
353 return llvm::createStringError(llvm::inconvertibleErrorCode(),
354 "Couldn't malloc: address space is full");
359 "IRMemoryMap::%s process_sp=0x%" PRIxPTR
360 ", process_sp->CanJIT()=%s, process_sp->IsAlive()=%s",
361 __FUNCTION__,
reinterpret_cast<uintptr_t
>(process_sp.get()),
362 process_sp && process_sp->CanJIT() ?
"true" :
"false",
363 process_sp && process_sp->IsAlive() ?
"true" :
"false");
364 if (process_sp && process_sp->CanJIT() && process_sp->IsAlive()) {
368 process_sp->AllocateMemory(allocation_size, permissions,
error);
371 process_sp->CallocateMemory(allocation_size, permissions,
error);
373 if (!
error.Success())
374 return error.takeError();
377 "IRMemoryMap::%s switching to eAllocationPolicyHostOnly "
378 "due to failed condition (see previous expr log message)",
381 allocation_address =
FindSpace(allocation_size);
383 return llvm::createStringError(
384 llvm::inconvertibleErrorCode(),
385 "Couldn't malloc: address space is full");
391 if (process_sp->CanJIT() && process_sp->IsAlive()) {
395 process_sp->AllocateMemory(allocation_size, permissions,
error);
398 process_sp->CallocateMemory(allocation_size, permissions,
error);
400 if (!
error.Success())
401 return error.takeError();
403 return llvm::createStringError(
404 llvm::inconvertibleErrorCode(),
405 "Couldn't malloc: process doesn't support allocating memory");
408 return llvm::createStringError(llvm::inconvertibleErrorCode(),
409 "Couldn't malloc: process doesn't exist, "
410 "and this memory must be in the process");
416 aligned_address = (allocation_address + mask) & (~mask);
419 std::piecewise_construct, std::forward_as_tuple(aligned_address),
420 std::forward_as_tuple(allocation_address, aligned_address,
421 allocation_size, permissions, alignment, policy));
425 std::vector<uint8_t> zero_buf(size, 0);
426 WriteMemory(aligned_address, zero_buf.data(), size, write_error);
430 const char *policy_string;
434 policy_string =
"<invalid policy>";
437 policy_string =
"eAllocationPolicyHostOnly";
440 policy_string =
"eAllocationPolicyProcessOnly";
443 policy_string =
"eAllocationPolicyMirror";
448 "IRMemoryMap::Malloc (%" PRIu64
", 0x%" PRIx64
", 0x%" PRIx64
449 ", %s) -> 0x%" PRIx64,
450 (uint64_t)allocation_size, (uint64_t)alignment,
451 (uint64_t)permissions, policy_string, aligned_address);
455 *used_policy = policy;
457 return aligned_address;
463 AllocationMap::iterator iter =
m_allocations.find(process_address);
478 AllocationMap::iterator iter =
m_allocations.find(process_address);
492 if (process_sp->CanJIT() && process_sp->IsAlive())
493 process_sp->DeallocateMemory(
509 "IRMemoryMap::Free (0x%" PRIx64
") freed [0x%" PRIx64
511 (uint64_t)process_address, iter->second.m_process_start,
512 iter->second.m_process_start + iter->second.m_size);
541 const uint8_t *bytes,
size_t size,
545 AllocationMap::iterator iter =
FindAllocation(process_address, size);
551 process_sp->WriteMemory(process_address, bytes, size,
error);
556 "Couldn't write: no allocation contains the target "
557 "range and the process doesn't exist");
587 process_sp->WriteMemory(process_address, bytes, size,
error);
588 if (!
error.Success())
595 process_sp->WriteMemory(process_address, bytes, size,
error);
596 if (!
error.Success())
604 "IRMemoryMap::WriteMemory (0x%" PRIx64
", 0x%" PRIxPTR
605 ", 0x%" PRId64
") went to [0x%" PRIx64
"..0x%" PRIx64
")",
606 (uint64_t)process_address,
reinterpret_cast<uintptr_t
>(bytes), (uint64_t)size,
609 (uint64_t)allocation.
m_size);
614 Scalar &scalar,
size_t size,
623 const size_t mem_size =
629 "Couldn't write scalar: failed to get scalar as memory data");
647 pointer = process_sp->FixAnyAddress(pointer);
658 AllocationMap::iterator iter =
FindAllocation(process_address, size);
664 process_sp->ReadMemory(process_address, bytes, size,
error);
671 Address absolute_address(process_address);
672 target_sp->ReadMemory(absolute_address, bytes, size,
error,
true);
677 "Couldn't read: no allocation contains the target "
678 "range, and neither the process nor the target exist");
686 if (offset > allocation.
m_size) {
714 process_sp->ReadMemory(process_address, bytes, size,
error);
715 if (!
error.Success())
728 process_sp->ReadMemory(process_address, bytes, size,
error);
729 if (!
error.Success())
737 "IRMemoryMap::ReadMemory (0x%" PRIx64
", 0x%" PRIxPTR
738 ", 0x%" PRId64
") came from [0x%" PRIx64
"..0x%" PRIx64
")",
739 (uint64_t)process_address,
reinterpret_cast<uintptr_t
>(bytes), (uint64_t)size,
742 (uint64_t)allocation.
m_size);
755 if (!
error.Success())
766 "Couldn't read scalar: unsupported size %" PRIu64, (uint64_t)size);
769 scalar = extractor.
GetU8(&offset);
772 scalar = extractor.
GetU16(&offset);
775 scalar = extractor.
GetU32(&offset);
778 scalar = extractor.
GetU64(&offset);
795 if (!
error.Success())
807 AllocationMap::iterator iter =
FindAllocation(process_address, size);
811 "Couldn't find an allocation containing [0x%" PRIx64
"..0x%" PRIx64
813 process_address, process_address + size);
822 "Couldn't get memory data: invalid allocation policy");
826 "Couldn't get memory data: memory is only in the target");
833 "Couldn't get memory data: data buffer is empty");
840 if (!
error.Success())
851 "Couldn't get memory data: data buffer is empty");
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
A section + offset based address class.
A subclass of DataBuffer that stores a data buffer on the heap.
lldb::offset_t GetByteSize() const override
Get the number of bytes in the data buffer.
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
lldb::TargetWP m_target_wp
void Free(lldb::addr_t process_address, Status &error)
lldb::ByteOrder GetByteOrder()
llvm::Expected< lldb::addr_t > Malloc(size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, bool zero_memory, AllocationPolicy *used_policy=nullptr)
void ReadPointerFromMemory(lldb::addr_t *address, lldb::addr_t process_address, Status &error)
lldb::ProcessWP m_process_wp
AllocationMap m_allocations
bool IntersectsAllocation(lldb::addr_t addr, size_t size) const
ExecutionContextScope * GetBestExecutionContextScope() const
static bool AllocationsIntersect(lldb::addr_t addr1, size_t size1, lldb::addr_t addr2, size_t size2)
void GetMemoryData(DataExtractor &extractor, lldb::addr_t process_address, size_t size, Status &error)
lldb::ProcessWP & GetProcessWP()
AllocationMap::iterator FindAllocation(lldb::addr_t addr, size_t size)
uint32_t GetAddressByteSize()
void WritePointerToMemory(lldb::addr_t process_address, lldb::addr_t pointer, Status &error)
IRMemoryMap(lldb::TargetSP target_sp)
void ReadScalarFromMemory(Scalar &scalar, lldb::addr_t process_address, size_t size, Status &error)
lldb::addr_t FindSpace(size_t size)
void WriteScalarToMemory(lldb::addr_t process_address, Scalar &scalar, size_t size, Status &error)
bool GetAllocSize(lldb::addr_t address, size_t &size)
void Leak(lldb::addr_t process_address, Status &error)
void WriteMemory(lldb::addr_t process_address, const uint8_t *bytes, size_t size, Status &error)
void ReadMemory(uint8_t *bytes, lldb::addr_t process_address, size_t size, Status &error)
@ eAllocationPolicyProcessOnly
The intent is that this allocation exist only in the process.
@ eAllocationPolicyHostOnly
This allocation was created in the host and will never make it into the process.
@ eAllocationPolicyMirror
The intent is that this allocation exist both in the host and the process and have the same content i...
LazyBool GetReadable() const
LazyBool GetExecutable() const
LazyBool GetWritable() const
size_t GetByteSize() const
unsigned long long ULongLong(unsigned long long fail_value=0) const
size_t GetAsMemoryData(void *dst, size_t dst_len, lldb::ByteOrder dst_byte_order, Status &error) const
void Clear()
Clear the object state.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Fail() const
Test for error condition.
bool Success() const
Test for success condition.
uint8_t * GetBytes()
Get a pointer to the data.
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::Process > ProcessSP
ByteOrder
Byte ordering definitions.
std::shared_ptr< lldb_private::Target > TargetSP
size_t m_size
The size of the requested allocation.
lldb::addr_t m_process_alloc
The (unaligned) base for the remote allocation.
AllocationPolicy m_policy
Flags. Keep these grouped together to avoid structure padding.
uint8_t m_permissions
The access permissions on the memory in the process.
Allocation(lldb::addr_t process_alloc, lldb::addr_t process_start, size_t size, uint32_t permissions, uint8_t alignment, AllocationPolicy m_policy)
lldb::addr_t m_process_start
The base address of the allocation in the process.
uint8_t m_alignment
The alignment of the requested allocation.
BaseType GetRangeBase() const
BaseType GetRangeEnd() const