Skip to content

Commit b3ecce3

Browse files
committed
Move the block and IRs memory pool to rv sturcture
Because the block map isn't used in JIT mode, we need to move the block and IRs memory pool to rv structure.
1 parent 5ba1a8f commit b3ecce3

File tree

3 files changed

+27
-31
lines changed

3 files changed

+27
-31
lines changed

src/emulate.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -289,17 +289,13 @@ static inline uint32_t hash(size_t k)
289289
return k;
290290
}
291291

292-
static void block_translate(riscv_t *rv, block_map_t *map, block_t *block);
293292
/* allocate a basic block */
294-
static block_t *block_alloc(riscv_t *rv, block_map_t *map)
293+
static block_t *block_alloc(riscv_t *rv)
295294
{
296-
block_t *block = mpool_alloc(map->block_mp);
295+
block_t *block = mpool_alloc(rv->block_mp);
297296
assert(block);
298297
block->n_insn = 0;
299298
block->predict = NULL;
300-
301-
/* Initialize remaining part of block_t */
302-
block_translate(rv, map, block);
303299
return block;
304300
}
305301

@@ -608,12 +604,12 @@ FORCE_INLINE bool insn_is_unconditional_branch(uint8_t opcode)
608604
return false;
609605
}
610606

611-
static void block_translate(riscv_t *rv, block_map_t *map, block_t *block)
607+
static void block_translate(riscv_t *rv, block_t *block)
612608
{
613609
block->pc_start = block->pc_end = rv->PC;
614610

615611
rv_insn_t *prev_ir = NULL;
616-
rv_insn_t *ir = mpool_alloc(map->block_ir_mp);
612+
rv_insn_t *ir = mpool_alloc(rv->block_ir_mp);
617613
block->ir_head = ir;
618614

619615
/* translate the basic block */
@@ -642,7 +638,7 @@ static void block_translate(riscv_t *rv, block_map_t *map, block_t *block)
642638
if (insn_is_branch(ir->opcode))
643639
break;
644640

645-
ir = mpool_alloc(map->block_ir_mp);
641+
ir = mpool_alloc(rv->block_ir_mp);
646642
}
647643

648644
assert(prev_ir);
@@ -725,7 +721,7 @@ FORCE_INLINE void remove_next_nth_ir(riscv_t *rv,
725721
for (uint8_t i = 0; i < n; i++) {
726722
rv_insn_t *next = ir->next;
727723
ir->next = ir->next->next;
728-
mpool_free(rv->block_map.block_ir_mp, next);
724+
mpool_free(rv->block_ir_mp, next);
729725
}
730726
if (!ir->next) {
731727
block->ir_tail = ir;
@@ -949,12 +945,13 @@ static block_t *block_find_or_translate(riscv_t *rv)
949945

950946
if (!next) {
951947
if (map->size * 1.25 > map->block_capacity) {
952-
block_map_clear(map);
948+
block_map_clear(rv);
953949
prev = NULL;
954950
}
955951

956952
/* allocate a new block */
957-
next = block_alloc(rv, map);
953+
next = block_alloc(rv);
954+
block_translate(rv, next);
958955

959956
if (!libc_substitute(rv, next)) {
960957
optimize_constant(rv, next);

src/riscv.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,12 @@ static void block_map_init(block_map_t *map, const uint8_t bits)
2020
map->block_capacity = 1 << bits;
2121
map->size = 0;
2222
map->map = calloc(map->block_capacity, sizeof(struct block *));
23-
24-
map->block_mp = mpool_create(sizeof(block_t) << BLOCK_MAP_CAPACITY_BITS,
25-
sizeof(block_t));
26-
map->block_ir_mp = mpool_create(
27-
sizeof(rv_insn_t) << BLOCK_IR_MAP_CAPACITY_BITS, sizeof(rv_insn_t));
2823
}
2924

3025
/* clear all block in the block map */
31-
void block_map_clear(block_map_t *map)
26+
void block_map_clear(riscv_t *rv)
3227
{
33-
assert(map);
28+
block_map_t *map = &rv->block_map;
3429
for (uint32_t i = 0; i < map->block_capacity; i++) {
3530
block_t *block = map->map[i];
3631
if (!block)
@@ -41,21 +36,21 @@ void block_map_clear(block_map_t *map)
4136
idx++, ir = next) {
4237
free(ir->fuse);
4338
next = ir->next;
44-
mpool_free(map->block_ir_mp, ir);
39+
mpool_free(rv->block_ir_mp, ir);
4540
}
46-
mpool_free(map->block_mp, block);
41+
mpool_free(rv->block_mp, block);
4742
map->map[i] = NULL;
4843
}
4944
map->size = 0;
5045
}
5146

52-
static void block_map_destroy(block_map_t *map)
47+
static void block_map_destroy(riscv_t *rv)
5348
{
54-
block_map_clear(map);
55-
free(map->map);
49+
block_map_clear(rv);
50+
free(rv->block_map.map);
5651

57-
mpool_destroy(map->block_mp);
58-
mpool_destroy(map->block_ir_mp);
52+
mpool_destroy(rv->block_mp);
53+
mpool_destroy(rv->block_ir_mp);
5954
}
6055

6156
riscv_user_t rv_userdata(riscv_t *rv)
@@ -118,6 +113,12 @@ riscv_t *rv_create(const riscv_io_t *io,
118113

119114
rv->output_exit_code = output_exit_code;
120115

116+
/* create block and IRs memory pool */
117+
rv->block_mp = mpool_create(sizeof(block_t) << BLOCK_MAP_CAPACITY_BITS,
118+
sizeof(block_t));
119+
rv->block_ir_mp = mpool_create(
120+
sizeof(rv_insn_t) << BLOCK_IR_MAP_CAPACITY_BITS, sizeof(rv_insn_t));
121+
121122
/* initialize the block map */
122123
block_map_init(&rv->block_map, 10);
123124

@@ -145,7 +146,7 @@ bool rv_enables_to_output_exit_code(riscv_t *rv)
145146
void rv_delete(riscv_t *rv)
146147
{
147148
assert(rv);
148-
block_map_destroy(&rv->block_map);
149+
block_map_destroy(rv);
149150
free(rv);
150151
}
151152

src/riscv_private.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,10 @@ typedef struct {
6565
uint32_t block_capacity; /**< max number of entries in the block map */
6666
uint32_t size; /**< number of entries currently in the map */
6767
block_t **map; /**< block map */
68-
69-
struct mpool *block_mp, *block_ir_mp;
7068
} block_map_t;
7169

7270
/* clear all block in the block map */
73-
void block_map_clear(block_map_t *map);
71+
void block_map_clear(riscv_t *rv);
7472

7573
struct riscv_internal {
7674
bool halt; /* indicate whether the core is halted */
@@ -123,7 +121,7 @@ struct riscv_internal {
123121

124122
bool compressed; /**< current instruction is compressed or not */
125123
block_map_t block_map; /**< basic block map */
126-
124+
struct mpool *block_mp, *block_ir_mp;
127125
/* print exit code on syscall_exit */
128126
bool output_exit_code;
129127
};

0 commit comments

Comments
 (0)