155 lines
3.2 KiB
C
155 lines
3.2 KiB
C
#include <limits.h>
|
|
#include <mie/ctx.h>
|
|
#include <mie/diag/diag.h>
|
|
#include <mie/dialect/builtin.h>
|
|
#include <mie/ir/block.h>
|
|
#include <mie/ir/op.h>
|
|
#include <mie/ir/region.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
struct mie_block *mie_region_get_first_block(const struct mie_region *region)
|
|
{
|
|
b_queue_entry *entry = b_queue_first(®ion->r_blocks);
|
|
if (!entry) {
|
|
return NULL;
|
|
}
|
|
|
|
return b_unbox(struct mie_block, entry, b_entry);
|
|
}
|
|
|
|
struct mie_block *mie_region_get_prev_block(
|
|
const struct mie_region *region, const struct mie_block *before)
|
|
{
|
|
if (!before || before->b_parent != region) {
|
|
return NULL;
|
|
}
|
|
|
|
b_queue_entry *entry = b_queue_prev(&before->b_entry);
|
|
if (!entry) {
|
|
return NULL;
|
|
}
|
|
|
|
return b_unbox(struct mie_block, entry, b_entry);
|
|
}
|
|
|
|
struct mie_block *mie_region_get_next_block(
|
|
const struct mie_region *region, const struct mie_block *after)
|
|
{
|
|
if (!after || after->b_parent != region) {
|
|
return NULL;
|
|
}
|
|
|
|
b_queue_entry *entry = b_queue_next(&after->b_entry);
|
|
if (!entry) {
|
|
return NULL;
|
|
}
|
|
|
|
return b_unbox(struct mie_block, entry, b_entry);
|
|
}
|
|
|
|
struct mie_block *mie_region_get_last_block(const struct mie_region *region)
|
|
{
|
|
b_queue_entry *entry = b_queue_last(®ion->r_blocks);
|
|
if (!entry) {
|
|
return NULL;
|
|
}
|
|
|
|
return b_unbox(struct mie_block, entry, b_entry);
|
|
}
|
|
|
|
struct mie_block *mie_region_add_block(struct mie_region *region)
|
|
{
|
|
struct mie_block *block = malloc(sizeof *block);
|
|
|
|
if (!block) {
|
|
return NULL;
|
|
}
|
|
|
|
memset(block, 0x0, sizeof *block);
|
|
block->b_parent = region;
|
|
block->b_id = MIE_BLOCK_ID_INVALID;
|
|
|
|
b_queue_push_back(®ion->r_blocks, &block->b_entry);
|
|
|
|
return block;
|
|
}
|
|
|
|
struct mie_block *mie_region_add_block_before(
|
|
struct mie_region *region, struct mie_block *before)
|
|
{
|
|
if (before->b_parent != region) {
|
|
return NULL;
|
|
}
|
|
|
|
struct mie_block *block = malloc(sizeof *block);
|
|
|
|
if (!block) {
|
|
return NULL;
|
|
}
|
|
|
|
memset(block, 0x0, sizeof *block);
|
|
block->b_parent = region;
|
|
|
|
b_queue_insert_before(®ion->r_blocks, &block->b_entry, &before->b_entry);
|
|
|
|
return block;
|
|
}
|
|
|
|
struct mie_block *mie_region_add_block_after(
|
|
struct mie_region *region, struct mie_block *after)
|
|
{
|
|
if (after->b_parent != region) {
|
|
return NULL;
|
|
}
|
|
|
|
struct mie_block *block = malloc(sizeof *block);
|
|
|
|
if (!block) {
|
|
return NULL;
|
|
}
|
|
|
|
memset(block, 0x0, sizeof *block);
|
|
block->b_parent = region;
|
|
|
|
b_queue_insert_after(®ion->r_blocks, &block->b_entry, &after->b_entry);
|
|
|
|
return block;
|
|
}
|
|
|
|
struct mie_block *mie_region_find_block(
|
|
const struct mie_region *region, const char *name)
|
|
{
|
|
b_queue_entry *cur = b_queue_first(®ion->r_blocks);
|
|
while (cur) {
|
|
struct mie_block *block = b_unbox(struct mie_block, cur, b_entry);
|
|
const char *block_name = block->b_name.n_str;
|
|
if (block_name && !strcmp(block_name, name)) {
|
|
return block;
|
|
}
|
|
|
|
cur = b_queue_next(cur);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
struct mie_register *mie_region_find_register(
|
|
const struct mie_region *region, const char *name)
|
|
{
|
|
b_queue_entry *cur = b_queue_first(®ion->r_blocks);
|
|
|
|
while (cur) {
|
|
struct mie_block *block = b_unbox(struct mie_block, cur, b_entry);
|
|
struct mie_register *reg
|
|
= mie_block_find_register(block, name, NULL);
|
|
if (reg) {
|
|
return reg;
|
|
}
|
|
|
|
cur = b_queue_next(cur);
|
|
}
|
|
|
|
return NULL;
|
|
}
|