asm: implement parsing of classes, dot-mnemonics
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user