mips/masm/asm.c

78 lines
1.6 KiB
C
Raw Normal View History

2024-09-10 00:48:08 +00:00
#include <merror.h>
#include <stdlib.h>
#include "asm.h"
2024-09-10 22:23:46 +00:00
int assembler_init(struct assembler *assembler, const char *path)
2024-09-10 00:48:08 +00:00
{
2024-09-10 22:23:46 +00:00
if (lexer_init(path, &assembler->lexer))
2024-09-10 00:48:08 +00:00
return M_ERROR;
2024-09-10 22:23:46 +00:00
if (parser_init(&assembler->lexer, &assembler->parser)) {
lexer_free(&assembler->lexer);
2024-09-10 00:48:08 +00:00
return M_ERROR;
}
2024-09-10 22:23:46 +00:00
if (strtbl_init(&assembler->shstr_tbl)) {
parser_free(&assembler->parser);
lexer_free(&assembler->lexer);
2024-09-10 00:48:08 +00:00
return M_ERROR;
}
2024-09-10 22:23:46 +00:00
if (strtbl_init(&assembler->str_tbl)) {
strtbl_free(&assembler->shstr_tbl);
parser_free(&assembler->parser);
lexer_free(&assembler->lexer);
2024-09-10 00:48:08 +00:00
return M_ERROR;
}
2024-09-10 22:23:46 +00:00
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;
2024-09-10 00:48:08 +00:00
return M_SUCCESS;
}
2024-09-10 22:23:46 +00:00
void assembler_free(struct assembler *assembler)
2024-09-10 00:48:08 +00:00
{
2024-09-10 22:23:46 +00:00
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;
2024-09-10 00:48:08 +00:00
}