svs-quic wrote:

> Does the generic implementation not work fine for RISC-V? I thought you only 
> needed to override it when the instruction had an immediate?

We have this set for RISCV in 
`lldb/source/Host/common/NativeProcessProtocol.cpp`

```
  case llvm::Triple::riscv32:
  case llvm::Triple::riscv64:  
  case llvm::Triple::loongarch32:
  case llvm::Triple::loongarch64:
    // On these architectures the PC doesn't get updated for breakpoint hits.
    return 0;
```

The test that fails looks like:

```
#include <stdio.h>
int global = 0;
int main() {
  global = 5; // Set a breakpoint here
  puts("");
  __builtin_debugtrap();
  global = 10;
  __builtin_trap();
  global = 15;
  return global;
}
```

When we run in lldb this is what we see:

```
(lldb) b main.c:4
Breakpoint 1: where = dtrap.o`main + 12 at main.c:4:10, address = 0x08048136
(lldb) gdb-remote 1234
(lldb) Process 430709 stopped
* thread #1, stop reason = signal SIGTRAP
       frame #0: 0x08048166 dtrap.o`_start
dtrap.o`_start:
->  0x8048166 <+0>:  auipc  gp, 0x3
    0x804816a <+4>:  addi   gp, gp, 0x776
    0x804816e <+8>:  auipc  a0, 0xf7fb8
    0x8048172 <+12>: addi   a0, a0, -0x16e
c
Process 430709 resuming
(lldb) Process 430709 stopped
* thread #1, stop reason = breakpoint 1.1
       frame #0: 0x08048136 dtrap.o`main at main.c:4:10
   1    #include <stdio.h>
   2    int global = 0;
   3    int main() {
-> 4      global = 5; // Set a breakpoint here
   5      puts("");
   6      __builtin_debugtrap();
   7      global = 10;
c
Process 430709 resuming
(lldb) Process 430709 stopped
* thread #1, stop reason = signal SIGTRAP
       frame #0: 0x08048150 dtrap.o`main at main.c:6:3
   3    int main() {
   4      global = 5; // Set a breakpoint here
   5      puts("");
-> 6      __builtin_debugtrap();
   7      global = 10;
   8      __builtin_trap();
   9      global = 15;
dis
dtrap.o`main:
    0x804812a <+0>:  addi   sp, sp, -0x10
    0x804812c <+2>:  sw     ra, 0xc(sp)
    0x804812e <+4>:  sw     s0, 0x8(sp)
    0x8048130 <+6>:  addi   s0, sp, 0x10
    0x8048132 <+8>:  li     a0, 0x0
    0x8048134 <+10>: sw     a0, 0x4(sp)
    0x8048136 <+12>: auipc  a0, 0x3
    0x804813a <+16>: addi   a1, a0, -0x5a
    0x804813e <+20>: sw     a1, 0x0(sp)
    0x8048140 <+22>: li     a0, 0x5
    0x8048142 <+24>: sw     a0, 0x0(a1)
    0x8048144 <+26>: auipc  a0, 0x1
    0x8048148 <+30>: addi   a0, a0, -0x24
    0x804814c <+34>: jal    0x80483c0
    0x804814e <+36>: lw     a0, 0x0(sp)
->  0x8048150 <+38>: ebreak 
    0x8048152 <+40>: li     a1, 0xa
```

When we continue from here on the SIGTRAP LLDB does not know EBREAK is a valid 
TRAP instruction and so a continue stays on the same instruction:

```
(lldb) c
Process 430709 resuming
(lldb) Process 430709 stopped
* thread #1, stop reason = signal SIGTRAP
       frame #0: 0x08048150 dtrap.o`main at main.c:6:3
   3    int main() {
   4      global = 5; // Set a breakpoint here
   5      puts("");
-> 6      __builtin_debugtrap();
   7      global = 10;
   8      __builtin_trap();
   9      global = 15;
dis
dtrap.o`main:
    0x804812a <+0>:  addi   sp, sp, -0x10
    0x804812c <+2>:  sw     ra, 0xc(sp)
    0x804812e <+4>:  sw     s0, 0x8(sp)
    0x8048130 <+6>:  addi   s0, sp, 0x10
    0x8048132 <+8>:  li     a0, 0x0
    0x8048134 <+10>: sw     a0, 0x4(sp)
    0x8048136 <+12>: auipc  a0, 0x3
    0x804813a <+16>: addi   a1, a0, -0x5a
    0x804813e <+20>: sw     a1, 0x0(sp)
    0x8048140 <+22>: li     a0, 0x5
    0x8048142 <+24>: sw     a0, 0x0(a1)
    0x8048144 <+26>: auipc  a0, 0x1
    0x8048148 <+30>: addi   a0, a0, -0x24
    0x804814c <+34>: jal    0x80483c0
    0x804814e <+36>: lw     a0, 0x0(sp)
->  0x8048150 <+38>: ebreak 
    0x8048152 <+40>: li     a1, 0xa
    0x8048154 <+42>: sw     a1, 0x0(a0)
```

Hope this helps.



https://github.com/llvm/llvm-project/pull/207675
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to