Module Name: src Committed By: rillig Date: Sun Jul 30 08:58:54 UTC 2023
Modified Files: src/usr.bin/xlint/lint1: debug.c mem1.c Log Message: lint: in memory debug mode, log the type of the nodes First log all objects to be freed, then free them all at once. This allows cross references from the objects of a block independent of their allocation order. To generate a diff of this commit: cvs rdiff -u -r1.56 -r1.57 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.72 -r1.73 src/usr.bin/xlint/lint1/mem1.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.56 src/usr.bin/xlint/lint1/debug.c:1.57 --- src/usr.bin/xlint/lint1/debug.c:1.56 Fri Jul 28 21:50:03 2023 +++ src/usr.bin/xlint/lint1/debug.c Sun Jul 30 08:58:54 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.56 2023/07/28 21:50:03 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.57 2023/07/30 08:58:54 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: debug.c,v 1.56 2023/07/28 21:50:03 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.57 2023/07/30 08:58:54 rillig Exp $"); #endif #include <stdlib.h> @@ -87,6 +87,7 @@ void debug_indent_dec(void) { + lint_assert(debug_indentation > 0); debug_indentation--; } Index: src/usr.bin/xlint/lint1/mem1.c diff -u src/usr.bin/xlint/lint1/mem1.c:1.72 src/usr.bin/xlint/lint1/mem1.c:1.73 --- src/usr.bin/xlint/lint1/mem1.c:1.72 Sat Jul 29 10:22:50 2023 +++ src/usr.bin/xlint/lint1/mem1.c Sun Jul 30 08:58:54 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: mem1.c,v 1.72 2023/07/29 10:22:50 rillig Exp $ */ +/* $NetBSD: mem1.c,v 1.73 2023/07/30 08:58:54 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: mem1.c,v 1.72 2023/07/29 10:22:50 rillig Exp $"); +__RCSID("$NetBSD: mem1.c,v 1.73 2023/07/30 08:58:54 rillig Exp $"); #endif #include <sys/param.h> @@ -181,34 +181,50 @@ mpool_add(memory_pool *pool, struct memo pool->items[pool->len++] = item; } +#ifdef DEBUG_MEM +static void +debug_memory_pool_item(const struct memory_pool_item *item) +{ + void *p = item->p; + size_t size = item->size; + const char *descr = item->descr; + + if (strcmp(descr, "string") == 0) { + const char *str = p; + debug_step("%s: freeing string '%s'", __func__, str); + } else if (strcmp(descr, "sym") == 0) { + const sym_t *sym = p; + debug_step("%s: freeing symbol '%s'", __func__, sym->s_name); + } else if (strcmp(descr, "type") == 0) { + const type_t *tp = p; + debug_step("%s: freeing type '%s'", __func__, type_name(tp)); + } else if (strcmp(descr, "tnode") == 0) { + const tnode_t *tn = p; + debug_step("%s: freeing node '%s' with type '%s'", + __func__, op_name(tn->tn_op), type_name(tn->tn_type)); + } else + debug_step("%s: freeing '%s' with %zu bytes", + __func__, descr, size); +} +#endif + static void mpool_free(memory_pool *pool) { - for (; pool->len > 0; pool->len--) { - struct memory_pool_item *item = pool->items + pool->len - 1; - void *p = item->p; #ifdef DEBUG_MEM - if (strcmp(item->descr, "string") == 0) - debug_step("%s: freeing string '%s'", - __func__, (const char *)p); - else if (strcmp(item->descr, "sym") == 0) - debug_step("%s: freeing symbol '%s'", - __func__, ((const sym_t *)p)->s_name); - else if (strcmp(item->descr, "type") == 0) - debug_step("%s: freeing type '%s'", - __func__, type_name(p)); - else if (strcmp(item->descr, "tnode") == 0) - debug_step("%s: freeing node '%s'", - __func__, op_name(((const tnode_t *)p)->tn_op)); - else - debug_step("%s: freeing '%s' with %zu bytes", - __func__, item->descr, item->size); - static void *(*volatile memset_ptr)(void *, int, size_t) = memset; - memset_ptr(p, 'Z', item->size); + for (size_t i = pool->len; i-- > 0; ) + debug_memory_pool_item(pool->items + i); +#endif + + for (size_t i = pool->len; i-- > 0;) { +#ifdef DEBUG_MEM + static void *(*volatile set)(void *, int, size_t) = memset; + set(pool->items[i].p, 'Z', pool->items[i].size); #endif - free(p); + free(pool->items[i].p); } + pool->len = 0; } static void * @@ -284,8 +300,10 @@ void level_free_all(size_t level) { - debug_step("%s %zu", __func__, level); + debug_step("+ %s %zu", __func__, level); + debug_indent_inc(); mpool_free(mpool_at(level)); + debug_leave(); } /* Allocate memory that is freed at the end of the current expression. */