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,9 @@ 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 (
2172
+ "JIT: Flushing code cache (n_blocks=%d, n_jumps=%d, offset=%u)" ,
2173
+ state -> n_blocks , state -> n_jumps , state -> offset );
2169
2174
should_flush = false;
2170
2175
state -> offset = state -> org_size ;
2171
2176
state -> n_blocks = 0 ;
@@ -2199,6 +2204,7 @@ static void translate(struct jit_state *state, riscv_t *rv, block_t *block)
2199
2204
2200
2205
static void resolve_jumps (struct jit_state * state )
2201
2206
{
2207
+ rv_log_debug ("JIT: Resolving %d jumps" , state -> n_jumps );
2202
2208
for (int i = 0 ; i < state -> n_jumps ; i ++ ) {
2203
2209
struct jump jump = state -> jumps [i ];
2204
2210
int target_loc ;
@@ -2221,6 +2227,10 @@ static void resolve_jumps(struct jit_state *state)
2221
2227
(if (jump .target_satp == state -> offset_map [i ].satp ), )
2222
2228
{
2223
2229
target_loc = state -> offset_map [i ].offset ;
2230
+ rv_log_debug (
2231
+ "JIT: Jump %d resolved to block pc=0x%08x, "
2232
+ "offset=%d" ,
2233
+ i , jump .target_pc , target_loc );
2224
2234
break ;
2225
2235
}
2226
2236
}
@@ -2312,12 +2322,16 @@ void jit_translate(riscv_t *rv, block_t *block)
2312
2322
) {
2313
2323
block -> offset = state -> offset_map [i ].offset ;
2314
2324
block -> hot = true;
2325
+ rv_log_debug ("JIT: Cache hit for block pc=0x%08x, offset=%u" ,
2326
+ block -> pc_start , block -> offset );
2315
2327
return ;
2316
2328
}
2317
2329
}
2318
2330
assert (NULL );
2319
2331
__UNREACHABLE ;
2320
2332
}
2333
+ rv_log_debug ("JIT: Starting translation for block pc=0x%08x" ,
2334
+ block -> pc_start );
2321
2335
restart :
2322
2336
memset (state -> jumps , 0 , MAX_JUMPS * sizeof (struct jump ));
2323
2337
state -> n_jumps = 0 ;
@@ -2327,11 +2341,16 @@ void jit_translate(riscv_t *rv, block_t *block)
2327
2341
/* Mark block as not translated since translation was incomplete */
2328
2342
block -> hot = false;
2329
2343
/* Don't reset offset - it will be set correctly on restart */
2344
+ rv_log_debug ("JIT: Translation triggered flush for block pc=0x%08x" ,
2345
+ block -> pc_start );
2330
2346
code_cache_flush (state , rv );
2331
2347
goto restart ;
2332
2348
}
2333
2349
resolve_jumps (state );
2334
2350
block -> hot = true;
2351
+ rv_log_debug (
2352
+ "JIT: Translation completed for block pc=0x%08x, offset=%u, size=%u" ,
2353
+ block -> pc_start , block -> offset , state -> offset - block -> offset );
2335
2354
}
2336
2355
2337
2356
struct jit_state * jit_state_init (size_t size )
0 commit comments