{
bblock_link *link = (bblock_link *)list->get_tail();
bblock_t *block = link->block;
- link->remove();
+ link->link.remove();
return block;
}
+static exec_node *
+link(void *mem_ctx, bblock_t *block)
+{
+ bblock_link *l = new(mem_ctx) bblock_link(block);
+ return &l->link;
+}
+
bblock_t::bblock_t() :
start_ip(0), end_ip(0), block_num(0)
{
void
bblock_t::add_successor(void *mem_ctx, bblock_t *successor)
{
- successor->parents.push_tail(new(mem_ctx) bblock_link(this));
- children.push_tail(new(mem_ctx) bblock_link(successor));
+ successor->parents.push_tail(link(mem_ctx, this));
+ children.push_tail(link(mem_ctx, successor));
}
void
/* Push our information onto a stack so we can recover from
* nested ifs.
*/
- if_stack.push_tail(new(mem_ctx) bblock_link(cur_if));
- else_stack.push_tail(new(mem_ctx) bblock_link(cur_else));
+ if_stack.push_tail(link(mem_ctx, cur_if));
+ else_stack.push_tail(link(mem_ctx, cur_else));
cur_if = cur;
cur_else = NULL;
/* Push our information onto a stack so we can recover from
* nested loops.
*/
- do_stack.push_tail(new(mem_ctx) bblock_link(cur_do));
- while_stack.push_tail(new(mem_ctx) bblock_link(cur_while));
+ do_stack.push_tail(link(mem_ctx, cur_do));
+ while_stack.push_tail(link(mem_ctx, cur_while));
/* Set up the block just after the while. Don't know when exactly
* it will start, yet.
block->start_ip = ip;
block->block_num = num_blocks++;
- block_list.push_tail(new(mem_ctx) bblock_link(block));
+ block_list.push_tail(link(mem_ctx, block));
*cur = block;
}
blocks = ralloc_array(mem_ctx, bblock_t *, num_blocks);
int i = 0;
- foreach_list(block_node, &block_list) {
- bblock_link *link = (bblock_link *)block_node;
+ foreach_list_typed(bblock_link, link, link, &block_list) {
blocks[i++] = link->block;
}
assert(i == num_blocks);
for (int b = 0; b < this->num_blocks; b++) {
bblock_t *block = this->blocks[b];
fprintf(stderr, "START B%d", b);
- foreach_list(node, &block->parents) {
- bblock_link *link = (bblock_link *)node;
+ foreach_list_typed(bblock_link, link, link, &block->parents) {
fprintf(stderr, " <-B%d",
link->block->block_num);
}
fprintf(stderr, "\n");
block->dump(v);
fprintf(stderr, "END B%d", b);
- foreach_list(node, &block->children) {
- bblock_link *link = (bblock_link *)node;
+ foreach_list_typed(bblock_link, link, link, &block->children) {
fprintf(stderr, " ->B%d",
link->block->block_num);
}
const BITSET_WORD old_livein = bd[b].livein[i];
bd[b].livein[i] = ~0u;
- foreach_list(block_node, &cfg->blocks[b]->parents) {
- bblock_link *link = (bblock_link *)block_node;
+ foreach_list_typed(bblock_link, link, link, &cfg->blocks[b]->parents) {
bblock_t *block = link->block;
bd[b].livein[i] &= bd[block->block_num].liveout[i];
}
bblock_t *block = cfg->blocks[b];
fprintf(stderr, "Block %d [%d, %d] (parents ", block->block_num,
block->start_ip, block->end_ip);
- foreach_list(block_node, &block->parents) {
- bblock_t *parent = ((bblock_link *) block_node)->block;
+ foreach_list_typed(bblock_link, link, link, &block->parents) {
+ bblock_t *parent = link->block;
fprintf(stderr, "%d ", parent->block_num);
}
fprintf(stderr, "):\n");