diff options
author | Freya Murphy <freya@freyacat.org> | 2024-09-10 18:23:46 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2024-09-10 18:23:46 -0400 |
commit | 92a7e5853c6caeec09122c05ddbc19ae1498a0d8 (patch) | |
tree | d14a6a1c091df35c06ffb735ce3f6c72b1f37b42 /masm/asm.c | |
parent | relocation table hell (diff) | |
download | mips-92a7e5853c6caeec09122c05ddbc19ae1498a0d8.tar.gz mips-92a7e5853c6caeec09122c05ddbc19ae1498a0d8.tar.bz2 mips-92a7e5853c6caeec09122c05ddbc19ae1498a0d8.zip |
joe
Diffstat (limited to 'masm/asm.c')
-rw-r--r-- | masm/asm.c | 72 |
1 files changed, 54 insertions, 18 deletions
@@ -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; } |