[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