mie: add parent pointers to region and block; two-way link between a register and its users
This commit is contained in:
@@ -11,6 +11,7 @@ struct mie_register;
|
||||
|
||||
struct mie_block {
|
||||
struct mie_name b_name;
|
||||
struct mie_region *b_parent;
|
||||
|
||||
MIE_VECTOR_DECLARE(struct mie_register, b_params);
|
||||
MIE_VECTOR_DECLARE(struct mie_op, b_ops);
|
||||
|
||||
@@ -29,7 +29,7 @@ struct mie_op_arg {
|
||||
struct mie_file_span arg_span;
|
||||
union {
|
||||
/* only valid if F_ARG_RESOLVED is set in arg_flags */
|
||||
struct mie_register *arg_value;
|
||||
struct mie_register_use arg_value;
|
||||
/* only valid if F_ARG_RESOLVED is NOT set in arg_flags */
|
||||
struct mie_register_ref arg_unresolved;
|
||||
};
|
||||
|
||||
@@ -5,10 +5,12 @@
|
||||
#include <mie/vector.h>
|
||||
#include <stddef.h>
|
||||
|
||||
struct mie_op;
|
||||
struct mie_block;
|
||||
|
||||
struct mie_region {
|
||||
struct mie_name_map *r_names;
|
||||
struct mie_op *r_parent;
|
||||
MIE_VECTOR_DECLARE(struct mie_block, r_blocks);
|
||||
};
|
||||
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
#include <mie/name.h>
|
||||
#include <mie/vector.h>
|
||||
|
||||
struct mie_op;
|
||||
struct mie_register;
|
||||
struct mie_target_register;
|
||||
|
||||
enum mie_register_flags {
|
||||
@@ -26,6 +28,13 @@ struct mie_register_ref {
|
||||
const struct mie_type *reg_type;
|
||||
};
|
||||
|
||||
/* represents a use of/resolved reference to a mie_register */
|
||||
struct mie_register_use {
|
||||
b_queue_entry u_entry;
|
||||
struct mie_op *u_user;
|
||||
struct mie_register *u_reg;
|
||||
};
|
||||
|
||||
struct mie_register {
|
||||
enum mie_register_flags reg_flags;
|
||||
union {
|
||||
@@ -47,6 +56,9 @@ struct mie_register {
|
||||
* for which this register is a parameter
|
||||
* if this is a BLOCK_PARAM register, this pointer is NULL */
|
||||
struct mie_op *reg_op;
|
||||
/* list of struct mie_register_use, representing all the places
|
||||
* where this register is used. */
|
||||
b_queue reg_use;
|
||||
};
|
||||
|
||||
extern struct mie_vector_ops mie_register_vector_ops;
|
||||
|
||||
@@ -105,9 +105,10 @@ MIE_API bool mie_parser_parse_register_list(
|
||||
MIE_VECTOR_REF_PARAM(struct mie_register, out));
|
||||
|
||||
MIE_API bool mie_parser_parse_region(
|
||||
struct mie_parser *ctx, struct mie_region *region);
|
||||
struct mie_parser *ctx, struct mie_op *parent, struct mie_region *region);
|
||||
MIE_API bool mie_parser_parse_region_list(
|
||||
struct mie_parser *ctx, MIE_VECTOR_REF_PARAM(struct mie_region, out));
|
||||
struct mie_parser *ctx, struct mie_op *parent,
|
||||
MIE_VECTOR_REF_PARAM(struct mie_region, out));
|
||||
MIE_API bool mie_parser_parse_anonymous_block(
|
||||
struct mie_parser *ctx, struct mie_name_map *names,
|
||||
struct mie_block *block);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
const struct mie_type *mie_op_arg_get_type(const struct mie_op_arg *arg)
|
||||
{
|
||||
if (arg->arg_flags & MIE_OP_F_ARG_RESOLVED) {
|
||||
return arg->arg_value->reg_type;
|
||||
return arg->arg_value.u_reg->reg_type;
|
||||
}
|
||||
|
||||
return arg->arg_unresolved.reg_type;
|
||||
|
||||
@@ -5,5 +5,14 @@
|
||||
|
||||
struct mie_block *mie_region_add_block(struct mie_region *region)
|
||||
{
|
||||
return mie_vector_emplace_back(region->r_blocks, &mie_block_vector_ops);
|
||||
struct mie_block *block = mie_vector_emplace_back(
|
||||
region->r_blocks, &mie_block_vector_ops);
|
||||
|
||||
if (!block) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
block->b_parent = region;
|
||||
|
||||
return block;
|
||||
}
|
||||
|
||||
@@ -759,9 +759,11 @@ bool mie_parser_parse_register_list(
|
||||
return true;
|
||||
}
|
||||
|
||||
bool mie_parser_parse_region(struct mie_parser *ctx, struct mie_region *region)
|
||||
bool mie_parser_parse_region(
|
||||
struct mie_parser *ctx, struct mie_op *parent, struct mie_region *region)
|
||||
{
|
||||
region->r_names = mie_name_map_create(NULL);
|
||||
region->r_parent = parent;
|
||||
|
||||
if (!mie_parser_parse_symbol(ctx, MIE_SYM_LEFT_BRACE)) {
|
||||
return false;
|
||||
@@ -797,7 +799,8 @@ bool mie_parser_parse_region(struct mie_parser *ctx, struct mie_region *region)
|
||||
}
|
||||
|
||||
bool mie_parser_parse_region_list(
|
||||
struct mie_parser *ctx, MIE_VECTOR_REF_PARAM(struct mie_region, out))
|
||||
struct mie_parser *ctx, struct mie_op *parent,
|
||||
MIE_VECTOR_REF_PARAM(struct mie_region, out))
|
||||
{
|
||||
if (!mie_parser_check_symbol(ctx, MIE_SYM_LEFT_BRACE)) {
|
||||
return false;
|
||||
@@ -805,7 +808,7 @@ bool mie_parser_parse_region_list(
|
||||
|
||||
struct mie_region *region = mie_vector_ref_emplace_back(out, NULL);
|
||||
|
||||
if (!mie_parser_parse_region(ctx, region)) {
|
||||
if (!mie_parser_parse_region(ctx, parent, region)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -820,7 +823,8 @@ bool mie_parser_parse_region_list(
|
||||
|
||||
struct mie_region *region = mie_vector_ref_emplace_back(out, NULL);
|
||||
|
||||
if (!mie_parser_parse_region(ctx, region)) {
|
||||
if (!mie_parser_parse_region(ctx, parent, region)) {
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1087,7 +1091,7 @@ static bool parse_generic_op(
|
||||
if (mie_parser_parse_symbol(ctx, MIE_SYM_LEFT_PAREN)) {
|
||||
mie_parser_parse_linefeed(ctx);
|
||||
if (!mie_parser_parse_region_list(
|
||||
ctx, MIE_VECTOR_REF(dest->op_regions))) {
|
||||
ctx, dest, MIE_VECTOR_REF(dest->op_regions))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,9 +13,9 @@ void mie_printer_print_op_arg(
|
||||
const struct mie_type *arg_type = NULL;
|
||||
|
||||
if (MIE_TEST_FLAGS(arg->arg_flags, MIE_OP_F_ARG_RESOLVED)) {
|
||||
arg_flags = arg->arg_value->reg_flags;
|
||||
arg_name = arg->arg_value->reg_name.n_str;
|
||||
arg_type = arg->arg_value->reg_type;
|
||||
arg_flags = arg->arg_value.u_reg->reg_flags;
|
||||
arg_name = arg->arg_value.u_reg->reg_name.n_str;
|
||||
arg_type = arg->arg_value.u_reg->reg_type;
|
||||
} else {
|
||||
arg_flags = arg->arg_unresolved.reg_flags;
|
||||
arg_name = arg->arg_unresolved.reg_name;
|
||||
@@ -160,7 +160,7 @@ static void print_type_signature(
|
||||
|
||||
const struct mie_op_arg *arg = &op->op_args.items[i];
|
||||
if (arg->arg_flags & MIE_OP_F_ARG_RESOLVED) {
|
||||
type = arg->arg_value->reg_type;
|
||||
type = arg->arg_value.u_reg->reg_type;
|
||||
} else {
|
||||
type = arg->arg_unresolved.reg_type;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user