mips/masm/asm.c
2024-09-10 18:23:46 -04:00

78 lines
1.6 KiB
C

#include <merror.h>
#include <stdlib.h>
#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;
}