42
42
#include "decode.h"
43
43
#include "io.h"
44
44
#include "jit.h"
45
+ #include "log.h"
45
46
#include "riscv.h"
46
47
#include "riscv_private.h"
47
48
#include "utils.h"
@@ -593,6 +594,7 @@ static void update_branch_imm(struct jit_state *state,
593
594
assert ((imm & 3 ) == 0 );
594
595
uint32_t insn ;
595
596
imm >>= 2 ;
597
+ rv_log_debug ("JIT: Patching branch at offset=%u, imm=%d" , offset , imm << 2 );
596
598
#if defined(__APPLE__ ) && defined(__aarch64__ )
597
599
/* Must be in write mode to read/write MAP_JIT memory on Apple ARM64 */
598
600
pthread_jit_write_protect_np (false);
@@ -2166,6 +2168,8 @@ void clear_hot(block_t *block)
2166
2168
2167
2169
static void code_cache_flush (struct jit_state * state , riscv_t * rv )
2168
2170
{
2171
+ rv_log_debug ("JIT: Flushing code cache (n_blocks=%d, n_jumps=%d, offset=%u)" ,
2172
+ state -> n_blocks , state -> n_jumps , state -> offset );
2169
2173
should_flush = false;
2170
2174
state -> offset = state -> org_size ;
2171
2175
state -> n_blocks = 0 ;
@@ -2199,6 +2203,7 @@ static void translate(struct jit_state *state, riscv_t *rv, block_t *block)
2199
2203
2200
2204
static void resolve_jumps (struct jit_state * state )
2201
2205
{
2206
+ rv_log_debug ("JIT: Resolving %d jumps" , state -> n_jumps );
2202
2207
for (int i = 0 ; i < state -> n_jumps ; i ++ ) {
2203
2208
struct jump jump = state -> jumps [i ];
2204
2209
int target_loc ;
@@ -2221,6 +2226,8 @@ static void resolve_jumps(struct jit_state *state)
2221
2226
(if (jump .target_satp == state -> offset_map [i ].satp ), )
2222
2227
{
2223
2228
target_loc = state -> offset_map [i ].offset ;
2229
+ rv_log_debug ("JIT: Jump %d resolved to block pc=0x%08x, offset=%d" ,
2230
+ i , jump .target_pc , target_loc );
2224
2231
break ;
2225
2232
}
2226
2233
}
@@ -2312,12 +2319,15 @@ void jit_translate(riscv_t *rv, block_t *block)
2312
2319
) {
2313
2320
block -> offset = state -> offset_map [i ].offset ;
2314
2321
block -> hot = true;
2322
+ rv_log_debug ("JIT: Cache hit for block pc=0x%08x, offset=%u" ,
2323
+ block -> pc_start , block -> offset );
2315
2324
return ;
2316
2325
}
2317
2326
}
2318
2327
assert (NULL );
2319
2328
__UNREACHABLE ;
2320
2329
}
2330
+ rv_log_debug ("JIT: Starting translation for block pc=0x%08x" , block -> pc_start );
2321
2331
restart :
2322
2332
memset (state -> jumps , 0 , MAX_JUMPS * sizeof (struct jump ));
2323
2333
state -> n_jumps = 0 ;
@@ -2327,11 +2337,15 @@ void jit_translate(riscv_t *rv, block_t *block)
2327
2337
/* Mark block as not translated since translation was incomplete */
2328
2338
block -> hot = false;
2329
2339
/* Don't reset offset - it will be set correctly on restart */
2340
+ rv_log_debug ("JIT: Translation triggered flush for block pc=0x%08x" ,
2341
+ block -> pc_start );
2330
2342
code_cache_flush (state , rv );
2331
2343
goto restart ;
2332
2344
}
2333
2345
resolve_jumps (state );
2334
2346
block -> hot = true;
2347
+ rv_log_debug ("JIT: Translation completed for block pc=0x%08x, offset=%u, size=%u" ,
2348
+ block -> pc_start , block -> offset , state -> offset - block -> offset );
2335
2349
}
2336
2350
2337
2351
struct jit_state * jit_state_init (size_t size )
0 commit comments