diff --git a/src/globals.c b/src/globals.c index 90df82f9..1cdc6e92 100644 --- a/src/globals.c +++ b/src/globals.c @@ -60,6 +60,11 @@ arena_t *BLOCK_ARENA; /* BB_ARENA is responsible for basic_block_t / ph2_ir_t allocation */ arena_t *BB_ARENA; +/* GENERAL_ARENA is responsible for functions, symbols, constants, aliases, + * macros, and traversal args + */ +arena_t *GENERAL_ARENA; + int bb_label_idx = 0; ph2_ir_t **PH2_IR_FLATTEN; @@ -290,6 +295,37 @@ void *arena_memdup(arena_t *arena, void *data, int size) return memcpy(arena_alloc(arena, size), data, size); } +/* Typed allocators for consistent memory management */ +func_t *arena_alloc_func(void) +{ + return arena_calloc(GENERAL_ARENA, 1, sizeof(func_t)); +} + +symbol_t *arena_alloc_symbol(void) +{ + return arena_calloc(GENERAL_ARENA, 1, sizeof(symbol_t)); +} + +constant_t *arena_alloc_constant(void) +{ + return arena_alloc(GENERAL_ARENA, sizeof(constant_t)); +} + +alias_t *arena_alloc_alias(void) +{ + return arena_alloc(GENERAL_ARENA, sizeof(alias_t)); +} + +macro_t *arena_alloc_macro(void) +{ + return arena_alloc(GENERAL_ARENA, sizeof(macro_t)); +} + +bb_traversal_args_t *arena_alloc_traversal_args(void) +{ + return arena_calloc(GENERAL_ARENA, 1, sizeof(bb_traversal_args_t)); +} + /* Free the given arena and all its blocks. * @arena: The arena to free. Must not be NULL. */ @@ -608,7 +644,7 @@ void add_alias(char *alias, char *value) { alias_t *al = hashmap_get(ALIASES_MAP, alias); if (!al) { - al = malloc(sizeof(alias_t)); + al = arena_alloc_alias(); if (!al) { printf("Failed to allocate alias_t\n"); return; @@ -642,7 +678,7 @@ macro_t *add_macro(char *name) { macro_t *ma = hashmap_get(MACROS_MAP, name); if (!ma) { - ma = malloc(sizeof(macro_t)); + ma = arena_alloc_macro(); if (!ma) { printf("Failed to allocate macro_t\n"); return NULL; @@ -703,7 +739,7 @@ type_t *add_named_type(char *name) void add_constant(char alias[], int value) { - constant_t *constant = malloc(sizeof(constant_t)); + constant_t *constant = arena_alloc_constant(); if (!constant) { printf("Failed to allocate constant_t\n"); return; @@ -811,7 +847,7 @@ func_t *add_func(char *func_name, bool synthesize) if (func) return func; - func = calloc(1, sizeof(func_t)); + func = arena_alloc_func(); hashmap_put(FUNC_MAP, func_name, func); strcpy(func->return_def.var_name, func_name); func->stack_size = 4; @@ -931,7 +967,7 @@ void add_symbol(basic_block_t *bb, var_t *var) return; } - sym = calloc(1, sizeof(symbol_t)); + sym = arena_alloc_symbol(); sym->var = var; if (!bb->symbol_list.head) { @@ -1067,6 +1103,7 @@ void global_init(void) INSN_ARENA = arena_init(DEFAULT_ARENA_SIZE); BB_ARENA = arena_init(DEFAULT_ARENA_SIZE); HASHMAP_ARENA = arena_init(DEFAULT_ARENA_SIZE); + GENERAL_ARENA = arena_init(DEFAULT_ARENA_SIZE); PH2_IR_FLATTEN = malloc(MAX_IR_INSTR * sizeof(ph2_ir_t *)); SOURCE = strbuf_create(MAX_SOURCE); FUNC_MAP = hashmap_create(DEFAULT_FUNCS_SIZE); @@ -1090,6 +1127,7 @@ void global_release(void) arena_free(INSN_ARENA); arena_free(BB_ARENA); arena_free(HASHMAP_ARENA); + arena_free(GENERAL_ARENA); free(PH2_IR_FLATTEN); strbuf_free(SOURCE); hashmap_free(FUNC_MAP); diff --git a/src/ssa.c b/src/ssa.c index 85e0f743..08fa0a52 100644 --- a/src/ssa.c +++ b/src/ssa.c @@ -104,7 +104,7 @@ void bb_build_rpo(func_t *func, basic_block_t *bb) void build_rpo(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->bbs; @@ -121,7 +121,6 @@ void build_rpo(void) args->postorder_cb = bb_build_rpo; bb_forward_traversal(args); } - free(args); } 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) void build_dom(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->bbs; @@ -230,7 +229,6 @@ void build_dom(void) args->preorder_cb = bb_build_dom; bb_forward_traversal(args); } - free(args); } 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) void build_df(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->bbs; @@ -265,7 +263,6 @@ void build_df(void) args->postorder_cb = bb_build_df; bb_forward_traversal(args); } - free(args); } 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) void build_rdom(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->exit; @@ -360,7 +357,6 @@ void build_rdom(void) args->preorder_cb = bb_build_rdom; bb_backward_traversal(args); } - free(args); } 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) void build_rdf(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->exit; @@ -405,7 +401,6 @@ void build_rdf(void) args->postorder_cb = bb_build_rdf; bb_backward_traversal(args); } - free(args); } 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) if (found) return; - ref = calloc(1, sizeof(ref_block_t)); + ref = arena_calloc(GENERAL_ARENA, 1, sizeof(ref_block_t)); ref->bb = bb; if (!var->ref_block_list.head) var->ref_block_list.head = ref; @@ -511,7 +506,7 @@ void fn_add_global(func_t *func, var_t *var) if (found) return; - sym = calloc(1, sizeof(symbol_t)); + sym = arena_alloc_symbol(); sym->var = var; if (!func->global_sym_list.head) { sym->index = 0; @@ -544,7 +539,7 @@ void bb_solve_globals(func_t *func, basic_block_t *bb) void solve_globals(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->bbs; @@ -553,7 +548,6 @@ void solve_globals(void) args->postorder_cb = bb_solve_globals; bb_forward_traversal(args); } - free(args); } bool var_check_in_scope(var_t *var, block_t *block) @@ -723,7 +717,7 @@ void pop_name(var_t *var) void append_phi_operand(insn_t *insn, var_t *var, basic_block_t *bb_from) { - phi_operand_t *op = calloc(1, sizeof(phi_operand_t)); + phi_operand_t *op = arena_calloc(GENERAL_ARENA, 1, sizeof(phi_operand_t)); op->from = bb_from; op->var = get_stack_top_subscript_var(var); @@ -863,7 +857,7 @@ void bb_unwind_phi(func_t *func, basic_block_t *bb) void unwind_phi(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->bbs; @@ -872,7 +866,6 @@ void unwind_phi(void) args->preorder_cb = bb_unwind_phi; bb_forward_traversal(args); } - free(args); } #ifdef __SHECC__ @@ -1599,7 +1592,7 @@ void bb_build_reversed_rpo(func_t *func, basic_block_t *bb) void build_reversed_rpo(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { func->bb_cnt = 0; args->func = func; @@ -1617,7 +1610,6 @@ void build_reversed_rpo(void) args->postorder_cb = bb_build_reversed_rpo; bb_backward_traversal(args); } - free(args); } 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) void liveness_analysis(void) { - bb_traversal_args_t *args = calloc(1, sizeof(bb_traversal_args_t)); + bb_traversal_args_t *args = arena_alloc_traversal_args(); for (func_t *func = FUNC_LIST.head; func; func = func->next) { args->func = func; args->bb = func->bbs; @@ -1765,7 +1757,6 @@ void liveness_analysis(void) args->preorder_cb = bb_solve_locals; bb_forward_traversal(args); } - free(args); for (func_t *func = FUNC_LIST.head; func; func = func->next) { basic_block_t *bb = func->exit;