diff --git a/source/arena.h b/source/arena.h index 141f468..2d14d0a 100644 --- a/source/arena.h +++ b/source/arena.h @@ -1,69 +1,3 @@ -/* -xolatile@bunsenlabs:~/Git/eaxcc$ grep -rn malloc source/* -source/eaxhla.c:276: r = malloc(2 + scl + 1 + nml + 1); -source/eaxhla.l:268: yylval.blobval.data = malloc(sdslen(string_literal_buffer)); -xolatile@bunsenlabs:~/Git/eaxcc$ grep -rn calloc source/* -source/arena.h:44: arena->array[arena->count - 1] = calloc(1, sizeof(*arena)); -source/arena.h:46: arena->array[arena->count - 1]->buffer = calloc(ARENA_CHUNK, 1); -source/arena.h:57: arena = calloc(1, sizeof(*arena)); -source/assembler.c:778: empty_array = calloc(1024, sizeof(*empty_array)); -source/assembler.c:779: empty_imbue = calloc(1024, sizeof(*empty_imbue)); -source/assembler.c:780: empty_store = calloc(1024, sizeof(*empty_store)); -source/compile.c:25: token_array = calloc(1440UL, sizeof(*token_array)); -source/compile.c:117: text_sector_byte = calloc(4096UL, sizeof(*text_sector_byte)); -source/eaxhla.c:149: undeclared_symbol = (symbol_t *)calloc(sizeof(symbol_t), 1); -source/eaxhla.c:159: r = (symbol_t *)calloc(sizeof(symbol_t), 1); -source/eaxhla.c:384: symbol_t * literal = (symbol_t *)calloc(sizeof(symbol_t), 1); -xolatile@bunsenlabs:~/Git/eaxcc$ grep -rn realloc source/* -source/arena.h:42: arena->array = realloc(arena->array, arena->count * sizeof(*arena->array)); -xolatile@bunsenlabs:~/Git/eaxcc$ grep -rn free source/* -source/arena.h:31: free(arena->array[index]->buffer); -source/arena.h:32: free(arena->array[index]); -source/arena.h:35: free(arena->array); -source/arena.h:36: free(arena); -source/assembler.c:810: free(empty_array); -source/assembler.c:811: free(empty_imbue); -source/assembler.c:812: free(empty_store); -source/compile.c:30: free(token_array); -source/compile.c:130: free(text_sector_byte); -source/compile.h:19: * A variadic argument interface would be ideal except theres not free -source/eaxhla.c:143: free(scope); -source/eaxhla.c:165:void free_symbol(void * data) { -source/eaxhla.c:168: free(variable->name); -source/eaxhla.c:172: free(variable->array_value); -source/eaxhla.c:175: free(variable); -source/eaxhla.c:181: free(undeclared_symbol); -source/eaxhla.c:182: tommy_hashtable_foreach(&symbol_table, free_symbol); -source/eaxhla.c:262: free(scope); -source/eaxhla.c:296: free(alternative_name); -source/eaxhla.c:403: free(full_name); -source/eaxhla.c:499: free(varname); -source/eaxhla.c:563: free(msg); -source/eaxhla.c:583: free(msg); -source/eaxhla.h:41:void free_symbol(void * name); -source/eaxhla.l:358:void yyfree_leftovers(void) { -source/eaxhla.l:365: sdsfree(string_literal_buffer); -source/eaxhla.y:21: extern void yyfree_leftovers(void); -source/eaxhla.y:120: free($3); -source/eaxhla.y:142: free($3); -source/eaxhla.y:158: free($3); -source/eaxhla.y:162: free($3); -source/eaxhla.y:166: free($6); -source/eaxhla.y:170: free($6); -source/eaxhla.y:174: free($5); -source/eaxhla.y:200: free($1); -source/eaxhla.y:216: free($2); -source/eaxhla.y:224: free($1); -source/eaxhla.y:233: free($1); -source/eaxhla.y:255: free($1); -source/eaxhla.y:331: | machine_code IDENTIFIER { free($2); } -source/eaxhla.y:336: free($2); -source/eaxhla.y:341: | IDENTIFIER arguments { free($1); } -source/main.c:18: extern void yyfree_leftovers(void); -source/main.c:20: yyfree_leftovers(); -xolatile@bunsenlabs:~/Git/eaxcc$ -*/ - #ifndef ARENA_H #define ARENA_H @@ -119,7 +53,6 @@ void * aalloc(size_t size) { if (arena == NULL) { atexit(arena_deinit); - open_arena = 1; arena = calloc(1, sizeof(*arena)); arena_reinit(); } diff --git a/source/assembler.c b/source/assembler.c index 5ddcfdb..94326eb 100644 --- a/source/assembler.c +++ b/source/assembler.c @@ -1,5 +1,6 @@ #include "assembler.h" #include "debug.h" +#include "arena.h" #include @@ -775,9 +776,9 @@ int assemble ( int count, return EXIT_FAILURE; } - empty_array = calloc(1024, sizeof(*empty_array)); - empty_imbue = calloc(1024, sizeof(*empty_imbue)); - empty_store = calloc(1024, sizeof(*empty_store)); + empty_array = aalloc(1024ul * sizeof(*empty_array)); + empty_imbue = aalloc(1024ul * sizeof(*empty_imbue)); + empty_store = aalloc(1024ul * sizeof(*empty_store)); for (int index = 0; index < count; ++index) { const int size = text_sector_size; @@ -807,9 +808,5 @@ int assemble ( int count, replace(&text_sector_byte[get], (char*)&set, (int)sizeof(get)); } - free(empty_array); - free(empty_imbue); - free(empty_store); - return EXIT_SUCCESS; } diff --git a/source/compile.c b/source/compile.c index a6cf1ee..5a9a5bb 100644 --- a/source/compile.c +++ b/source/compile.c @@ -13,6 +13,7 @@ #include "unix.h" #include "safety.h" #include "debug.h" +#include "arena.h" #include "printf2.h" int * token_array = NULL; @@ -22,12 +23,14 @@ char * output_file_name = "a.out"; int compile_init(void) { // Funny hacky solution, we can use arenas here. - token_array = calloc(1440UL, sizeof(*token_array)); + // And a day later we did use them... + token_array = aalloc(1440ul * sizeof(*token_array)); return 0; } +// Function not needful anymore sir! +// Arena handles the memory, no need to free! int compile_deinit(void) { - free(token_array); return 0; } @@ -114,7 +117,7 @@ int compile(void) { dump_variables_to_assembler(); - text_sector_byte = calloc(4096UL, sizeof(*text_sector_byte)); + text_sector_byte = aalloc(4096ul * sizeof(*text_sector_byte)); if (assemble(token_count, token_array)) { issue_internal_error(); @@ -127,7 +130,5 @@ int compile(void) { make_executable(output_file_name); - free(text_sector_byte); - return 0; } diff --git a/source/eaxhla.c b/source/eaxhla.c index 9708f95..685885e 100644 --- a/source/eaxhla.c +++ b/source/eaxhla.c @@ -13,6 +13,7 @@ #include "eaxhla.tab.h" +#include "arena.h" #include "debug.h" #include "assembler.h" #include "compile.h" @@ -144,7 +145,6 @@ void empty_out_scope(void) { scope = NULL; } - int eaxhla_init(void) { undeclared_symbol = (symbol_t *)calloc(sizeof(symbol_t), 1); tommy_hashtable_init(&symbol_table, 256); @@ -156,7 +156,7 @@ int eaxhla_init(void) { symbol_t * new_symbol(char * name) { symbol_t * r; - r = (symbol_t *)calloc(sizeof(symbol_t), 1); + r = (symbol_t *)calloc(sizeof(symbol_t), 1ul); r->name = name; return r; @@ -273,7 +273,7 @@ char * make_scoped_name(const char * const scope, const char * const name) { char * r; const long scl = strlen(scope); const long nml = strlen(name); - r = malloc(2 + scl + 1 + nml + 1); + r = calloc((size_t) (2 + scl + 1 + nml + 1), 1ul); r[0] = '_'; r[1] = '_'; memcpy(r + 2, scope, scl); @@ -337,7 +337,6 @@ void _add_variable(unsigned type, const char * const name, size_t size, void * v variable->symbol_type = VARIABLE_SYMBOL; symbol_insert(variable); - } void add_variable(unsigned type, const char * const name) { @@ -381,7 +380,7 @@ void add_literal(void * data, size_t size) { int ignore = asprintf(&name, "_anon_%lu", anon_variable_counter++); (void)ignore; - symbol_t * literal = (symbol_t *)calloc(sizeof(symbol_t), 1); + symbol_t * literal = (symbol_t *)calloc(sizeof(symbol_t), 1ul); literal->name = name; literal->elements = size; literal->array_value = data; @@ -497,6 +496,7 @@ symbol_t * get_variable(const char * const name) { } free(varname); + return r; } diff --git a/source/eaxhla.l b/source/eaxhla.l index 56e26ff..ac014f2 100644 --- a/source/eaxhla.l +++ b/source/eaxhla.l @@ -1,5 +1,6 @@ %{ #include + #include "sds/sds.h" #include "eaxhla.h" #include "eaxhla.tab.h" @@ -265,7 +266,7 @@ library { BEGIN INITIAL; return END_LIBRARY; } /* XXX: the first WORD_SIZE_IN_BYTES bytes should be 0'd */ \" { BEGIN INITIAL; - yylval.blobval.data = malloc(sdslen(string_literal_buffer)); + yylval.blobval.data = calloc(sdslen(string_literal_buffer), 1ul); memcpy(yylval.blobval.data, string_literal_buffer, sdslen(string_literal_buffer)); yylval.blobval.len = sdslen(string_literal_buffer); diff --git a/source/main.c b/source/main.c index 0ab3d05..2bdba6e 100644 --- a/source/main.c +++ b/source/main.c @@ -8,6 +8,9 @@ #include "assembler.h" #include "debug.h" +#define ARENA_IMPLEMENTATION +#include "arena.h" + int init(void) { eaxhla_init(); compile_init(); @@ -19,8 +22,8 @@ void deinit(void) { yyfree_leftovers(); - eaxhla_deinit(); - compile_deinit(); + eaxhla_deinit(); // We need this one because of 1000 dependencies. + compile_deinit(); // We don't need this one anymore... } signed main(int argc, char * argv[]) {