Add and use FREE() to complement ALLOC().

Now it will be easy to test memory access with valgrind (just compile with
DEBUG_QFCC_MEMORY defined).
This commit is contained in:
Bill Currie 2012-12-04 13:23:31 +09:00
parent 0872961269
commit 98a0afa38f
9 changed files with 44 additions and 35 deletions

View file

@ -123,6 +123,7 @@ char *fix_backslash (char *path);
#define NORMALIZE(x) x #define NORMALIZE(x) x
#endif #endif
#ifndef DEBUG_QFCC_MEMORY
/** High-tide structure allocator for use in linked lists. /** High-tide structure allocator for use in linked lists.
Using a free-list with the name of \c free_NAME, return a single element. 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)); \ memset (v, 0, sizeof (*v)); \
} while (0) } 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. /** 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 \a a must be a power of two or this will break.
\note There are no side effects on \a x. \note There are no side effects on \a x.

View file

@ -75,8 +75,7 @@ pop_source_file (void)
} }
tmp = pr.srcline_stack; tmp = pr.srcline_stack;
pr.srcline_stack = tmp->next; pr.srcline_stack = tmp->next;
tmp->next = free_srclines; FREE (srclines, tmp);
free_srclines = tmp;
} }
void void

View file

@ -241,8 +241,7 @@ free_def (def_t *def)
} }
def->return_addr = 0; def->return_addr = 0;
def->free_addr = __builtin_return_address (0); def->free_addr = __builtin_return_address (0);
def->next = free_defs; FREE (defs, def);
free_defs = def;
} }
void void

View file

@ -106,8 +106,7 @@ defspace_alloc_loc (defspace_t *space, int size)
if ((*l)->size == size) { if ((*l)->size == size) {
loc = *l; loc = *l;
*l = (*l)->next; *l = (*l)->next;
loc->next = free_locrefs; FREE (locrefs, loc);
free_locrefs = loc;
} else { } else {
(*l)->ofs += size; (*l)->ofs += size;
(*l)->size -= size; (*l)->size -= size;
@ -163,8 +162,7 @@ defspace_free_loc (defspace_t *space, int ofs, int size)
loc->size += loc->next->size; loc->size += loc->next->size;
loc = loc->next; loc = loc->next;
*l = loc->next; *l = loc->next;
loc->next = free_locrefs; FREE (locrefs, loc);
free_locrefs = loc;
} }
return; return;
} }

View file

@ -99,8 +99,7 @@ static void
delete_loop (flowloop_t *loop) delete_loop (flowloop_t *loop)
{ {
set_delete (loop->nodes); set_delete (loop->nodes);
loop->next = free_loops; FREE (loops, loop);
free_loops = loop;
} }
static flownode_t * static flownode_t *
@ -122,8 +121,7 @@ delete_node (flownode_t *node)
set_delete (node->edges); set_delete (node->edges);
if (node->dom) if (node->dom)
set_delete (node->dom); set_delete (node->dom);
node->next = free_nodes; FREE (nodes, node);
free_nodes = node;
} }
static flowgraph_t * static flowgraph_t *
@ -150,8 +148,7 @@ delete_graph (flowgraph_t *graph)
set_delete (graph->dfst); set_delete (graph->dfst);
if (graph->dfo) if (graph->dfo)
free (graph->dfo); free (graph->dfo);
graph->next = free_graphs; FREE (graphs, graph);
free_graphs = graph;
} }
static def_t * static def_t *

View file

@ -82,8 +82,7 @@ static void
frame_free (void *_f, void *unused) frame_free (void *_f, void *unused)
{ {
frame_t *f = (frame_t *)_f; frame_t *f = (frame_t *)_f;
f->next = free_frames; FREE (frames, f);
free_frames = f;
} }
int int

View file

@ -62,8 +62,7 @@ new_setiter (void)
static void static void
delete_setiter (set_iter_t *set_iter) delete_setiter (set_iter_t *set_iter)
{ {
set_iter->next = free_set_iters; FREE (set_iters, set_iter);
free_set_iters = set_iter;
} }
void void
@ -88,8 +87,7 @@ set_delete (set_t *set)
{ {
if (set->map != set->defmap) if (set->map != set->defmap)
free (set->map); free (set->map);
set->next = free_sets; FREE (sets, set);
free_sets = set;
} }
static void static void

View file

@ -256,7 +256,7 @@ new_operand (op_type_e op)
return operand; return operand;
} }
static void static void __attribute__((unused)) //FIXME
free_operand (operand_t *op) free_operand (operand_t *op)
{ {
if (op->next) { if (op->next) {
@ -267,21 +267,19 @@ free_operand (operand_t *op)
} }
if (op->op_type == op_alias) if (op->op_type == op_alias)
free_operand (op->o.alias); free_operand (op->o.alias);
op->next = free_operands; FREE (operands, op);
free_operands = op;
} }
static void static void
free_statement (statement_t *s) free_statement (statement_t *s)
{ {
if (s->opa) // if (s->opa)
free_operand (s->opa); // free_operand (s->opa);
if (s->opb) // if (s->opb)
free_operand (s->opb); // free_operand (s->opb);
if (s->opc) // if (s->opc)
free_operand (s->opc); // free_operand (s->opc);
s->next = free_statements; FREE (statements, s);
free_statements = s;
} }
static void static void
@ -292,8 +290,7 @@ free_sblock (sblock_t *sblock)
sblock->statements = s->next; sblock->statements = s->next;
free_statement (s); free_statement (s);
} }
sblock->next = free_sblocks; FREE (sblocks, sblock);
free_sblocks = sblock;
} }
operand_t * operand_t *

View file

@ -182,8 +182,7 @@ free_type (type_t *type)
break; break;
} }
memset (type, 0, sizeof (type)); memset (type, 0, sizeof (type));
type->next = free_types; FREE (types, type);
free_types = type;
} }
type_t * type_t *