| #ifndef ALLOCATE_H |
| #define ALLOCATE_H |
| |
| struct allocation_blob { |
| struct allocation_blob *next; |
| unsigned int left, offset; |
| unsigned char data[]; |
| }; |
| |
| struct allocator_struct { |
| const char *name; |
| struct allocation_blob *blobs; |
| unsigned int alignment; |
| unsigned int chunking; |
| void *freelist; |
| /* statistics */ |
| unsigned int allocations, total_bytes, useful_bytes; |
| }; |
| |
| extern void protect_allocations(struct allocator_struct *desc); |
| extern void drop_all_allocations(struct allocator_struct *desc); |
| extern void *allocate(struct allocator_struct *desc, unsigned int size); |
| extern void free_one_entry(struct allocator_struct *desc, void *entry); |
| extern void show_allocations(struct allocator_struct *); |
| |
| #define __DECLARE_ALLOCATOR(type, x) \ |
| extern type *__alloc_##x(int); \ |
| extern void __free_##x(type *); \ |
| extern void show_##x##_alloc(void); \ |
| extern void clear_##x##_alloc(void); \ |
| extern void protect_##x##_alloc(void); |
| #define DECLARE_ALLOCATOR(x) __DECLARE_ALLOCATOR(struct x, x) |
| |
| #define __DO_ALLOCATOR(type, objsize, objalign, objname, x) \ |
| static struct allocator_struct x##_allocator = { \ |
| .name = objname, \ |
| .alignment = objalign, \ |
| .chunking = CHUNK }; \ |
| type *__alloc_##x(int extra) \ |
| { \ |
| return allocate(&x##_allocator, objsize+extra); \ |
| } \ |
| void __free_##x(type *entry) \ |
| { \ |
| free_one_entry(&x##_allocator, entry); \ |
| } \ |
| void show_##x##_alloc(void) \ |
| { \ |
| show_allocations(&x##_allocator); \ |
| } \ |
| void clear_##x##_alloc(void) \ |
| { \ |
| drop_all_allocations(&x##_allocator); \ |
| } \ |
| void protect_##x##_alloc(void) \ |
| { \ |
| protect_allocations(&x##_allocator); \ |
| } |
| |
| #define __ALLOCATOR(t, n, x) \ |
| __DO_ALLOCATOR(t, sizeof(t), __alignof__(t), n, x) |
| |
| #define ALLOCATOR(x, n) __ALLOCATOR(struct x, n, x) |
| |
| DECLARE_ALLOCATOR(ident); |
| DECLARE_ALLOCATOR(token); |
| DECLARE_ALLOCATOR(context); |
| DECLARE_ALLOCATOR(symbol); |
| DECLARE_ALLOCATOR(expression); |
| DECLARE_ALLOCATOR(statement); |
| DECLARE_ALLOCATOR(string); |
| DECLARE_ALLOCATOR(scope); |
| __DECLARE_ALLOCATOR(void, bytes); |
| DECLARE_ALLOCATOR(basic_block); |
| DECLARE_ALLOCATOR(entrypoint); |
| DECLARE_ALLOCATOR(instruction); |
| DECLARE_ALLOCATOR(multijmp); |
| DECLARE_ALLOCATOR(pseudo); |
| |
| #endif |