From 92a7e5853c6caeec09122c05ddbc19ae1498a0d8 Mon Sep 17 00:00:00 2001 From: Freya Murphy Date: Tue, 10 Sep 2024 18:23:46 -0400 Subject: joe --- masm/asm.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 18 deletions(-) (limited to 'masm/asm.c') diff --git a/masm/asm.c b/masm/asm.c index 6e2a56c..099bfe6 100644 --- a/masm/asm.c +++ b/masm/asm.c @@ -3,39 +3,75 @@ #include "asm.h" -int assembler_init(struct assembler *asm, const char *path) +int assembler_init(struct assembler *assembler, const char *path) { - if (lexer_init(path, &asm->lexer)) + if (lexer_init(path, &assembler->lexer)) return M_ERROR; - if (parser_init(&asm->lexer, &asm->parser)) { - lexer_free(&asm->lexer); + if (parser_init(&assembler->lexer, &assembler->parser)) { + lexer_free(&assembler->lexer); return M_ERROR; } - if (strtbl_init(&asm->shstr_tbl)) { - parser_free(&asm->parser); - lexer_free(&asm->lexer); + if (strtbl_init(&assembler->shstr_tbl)) { + parser_free(&assembler->parser); + lexer_free(&assembler->lexer); return M_ERROR; } - if (strtbl_init(&asm->str_tbl)) { - strtbl_free(&asm->shstr_tbl); - parser_free(&asm->parser); - lexer_free(&asm->lexer); + if (strtbl_init(&assembler->str_tbl)) { + strtbl_free(&assembler->shstr_tbl); + parser_free(&assembler->parser); + lexer_free(&assembler->lexer); return M_ERROR; } - asm->meta = NULL; + if (symtbl_init(&assembler->sym_tbl)) { + strtbl_free(&assembler->str_tbl); + strtbl_free(&assembler->shstr_tbl); + parser_free(&assembler->parser); + lexer_free(&assembler->lexer); + return M_ERROR; + } + + assembler->meta = NULL; + assembler->phdr = NULL; + assembler->shdr = NULL; + assembler->symtab = NULL; return M_SUCCESS; } -void assembler_free(struct assembler *asm) +void assembler_free(struct assembler *assembler) { - strtbl_free(&asm->str_tbl); - strtbl_free(&asm->shstr_tbl); - parser_free(&asm->parser); - lexer_free(&asm->lexer); - free(asm->meta); + if (assembler->meta) { + for (uint32_t i = 0; i < assembler->parser.sec_tbl.count; i++) { + if (assembler->meta[i].reltbl != NULL) { + free(assembler->meta[i].reltbl); + } + } + free(assembler->meta); + } + + if (assembler->phdr) + free(assembler->phdr); + if (assembler->shdr) + free(assembler->shdr); + if (assembler->symtab) + free(assembler->symtab); + + symtbl_free(&assembler->sym_tbl); + strtbl_free(&assembler->str_tbl); + strtbl_free(&assembler->shstr_tbl); + + parser_free(&assembler->parser); + lexer_free(&assembler->lexer); +} + +int assemble_file(struct assembler_arguments args) { + switch (args.isa) { + case ISA_MIPS32: + return assemble_file_mips32(args); + } + return M_ERROR; } -- cgit v1.2.3-freya