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. */