ted added a subscriber: labath.
ted added a comment.

With this change, I'm able to debug RISC-V 32 and 64 bit applications using 
Linux user space QEMU, using @labath 's QemuUser platform. Simple expression 
parsing with the IR Interpreter is working. Complex expression parsing with JIT 
is not tested.

Here's an example of a simple debug session:

  > bin/lldb
  (lldb) platform select qemu-user
    Platform: qemu-user
      Triple: x86_64-*-linux-gnu
  OS Version: 5.4.0 (5.4.0-136-generic)
    Hostname: 127.0.0.1
  WorkingDir: /local/mnt/ted/upstream/full
      Kernel: #153~18.04.1-Ubuntu SMP Wed Nov 30 15:47:57 UTC 2022
  (lldb) file ~/lldb_test/factrv32
  Current executable set to '/usr2/tedwood/lldb_test/factrv32' (riscv32).
  (lldb) b main
  Breakpoint 1: where = factrv32`main + 28 at factorial.c:32:8, address = 
0x000104ea
  (lldb) target list
  Current targets:
  * target #0: /usr2/tedwood/lldb_test/factrv32 ( arch=riscv32-*-linux, 
platform=qemu-user )
  (lldb) r
  Process 1 launched: '/usr2/tedwood/lldb_test/factrv32' (riscv32)
  Process 1 stopped
  * thread #1, stop reason = breakpoint 1.1
      frame #0: 0x000104ea factrv32`main(argc=1, argv=0x40800604) at 
factorial.c:32:8
     29           }
     30         */
     31         
  -> 32           base = 10;
     33         
     34           printf("Factorial of %d is %d\n", base, factorial(base));
     35           return 0;
  (lldb) s
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x000104ee factrv32`main(argc=1, argv=0x40800604) at 
factorial.c:34:37
     31         
     32           base = 10;
     33         
  -> 34           printf("Factorial of %d is %d\n", base, factorial(base));
     35           return 0;
     36         }
     37         
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x00010488 factrv32`factorial(i=10) at factorial.c:6:7
     3          
     4          int factorial(int i)
     5          {
  -> 6            if (i == 1)
     7              return 1;
     8            else
     9              return i * factorial(i - 1);
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x000104a4 factrv32`factorial(i=10) at factorial.c:9:12
     6            if (i == 1)
     7              return 1;
     8            else
  -> 9              return i * factorial(i - 1);
     10         }
     11         
     12         int main(int argc, char **argv)
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x00010488 factrv32`factorial(i=9) at factorial.c:6:7
     3          
     4          int factorial(int i)
     5          {
  -> 6            if (i == 1)
     7              return 1;
     8            else
     9              return i * factorial(i - 1);
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x000104a4 factrv32`factorial(i=9) at factorial.c:9:12
     6            if (i == 1)
     7              return 1;
     8            else
  -> 9              return i * factorial(i - 1);
     10         }
     11         
     12         int main(int argc, char **argv)
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x00010488 factrv32`factorial(i=8) at factorial.c:6:7
     3          
     4          int factorial(int i)
     5          {
  -> 6            if (i == 1)
     7              return 1;
     8            else
     9              return i * factorial(i - 1);
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x000104a4 factrv32`factorial(i=8) at factorial.c:9:12
     6            if (i == 1)
     7              return 1;
     8            else
  -> 9              return i * factorial(i - 1);
     10         }
     11         
     12         int main(int argc, char **argv)
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x00010488 factrv32`factorial(i=7) at factorial.c:6:7
     3          
     4          int factorial(int i)
     5          {
  -> 6            if (i == 1)
     7              return 1;
     8            else
     9              return i * factorial(i - 1);
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x000104a4 factrv32`factorial(i=7) at factorial.c:9:12
     6            if (i == 1)
     7              return 1;
     8            else
  -> 9              return i * factorial(i - 1);
     10         }
     11         
     12         int main(int argc, char **argv)
  (lldb) 
  Process 1 stopped
  * thread #1, stop reason = step in
      frame #0: 0x00010488 factrv32`factorial(i=6) at factorial.c:6:7
     3          
     4          int factorial(int i)
     5          {
  -> 6            if (i == 1)
     7              return 1;
     8            else
     9              return i * factorial(i - 1);
  (lldb) bt
  * thread #1, stop reason = step in
    * frame #0: 0x00010488 factrv32`factorial(i=6) at factorial.c:6:7
      frame #1: 0x000104b0 factrv32`factorial(i=7) at factorial.c:9:16
      frame #2: 0x000104b0 factrv32`factorial(i=8) at factorial.c:9:16
      frame #3: 0x000104b0 factrv32`factorial(i=9) at factorial.c:9:16
      frame #4: 0x000104b0 factrv32`factorial(i=10) at factorial.c:9:16
      frame #5: 0x000104f8 factrv32`main(argc=1, argv=0x40800604) at 
factorial.c:34:43
      frame #6: 0x000106f0 factrv32`__libc_start_main(main=(factrv32`main at 
factorial.c:13), argc=1, argv=0x40800604, init=(factrv32`__libc_csu_init at 
elf-init.c:69:1), fini=(factrv32`__libc_csu_fini at elf-init.c:97:1), 
rtld_fini=0x00000000, stack_end=<unavailable>) at libc-start.c:332:16
      frame #7: 0x000103d8 factrv32`_start at start.S:61
  (lldb) dis
  factrv32`factorial:
      0x1047c <+0>:  addi   sp, sp, -32
      0x1047e <+2>:  sw     ra, 28(sp)
      0x10480 <+4>:  sw     s0, 24(sp)
      0x10482 <+6>:  addi   s0, sp, 32
      0x10484 <+8>:  sw     a0, -16(s0)
  ->  0x10488 <+12>: lw     a0, -16(s0)
      0x1048c <+16>: li     a1, 1
      0x1048e <+18>: beq    a0, a1, 0x10496
      0x10492 <+22>: j      0x104a4
      0x10496 <+26>: j      0x1049a
      0x1049a <+30>: li     a0, 1
      0x1049c <+32>: sw     a0, -12(s0)
      0x104a0 <+36>: j      0x104c2
      0x104a4 <+40>: lw     a0, -16(s0)
      0x104a8 <+44>: sw     a0, -20(s0)
      0x104ac <+48>: addi   a0, a0, -1
      0x104ae <+50>: jal    0x1047c
      0x104b0 <+52>: mv     a1, a0
      0x104b2 <+54>: lw     a0, -20(s0)
      0x104b6 <+58>: mul    a0, a0, a1
      0x104ba <+62>: sw     a0, -12(s0)
      0x104be <+66>: j      0x104c2
      0x104c2 <+70>: lw     a0, -12(s0)
      0x104c6 <+74>: lw     ra, 28(sp)
      0x104c8 <+76>: lw     s0, 24(sp)
      0x104ca <+78>: addi   sp, sp, 32
      0x104cc <+80>: ret    
  (lldb) c
  Process 1 resuming
  Factorial of 10 is 3628800
  Process 1 exited with status = 0 (0x00000000) 
  (lldb) 


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D159101/new/

https://reviews.llvm.org/D159101

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to