mirror of
https://github.com/sigmasternchen/macrofuck
synced 2025-03-15 07:08:56 +00:00
feat: Added indicator for allocated regions
This commit is contained in:
parent
8ec648601d
commit
36b75d5654
3 changed files with 54 additions and 1 deletions
31
src/band.c
31
src/band.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue