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);
143 err = process_sp->GetMemoryRegionInfo(
146 lldbassert(0 &&
"GetMemoryRegionInfo() succeeded, then failed");
158 uint64_t alloc_address = target_sp->GetExprAllocAddress();
159 if (alloc_address > 0) {
160 if (alloc_address >= end_of_memory) {
161 lldbassert(0 &&
"The allocation address for expression evaluation must "
162 "be within process address space");
169 switch (address_byte_size) {
177 ret = 0xdead0fff00000000ull;
188 size_t alloc_size = back->second.m_size;
189 uint64_t align = target_sp->GetExprAllocAlign();
192 ret = llvm::alignTo(addr + alloc_size, align);
198IRMemoryMap::AllocationMap::iterator
203 AllocationMap::iterator iter =
m_allocations.lower_bound(addr);
211 if (iter->first <= addr && iter->first + iter->second.m_size >= addr + size)
221 AllocationMap::const_iterator iter =
m_allocations.lower_bound(addr);
232 iter->second.m_size))
239 iter->second.m_size))
258 return (addr2 < (addr1 + size1)) && (addr1 < (addr2 + size2));
265 return process_sp->GetByteOrder();
270 return target_sp->GetArchitecture().GetByteOrder();
279 return process_sp->GetAddressByteSize();
284 return target_sp->GetArchitecture().GetAddressByteSize();
293 return process_sp.get();
298 return target_sp.get();
305 uint32_t permissions, uint8_t alignment,
307 : m_process_alloc(process_alloc), m_process_start(process_start),
308 m_size(size), m_policy(policy), m_leak(false), m_permissions(permissions),
309 m_alignment(alignment) {
312 llvm_unreachable(
"Invalid AllocationPolicy");
332 size_t allocation_size;
337 allocation_size = alignment;
340 allocation_size = llvm::alignTo(size, alignment);
345 allocation_size += alignment - 1;
350 error.SetErrorToGenericError();
351 error.SetErrorString(
"Couldn't malloc: invalid allocation policy");
354 allocation_address =
FindSpace(allocation_size);
356 error.SetErrorToGenericError();
357 error.SetErrorString(
"Couldn't malloc: address space is full");
364 "IRMemoryMap::%s process_sp=0x%" PRIxPTR
365 ", process_sp->CanJIT()=%s, process_sp->IsAlive()=%s",
366 __FUNCTION__,
reinterpret_cast<uintptr_t
>(process_sp.get()),
367 process_sp && process_sp->CanJIT() ?
"true" :
"false",
368 process_sp && process_sp->IsAlive() ?
"true" :
"false");
369 if (process_sp && process_sp->CanJIT() && process_sp->IsAlive()) {
372 process_sp->AllocateMemory(allocation_size, permissions,
error);
375 process_sp->CallocateMemory(allocation_size, permissions,
error);
377 if (!
error.Success())
381 "IRMemoryMap::%s switching to eAllocationPolicyHostOnly "
382 "due to failed condition (see previous expr log message)",
385 allocation_address =
FindSpace(allocation_size);
387 error.SetErrorToGenericError();
388 error.SetErrorString(
"Couldn't malloc: address space is full");
396 if (process_sp->CanJIT() && process_sp->IsAlive()) {
399 process_sp->AllocateMemory(allocation_size, permissions,
error);
402 process_sp->CallocateMemory(allocation_size, permissions,
error);
404 if (!
error.Success())
407 error.SetErrorToGenericError();
408 error.SetErrorString(
409 "Couldn't malloc: process doesn't support allocating memory");
413 error.SetErrorToGenericError();
414 error.SetErrorString(
"Couldn't malloc: process doesn't exist, and this "
415 "memory must be in the process");
422 aligned_address = (allocation_address + mask) & (~mask);
425 std::piecewise_construct, std::forward_as_tuple(aligned_address),
426 std::forward_as_tuple(allocation_address, aligned_address,
427 allocation_size, permissions, alignment, policy));
431 std::vector<uint8_t> zero_buf(size, 0);
432 WriteMemory(aligned_address, zero_buf.data(), size, write_error);
436 const char *policy_string;
440 policy_string =
"<invalid policy>";
443 policy_string =
"eAllocationPolicyHostOnly";
446 policy_string =
"eAllocationPolicyProcessOnly";
449 policy_string =
"eAllocationPolicyMirror";
454 "IRMemoryMap::Malloc (%" PRIu64
", 0x%" PRIx64
", 0x%" PRIx64
455 ", %s) -> 0x%" PRIx64,
456 (uint64_t)allocation_size, (uint64_t)alignment,
457 (uint64_t)permissions, policy_string, aligned_address);
460 return aligned_address;
466 AllocationMap::iterator iter =
m_allocations.find(process_address);
469 error.SetErrorToGenericError();
470 error.SetErrorString(
"Couldn't leak: allocation doesn't exist");
482 AllocationMap::iterator iter =
m_allocations.find(process_address);
485 error.SetErrorToGenericError();
486 error.SetErrorString(
"Couldn't free: allocation doesn't exist");
497 if (process_sp->CanJIT() && process_sp->IsAlive())
498 process_sp->DeallocateMemory(
514 "IRMemoryMap::Free (0x%" PRIx64
") freed [0x%" PRIx64
516 (uint64_t)process_address, iter->second.m_process_start,
517 iter->second.m_process_start + iter->second.m_size);
546 const uint8_t *bytes,
size_t size,
550 AllocationMap::iterator iter =
FindAllocation(process_address, size);
556 process_sp->WriteMemory(process_address, bytes, size,
error);
560 error.SetErrorToGenericError();
561 error.SetErrorString(
"Couldn't write: no allocation contains the target "
562 "range and the process doesn't exist");
574 error.SetErrorToGenericError();
575 error.SetErrorString(
"Couldn't write: invalid allocation policy");
579 error.SetErrorToGenericError();
580 error.SetErrorString(
"Couldn't write: data buffer is empty");
587 error.SetErrorToGenericError();
588 error.SetErrorString(
"Couldn't write: data buffer is empty");
594 process_sp->WriteMemory(process_address, bytes, size,
error);
595 if (!
error.Success())
602 process_sp->WriteMemory(process_address, bytes, size,
error);
603 if (!
error.Success())
611 "IRMemoryMap::WriteMemory (0x%" PRIx64
", 0x%" PRIxPTR
612 ", 0x%" PRId64
") went to [0x%" PRIx64
"..0x%" PRIx64
")",
613 (uint64_t)process_address,
reinterpret_cast<uintptr_t
>(bytes), (uint64_t)size,
616 (uint64_t)allocation.
m_size);
621 Scalar &scalar,
size_t size,
630 const size_t mem_size =
635 error.SetErrorToGenericError();
636 error.SetErrorString(
637 "Couldn't write scalar: failed to get scalar as memory data");
640 error.SetErrorToGenericError();
641 error.SetErrorString(
"Couldn't write scalar: its size was zero");
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);
676 error.SetErrorToGenericError();
677 error.SetErrorString(
"Couldn't read: no allocation contains the target "
678 "range, and neither the process nor the target exist");
686 if (offset > allocation.
m_size) {
687 error.SetErrorToGenericError();
688 error.SetErrorString(
"Couldn't read: data is not in the allocation");
696 error.SetErrorToGenericError();
697 error.SetErrorString(
"Couldn't read: invalid allocation policy");
701 error.SetErrorToGenericError();
702 error.SetErrorString(
"Couldn't read: data buffer is empty");
706 error.SetErrorToGenericError();
707 error.SetErrorString(
"Couldn't read: not enough underlying data");
716 process_sp->ReadMemory(process_address, bytes, size,
error);
717 if (!
error.Success())
721 error.SetErrorToGenericError();
722 error.SetErrorString(
"Couldn't read: data buffer is empty");
731 process_sp->ReadMemory(process_address, bytes, size,
error);
732 if (!
error.Success())
740 "IRMemoryMap::ReadMemory (0x%" PRIx64
", 0x%" PRIxPTR
741 ", 0x%" PRId64
") came from [0x%" PRIx64
"..0x%" PRIx64
")",
742 (uint64_t)process_address,
reinterpret_cast<uintptr_t
>(bytes), (uint64_t)size,
745 (uint64_t)allocation.
m_size);
758 if (!
error.Success())
768 error.SetErrorToGenericError();
769 error.SetErrorStringWithFormat(
770 "Couldn't read scalar: unsupported size %" PRIu64, (uint64_t)size);
773 scalar = extractor.
GetU8(&offset);
776 scalar = extractor.
GetU16(&offset);
779 scalar = extractor.
GetU32(&offset);
782 scalar = extractor.
GetU64(&offset);
786 error.SetErrorToGenericError();
787 error.SetErrorString(
"Couldn't read scalar: its size was zero");
800 if (!
error.Success())
812 AllocationMap::iterator iter =
FindAllocation(process_address, size);
815 error.SetErrorToGenericError();
816 error.SetErrorStringWithFormat(
817 "Couldn't find an allocation containing [0x%" PRIx64
"..0x%" PRIx64
819 process_address, process_address + size);
827 error.SetErrorToGenericError();
828 error.SetErrorString(
829 "Couldn't get memory data: invalid allocation policy");
832 error.SetErrorToGenericError();
833 error.SetErrorString(
834 "Couldn't get memory data: memory is only in the target");
840 error.SetErrorToGenericError();
841 error.SetErrorString(
"Couldn't get memory data: data buffer is empty");
848 if (!
error.Success())
858 error.SetErrorToGenericError();
859 error.SetErrorString(
"Couldn't get memory data: data buffer is empty");
868 error.SetErrorToGenericError();
869 error.SetErrorString(
"Couldn't get memory data: its size was zero");
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::offset_t SetByteSize(lldb::offset_t byte_size)
Set 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()
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
lldb::addr_t Malloc(size_t size, uint8_t alignment, uint32_t permissions, AllocationPolicy policy, bool zero_memory, Status &error)
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)
void WritePointerToMemory(lldb::addr_t process_address, lldb::addr_t address, Status &error)
AllocationMap::iterator FindAllocation(lldb::addr_t addr, size_t size)
uint32_t GetAddressByteSize()
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...
OptionalBool GetWritable() const
OptionalBool GetReadable() const
OptionalBool GetExecutable() 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.
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.
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.
BaseType GetRangeBase() const
BaseType GetRangeEnd() const