asm: implement import and instruction parsing
This commit is contained in:
@@ -9,6 +9,8 @@ extern struct parser_state_type constpool_parser_state_type;
|
||||
extern struct parser_state_type ident_parser_state_type;
|
||||
extern struct parser_state_type selector_parser_state_type;
|
||||
extern struct parser_state_type atom_parser_state_type;
|
||||
extern struct parser_state_type import_parser_state_type;
|
||||
extern struct parser_state_type block_parser_state_type;
|
||||
|
||||
static const struct parser_state_type *parser_state_types[] = {
|
||||
[ASM_PARSER_UNIT] = &unit_parser_state_type,
|
||||
@@ -16,6 +18,8 @@ static const struct parser_state_type *parser_state_types[] = {
|
||||
[ASM_PARSER_IDENT] = &ident_parser_state_type,
|
||||
[ASM_PARSER_SELECTOR] = &selector_parser_state_type,
|
||||
[ASM_PARSER_ATOM] = &atom_parser_state_type,
|
||||
[ASM_PARSER_IMPORT] = &import_parser_state_type,
|
||||
[ASM_PARSER_BLOCK] = &block_parser_state_type,
|
||||
};
|
||||
static const size_t nr_parser_state_types = sizeof parser_state_types / sizeof parser_state_types[0];
|
||||
|
||||
@@ -29,7 +33,7 @@ enum ivy_status ivy_asm_parser_create(struct ivy_asm_parser **out)
|
||||
|
||||
memset(parser, 0x0, sizeof *parser);
|
||||
|
||||
asm_parser_push_state(parser, ASM_PARSER_UNIT);
|
||||
asm_parser_push_state(parser, ASM_PARSER_UNIT, NULL);
|
||||
|
||||
*out = parser;
|
||||
return IVY_OK;
|
||||
@@ -112,7 +116,9 @@ static const struct parser_state_type *get_parser_state_type(enum parser_state_t
|
||||
return parser_state_types[type];
|
||||
}
|
||||
|
||||
struct parser_state *asm_parser_push_state(struct ivy_asm_parser *parser, enum parser_state_type_id type)
|
||||
struct parser_state *asm_parser_push_state(
|
||||
struct ivy_asm_parser *parser, enum parser_state_type_id type,
|
||||
const ivy_assembler_attrib_table attrib)
|
||||
{
|
||||
const struct parser_state_type *type_info = get_parser_state_type(type);
|
||||
|
||||
@@ -130,6 +136,10 @@ struct parser_state *asm_parser_push_state(struct ivy_asm_parser *parser, enum p
|
||||
|
||||
state->s_type = type_info;
|
||||
|
||||
if (attrib) {
|
||||
memcpy(state->s_attrib, attrib, sizeof attrib);
|
||||
}
|
||||
|
||||
if (type_info->n_init_state) {
|
||||
type_info->n_init_state(parser, state);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user