long align_item(long offset, long size);
long size_of(Type* type);
-// src/bitmap.c
+// src/bitset.c
typedef struct Bitset Bitset;
Bitset* bitset_new(size_t max);
void ssa_call_add(SsaBlock* call, SsaNode* arg);
void ssa_print(Parser* p, SsaNode* expr);
-void ssa_print_block(Parser* p, SsaBlock* block);
+void ssa_print_block(Parser* p, Bitset* set, SsaBlock* block);
void ssa_print_graph(Parser* p, SsaBlock* block);
/* Backend Code Generation and Base Type Definitions
}
}
-void ssa_print_block(Parser* p, SsaBlock* block)
+void ssa_print_block(Parser* p, Bitset* set, SsaBlock* block)
{
/* print the phis */
printf("L%lu:\n", block->id);
/* print the next node */
if (block->links[0])
{
- ssa_print_block(p, block->links[0]);
+ ssa_print_block(p, set, block->links[0]);
}
if (block->links[1])
{
- ssa_print_block(p, block->links[1]);
+ ssa_print_block(p, set, block->links[1]);
}
}
-static void print_block_graph(Parser* p, SsaBlock* block)
+static void print_block_graph(Parser* p, Bitset* set, SsaBlock* block)
{
+ if (bitset_has(set, block->id))
+ {
+ return;
+ }
+ bitset_add(set, block->id);
+
/* print the phis */
-// for (SsaPhi* phi = block->phis; phi; phi = phi->next)
-// {
-// Symbol* s = symbol_getbyid(p, phi->symid);
-// s->version++;
-// printf("block%lu: %s.%lu = phi(", block->id, s->name, s->version);
-// for (SsaPhiVar* var = phi->vars; var; var = var->next)
-// {
-// printf("%s.%lu", s->name, var->version);
-// if (var->next)
-// {
-// printf(", ");
-// }
-// }
-// puts(")");
-// }
-// /* print the instructions */
-// for (SsaNode* node = block->head; node; node = node->next)
-// {
-// printf("block%lu : ", block->id);
-// print_dest(p, node);
-// ssa_print(p, node);
-// puts("");
-// }
+ for (SsaPhi* phi = block->phis; phi; phi = phi->next)
+ {
+ Symbol* s = symbol_getbyid(p, phi->symid);
+ s->version++;
+ printf("block%lu: %s.%lu = phi(", block->id, s->name, s->version);
+ for (SsaPhiVar* var = phi->vars; var; var = var->next)
+ {
+ printf("%s.%lu", s->name, var->version);
+ if (var->next)
+ {
+ printf(", ");
+ }
+ }
+ puts(")");
+ }
+
+ /* print the instructions */
+ for (SsaNode* node = block->head; node; node = node->next)
+ {
+ printf("block%lu : ", block->id);
+ print_dest(p, node);
+ ssa_print(p, node);
+ puts("");
+ }
/* print the next nodes */
if (block->links[0])
{
printf("block%lu --> block%lu\n", block->id, block->links[0]->id);
- print_block_graph(p, block->links[0]);
+ print_block_graph(p, set, block->links[0]);
}
+
if (block->links[1])
{
printf("block%lu --> block%lu\n", block->id, block->links[1]->id);
// if (!block->links[1]->phis)
{
- print_block_graph(p, block->links[1]);
+ print_block_graph(p, set, block->links[1]);
}
}
}
{
printf("@startuml\n");
printf("[*] --> block%lu\n", block->id);
- print_block_graph(p, block);
+ Bitset* set = bitset_new(p->blockid);
+ print_block_graph(p, set, block);
printf("@enduml\n");
}