this change has two key benefits:
1. we no longer need to allocate large contigious buffers for Regions with lots
of Blocks, or Blocks with lots of Ops.
2. this simplifies re-arranging, inserting, and moving parts of the IR structure.
92 lines
1.8 KiB
C
92 lines
1.8 KiB
C
#include <mie/ir/block.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;
|
|
|
|
b_queue_push_back(®ion->r_blocks, &block->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;
|
|
}
|