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(
146 if (ret + size < end_of_memory)
159 uint64_t alloc_address = target_sp->GetExprAllocAddress();
160 if (alloc_address > 0) {
161 if (alloc_address >= end_of_memory) {
162 lldbassert(0 &&
"The allocation address for expression evaluation must "
163 "be within process address space");
170 switch (address_byte_size) {
178 ret = 0xdead0fff00000000ull;
189 size_t alloc_size = back->second.m_size;
190 uint64_t align = target_sp->GetExprAllocAlign();
193 ret = llvm::alignTo(addr + alloc_size, align);
199IRMemoryMap::AllocationMap::iterator
204 AllocationMap::iterator iter =
m_allocations.lower_bound(addr);
212 if (iter->first <= addr && iter->first + iter->second.m_size >= addr + size)
222 AllocationMap::const_iterator iter =
m_allocations.lower_bound(addr);
233 iter->second.m_size))
240 iter->second.m_size))
259 return (addr2 < (addr1 + size1)) && (addr1 < (addr2 + size2));
266 return process_sp->GetByteOrder();
271 return target_sp->GetArchitecture().GetByteOrder();
280 return process_sp->GetAddressByteSize();
285 return target_sp->GetArchitecture().GetAddressByteSize();
294 return process_sp.get();
299 return target_sp.get();
306 uint32_t permissions, uint8_t alignment,
313 llvm_unreachable(
"Invalid AllocationPolicy");
323llvm::Expected<lldb::addr_t>
333 size_t allocation_size;
338 allocation_size = alignment;
341 allocation_size = llvm::alignTo(size, alignment);
346 allocation_size += alignment - 1;
351 return llvm::createStringError(
352 llvm::inconvertibleErrorCode(),
353 "Couldn't malloc: invalid allocation policy");
355 allocation_address =
FindSpace(allocation_size);
357 return llvm::createStringError(llvm::inconvertibleErrorCode(),
358 "Couldn't malloc: address space is full");
363 "IRMemoryMap::%s process_sp=0x%" PRIxPTR
364 ", process_sp->CanJIT()=%s, process_sp->IsAlive()=%s",
365 __FUNCTION__,
reinterpret_cast<uintptr_t
>(process_sp.get()),
366 process_sp && process_sp->CanJIT() ?
"true" :
"false",
367 process_sp && process_sp->IsAlive() ?
"true" :
"false");
368 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())
378 return error.takeError();
381 "IRMemoryMap::%s switching to eAllocationPolicyHostOnly "
382 "due to failed condition (see previous expr log message)",
385 allocation_address =
FindSpace(allocation_size);
387 return llvm::createStringError(
388 llvm::inconvertibleErrorCode(),
389 "Couldn't malloc: address space is full");
395 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())
405 return error.takeError();
407 return llvm::createStringError(
408 llvm::inconvertibleErrorCode(),
409 "Couldn't malloc: process doesn't support allocating memory");
412 return llvm::createStringError(llvm::inconvertibleErrorCode(),
413 "Couldn't malloc: process doesn't exist, "
414 "and this memory must be in the process");
420 aligned_address = (allocation_address + mask) & (~mask);
423 std::piecewise_construct, std::forward_as_tuple(aligned_address),
424 std::forward_as_tuple(allocation_address, aligned_address,
425 allocation_size, permissions, alignment, policy));
429 std::vector<uint8_t> zero_buf(size, 0);
430 WriteMemory(aligned_address, zero_buf.data(), size, write_error);
434 const char *policy_string;
438 policy_string =
"<invalid policy>";
441 policy_string =
"eAllocationPolicyHostOnly";
444 policy_string =
"eAllocationPolicyProcessOnly";
447 policy_string =
"eAllocationPolicyMirror";
452 "IRMemoryMap::Malloc (%" PRIu64
", 0x%" PRIx64
", 0x%" PRIx64
453 ", %s) -> 0x%" PRIx64,
454 (uint64_t)allocation_size, (uint64_t)alignment,
455 (uint64_t)permissions, policy_string, aligned_address);
459 *used_policy = policy;
461 return aligned_address;
467 AllocationMap::iterator iter =
m_allocations.find(process_address);
482 AllocationMap::iterator iter =
m_allocations.find(process_address);
496 if (process_sp->CanJIT() && process_sp->IsAlive())
497 process_sp->DeallocateMemory(
513 "IRMemoryMap::Free (0x%" PRIx64
") freed [0x%" PRIx64
515 (uint64_t)process_address, iter->second.m_process_start,
516 iter->second.m_process_start + iter->second.m_size);
545 const uint8_t *bytes,
size_t size,
549 AllocationMap::iterator iter =
FindAllocation(process_address, size);
555 process_sp->WriteMemory(process_address, bytes, size,
error);
560 "Couldn't write: no allocation contains the target "
561 "range and the process doesn't exist");
591 process_sp->WriteMemory(process_address, bytes, size,
error);
592 if (!
error.Success())
599 process_sp->WriteMemory(process_address, bytes, size,
error);
600 if (!
error.Success())
608 "IRMemoryMap::WriteMemory (0x%" PRIx64
", 0x%" PRIxPTR
609 ", 0x%" PRId64
") went to [0x%" PRIx64
"..0x%" PRIx64
")",
610 (uint64_t)process_address,
reinterpret_cast<uintptr_t
>(bytes), (uint64_t)size,
613 (uint64_t)allocation.
m_size);
618 Scalar &scalar,
size_t size,
627 const size_t mem_size =
633 "Couldn't write scalar: failed to get scalar as memory data");
651 pointer = process_sp->FixAnyAddress(pointer);
662 AllocationMap::iterator iter =
FindAllocation(process_address, size);
668 process_sp->ReadMemory(process_address, bytes, size,
error);
675 Address absolute_address(process_address);
676 target_sp->ReadMemory(absolute_address, bytes, size,
error,
true);
681 "Couldn't read: no allocation contains the target "
682 "range, and neither the process nor the target exist");
690 if (offset > allocation.
m_size) {
718 process_sp->ReadMemory(process_address, bytes, size,
error);
719 if (!
error.Success())
732 process_sp->ReadMemory(process_address, bytes, size,
error);
733 if (!
error.Success())
741 "IRMemoryMap::ReadMemory (0x%" PRIx64
", 0x%" PRIxPTR
742 ", 0x%" PRId64
") came from [0x%" PRIx64
"..0x%" PRIx64
")",
743 (uint64_t)process_address,
reinterpret_cast<uintptr_t
>(bytes), (uint64_t)size,
746 (uint64_t)allocation.
m_size);
759 if (!
error.Success())
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);
799 if (!
error.Success())
811 AllocationMap::iterator iter =
FindAllocation(process_address, size);
815 "Couldn't find an allocation containing [0x%" PRIx64
"..0x%" PRIx64
817 process_address, process_address + size);
826 "Couldn't get memory data: invalid allocation policy");
830 "Couldn't get memory data: memory is only in the target");
837 "Couldn't get memory data: data buffer is empty");
844 if (!
error.Success())
855 "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