diff --git a/asm/assembler/block.c b/asm/assembler/block.c index e69de29..df96b86 100644 --- a/asm/assembler/block.c +++ b/asm/assembler/block.c @@ -0,0 +1,46 @@ +#include "assembler.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct block_assembler_scope { + struct assembler_scope s_base; +}; + +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); + + struct block_assembler_scope *c + = (struct block_assembler_scope *)scope; + + return IVY_OK; +} + +static enum ivy_status put_instr( + struct ivy_assembler *as, struct assembler_scope *scope, + const struct ivy_instr *instr) +{ + uint32_t op = 0xAABBCCDD; + b_i32 x = b_i32_htob(op); + assembler_write_data(as, &x, sizeof x); + return IVY_OK; +} + +const struct assembler_scope_type block_scope_type = { + .s_scope_size = sizeof(struct block_assembler_scope), + .s_init_scope = init_scope, + .s_put_instr = put_instr, +}; diff --git a/asm/include/ivy/asm/bin.h b/asm/include/ivy/asm/bin.h index 5ca11fa..136916b 100644 --- a/asm/include/ivy/asm/bin.h +++ b/asm/include/ivy/asm/bin.h @@ -67,6 +67,7 @@ struct ivy_bin_class_table_entry { struct ivy_bin_class { b_i32 c_ident; + uint8_t c_reserved[12]; struct ivy_bin_class_table_entry c_table[]; }; diff --git a/asm/parse/block.c b/asm/parse/block.c index 525408b..4e2589b 100644 --- a/asm/parse/block.c +++ b/asm/parse/block.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #define HASH_SELF 0x2d19e518d40792b7 @@ -154,8 +155,10 @@ static enum index_base get_index_base(struct ivy_asm_token *tok) } } -static enum ivy_status write_instruction(struct block_parser_state *state) +static enum ivy_status write_instruction(struct ivy_asm_parser *p, struct block_parser_state *state) { + struct ivy_instr instr = {0}; + ivy_assembler_put_instr(p->p_assembler, &instr); return IVY_OK; } @@ -234,7 +237,7 @@ static enum ivy_status push_reg_arg( static enum ivy_status parse_linefeed( struct ivy_asm_parser *ctx, struct ivy_asm_token *tok) { - struct block_parser_state *state + struct block_parser_state *state = (struct block_parser_state *)asm_parser_get_state(ctx); switch (state->s_prev_component) { @@ -244,7 +247,7 @@ static enum ivy_status parse_linefeed( case INSTR_OPERAND: case INSTR_OPERAND_INDEX_RIGHT: state->s_prev_component = INSTR_NONE; - return write_instruction(state); + return write_instruction(ctx, state); default: return IVY_ERR_BAD_SYNTAX; }