diff options
Diffstat (limited to 'src/fasm/code_generator')
-rw-r--r-- | src/fasm/code_generator/code_generator.c | 42 | ||||
-rw-r--r-- | src/fasm/code_generator/code_generator.h | 17 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/fasm/code_generator/code_generator.c b/src/fasm/code_generator/code_generator.c new file mode 100644 index 0000000..0df70f5 --- /dev/null +++ b/src/fasm/code_generator/code_generator.c @@ -0,0 +1,42 @@ +#include "code_generator.h" + +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <utils/memory/memory.h> + +void deleteByteCodeInners(ByteCode bytecode) { + free(bytecode.code); + free(bytecode.data); + free(bytecode.labels); +} + +ByteCode fasmCodeGenerator(FasmLinkedLines *lines) { + ByteCode bytecode = { + .code = a404m_malloc(0), + .code_size = 0, + .data = lines->data, + .data_size = lines->data_size, + .labels = lines->variables, + .labels_size = lines->variables_size, + }; + + lines->data = a404m_malloc(0); + lines->data_size = 0; + lines->variables = a404m_malloc(0); + lines->variables_size = 0; + + for (size_t i = 0; i < lines->lines_size; ++i) { + const FasmLinkedLine line = lines->lines[i]; + const size_t size = sizeof(line.instruction) + line.operands_size; + bytecode.code = a404m_realloc(bytecode.code, bytecode.code_size + size); + memcpy(bytecode.code + bytecode.code_size, &line.instruction, + sizeof(line.instruction)); + bytecode.code_size += sizeof(line.instruction); + memcpy(bytecode.code + bytecode.code_size, line.operands, + line.operands_size); + bytecode.code_size += line.operands_size; + } + + return bytecode; +} diff --git a/src/fasm/code_generator/code_generator.h b/src/fasm/code_generator/code_generator.h new file mode 100644 index 0000000..85715e4 --- /dev/null +++ b/src/fasm/code_generator/code_generator.h @@ -0,0 +1,17 @@ +#pragma once + +#include <fasm/linker/linker.h> +#include <stdint.h> + +typedef struct ByteCode { + uint8_t *code; + size_t code_size; + uint8_t *data; + size_t data_size; + FasmVariable *labels; + size_t labels_size; +}ByteCode; + +extern void deleteByteCodeInners(ByteCode bytecode); + +extern ByteCode fasmCodeGenerator(FasmLinkedLines *lines); |