diff --git a/tools/qfcc/include/qfcc.h b/tools/qfcc/include/qfcc.h index f95e01af7..e10cd29d6 100644 --- a/tools/qfcc/include/qfcc.h +++ b/tools/qfcc/include/qfcc.h @@ -123,6 +123,7 @@ char *fix_backslash (char *path); #define NORMALIZE(x) x #endif +#ifndef DEBUG_QFCC_MEMORY /** High-tide structure allocator for use in linked lists. Using a free-list with the name of \c free_NAME, return a single element. @@ -153,6 +154,28 @@ char *fix_backslash (char *path); memset (v, 0, sizeof (*v)); \ } while (0) +/** Free a block allocated by #ALLOC + + \param n The \c NAME portion of the \c free_NAME free-list. + \param p The pointer to the block to be freed. + + \hideinitializer +*/ +#define FREE(n, p) \ + do { \ + p->next = free_##n; \ + free_##n = p->next; \ + } while (0) +#else +#define ALLOC(s, t, n, v) \ + do { \ + __attribute__((unused)) t **dummy = &free_##n; \ + v = (t *) calloc (1, sizeof (t)); \ + } while (0) + +#define FREE(n, p) do { free (p); } while (0) +#endif + /** Round \a x up to the next multiple of \a a. \note \a a must be a power of two or this will break. \note There are no side effects on \a x. diff --git a/tools/qfcc/source/debug.c b/tools/qfcc/source/debug.c index b7ce5a87f..6082ef598 100644 --- a/tools/qfcc/source/debug.c +++ b/tools/qfcc/source/debug.c @@ -75,8 +75,7 @@ pop_source_file (void) } tmp = pr.srcline_stack; pr.srcline_stack = tmp->next; - tmp->next = free_srclines; - free_srclines = tmp; + FREE (srclines, tmp); } void diff --git a/tools/qfcc/source/def.c b/tools/qfcc/source/def.c index 0ee88b95d..b17061545 100644 --- a/tools/qfcc/source/def.c +++ b/tools/qfcc/source/def.c @@ -241,8 +241,7 @@ free_def (def_t *def) } def->return_addr = 0; def->free_addr = __builtin_return_address (0); - def->next = free_defs; - free_defs = def; + FREE (defs, def); } void diff --git a/tools/qfcc/source/defspace.c b/tools/qfcc/source/defspace.c index a5050bf23..050d52a79 100644 --- a/tools/qfcc/source/defspace.c +++ b/tools/qfcc/source/defspace.c @@ -106,8 +106,7 @@ defspace_alloc_loc (defspace_t *space, int size) if ((*l)->size == size) { loc = *l; *l = (*l)->next; - loc->next = free_locrefs; - free_locrefs = loc; + FREE (locrefs, loc); } else { (*l)->ofs += size; (*l)->size -= size; @@ -163,8 +162,7 @@ defspace_free_loc (defspace_t *space, int ofs, int size) loc->size += loc->next->size; loc = loc->next; *l = loc->next; - loc->next = free_locrefs; - free_locrefs = loc; + FREE (locrefs, loc); } return; } diff --git a/tools/qfcc/source/flow.c b/tools/qfcc/source/flow.c index 912b90ce9..280917253 100644 --- a/tools/qfcc/source/flow.c +++ b/tools/qfcc/source/flow.c @@ -99,8 +99,7 @@ static void delete_loop (flowloop_t *loop) { set_delete (loop->nodes); - loop->next = free_loops; - free_loops = loop; + FREE (loops, loop); } static flownode_t * @@ -122,8 +121,7 @@ delete_node (flownode_t *node) set_delete (node->edges); if (node->dom) set_delete (node->dom); - node->next = free_nodes; - free_nodes = node; + FREE (nodes, node); } static flowgraph_t * @@ -150,8 +148,7 @@ delete_graph (flowgraph_t *graph) set_delete (graph->dfst); if (graph->dfo) free (graph->dfo); - graph->next = free_graphs; - free_graphs = graph; + FREE (graphs, graph); } static def_t * diff --git a/tools/qfcc/source/grab.c b/tools/qfcc/source/grab.c index 071223705..8aba16230 100644 --- a/tools/qfcc/source/grab.c +++ b/tools/qfcc/source/grab.c @@ -82,8 +82,7 @@ static void frame_free (void *_f, void *unused) { frame_t *f = (frame_t *)_f; - f->next = free_frames; - free_frames = f; + FREE (frames, f); } int diff --git a/tools/qfcc/source/set.c b/tools/qfcc/source/set.c index 7c44b734c..faedc8c67 100644 --- a/tools/qfcc/source/set.c +++ b/tools/qfcc/source/set.c @@ -62,8 +62,7 @@ new_setiter (void) static void delete_setiter (set_iter_t *set_iter) { - set_iter->next = free_set_iters; - free_set_iters = set_iter; + FREE (set_iters, set_iter); } void @@ -88,8 +87,7 @@ set_delete (set_t *set) { if (set->map != set->defmap) free (set->map); - set->next = free_sets; - free_sets = set; + FREE (sets, set); } static void diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index 02dc2df56..8cc6c15b4 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -256,7 +256,7 @@ new_operand (op_type_e op) return operand; } -static void +static void __attribute__((unused)) //FIXME free_operand (operand_t *op) { if (op->next) { @@ -267,21 +267,19 @@ free_operand (operand_t *op) } if (op->op_type == op_alias) free_operand (op->o.alias); - op->next = free_operands; - free_operands = op; + FREE (operands, op); } static void free_statement (statement_t *s) { - if (s->opa) - free_operand (s->opa); - if (s->opb) - free_operand (s->opb); - if (s->opc) - free_operand (s->opc); - s->next = free_statements; - free_statements = s; +// if (s->opa) +// free_operand (s->opa); +// if (s->opb) +// free_operand (s->opb); +// if (s->opc) +// free_operand (s->opc); + FREE (statements, s); } static void @@ -292,8 +290,7 @@ free_sblock (sblock_t *sblock) sblock->statements = s->next; free_statement (s); } - sblock->next = free_sblocks; - free_sblocks = sblock; + FREE (sblocks, sblock); } operand_t * diff --git a/tools/qfcc/source/type.c b/tools/qfcc/source/type.c index 9e5fa7c52..499685598 100644 --- a/tools/qfcc/source/type.c +++ b/tools/qfcc/source/type.c @@ -182,8 +182,7 @@ free_type (type_t *type) break; } memset (type, 0, sizeof (type)); - type->next = free_types; - free_types = type; + FREE (types, type); } type_t *