feat: Added indicator for allocated regions

This commit is contained in:
overflowerror 2024-02-16 13:41:21 +01:00
parent 8ec648601d
commit 36b75d5654
3 changed files with 54 additions and 1 deletions

View file

@ -59,7 +59,7 @@ size_t band_find_empty_region_index(band_t* band) {
}
}
band->regions = list_ensure_space(band->regions, sizeof(region_t*), 1);
list_add(band->regions, NULL);
return regions_size;
}
@ -119,3 +119,32 @@ void band_region_free(band_t* band, region_t* region) {
void band_region_free_raw(band_t* band, band_addr_t addr) {
band_region_free(band, band->band[addr]);
}
size_t band_number_of_regions(band_t* band) {
size_t regions_size = list_size(band->regions);
size_t result = 0;
for (size_t i = 0; i < regions_size; i++) {
if (band->regions[i] != NULL) {
result++;
}
}
return result;
}
region_t** band_iterate(band_t* band, region_t** last_ptr) {
size_t size = list_size(band->regions);
size_t offset = 0;
if (last_ptr) {
offset = (((uintptr_t) last_ptr) - ((uintptr_t) band->regions)) / sizeof(void *) + 1;
}
for (size_t i = offset; i < size; i++) {
if (band->regions[i] != NULL) {
return band->regions + i;
}
}
return NULL;
}

View file

@ -36,5 +36,7 @@ void band_make_var(band_t*, region_t*, const char*);
void band_region_free(band_t*, region_t*);
void band_region_free_raw(band_t*, band_addr_t);
size_t band_number_of_regions(band_t*);
region_t** band_iterate(band_t*, region_t**);
#endif

View file

@ -183,6 +183,26 @@ void codegen_statement(FILE* out, band_t* band, struct statement* statement) {
fprintf(out, "\n");
}
void check_allocations(band_t* band) {
size_t number_of_allocated_regions = band_number_of_regions(band);
if (number_of_allocated_regions > 0) {
fprintf(stderr, WARN("code generation existed with allocated regions:\n"));
region_t** region_ptr = NULL;
while((region_ptr = band_iterate(band, region_ptr)) != NULL) {
region_t* region = *region_ptr;
fprintf(stderr, "- (%zu) ", region->size);
if (region->is_temp) {
fprintf(stderr, "[anonymous] (this is a bug in the compiler!)\n");
} else {
fprintf(stderr, "variable %s\n", region->variable);
}
}
}
}
int codegen(FILE* out, struct program* program) {
band_t* band = band_init();
@ -190,5 +210,7 @@ int codegen(FILE* out, struct program* program) {
codegen_statement(out, band, program->statements[i]);
}
check_allocations(band);
return 0;
}