two pass encoding and resizing references #22

Merged
omicron merged 6 commits from encoding_start into main 2025-04-24 13:05:47 +00:00
3 changed files with 50 additions and 5 deletions
Showing only changes of commit 5272fdb227 - Show all commits

View File

@ -5,6 +5,7 @@
#include "error.h" #include "error.h"
#include "lexer.h" #include "lexer.h"
#include "tokenlist.h" #include "tokenlist.h"
#include <assert.h>
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@ -75,10 +76,26 @@ typedef struct register_ {
} register_t; } register_t;
typedef struct opcode_encoding { typedef struct opcode_encoding {
uint8_t encoding[32]; uint8_t buffer[32];
size_t len; size_t len;
} opcode_encoding_t; } opcode_encoding_t;
typedef struct instruction {
bool has_reference;
opcode_encoding_t encoding;
int64_t address;
} instruction_t;
typedef struct reference {
int64_t offset;
int64_t address;
operand_size_t size;
} reference_t;
typedef struct {
int64_t address;
} label_t;
struct ast_node { struct ast_node {
node_id_t id; node_id_t id;
tokenlist_entry_t *token_entry; tokenlist_entry_t *token_entry;
@ -89,10 +106,37 @@ struct ast_node {
union { union {
register_t reg; register_t reg;
number_t number; number_t number;
opcode_encoding_t encoding; instruction_t instruction;
reference_t reference;
label_t label;
} value; } value;
}; };
static inline register_t *ast_node_register_value(ast_node_t *node) {
assert(node->id == NODE_REGISTER);
return &node->value.reg;
}
static inline number_t *ast_node_number_value(ast_node_t *node) {
assert(node->id == NODE_NUMBER);
return &node->value.number;
}
static inline instruction_t *ast_node_instruction_value(ast_node_t *node) {
assert(node->id == NODE_INSTRUCTION);
return &node->value.instruction;
}
static inline reference_t *ast_node_reference_value(ast_node_t *node) {
assert(node->id == NODE_LABEL_REFERENCE);
return &node->value.reference;
}
static inline label_t *ast_node_label_value(ast_node_t *node) {
assert(node->id == NODE_LABEL);
return &node->value.label;
}
/** /**
* @brief Allocates a new AST node * @brief Allocates a new AST node
* *

View File

@ -481,7 +481,7 @@ error_t *encoder_encode_instruction(encoder_t *encoder,
return err; return err;
// produce the actual encoding output in the NODE_INSTRUCTION value // produce the actual encoding output in the NODE_INSTRUCTION value
uint8_t *output = instruction->value.encoding.encoding; uint8_t *output = instruction->value.instruction.encoding.buffer;
size_t output_len = 0; size_t output_len = 0;
// Handle prefixes // Handle prefixes
@ -500,7 +500,7 @@ error_t *encoder_encode_instruction(encoder_t *encoder,
memcpy(output + output_len, encoding->buffer, encoding->len); memcpy(output + output_len, encoding->buffer, encoding->len);
output_len += encoding->len; output_len += encoding->len;
instruction->value.encoding.len = output_len; instruction->value.instruction.encoding.len = output_len;
return nullptr; return nullptr;
} }

View File

@ -88,7 +88,8 @@ error_t *print_encoding(tokenlist_t *list) {
if (node->id != NODE_INSTRUCTION) if (node->id != NODE_INSTRUCTION)
continue; continue;
print_hex(node->value.encoding.len, node->value.encoding.encoding); print_hex(node->value.instruction.encoding.len,
node->value.instruction.encoding.buffer);
} }
encoder_free(encoder); encoder_free(encoder);