asm: implement parsing of classes, dot-mnemonics

This commit is contained in:
2024-12-14 21:57:29 +00:00
parent 83a021a862
commit 7f5cc3426d
13 changed files with 507 additions and 56 deletions

View File

@@ -1,18 +1,20 @@
#include "assembler.h"
#include <blue/core/queue.h>
#include <ivy/asm/assembler.h>
#include <ivy/asm/bin.h>
#include <blue/core/queue.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "assembler.h"
extern struct assembler_scope_type class_scope_type;
extern struct assembler_scope_type constpool_scope_type;
extern struct assembler_scope_type block_scope_type;
static const struct assembler_scope_type *scope_types[] = {
[IVY_ASM_SCOPE_CLASS] = &class_scope_type,
[IVY_ASM_SCOPE_CONSTPOOL] = &constpool_scope_type,
[IVY_ASM_SCOPE_BLOCK] = &block_scope_type,
};
static const size_t nr_scope_types = sizeof scope_types / sizeof scope_types[0];
@@ -24,7 +26,7 @@ struct asm_table_entry {
struct ivy_assembler {
struct assembler_scope *as_scope;
b_queue as_table;
FILE *as_data;
size_t as_data_offset;
@@ -35,7 +37,7 @@ struct ivy_assembler {
enum ivy_status ivy_assembler_create(FILE *fp, struct ivy_assembler **as)
{
struct ivy_assembler *out = malloc(sizeof *out);
if (!out) {
return IVY_ERR_NO_MEMORY;
}
@@ -47,7 +49,7 @@ enum ivy_status ivy_assembler_create(FILE *fp, struct ivy_assembler **as)
struct ivy_bin_header header = {0};
header.h_magic = b_i32_htob(0xAABBCCDD);
fseek(fp, 0, SEEK_SET);
fwrite(&header, sizeof header, 1, fp);
out->as_data_offset = sizeof header;
@@ -71,7 +73,7 @@ enum ivy_status ivy_assembler_finish(struct ivy_assembler *as)
{
const size_t buf_len = 4096;
size_t xdat_len = as->as_next_xdata_key;
fseek(as->as_xdat, 0, SEEK_SET);
unsigned char *buf = malloc(buf_len);
@@ -116,7 +118,8 @@ enum ivy_status ivy_assembler_finish(struct ivy_assembler *as)
b_queue_iterator it = {0};
b_queue_foreach (&it, &as->as_table) {
struct asm_table_entry *e = b_unbox(struct asm_table_entry, it.entry, e_entry);
struct asm_table_entry *e
= b_unbox(struct asm_table_entry, it.entry, e_entry);
size_t w = fwrite(&e->e_data, 1, sizeof e->e_data, as->as_data);
if (w < sizeof e->e_data) {
@@ -150,7 +153,8 @@ size_t assembler_write_data(struct ivy_assembler *as, const void *p, size_t len)
return offset;
}
ivy_extended_data_key assembler_write_extended_data(struct ivy_assembler *as, const void *p, size_t len)
ivy_extended_data_key assembler_write_extended_data(
struct ivy_assembler *as, const void *p, size_t len)
{
ivy_extended_data_key key = as->as_next_xdata_key;
@@ -228,18 +232,17 @@ enum ivy_status ivy_assembler_end_scope(struct ivy_assembler *as)
memset(entry, 0x0, sizeof *entry);
entry->e_data.e_offset = b_i64_htob((uint64_t)as->as_scope->s_start_offset);
entry->e_data.e_size = b_i32_htob((uint32_t)(as->as_data_offset - as->as_scope->s_start_offset));
entry->e_data.e_offset
= b_i64_htob((uint64_t)as->as_scope->s_start_offset);
entry->e_data.e_size = b_i32_htob(
(uint32_t)(as->as_data_offset - as->as_scope->s_start_offset));
switch (as->as_scope->s_type) {
case IVY_ASM_SCOPE_CLASS:
entry->e_data.e_type = b_i32_htob(IVY_TABLE_CLASS);
break;
case IVY_ASM_SCOPE_LAMBDA:
entry->e_data.e_type = b_i32_htob(IVY_TABLE_LAMBDA);
break;
case IVY_ASM_SCOPE_MSGH:
entry->e_data.e_type = b_i32_htob(IVY_TABLE_MSGH);
case IVY_ASM_SCOPE_BLOCK:
entry->e_data.e_type = b_i32_htob(IVY_TABLE_BLOCK);
break;
case IVY_ASM_SCOPE_CONSTPOOL:
entry->e_data.e_type = b_i32_htob(IVY_TABLE_POOL);
@@ -310,4 +313,4 @@ enum ivy_status ivy_assembler_put_instr(
}
return type_info->s_put_instr(as, scope, i);
}
}