Module Name: src
Committed By: rillig
Date: Sat Jul 15 13:35:24 UTC 2023
Modified Files:
src/usr.bin/xlint/lint1: cgram.y decl.c externs1.h func.c init.c lex.c
lint1.h mem1.c tree.c
Log Message:
lint: add detailed logging for finding memory allocation bugs
To generate a diff of this commit:
cvs rdiff -u -r1.462 -r1.463 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.357 -r1.358 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.195 -r1.196 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.170 -r1.171 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.246 -r1.247 src/usr.bin/xlint/lint1/init.c
cvs rdiff -u -r1.187 -r1.188 src/usr.bin/xlint/lint1/lex.c
cvs rdiff -u -r1.193 -r1.194 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.69 -r1.70 src/usr.bin/xlint/lint1/mem1.c
cvs rdiff -u -r1.567 -r1.568 src/usr.bin/xlint/lint1/tree.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/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.462 src/usr.bin/xlint/lint1/cgram.y:1.463
--- src/usr.bin/xlint/lint1/cgram.y:1.462 Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/cgram.y Sat Jul 15 13:35:24 2023
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: cgram.y,v 1.462 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.463 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.462 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.463 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <limits.h>
@@ -520,12 +520,12 @@ generic_assoc_list:
/* K&R ---, C90 ---, C99 ---, C11 6.5.1.1 */
generic_association:
type_name T_COLON assignment_expression {
- $$ = block_zero_alloc(sizeof(*$$));
+ $$ = block_zero_alloc(sizeof(*$$), "generic");
$$->ga_arg = $1;
$$->ga_result = $3;
}
| T_DEFAULT T_COLON assignment_expression {
- $$ = block_zero_alloc(sizeof(*$$));
+ $$ = block_zero_alloc(sizeof(*$$), "generic");
$$->ga_arg = NULL;
$$->ga_result = $3;
}
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.357 src/usr.bin/xlint/lint1/decl.c:1.358
--- src/usr.bin/xlint/lint1/decl.c:1.357 Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/decl.c Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.357 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.358 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: decl.c,v 1.357 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.358 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <sys/param.h>
@@ -138,7 +138,7 @@ type_t *
block_dup_type(const type_t *tp)
{
- type_t *ntp = block_zero_alloc(sizeof(*ntp));
+ type_t *ntp = block_zero_alloc(sizeof(*ntp), "type");
*ntp = *tp;
return ntp;
}
@@ -148,7 +148,7 @@ type_t *
expr_dup_type(const type_t *tp)
{
- type_t *ntp = expr_zero_alloc(sizeof(*ntp));
+ type_t *ntp = expr_zero_alloc(sizeof(*ntp), "type");
*ntp = *tp;
return ntp;
}
@@ -163,7 +163,7 @@ type_t *
expr_unqualified_type(const type_t *tp)
{
- type_t *ntp = expr_zero_alloc(sizeof(*ntp));
+ type_t *ntp = expr_zero_alloc(sizeof(*ntp), "type");
*ntp = *tp;
ntp->t_const = false;
ntp->t_volatile = false;
@@ -1042,7 +1042,7 @@ sym_t *
declare_unnamed_member(void)
{
- sym_t *mem = block_zero_alloc(sizeof(*mem));
+ sym_t *mem = block_zero_alloc(sizeof(*mem), "sym");
mem->s_name = unnamed;
mem->s_kind = FMEMBER;
mem->s_scl = STRUCT_MEMBER;
@@ -1123,7 +1123,7 @@ set_bit_field_width(sym_t *dsym, int bit
{
if (dsym == NULL) {
- dsym = block_zero_alloc(sizeof(*dsym));
+ dsym = block_zero_alloc(sizeof(*dsym), "sym");
dsym->s_name = unnamed;
dsym->s_kind = FMEMBER;
dsym->s_scl = STRUCT_MEMBER;
@@ -1568,19 +1568,20 @@ make_tag_type(sym_t *tag, tspec_t kind,
}
if (tag->s_scl == NOSCL) {
tag->s_scl = scl;
- tag->s_type = tp = block_zero_alloc(sizeof(*tp));
+ tag->s_type = tp =
+ block_zero_alloc(sizeof(*tp), "type");
tp->t_packed = dcs->d_packed;
} else
tp = tag->s_type;
} else {
- tag = block_zero_alloc(sizeof(*tag));
+ tag = block_zero_alloc(sizeof(*tag), "sym");
tag->s_name = unnamed;
tag->s_def_pos = unique_curr_pos();
tag->s_kind = FTAG;
tag->s_scl = scl;
tag->s_block_level = -1;
- tag->s_type = tp = block_zero_alloc(sizeof(*tp));
+ tag->s_type = tp = block_zero_alloc(sizeof(*tp), "type");
tp->t_packed = dcs->d_packed;
dcs->d_enclosing->d_nonempty_decl = true;
}
@@ -1588,13 +1589,15 @@ make_tag_type(sym_t *tag, tspec_t kind,
if (tp->t_tspec == NO_TSPEC) {
tp->t_tspec = kind;
if (kind != ENUM) {
- tp->t_sou = block_zero_alloc(sizeof(*tp->t_sou));
+ tp->t_sou = block_zero_alloc(sizeof(*tp->t_sou),
+ "struct_or_union");
tp->t_sou->sou_align_in_bits = CHAR_SIZE;
tp->t_sou->sou_tag = tag;
tp->t_sou->sou_incomplete = true;
} else {
tp->t_is_enum = true;
- tp->t_enum = block_zero_alloc(sizeof(*tp->t_enum));
+ tp->t_enum = block_zero_alloc(sizeof(*tp->t_enum),
+ "enumeration");
tp->t_enum->en_tag = tag;
tp->t_enum->en_incomplete = true;
}
@@ -1823,7 +1826,7 @@ declare_extern(sym_t *dsym, bool has_ini
if (renaming != NULL) {
lint_assert(dsym->s_rename == NULL);
- char *s = level_zero_alloc(1, renaming->sb_len + 1);
+ char *s = level_zero_alloc(1, renaming->sb_len + 1, "string");
(void)memcpy(s, renaming->sb_name, renaming->sb_len + 1);
dsym->s_rename = s;
}
@@ -2754,7 +2757,7 @@ abstract_name(void)
lint_assert(dcs->d_kind == DLK_ABSTRACT
|| dcs->d_kind == DLK_PROTO_PARAMS);
- sym_t *sym = block_zero_alloc(sizeof(*sym));
+ sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
sym->s_name = unnamed;
sym->s_def = DEF;
sym->s_scl = ABSTRACT;
Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.195 src/usr.bin/xlint/lint1/externs1.h:1.196
--- src/usr.bin/xlint/lint1/externs1.h:1.195 Thu Jul 13 23:11:11 2023
+++ src/usr.bin/xlint/lint1/externs1.h Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: externs1.h,v 1.195 2023/07/13 23:11:11 rillig Exp $ */
+/* $NetBSD: externs1.h,v 1.196 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -104,11 +104,23 @@ int get_filename_id(const char *);
void add_directory_replacement(char *);
const char *transform_filename(const char *, size_t);
+#ifdef DEBUG_MEM
+void *block_zero_alloc(size_t, const char *);
+void *level_zero_alloc(size_t, size_t, const char *);
+#else
void *block_zero_alloc(size_t);
void *level_zero_alloc(size_t, size_t);
+#define block_zero_alloc(size, descr) (block_zero_alloc)(size)
+#define level_zero_alloc(level, size, descr) (level_zero_alloc)(level, size)
+#endif
void level_free_all(size_t);
+#ifdef DEBUG_MEM
+void *expr_zero_alloc(size_t, const char *);
+#else
void *expr_zero_alloc(size_t);
+#define expr_zero_alloc(size, descr) (expr_zero_alloc)(size)
+#endif
tnode_t *expr_alloc_tnode(void);
void expr_free_all(void);
memory_pool expr_save_memory(void);
Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.170 src/usr.bin/xlint/lint1/func.c:1.171
--- src/usr.bin/xlint/lint1/func.c:1.170 Thu Jul 13 08:40:38 2023
+++ src/usr.bin/xlint/lint1/func.c Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.170 2023/07/13 08:40:38 rillig Exp $ */
+/* $NetBSD: func.c,v 1.171 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: func.c,v 1.170 2023/07/13 08:40:38 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.171 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <stdlib.h>
@@ -1010,7 +1010,7 @@ check_return_value(bool sys, tnode_t *tn
}
/* Create a temporary node for the left side */
- tnode_t *ln = expr_zero_alloc(sizeof(*ln));
+ tnode_t *ln = expr_zero_alloc(sizeof(*ln), "tnode");
ln->tn_op = NAME;
ln->tn_type = expr_unqualified_type(funcsym->s_type->t_subt);
ln->tn_lvalue = true;
Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.246 src/usr.bin/xlint/lint1/init.c:1.247
--- src/usr.bin/xlint/lint1/init.c:1.246 Thu Jul 13 08:40:38 2023
+++ src/usr.bin/xlint/lint1/init.c Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: init.c,v 1.246 2023/07/13 08:40:38 rillig Exp $ */
+/* $NetBSD: init.c,v 1.247 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: init.c,v 1.246 2023/07/13 08:40:38 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.247 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <stdlib.h>
@@ -304,7 +304,7 @@ check_init_expr(const type_t *ltp, sym_t
type_t *lutp = expr_unqualified_type(ltp);
/* Create a temporary node for the left side. */
- tnode_t *ln = expr_zero_alloc(sizeof(*ln));
+ tnode_t *ln = expr_zero_alloc(sizeof(*ln), "tnode");
ln->tn_op = NAME;
ln->tn_type = lutp;
ln->tn_lvalue = true;
Index: src/usr.bin/xlint/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.187 src/usr.bin/xlint/lint1/lex.c:1.188
--- src/usr.bin/xlint/lint1/lex.c:1.187 Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/lex.c Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.187 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.188 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: lex.c,v 1.187 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.188 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <ctype.h>
@@ -358,7 +358,7 @@ add_keyword(const struct keyword *kw, bo
name = xstrdup(buf);
}
- sym_t *sym = block_zero_alloc(sizeof(*sym));
+ sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
sym->s_name = name;
sym->s_keyword = kw;
int tok = kw->kw_token;
@@ -481,7 +481,7 @@ lex_name(const char *yytext, size_t yyle
return sym->s_scl == TYPEDEF ? T_TYPENAME : T_NAME;
}
- char *name = block_zero_alloc(yyleng + 1);
+ char *name = block_zero_alloc(yyleng + 1, "string");
(void)memcpy(name, yytext, yyleng + 1);
sb->sb_name = name;
return T_NAME;
@@ -1336,8 +1336,8 @@ getsym(sbuf_t *sb)
/* labels must always be allocated at level 1 (outermost block) */
decl_level *dl;
if (symtyp == FLABEL) {
- sym = level_zero_alloc(1, sizeof(*sym));
- char *s = level_zero_alloc(1, sb->sb_len + 1);
+ sym = level_zero_alloc(1, sizeof(*sym), "sym");
+ char *s = level_zero_alloc(1, sb->sb_len + 1, "string");
(void)memcpy(s, sb->sb_name, sb->sb_len + 1);
sym->s_name = s;
sym->s_block_level = 1;
@@ -1347,7 +1347,7 @@ getsym(sbuf_t *sb)
dl = dl->d_enclosing;
lint_assert(dl->d_kind == DLK_AUTO);
} else {
- sym = block_zero_alloc(sizeof(*sym));
+ sym = block_zero_alloc(sizeof(*sym), "sym");
sym->s_name = sb->sb_name;
sym->s_block_level = block_level;
dl = dcs;
@@ -1378,8 +1378,8 @@ sym_t *
mktempsym(type_t *tp)
{
static unsigned n = 0;
- char *s = level_zero_alloc((size_t)block_level, 64);
- sym_t *sym = block_zero_alloc(sizeof(*sym));
+ char *s = level_zero_alloc((size_t)block_level, 64, "string");
+ sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
scl_t scl;
(void)snprintf(s, 64, "%.8u_tmp", n++);
@@ -1481,7 +1481,7 @@ pushdown(const sym_t *sym)
debug_step("pushdown '%s' %s '%s'",
sym->s_name, symt_name(sym->s_kind), type_name(sym->s_type));
- nsym = block_zero_alloc(sizeof(*nsym));
+ nsym = block_zero_alloc(sizeof(*nsym), "sym");
lint_assert(sym->s_block_level <= block_level);
nsym->s_name = sym->s_name;
nsym->s_def_pos = unique_curr_pos();
Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.193 src/usr.bin/xlint/lint1/lint1.h:1.194
--- src/usr.bin/xlint/lint1/lint1.h:1.193 Fri Jul 14 08:53:52 2023
+++ src/usr.bin/xlint/lint1/lint1.h Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.193 2023/07/14 08:53:52 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.194 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -43,7 +43,13 @@
* - the end of the translation unit.
*/
typedef struct memory_pool {
- void **items;
+ struct memory_pool_item {
+ void *p;
+#ifdef DEBUG_MEM
+ size_t size;
+ const char *descr;
+#endif
+ } *items;
size_t len;
size_t cap;
} memory_pool;
Index: src/usr.bin/xlint/lint1/mem1.c
diff -u src/usr.bin/xlint/lint1/mem1.c:1.69 src/usr.bin/xlint/lint1/mem1.c:1.70
--- src/usr.bin/xlint/lint1/mem1.c:1.69 Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/mem1.c Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: mem1.c,v 1.69 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: mem1.c,v 1.70 2023/07/15 13:35:24 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.69 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: mem1.c,v 1.70 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <sys/param.h>
@@ -170,7 +170,7 @@ static memory_pools mpools;
static memory_pool expr_pool;
static void
-mpool_add(memory_pool *pool, void *item)
+mpool_add(memory_pool *pool, struct memory_pool_item item)
{
if (pool->len >= pool->cap) {
@@ -185,17 +185,41 @@ static void
mpool_free(memory_pool *pool)
{
- for (; pool->len > 0; pool->len--)
- free(pool->items[pool->len - 1]);
+ for (; pool->len > 0; pool->len--) {
+ struct memory_pool_item *item = pool->items + pool->len - 1;
+#ifdef DEBUG_MEM
+ if (strcmp(item->descr, "string") == 0)
+ debug_step("%s: freeing string '%s'",
+ __func__, (const char *)item->p);
+ else if (strcmp(item->descr, "sym") == 0)
+ debug_step("%s: freeing symbol '%s'",
+ __func__, ((const sym_t *)item->p)->s_name);
+ else if (strcmp(item->descr, "type") == 0)
+ debug_step("%s: freeing type '%s'",
+ __func__, type_name(item->p));
+ else
+ debug_step("%s: freeing '%s' with %zu bytes",
+ __func__, item->descr, item->size);
+#endif
+ free(item->p);
+ }
}
static void *
+#ifdef DEBUG_MEM
+mpool_zero_alloc(memory_pool *pool, size_t size, const char *descr)
+#else
mpool_zero_alloc(memory_pool *pool, size_t size)
+#endif
{
void *mem = xmalloc(size);
memset(mem, 0, size);
- mpool_add(pool, mem);
+#if DEBUG_MEM
+ mpool_add(pool, (struct memory_pool_item){ mem, size, descr });
+#else
+ mpool_add(pool, (struct memory_pool_item){ mem });
+#endif
return mem;
}
@@ -215,21 +239,39 @@ mpool_at(size_t level)
}
-/* Allocate memory associated with level l, initialized with zero. */
+/* Allocate memory associated with the level, initialized with zero. */
+#ifdef DEBUG_MEM
+void *
+level_zero_alloc(size_t level, size_t size, const char *descr)
+{
+
+ return mpool_zero_alloc(mpool_at(level), size, descr);
+}
+#else
void *
-level_zero_alloc(size_t l, size_t s)
+(level_zero_alloc)(size_t level, size_t size)
{
- return mpool_zero_alloc(mpool_at(l), s);
+ return mpool_zero_alloc(mpool_at(level), size);
}
+#endif
/* Allocate memory that is freed at the end of the current block. */
+#ifdef DEBUG_MEM
void *
-block_zero_alloc(size_t s)
+block_zero_alloc(size_t size, const char *descr)
{
- return level_zero_alloc(mem_block_level, s);
+ return level_zero_alloc(mem_block_level, size, descr);
}
+#else
+void *
+(block_zero_alloc)(size_t size)
+{
+
+ return (level_zero_alloc)(mem_block_level, size);
+}
+#endif
void
level_free_all(size_t level)
@@ -240,12 +282,21 @@ level_free_all(size_t level)
}
/* Allocate memory that is freed at the end of the current expression. */
+#if DEBUG_MEM
void *
-expr_zero_alloc(size_t s)
+expr_zero_alloc(size_t s, const char *descr)
{
- return mpool_zero_alloc(&expr_pool, s);
+ return mpool_zero_alloc(&expr_pool, s, descr);
}
+#else
+void *
+(expr_zero_alloc)(size_t size)
+{
+
+ return mpool_zero_alloc(&expr_pool, size);
+}
+#endif
static bool
str_ends_with(const char *haystack, const char *needle)
@@ -267,7 +318,7 @@ str_ends_with(const char *haystack, cons
tnode_t *
expr_alloc_tnode(void)
{
- tnode_t *tn = expr_zero_alloc(sizeof(*tn));
+ tnode_t *tn = expr_zero_alloc(sizeof(*tn), "tnode");
/*
* files named *.c that are different from the main translation unit
* typically contain generated code that cannot be influenced, such
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.567 src/usr.bin/xlint/lint1/tree.c:1.568
--- src/usr.bin/xlint/lint1/tree.c:1.567 Sat Jul 15 12:24:57 2023
+++ src/usr.bin/xlint/lint1/tree.c Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.567 2023/07/15 12:24:57 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.568 2023/07/15 13:35:24 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.567 2023/07/15 12:24:57 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.568 2023/07/15 13:35:24 rillig Exp $");
#endif
#include <float.h>
@@ -322,7 +322,7 @@ block_derive_type(type_t *tp, tspec_t t)
{
type_t *tp2;
- tp2 = block_zero_alloc(sizeof(*tp2));
+ tp2 = block_zero_alloc(sizeof(*tp2), "type");
tp2->t_tspec = t;
tp2->t_subt = tp;
return tp2;
@@ -337,7 +337,7 @@ expr_derive_type(type_t *tp, tspec_t t)
{
type_t *tp2;
- tp2 = expr_zero_alloc(sizeof(*tp2));
+ tp2 = expr_zero_alloc(sizeof(*tp2), "type");
tp2->t_tspec = t;
tp2->t_subt = tp;
return tp2;
@@ -526,7 +526,7 @@ build_string(strg_t *strg)
{
size_t len = strg->st_len;
- type_t *tp = expr_zero_alloc(sizeof(*tp));
+ type_t *tp = expr_zero_alloc(sizeof(*tp), "type");
tp->t_tspec = ARRAY;
tp->t_subt = gettyp(strg->st_char ? CHAR : WCHAR_TSPEC);
tp->t_dim = (int)(len + 1);
@@ -536,13 +536,13 @@ build_string(strg_t *strg)
n->tn_type = tp;
n->tn_lvalue = true;
- n->tn_string = expr_zero_alloc(sizeof(*n->tn_string));
+ n->tn_string = expr_zero_alloc(sizeof(*n->tn_string), "type.string");
n->tn_string->st_char = strg->st_char;
n->tn_string->st_len = len;
size_t chsize = strg->st_char ? sizeof(char) : sizeof(wchar_t);
size_t size = (len + 1) * chsize;
- n->tn_string->st_mem = expr_zero_alloc(size);
+ n->tn_string->st_mem = expr_zero_alloc(size, "type.string.data");
(void)memcpy(n->tn_string->st_mem, strg->st_mem, size);
free(strg->st_mem);
free(strg);
@@ -1909,8 +1909,9 @@ struct_or_union_member(tnode_t *tn, op_t
msym->s_kind = FMEMBER;
msym->s_scl = STRUCT_MEMBER;
- struct_or_union *sou = expr_zero_alloc(sizeof(*sou));
- sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag));
+ struct_or_union *sou = expr_zero_alloc(sizeof(*sou),
+ "struct_or_union");
+ sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag), "sym");
sou->sou_tag->s_name = unnamed;
msym->u.s_member.sm_containing_type = sou;