Skip to content

Commit 1fb9fa5

Browse files
authored
Merge pull request #229 from sysprog21/arena-alloc
Implement GENERAL_ARENA and typed allocators
2 parents 7286ab7 + 30f635f commit 1fb9fa5

File tree

2 files changed

+55
-26
lines changed

2 files changed

+55
-26
lines changed

src/globals.c

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ arena_t *BLOCK_ARENA;
6060
/* BB_ARENA is responsible for basic_block_t / ph2_ir_t allocation */
6161
arena_t *BB_ARENA;
6262

63+
/* GENERAL_ARENA is responsible for functions, symbols, constants, aliases,
64+
* macros, and traversal args
65+
*/
66+
arena_t *GENERAL_ARENA;
67+
6368
int bb_label_idx = 0;
6469

6570
ph2_ir_t **PH2_IR_FLATTEN;
@@ -290,6 +295,37 @@ void *arena_memdup(arena_t *arena, void *data, int size)
290295
return memcpy(arena_alloc(arena, size), data, size);
291296
}
292297

298+
/* Typed allocators for consistent memory management */
299+
func_t *arena_alloc_func(void)
300+
{
301+
return arena_calloc(GENERAL_ARENA, 1, sizeof(func_t));
302+
}
303+
304+
symbol_t *arena_alloc_symbol(void)
305+
{
306+
return arena_calloc(GENERAL_ARENA, 1, sizeof(symbol_t));
307+
}
308+
309+
constant_t *arena_alloc_constant(void)
310+
{
311+
return arena_alloc(GENERAL_ARENA, sizeof(constant_t));
312+
}
313+
314+
alias_t *arena_alloc_alias(void)
315+
{
316+
return arena_alloc(GENERAL_ARENA, sizeof(alias_t));
317+
}
318+
319+
macro_t *arena_alloc_macro(void)
320+
{
321+
return arena_alloc(GENERAL_ARENA, sizeof(macro_t));
322+
}
323+
324+
bb_traversal_args_t *arena_alloc_traversal_args(void)
325+
{
326+
return arena_calloc(GENERAL_ARENA, 1, sizeof(bb_traversal_args_t));
327+
}
328+
293329
/* Free the given arena and all its blocks.
294330
* @arena: The arena to free. Must not be NULL.
295331
*/
@@ -608,7 +644,7 @@ void add_alias(char *alias, char *value)
608644
{
609645
alias_t *al = hashmap_get(ALIASES_MAP, alias);
610646
if (!al) {
611-
al = malloc(sizeof(alias_t));
647+
al = arena_alloc_alias();
612648
if (!al) {
613649
printf("Failed to allocate alias_t\n");
614650
return;
@@ -642,7 +678,7 @@ macro_t *add_macro(char *name)
642678
{
643679
macro_t *ma = hashmap_get(MACROS_MAP, name);
644680
if (!ma) {
645-
ma = malloc(sizeof(macro_t));
681+
ma = arena_alloc_macro();
646682
if (!ma) {
647683
printf("Failed to allocate macro_t\n");
648684
return NULL;
@@ -703,7 +739,7 @@ type_t *add_named_type(char *name)
703739

704740
void add_constant(char alias[], int value)
705741
{
706-
constant_t *constant = malloc(sizeof(constant_t));
742+
constant_t *constant = arena_alloc_constant();
707743
if (!constant) {
708744
printf("Failed to allocate constant_t\n");
709745
return;
@@ -811,7 +847,7 @@ func_t *add_func(char *func_name, bool synthesize)
811847
if (func)
812848
return func;
813849

814-
func = calloc(1, sizeof(func_t));
850+
func = arena_alloc_func();
815851
hashmap_put(FUNC_MAP, func_name, func);
816852
strcpy(func->return_def.var_name, func_name);
817853
func->stack_size = 4;
@@ -931,7 +967,7 @@ void add_symbol(basic_block_t *bb, var_t *var)
931967
return;
932968
}
933969

934-
sym = calloc(1, sizeof(symbol_t));
970+
sym = arena_alloc_symbol();
935971
sym->var = var;
936972

937973
if (!bb->symbol_list.head) {
@@ -1067,6 +1103,7 @@ void global_init(void)
10671103
INSN_ARENA = arena_init(DEFAULT_ARENA_SIZE);
10681104
BB_ARENA = arena_init(DEFAULT_ARENA_SIZE);
10691105
HASHMAP_ARENA = arena_init(DEFAULT_ARENA_SIZE);
1106+
GENERAL_ARENA = arena_init(DEFAULT_ARENA_SIZE);
10701107
PH2_IR_FLATTEN = malloc(MAX_IR_INSTR * sizeof(ph2_ir_t *));
10711108
SOURCE = strbuf_create(MAX_SOURCE);
10721109
FUNC_MAP = hashmap_create(DEFAULT_FUNCS_SIZE);
@@ -1090,6 +1127,7 @@ void global_release(void)
10901127
arena_free(INSN_ARENA);
10911128
arena_free(BB_ARENA);
10921129
arena_free(HASHMAP_ARENA);
1130+
arena_free(GENERAL_ARENA);
10931131
free(PH2_IR_FLATTEN);
10941132
strbuf_free(SOURCE);
10951133
hashmap_free(FUNC_MAP);

src/ssa.c

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void bb_build_rpo(func_t *func, basic_block_t *bb)
104104

105105
void build_rpo(void)
106106
{
107-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
107+
bb_traversal_args_t *args = arena_alloc_traversal_args();
108108
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
109109
args->func = func;
110110
args->bb = func->bbs;
@@ -121,7 +121,6 @@ void build_rpo(void)
121121
args->postorder_cb = bb_build_rpo;
122122
bb_forward_traversal(args);
123123
}
124-
free(args);
125124
}
126125

127126
basic_block_t *intersect(basic_block_t *i, basic_block_t *j)
@@ -221,7 +220,7 @@ void bb_build_dom(func_t *func, basic_block_t *bb)
221220

222221
void build_dom(void)
223222
{
224-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
223+
bb_traversal_args_t *args = arena_alloc_traversal_args();
225224
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
226225
args->func = func;
227226
args->bb = func->bbs;
@@ -230,7 +229,6 @@ void build_dom(void)
230229
args->preorder_cb = bb_build_dom;
231230
bb_forward_traversal(args);
232231
}
233-
free(args);
234232
}
235233

236234
void bb_build_df(func_t *func, basic_block_t *bb)
@@ -256,7 +254,7 @@ void bb_build_df(func_t *func, basic_block_t *bb)
256254

257255
void build_df(void)
258256
{
259-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
257+
bb_traversal_args_t *args = arena_alloc_traversal_args();
260258
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
261259
args->func = func;
262260
args->bb = func->bbs;
@@ -265,7 +263,6 @@ void build_df(void)
265263
args->postorder_cb = bb_build_df;
266264
bb_forward_traversal(args);
267265
}
268-
free(args);
269266
}
270267

271268
basic_block_t *reverse_intersect(basic_block_t *i, basic_block_t *j)
@@ -351,7 +348,7 @@ void bb_build_rdom(func_t *func, basic_block_t *bb)
351348

352349
void build_rdom(void)
353350
{
354-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
351+
bb_traversal_args_t *args = arena_alloc_traversal_args();
355352
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
356353
args->func = func;
357354
args->bb = func->exit;
@@ -360,7 +357,6 @@ void build_rdom(void)
360357
args->preorder_cb = bb_build_rdom;
361358
bb_backward_traversal(args);
362359
}
363-
free(args);
364360
}
365361

366362
void bb_build_rdf(func_t *func, basic_block_t *bb)
@@ -396,7 +392,7 @@ void bb_build_rdf(func_t *func, basic_block_t *bb)
396392

397393
void build_rdf(void)
398394
{
399-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
395+
bb_traversal_args_t *args = arena_alloc_traversal_args();
400396
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
401397
args->func = func;
402398
args->bb = func->exit;
@@ -405,7 +401,6 @@ void build_rdf(void)
405401
args->postorder_cb = bb_build_rdf;
406402
bb_backward_traversal(args);
407403
}
408-
free(args);
409404
}
410405

411406
void use_chain_add_tail(insn_t *i, var_t *var)
@@ -488,7 +483,7 @@ void var_add_killed_bb(var_t *var, basic_block_t *bb)
488483
if (found)
489484
return;
490485

491-
ref = calloc(1, sizeof(ref_block_t));
486+
ref = arena_calloc(GENERAL_ARENA, 1, sizeof(ref_block_t));
492487
ref->bb = bb;
493488
if (!var->ref_block_list.head)
494489
var->ref_block_list.head = ref;
@@ -511,7 +506,7 @@ void fn_add_global(func_t *func, var_t *var)
511506
if (found)
512507
return;
513508

514-
sym = calloc(1, sizeof(symbol_t));
509+
sym = arena_alloc_symbol();
515510
sym->var = var;
516511
if (!func->global_sym_list.head) {
517512
sym->index = 0;
@@ -544,7 +539,7 @@ void bb_solve_globals(func_t *func, basic_block_t *bb)
544539

545540
void solve_globals(void)
546541
{
547-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
542+
bb_traversal_args_t *args = arena_alloc_traversal_args();
548543
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
549544
args->func = func;
550545
args->bb = func->bbs;
@@ -553,7 +548,6 @@ void solve_globals(void)
553548
args->postorder_cb = bb_solve_globals;
554549
bb_forward_traversal(args);
555550
}
556-
free(args);
557551
}
558552

559553
bool var_check_in_scope(var_t *var, block_t *block)
@@ -723,7 +717,7 @@ void pop_name(var_t *var)
723717

724718
void append_phi_operand(insn_t *insn, var_t *var, basic_block_t *bb_from)
725719
{
726-
phi_operand_t *op = calloc(1, sizeof(phi_operand_t));
720+
phi_operand_t *op = arena_calloc(GENERAL_ARENA, 1, sizeof(phi_operand_t));
727721
op->from = bb_from;
728722
op->var = get_stack_top_subscript_var(var);
729723

@@ -863,7 +857,7 @@ void bb_unwind_phi(func_t *func, basic_block_t *bb)
863857

864858
void unwind_phi(void)
865859
{
866-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
860+
bb_traversal_args_t *args = arena_alloc_traversal_args();
867861
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
868862
args->func = func;
869863
args->bb = func->bbs;
@@ -872,7 +866,6 @@ void unwind_phi(void)
872866
args->preorder_cb = bb_unwind_phi;
873867
bb_forward_traversal(args);
874868
}
875-
free(args);
876869
}
877870

878871
#ifdef __SHECC__
@@ -1599,7 +1592,7 @@ void bb_build_reversed_rpo(func_t *func, basic_block_t *bb)
15991592

16001593
void build_reversed_rpo(void)
16011594
{
1602-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
1595+
bb_traversal_args_t *args = arena_alloc_traversal_args();
16031596
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
16041597
func->bb_cnt = 0;
16051598
args->func = func;
@@ -1617,7 +1610,6 @@ void build_reversed_rpo(void)
16171610
args->postorder_cb = bb_build_reversed_rpo;
16181611
bb_backward_traversal(args);
16191612
}
1620-
free(args);
16211613
}
16221614

16231615
void bb_reset_live_kill_idx(func_t *func, basic_block_t *bb)
@@ -1749,7 +1741,7 @@ bool recompute_live_out(basic_block_t *bb)
17491741

17501742
void liveness_analysis(void)
17511743
{
1752-
bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t));
1744+
bb_traversal_args_t *args = arena_alloc_traversal_args();
17531745
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
17541746
args->func = func;
17551747
args->bb = func->bbs;
@@ -1765,7 +1757,6 @@ void liveness_analysis(void)
17651757
args->preorder_cb = bb_solve_locals;
17661758
bb_forward_traversal(args);
17671759
}
1768-
free(args);
17691760

17701761
for (func_t *func = FUNC_LIST.head; func; func = func->next) {
17711762
basic_block_t *bb = func->exit;

0 commit comments

Comments
 (0)