/* Copyright (c) 2024 Freya Murphy */ #ifndef __ASM_H__ #define __ASM_H__ #include #include "gen.h" /// /// ELF string table /// struct elf_str_table { // size of the ptr in bytes size_t size; // pointer that contains // the strings char *ptr; }; /* initalize a string table */ int strtab_init(struct elf_str_table *strtab); /* free a string table */ void strtab_free(struct elf_str_table *strtab); /* get a string form the string table */ int strtab_get_str(struct elf_str_table *strtab, const char *str, size_t *res); /* get or append a string into the string table */ int strtab_write_str(struct elf_str_table *strtab, const char *str, size_t *res); /// /// elf section /// /* holds a section of the asm file (i.e. .text, .bss, .data) */ struct elf_section { // section data *weak* pointer struct section *data; // index of the section in // the ELF shdr size_t shdr_idx; // relocation table size_t reltab_shidx; uint32_t reltab_len; Elf32_Rel *reltab; }; /// /// assembler /// struct assembler { // the code generator struct generator gen; /// symbol table size_t symtab_shidx; size_t symtab_len; Elf32_Sym *symbols; // sh string table size_t strtab_shidx; struct elf_str_table strtab; // string table size_t shstrtab_shidx; struct elf_str_table shstrtab; /// sections uint32_t section_len; struct elf_section *sections; /// section header Elf32_Shdr *shdr; uint32_t shdr_len; }; /* defines arguments to the assembler */ struct assembler_arguments { char *in_file; char *out_file; }; /* initalize the assembler */ int assembler_init(struct assembler *assembler, const char *path); /* free the assembler */ void assembler_free(struct assembler *assembler); /* assemble a file */ int assemble_file(struct assembler_arguments args); #endif /* __ASM_H__ */