summaryrefslogtreecommitdiff
path: root/masm/asm.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2024-09-10 18:23:46 -0400
committerFreya Murphy <freya@freyacat.org>2024-09-10 18:23:46 -0400
commit92a7e5853c6caeec09122c05ddbc19ae1498a0d8 (patch)
treed14a6a1c091df35c06ffb735ce3f6c72b1f37b42 /masm/asm.c
parentrelocation table hell (diff)
downloadmips-92a7e5853c6caeec09122c05ddbc19ae1498a0d8.tar.gz
mips-92a7e5853c6caeec09122c05ddbc19ae1498a0d8.tar.bz2
mips-92a7e5853c6caeec09122c05ddbc19ae1498a0d8.zip
joe
Diffstat (limited to 'masm/asm.c')
-rw-r--r--masm/asm.c72
1 files changed, 54 insertions, 18 deletions
diff --git a/masm/asm.c b/masm/asm.c
index 6e2a56c..099bfe6 100644
--- a/masm/asm.c
+++ b/masm/asm.c
@@ -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;
}