dlav-sc wrote:

> Thanks for the patches (if we end up going down this route you'll probably 
> want to split out the LLVM JIT changes into a separate PR).
> 
> Not very familiar with RISCV. Could you elaborate on the exact failures you 
> were seeing and why we need the extra IR pass?
> 
> > Also it adds RISCV specific DirectToIndirectFunctionCallsReplacement IR 
> > pass, that allows to make assembly jumps at any 64bit address without RISCV 
> > large code model, which has not been implemented yet.
> 
> I guess this summarizes it, but would be good to see actual example failures

> I guess this summarizes it, but would be good to see actual example failures

Consider a simple function call:

`main.cpp`:
```
void foo() {                                                                    
                                                                                
                                                                                
                               
 int a = 42;
}                                                                               
                                                                                
                                                                                
                   

int main() {                                                                    
                                                                                
                                                                                
                                                                                
 
 foo();                                                                         
                                                                                
                                                                                
                              
 return 0;                                                                      
                                                                                
                                                                                
                              
} 
```

```
(lldb) file main.x
(lldb) b main
(lldb) run
(lldb) expr foo()
```
Before patch:

Lldb generates a wrapper, obtains its IR and tries to interpret it with 
IRInterpreter, but fails on a function call:

IR:
```
lldb             Module as passed in to IRForTarget: 
"; ModuleID = '$__lldb_module'
source_filename = "$__lldb_module"
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
target triple = "riscv64-unknown-linux-gnu"

; Function Attrs: convergent mustprogress noinline nounwind optnone
define dso_local void @"_Z12$__lldb_exprPv"(ptr %"$__lldb_arg") #0 {
entry:
  %"$__lldb_arg.addr" = alloca ptr, align 8, !clang.decl.ptr !8
  store ptr %"$__lldb_arg", ptr %"$__lldb_arg.addr", align 8
  call void @_Z3foov() #2
  ret void
}

; Function Attrs: convergent
declare void @_Z3foov() #1

attributes #0 = { convergent mustprogress noinline nounwind optnone 
"frame-pointer"="all" "no-builtins" "no-trapping-math"="true" 
"stack-protector-buffer-size"="0" "target-features"="+64bit" }
attributes #1 = { convergent "frame-pointer"="all" "no-builtins" 
"no-trapping-math"="true" "stack-protector-buffer-size"="0" 
"target-features"="+64bit" }
attributes #2 = { convergent "no-builtins" }

!llvm.module.flags = !{!0, !1, !2, !3, !4}
!clang.global.decl.ptrs = !{!5, !6}
!llvm.ident = !{!7}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 1, !"target-abi", !"lp64"}
!2 = !{i32 7, !"direct-access-external-data", i32 0}
!3 = !{i32 7, !"frame-pointer", i32 2}
!4 = !{i32 8, !"SmallDataLimit", i32 0}
!5 = !{ptr @"_Z12$__lldb_exprPv", i64 94163729942528}
!6 = !{ptr @_Z3foov, i64 94163729942816}
!7 = !{!"Syntacore clang version 18.1.4-sc (SC git:/tools/llvm/llvm-project/ 
fefe1910746c1b7e0e23cd64767b3f08ba788cf1)"}
!8 = !{i64 94163729942296}
"
```
Output:
```
lldb             Couldn't find result variable
lldb             MaybeHandleCallArguments(  call void @_Z3foov() #2)
lldb             Element arrangement:
lldb             Arg: "ptr %"$__lldb_arg""
lldb             Total structure [align 8, size 0]
lldb             Saw function with body: _Z12$__lldb_exprPv
lldb             Unsupported instruction: call void @_Z3foov() #2
lldb                 [ClangASTImporter] Forgetting destination 
(ASTContext*)0x000055A433716B10
lldb                 [ClangASTImporter] Forgetting source->dest 
(ASTContext*)0x000055A433716B10->(ASTContext*)0x000055A433A119D0
error: Can't evaluate the expression without a running target due to: 
Interpreter doesn't handle one of the expression's opcodes
```

After patch:

Lldb also generates a wrapper, obtains its IR but sends it to a JIT compiler 
instead of IRInterpreter. MCJIT generates an assembly, puts it into a process 
stack memory, resolves relocations and finally executes:

IR the same.

Assembly:
```
lldb             Function disassembly:                                          
                                                                                
                                                                                
                                   
0x3ff7fdd040: 13 01 01 fe  unknown     addi   sp, sp, -0x20                     
                                                                                
                                                                                
                                   
0x3ff7fdd044: 23 3c 11 00  unknown     sd     ra, 0x18(sp)                      
                                                                                
                                                                                
                                   
0x3ff7fdd048: 23 38 81 00  unknown     sd     s0, 0x10(sp)                      
                                                                                
                                                                                
                                   
0x3ff7fdd04c: 23 34 91 00  unknown     sd     s1, 0x8(sp)                       
                                                                                
                                                                                
                                   
0x3ff7fdd050: 13 04 01 02  unknown     addi   s0, sp, 0x20                      
                                                                                
                                                                                
                                   
0x3ff7fdd054: 93 04 05 00  unknown     mv     s1, a0                            
                                                                                
                                                                                
                                   
0x3ff7fdd058: 37 85 ff 03  unknown     lui    a0, 0x3ff8                        
                                                                                
                                                                                
                                   
0x3ff7fdd05c: 1b 05 d5 fd  unknown     addiw  a0, a0, -0x23                     
                                                                                
                                                                                
                                   
0x3ff7fdd060: 93 15 c5 00  unknown     slli   a1, a0, 0xc                       
                                                                                
                                                                                
                                   
0x3ff7fdd064: 13 05 04 fe  unknown     addi   a0, s0, -0x20                     
                                                                                
                                                                                
                                   
0x3ff7fdd068: e7 80 05 00  unknown     jalr   a1                                
                                                                                
                                                                                
                                   
0x3ff7fdd06c: 23 30 94 fe  unknown     sd     s1, -0x20(s0)                     
                                                                                
                                                                                
                                   
0x3ff7fdd070: 37 55 55 01  unknown     lui    a0, 0x1555                        
                                                                                
                                                                                
                                   
0x3ff7fdd074: 1b 05 55 55  unknown     addiw  a0, a0, 0x555                     
                                                                                
                                                                                
                                   
0x3ff7fdd078: 13 15 d5 00  unknown     slli   a0, a0, 0xd                       
                                                                                
                                                                                
                                   
0x3ff7fdd07c: 13 05 85 62  unknown     addi   a0, a0, 0x628                     
                                                                                
                                                                                
                                   
0x3ff7fdd080: e7 00 05 00  unknown     jalr   a0                                
                                                                                
                                                                                
                                   
0x3ff7fdd084: 83 30 81 01  unknown     ld     ra, 0x18(sp)                      
                                                                                
                                                                                
                                   
0x3ff7fdd088: 03 34 01 01  unknown     ld     s0, 0x10(sp)                      
                                                                                
                                                                                
                                   
0x3ff7fdd08c: 83 34 81 00  unknown     ld     s1, 0x8(sp)                       
                                                                                
                                                                                
                                   
0x3ff7fdd090: 13 01 01 02  unknown     addi   sp, sp, 0x20                      
                                                                                
                                                                                
                                   
0x3ff7fdd094: 67 80 00 00  unknown     ret
```

Puts assembly into a stack memory:
```
lldb             IRMemoryMap::Malloc (91, 0x4, 0x6, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdd040                                   
                                                                                
                                                               
lldb             IRMemoryMap::Malloc (111, 0x1, 0x2, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdc760                                   
                                                                                
                                                              
lldb             IRMemoryMap::Malloc (28, 0x1, 0x2, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdc7d0                                   
                                                                                
                                                               
lldb             IRMemoryMap::Malloc (1, 0x1, 0x2, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdc7f0                                   
                                                                                
                                                                
lldb             IRMemoryMap::Malloc (115, 0x1, 0x2, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdc800                                   
                                                                                
                                                              
lldb             IRMemoryMap::Malloc (1, 0x1, 0x2, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdc880                                   
                                                                                
                                                                
lldb             IRMemoryMap::Malloc (151, 0x8, 0x2, 
eAllocationPolicyProcessOnly) -> 0x3ff7fdc890                                   
                                                                                
                                                              
lldb             IRMemoryMap::WriteMemory (0x3ff7fdd040, 0x7f5352f50000, 0x88) 
went to [0x3ff7fdd040..0x3ff7fdd09b)                                            
                                                                                
                                    
lldb             IRMemoryMap::WriteMemory (0x3ff7fdc760, 0x7f5352eea000, 0x111) 
went to [0x3ff7fdc760..0x3ff7fdc7cf)                                            
                                                                                
                                   
lldb             IRMemoryMap::WriteMemory (0x3ff7fdc7d0, 0x7f5352eea06f, 0x28) 
went to [0x3ff7fdc7d0..0x3ff7fdc7ec)                                            
                                                                                
                                    
lldb             IRMemoryMap::WriteMemory (0x3ff7fdc7f0, 0x7f5352eea08b, 0x1) 
went to [0x3ff7fdc7f0..0x3ff7fdc7f1)                                            
                                                                                
                                     
lldb             IRMemoryMap::WriteMemory (0x3ff7fdc800, 0x7f5352eea08c, 0x115) 
went to [0x3ff7fdc800..0x3ff7fdc873)                                            
                                                                                
                                   
lldb             IRMemoryMap::WriteMemory (0x3ff7fdc880, 0x7f5352eea0ff, 0x1) 
went to [0x3ff7fdc880..0x3ff7fdc881)                                            
                                                                                
                                     
lldb             IRMemoryMap::WriteMemory (0x3ff7fdc890, 0x7f5352eea100, 0x144) 
went to [0x3ff7fdc890..0x3ff7fdc927)
```

Result:
```
lldb             -- [UserExpression::Execute] Execution of expression begins --
lldb             -- [UserExpression::Execute] Execution of expression completed 
--
lldb             -- [UserExpression::FinalizeJITExecution] Dematerializing 
after execution --
lldb             Materializer::Dematerialize (frame_sp = 0x55bcbe861a80, 
process_address = 0x3ff7fdb000) about to dematerialize:
lldb             == [UserExpression::Evaluate] Execution completed normally 
with no result ==
```

https://github.com/llvm/llvm-project/pull/99336
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to