[Lldb-commits] [lldb] [lldb] IRMemoryMap zero address mapping fix (PR #99045)

via lldb-commits lldb-commits at lists.llvm.org
Wed Jul 17 18:10:37 PDT 2024


dlav-sc wrote:

I connect to a riscv (rv64gv) machine, nothing special. 

Lldb can just allocate memory on remote target only if the target supports executing JIT-compiled code (`if (process_is_alive && process_sp->CanJIT())` on the line `68`), otherwise lldb falls through and starts finding suitable memory region for a mapping.

The problem is that riscv targets currently don't support JIT-compiled code execution, but can only execute simple lldb expressions interpreting its IR, like for example 
```
expr <variable>
``` 
or 
```
expr *(type_z*)pz
``` 
If in the case above `pz == nullptr` and lldb have mapped zero address, then instead of the error we will get a valid result:
```
output: (type_z) $0 = {
  y = (dummy = 0)
}
```
I take this example from `TestAnonymous.py`. 

Logs you have asked for:

Without patch:
```
lldb             <  23> send packet: $qMemoryRegionInfo:0#44                                                                                                                                                                                                                       
lldb             <  28> read packet: $start:0;size:2aaaaaa000;#0b                                                                                                                                                                                                                  
lldb             IRMemoryMap::Malloc (23, 0x8, 0x3, eAllocationPolicyHostOnly) -> 0x0                                                                                                                                                                                              
lldb             <  26> send packet: $qMemoryRegionInfo:1000#d5                                                                                                                                                                                                                    
lldb             <  31> read packet: $start:1000;size:2aaaaa9000;#74                                                                                                                                                                                                               
lldb             IRMemoryMap::Malloc (524295, 0x8, 0x3, eAllocationPolicyHostOnly) -> 0x1000
```
With patch:
```
lldb             <  23> send packet: $qMemoryRegionInfo:0#44                                                                                                                                                                                                                       
lldb             <  28> read packet: $start:0;size:2aaaaaa000;#0b                                                                                                                                                                                                                  
lldb             <  32> send packet: $qMemoryRegionInfo:2aaaaaa000#1c                                                                                                                                                                                                              
lldb             <  81> read packet: $start:2aaaaaa000;size:1000;permissions:rx;flags:;name:2f726f6f742f612e6f7574;#fc                                                                                                                                                             
lldb             <  32> send packet: $qMemoryRegionInfo:2aaaaab000#1d                                                                                                                                                                                                              
lldb             <  80> read packet: $start:2aaaaab000;size:1000;permissions:r;flags:;name:2f726f6f742f612e6f7574;#85                                                                                                                                                              
lldb             <  32> send packet: $qMemoryRegionInfo:2aaaaac000#1e                                                                                                                                                                                                              
lldb             <  81> read packet: $start:2aaaaac000;size:1000;permissions:rw;flags:;name:2f726f6f742f612e6f7574;#fd                                                                                                                                                             
lldb             <  32> send packet: $qMemoryRegionInfo:2aaaaad000#1f                                                                                                                                                                                                              
lldb             <  72> read packet: $start:2aaaaad000;size:21000;permissions:rw;flags:;name:5b686561705d;#5a                                                                                                                                                                      
lldb             <  32> send packet: $qMemoryRegionInfo:2aaaace000#22                                                                                                                                                                                                              
lldb             <  37> read packet: $start:2aaaace000;size:154d0a2000;#32                                                                                                                                                                                                         
lldb             IRMemoryMap::Malloc (23, 0x8, 0x3, eAllocationPolicyHostOnly) -> 0x2aaaace000                                                                                                                                                                                     
lldb             <  32> send packet: $qMemoryRegionInfo:2aaaacf000#23                                                                                                                                                                                                              
lldb             <  37> read packet: $start:2aaaacf000;size:154d0a1000;#32                                                                                                                                                                                                         
lldb             IRMemoryMap::Malloc (524295, 0x8, 0x3, eAllocationPolicyHostOnly) -> 0x2aaaacf000
```

Actually, I have solved the problem with this patch: https://github.com/llvm/llvm-project/pull/99336. It adds the ability to make function calls inside lldb expressions, including jitted code execution support for riscv targets.

I thought maybe this patch may be usefull for other architectures that can't execute JIT code.

https://github.com/llvm/llvm-project/pull/99045


More information about the lldb-commits mailing list