long align_item(long offset, long size);
long size_of(Type* type);
+// src/bitmap.c
+typedef struct Bitset Bitset;
+
+Bitset* bitset_new(size_t max);
+void bitset_add(Bitset* set, size_t val);
+bool bitset_has(Bitset* set, size_t val);
+
// src/ssa.c
bool ssa_asbool(SsaNode* node);
long long ssa_asint(SsaNode* node);
--- /dev/null
+#include <cerise.h>
+
+#define CELL_BITS (sizeof(size_t) * 8u)
+
+struct Bitset {
+ size_t maxval;
+ size_t bits[];
+};
+
+Bitset* bitset_new(size_t max)
+{
+ size_t ncells = (max / CELL_BITS) + ((max & (CELL_BITS-1)) ? 1 : 0);
+ Bitset* set = calloc(1, sizeof(Bitset) + (ncells * sizeof(size_t)));
+ set->maxval = max;
+ return set;
+}
+
+void bitset_add(Bitset* set, size_t val)
+{
+ if (val <= set->maxval)
+ {
+ size_t cell_index = (val / CELL_BITS);
+ size_t bit_index = val - (cell_index * CELL_BITS);
+ set->bits[cell_index] |= (1 << bit_index);
+ }
+ else
+ {
+ fatal("tried to set a bit greater than max for set");
+ }
+}
+
+bool bitset_has(Bitset* set, size_t val)
+{
+ bool ret = false;
+ if (val <= set->maxval)
+ {
+ size_t cell_index = (val / CELL_BITS);
+ size_t bit_index = val - (cell_index * CELL_BITS);
+ ret = ((set->bits[cell_index] & (1 << bit_index)) != 0);
+ }
+ return ret;
+}
p->curr_join = p->curr_join->next;
expect(p, END);
}
+// else if (accept(p, END))
+// {
+// /* this is an empty block?? */
+// break;
+// }
else /* assignments/expressions */
{
SsaNode* expr = expression(p);
static void print_block_graph(Parser* p, SsaBlock* block)
{
/* 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])