78 lines
1.6 KiB
C
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;
|
|
}
|