Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 43 additions & 5 deletions src/globals.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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.
*/
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down
33 changes: 12 additions & 21 deletions src/ssa.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand All @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand All @@ -872,7 +866,6 @@ void unwind_phi(void)
args->preorder_cb = bb_unwind_phi;
bb_forward_traversal(args);
}
free(args);
}

#ifdef __SHECC__
Expand Down Expand Up @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down