mie: ir: register: implement moving and cleanup of mie_register_use

This commit is contained in:
2026-01-21 14:36:24 +00:00
parent 0c4ebe7f39
commit 33f9ccd871
2 changed files with 41 additions and 4 deletions

View File

@@ -62,8 +62,13 @@ struct mie_register {
}; };
extern struct mie_vector_ops mie_register_vector_ops; extern struct mie_vector_ops mie_register_vector_ops;
extern struct mie_vector_ops mie_register_use_vector_ops;
MIE_API void mie_register_move(struct mie_register *dest, struct mie_register *src); MIE_API void mie_register_move(struct mie_register *dest, struct mie_register *src);
MIE_API void mie_register_cleanup(struct mie_register *reg); MIE_API void mie_register_cleanup(struct mie_register *reg);
MIE_API void mie_register_use_move(
struct mie_register_use *dest, struct mie_register_use *src);
MIE_API void mie_register_use_cleanup(struct mie_register_use *reg);
#endif #endif

View File

@@ -1,13 +1,14 @@
#include <assert.h> #include <assert.h>
#include <blue/core/queue.h>
#include <mie/ir/register.h> #include <mie/ir/register.h>
static enum mie_status cleanup(void *p) static enum mie_status reg_cleanup(void *p)
{ {
mie_register_cleanup(p); mie_register_cleanup(p);
return MIE_SUCCESS; return MIE_SUCCESS;
} }
static enum mie_status move(void *dst, void *src, size_t itemsz) static enum mie_status reg_move(void *dst, void *src, size_t itemsz)
{ {
assert(itemsz == sizeof(struct mie_register)); assert(itemsz == sizeof(struct mie_register));
struct mie_register *dest_reg = dst, *src_reg = src; struct mie_register *dest_reg = dst, *src_reg = src;
@@ -15,9 +16,23 @@ static enum mie_status move(void *dst, void *src, size_t itemsz)
return MIE_SUCCESS; return MIE_SUCCESS;
} }
static enum mie_status reg_use_cleanup(void *p)
{
mie_register_use_cleanup(p);
return MIE_SUCCESS;
}
static enum mie_status reg_use_move(void *dst, void *src, size_t itemsz)
{
assert(itemsz == sizeof(struct mie_register_use));
struct mie_register_use *dest_reg = dst, *src_reg = src;
mie_register_use_move(dest_reg, src_reg);
return MIE_SUCCESS;
}
struct mie_vector_ops mie_register_vector_ops = { struct mie_vector_ops mie_register_vector_ops = {
.v_destroy = cleanup, .v_destroy = reg_cleanup,
.v_move = move, .v_move = reg_move,
}; };
void mie_register_move(struct mie_register *dest, struct mie_register *src) void mie_register_move(struct mie_register *dest, struct mie_register *src)
@@ -35,3 +50,20 @@ void mie_register_cleanup(struct mie_register *reg)
mie_name_destroy(&reg->reg_name); mie_name_destroy(&reg->reg_name);
} }
} }
void mie_register_use_move(
struct mie_register_use *dest, struct mie_register_use *src)
{
memmove(dest, src, sizeof *dest);
if (src->u_reg) {
b_queue_move(&src->u_reg->reg_use, &src->u_entry, &dest->u_entry);
}
}
void mie_register_use_cleanup(struct mie_register_use *use)
{
if (use->u_reg) {
b_queue_delete(&use->u_reg->reg_use, &use->u_entry);
}
}