[Lldb-commits] [lldb] [lldb] IRMemoryMap zero address mapping fix (PR #99045)
Jason Molenda via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 18 23:02:43 PDT 2024
jasonmolenda wrote:
I'd describe this patch as handling the case where a remote stub cannot jit memory and has a qMemoryRegion info packet which does not specify permissions. The patch you reference makes jitted code expressions work, but I think IRMemoryMap::FindSpec only needs to find space in the inferior virtual address space -- allocate memory -- and that was already working, wasn't it? Also, your before & after packets show that you've got permissions returned for your qMemoryRegionInfo responses now, which you don't before -- you won't hit this failure because of that change.
One thing I'd say is that this patch is looking for "is this a region with read, write, or execute permissions", so it can skip that. It does this with,
```
if (region_info.GetReadable() != MemoryRegionInfo::OptionalBool::eNo ||
region_info.GetWritable() != MemoryRegionInfo::OptionalBool::eNo ||
region_info.GetExecutable() !=
MemoryRegionInfo::OptionalBool::eNo) {
ret = region_info.GetRange().GetRangeEnd();
/// keep iterating
```
but `MemoryRegionInfo::OptionalBool` can be `eDontKnow` which it is here. I think this conditional would be more clearly expressed as
```
bool all_permissions_unknown = region_info.GetReadable() == MemoryRegionInfo::OptionalBool::eDontKnow &&
region_info.GetWritable() == MemoryRegionInfo::OptionalBool::eDontKnow &&
region_info.GetExecutable() == MemoryRegionInfo::OptionalBool::eDontKnow;
bool any_permissions_yes = region_info.GetReadable() == MemoryRegionInfo::OptionalBool::eYes
region_info.GetWritable() == MemoryRegionInfo::OptionalBool::eYes
region_info.GetExecutable() == MemoryRegionInfo::OptionalBool::eYes;
if (all_permissions_unknown || any_permissions_yes)
ret = region_info.GetRange().GetRangeEnd();
/// keep iterating
```
or more simply, change the while (true) loop to first check if all permissions are No in a region,
```
if (region_info.GetReadable() != MemoryRegionInfo::OptionalBool::eNo &&
region_info.GetWritable() != MemoryRegionInfo::OptionalBool::eNo &&
region_info.GetExecutable() !=
MemoryRegionInfo::OptionalBool::eNo) {
if (ret + size < region_info.GetRange().GetRangeEnd())
return ret;
else
ret = region_info.GetRange().GetRangeEnd();
// keep searching
```
https://github.com/llvm/llvm-project/pull/99045
More information about the lldb-commits
mailing list