#include #include #include "asm.h" int assembler_init(struct assembler *assembler, const char *path) { if (lexer_init(path, &assembler->lexer)) return M_ERROR; if (parser_init(&assembler->lexer, &assembler->parser)) { lexer_free(&assembler->lexer); return M_ERROR; } if (strtbl_init(&assembler->shstr_tbl)) { parser_free(&assembler->parser); lexer_free(&assembler->lexer); return M_ERROR; } if (strtbl_init(&assembler->str_tbl)) { strtbl_free(&assembler->shstr_tbl); parser_free(&assembler->parser); lexer_free(&assembler->lexer); return M_ERROR; } 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 *assembler) { 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; }