[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