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);
}
}

View File

@@ -1,23 +1,23 @@
#include "assembler.h"
#include <ivy/asm/bin.h>
static enum ivy_status init_scope(struct ivy_assembler *as, struct assembler_scope *scope,
static enum ivy_status init_scope(
struct ivy_assembler *as, struct assembler_scope *scope,
const ivy_assembler_attrib_table attrib)
{
struct ivy_bin_class header = {0};
header.c_ident = b_i32_htob((uint32_t)attrib[IVY_ASM_ATTRIB_IDENT]);
assembler_write_data(as, &header, sizeof header);
return IVY_OK;
}
static enum ivy_status put_xval(
struct ivy_assembler *as,
struct assembler_scope *scope,
enum ivy_assembler_xval_type type,
const ivy_assembler_attrib_table attrib)
struct ivy_assembler *as, struct assembler_scope *scope,
enum ivy_assembler_xval_type type, const ivy_assembler_attrib_table attrib)
{
struct ivy_bin_class_table_entry entry = {0};
switch (type) {
@@ -37,10 +37,17 @@ static enum ivy_status put_xval(
entry.e_mvar.m_index
= b_i32_htob((uint32_t)attrib[IVY_ASM_ATTRIB_INDEX]);
break;
case IVY_ASM_XVAL_MESSAGE_HANDLER:
entry.e_type = b_i32_htob(IVY_CLASS_TABLE_MSGH);
entry.e_msgh.msg_selector
= b_i32_htob((uint32_t)attrib[IVY_ASM_ATTRIB_SELECTOR]);
entry.e_msgh.msg_block
= b_i32_htob((uint32_t)attrib[IVY_ASM_ATTRIB_BLOCK]);
break;
default:
return IVY_ERR_NOT_SUPPORTED;
}
assembler_write_data(as, &entry, sizeof entry);
return IVY_OK;
}
@@ -49,4 +56,4 @@ const struct assembler_scope_type class_scope_type = {
.s_scope_size = sizeof(struct assembler_scope),
.s_init_scope = init_scope,
.s_put_xval = put_xval,
};
};

View File

@@ -0,0 +1,21 @@
#include "assembler.h"
#include <ivy/asm/bin.h>
static enum ivy_status init_scope(
struct ivy_assembler *as, struct assembler_scope *scope,
const ivy_assembler_attrib_table attrib)
{
struct ivy_bin_block header = {0};
header.b_index = b_i32_htob((uint32_t)attrib[IVY_ASM_ATTRIB_INDEX]);
assembler_write_data(as, &header, sizeof header);
return IVY_OK;
}
const struct assembler_scope_type block_scope_type = {
.s_scope_size = sizeof(struct assembler_scope),
.s_init_scope = init_scope,
};