Skip to content

Commit 4efedfd

Browse files
authored
Merge pull request #246 from qwe661234/move_mpool_to_rv
Move block and IRs memory pool to rv
2 parents 1597288 + b3ecce3 commit 4efedfd

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)