Module Name:    src
Committed By:   rillig
Date:           Sun Mar 28 08:30:22 UTC 2021

Modified Files:
        src/usr.bin/xlint/lint1: init.c

Log Message:
lint: reorder code for handling initializations

First the primitives for debug logging, then the functions that do not
access any global variables, finally everything else.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.145 -r1.146 src/usr.bin/xlint/lint1/init.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/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.145 src/usr.bin/xlint/lint1/init.c:1.146
--- src/usr.bin/xlint/lint1/init.c:1.145	Sun Mar 28 07:59:09 2021
+++ src/usr.bin/xlint/lint1/init.c	Sun Mar 28 08:30:22 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.145 2021/03/28 07:59:09 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.146 2021/03/28 08:30:22 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.145 2021/03/28 07:59:09 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.146 2021/03/28 08:30:22 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -318,106 +318,87 @@ debug_leave(const char *func)
 #endif
 
 
-/* XXX: unnecessary prototype since it is not recursive */
-static	bool	init_array_using_string(tnode_t *);
-
-
-static struct initialization *
-current_init(void)
+static struct designator *
+designator_new(const char *name)
 {
-	lint_assert(init != NULL);
-	return init;
+	struct designator *d = xcalloc(1, sizeof *d);
+	d->name = name;
+	return d;
 }
 
-bool *
-current_initerr(void)
+static void
+designator_free(struct designator *d)
 {
-	return &current_init()->initerr;
+	free(d);
 }
 
-sym_t **
-current_initsym(void)
-{
-	return &current_init()->initsym;
-}
 
-static struct designation *
-current_designation_mod(void)
-{
-	return &current_init()->designation;
-}
-
-static struct designation
-current_designation(void)
+#ifdef DEBUG
+static void
+designation_debug(const struct designation *dn)
 {
-	return *current_designation_mod();
-}
+	const struct designator *p;
 
-static const struct brace_level *
-current_brace_level(void)
-{
-	return current_init()->brace_level;
-}
+	if (dn->head == NULL)
+		return;
 
-static struct brace_level **
-current_brace_level_lvalue(void)
-{
-	return &current_init()->brace_level;
+	debug_indent();
+	debug_printf("designation: ");
+	for (p = dn->head; p != NULL; p = p->next)
+		debug_printf(".%s", p->name);
+	debug_printf("\n");
 }
+#else
+#define designation_debug(dn) do { } while (false)
+#endif
 
 static void
-free_initialization(struct initialization *in)
+designation_add(struct designation *dn, struct designator *dr)
 {
-	struct brace_level *level, *next;
 
-	for (level = in->brace_level; level != NULL; level = next) {
-		next = level->bl_enclosing;
-		free(level);
+	if (dn->head != NULL) {
+		dn->tail->next = dr;
+		dn->tail = dr;
+	} else {
+		dn->head = dr;
+		dn->tail = dr;
 	}
 
-	free(in);
+	designation_debug(dn);
 }
 
+/* TODO: add support for array subscripts, not only named members */
+/*
+ * TODO: This function should not be necessary at all.  There is no need to
+ *  remove the head of the list.
+ */
 static void
-set_initerr(void)
+designation_shift_level(struct designation *dn)
 {
-	current_init()->initerr = true;
-}
-
-#define initerr		(*current_initerr())
-#define initsym		(*current_initsym())
-#define brace_level_rvalue	(current_brace_level())
-#define brace_level_lvalue	(*current_brace_level_lvalue())
+	lint_assert(dn->head != NULL);
 
-#ifndef DEBUG
-
-#define debug_designation()	do { } while (false)
-#define debug_brace_level(level) do { } while (false)
-#define debug_initstack()	do { } while (false)
-
-#else
-
-static void
-debug_designation(void)
-{
-	const struct designator *head = current_designation().head, *p;
-	if (head == NULL)
-		return;
+	if (dn->head == dn->tail) {
+		designator_free(dn->head);
+		dn->head = NULL;
+		dn->tail = NULL;
+	} else {
+		struct designator *head = dn->head;
+		dn->head = dn->head->next;
+		designator_free(head);
+	}
 
-	debug_indent();
-	debug_printf("designation: ");
-	for (p = head; p != NULL; p = p->next)
-		debug_printf(".%s", p->name);
-	debug_printf("\n");
+	designation_debug(dn);
 }
 
+
+#ifdef DEBUG
 /*
  * TODO: only log the top of the stack after each modifying operation
  *
  * TODO: wrap all write accesses to brace_level in setter functions
  */
 static void
-debug_brace_level(const struct brace_level *level)
+brace_level_debug(const struct brace_level *level)
 {
 	if (level->bl_type != NULL)
 		debug_printf("type '%s'", type_name(level->bl_type));
@@ -441,27 +422,125 @@ debug_brace_level(const struct brace_lev
 
 	debug_printf(", remaining %d\n", level->bl_remaining);
 }
+#else
+#define brace_level_debug(level) do { } while (false)
+#endif
+
+
+static struct initialization *
+initialization_new(sym_t *sym)
+{
+	struct initialization *in = xcalloc(1, sizeof(*in));
+
+	in->initsym = sym;
+
+	return in;
+}
 
+static void
+initialization_free(struct initialization *in)
+{
+	struct brace_level *level, *next;
+
+	for (level = in->brace_level; level != NULL; level = next) {
+		next = level->bl_enclosing;
+		free(level);
+	}
+
+	free(in);
+}
+
+#ifdef DEBUG
 /*
  * TODO: only call debug_initstack after each push/pop.
  */
 static void
-debug_initstack(void)
+initialization_debug(const struct initialization *in)
 {
-	if (brace_level_rvalue == NULL) {
+	if (in->brace_level == NULL) {
 		debug_step("no brace level in the current initialization");
 		return;
 	}
 
 	size_t i = 0;
-	for (const struct brace_level *level = brace_level_rvalue;
+	for (const struct brace_level *level = in->brace_level;
 	     level != NULL; level = level->bl_enclosing) {
 		debug_indent();
 		debug_printf("brace level %zu: ", i);
-		debug_brace_level(level);
+		brace_level_debug(level);
 		i++;
 	}
 }
+#else
+#define initialization_debug(in) do { } while (false)
+#endif
+
+/* XXX: unnecessary prototype since it is not recursive */
+static	bool	init_array_using_string(tnode_t *);
+
+
+static struct initialization *
+current_init(void)
+{
+	lint_assert(init != NULL);
+	return init;
+}
+
+bool *
+current_initerr(void)
+{
+	return &current_init()->initerr;
+}
+
+sym_t **
+current_initsym(void)
+{
+	return &current_init()->initsym;
+}
+
+static struct designation *
+current_designation_mod(void)
+{
+	return &current_init()->designation;
+}
+
+static struct designation
+current_designation(void)
+{
+	return *current_designation_mod();
+}
+
+static const struct brace_level *
+current_brace_level(void)
+{
+	return current_init()->brace_level;
+}
+
+static struct brace_level **
+current_brace_level_lvalue(void)
+{
+	return &current_init()->brace_level;
+}
+
+static void
+set_initerr(void)
+{
+	current_init()->initerr = true;
+}
+
+#define initerr		(*current_initerr())
+#define initsym		(*current_initsym())
+#define brace_level_rvalue	(current_brace_level())
+#define brace_level_lvalue	(*current_brace_level_lvalue())
+
+#ifndef DEBUG
+
+#define debug_designation()	do { } while (false)
+#define debug_brace_level(level) do { } while (false)
+#define debug_initstack()	do { } while (false)
+
+#else
+
 
 #define debug_enter() debug_enter(__func__)
 #define debug_leave() debug_leave(__func__)
@@ -475,10 +554,9 @@ begin_initialization(sym_t *sym)
 	struct initialization *curr_init;
 
 	debug_step("begin initialization of '%s'", type_name(sym->s_type));
-	curr_init = xcalloc(1, sizeof *curr_init);
+	curr_init = initialization_new(sym);
 	curr_init->next = init;
 	init = curr_init;
-	initsym = sym;
 }
 
 void
@@ -488,44 +566,17 @@ end_initialization(void)
 
 	curr_init = init;
 	init = init->next;
-	free_initialization(curr_init);
+	initialization_free(curr_init);
 	debug_step("end initialization");
 }
 
-static struct designator *
-designator_new(const char *name)
-{
-	struct designator *d = xcalloc(1, sizeof *d);
-	d->name = name;
-	return d;
-}
-
-static void
-designator_free(struct designator *d)
-{
-	free(d);
-}
-
-static void
-designation_add(struct designator *d)
-{
-	struct designation *dd = &current_init()->designation;
-
-	if (dd->head != NULL) {
-		dd->tail->next = d;
-		dd->tail = d;
-	} else {
-		dd->head = d;
-		dd->tail = d;
-	}
 
-	debug_designation();
-}
 
 void
 designation_add_name(sbuf_t *sb)
 {
-	designation_add(designator_new(sb->sb_name));
+	designation_add(current_designation_mod(),
+	    designator_new(sb->sb_name));
 }
 
 /* TODO: Move the function body up here, to avoid the forward declaration. */
@@ -567,7 +618,7 @@ brace_level_set_array_dimension(int dim)
 	debug_step("setting the array size to %d", dim);
 	brace_level_lvalue->bl_type->t_dim = dim;
 	debug_indent();
-	debug_brace_level(brace_level_rvalue);
+	brace_level_debug(brace_level_rvalue);
 }
 
 static void
@@ -582,7 +633,7 @@ brace_level_next_member(struct brace_lev
 	} while (m->s_bitfield && m->s_name == unnamed);
 
 	debug_indent();
-	debug_brace_level(level);
+	brace_level_debug(level);
 }
 
 /*
@@ -627,25 +678,6 @@ designation_add_subscript(range_t range)
 	debug_leave();
 }
 
-/* TODO: add support for array subscripts, not only named members */
-static void
-designation_shift_level(void)
-{
-	struct designation *des = current_designation_mod();
-	lint_assert(des->head != NULL);
-
-	if (des->head == des->tail) {
-		designator_free(des->head);
-		des->head = NULL;
-		des->tail = NULL;
-	} else {
-		struct designator *head = des->head;
-		des->head = des->head->next;
-		designator_free(head);
-	}
-
-	debug_designation();
-}
 
 /*
  * Initialize the initialization stack by putting an entry for the object
@@ -672,7 +704,7 @@ initstack_init(void)
 
 	brace_level_lvalue = brace_level_new(NULL, initsym->s_type, 1);
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -703,7 +735,7 @@ initstack_pop_item_named_member(const ch
 		/* undefined struct/union member: %s */
 		error(101, name);
 
-		designation_shift_level();
+		designation_shift_level(current_designation_mod());
 		level->bl_seen_named_member = true;
 		return;
 	}
@@ -713,7 +745,7 @@ initstack_pop_item_named_member(const ch
 	/* XXX: why ++? */
 	level->bl_remaining++;
 	/* XXX: why is bl_seen_named_member not set? */
-	designation_shift_level();
+	designation_shift_level(current_designation_mod());
 }
 
 /* TODO: think of a better name than 'pop' */
@@ -745,7 +777,7 @@ initstack_pop_item(void)
 	level = brace_level_lvalue;
 	debug_indent();
 	debug_printf("popping: ");
-	debug_brace_level(level);
+	brace_level_debug(level);
 
 	brace_level_lvalue = level->bl_enclosing;
 	free(level);
@@ -762,7 +794,7 @@ initstack_pop_item(void)
 	else
 		initstack_pop_item_unnamed();
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -776,14 +808,14 @@ initstack_pop_brace(void)
 	bool brace;
 
 	debug_enter();
-	debug_initstack();
+	initialization_debug(current_init());
 	do {
 		brace = brace_level_rvalue->bl_brace;
 		/* TODO: improve wording of the debug message */
 		debug_step("loop brace=%d", brace);
 		initstack_pop_item();
 	} while (!brace);
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -861,7 +893,7 @@ initstack_push_array(void)
 	level->bl_subtype = level->bl_type->t_subt;
 	level->bl_array_of_unknown_size = is_incomplete(level->bl_type);
 	level->bl_remaining = level->bl_type->t_dim;
-	debug_designation();
+	designation_debug(current_designation_mod());
 	debug_step("type '%s' remaining %d",
 	    type_name(level->bl_type), level->bl_remaining);
 }
@@ -924,7 +956,7 @@ initstack_push_struct_or_union(void)
 	}
 
 	cnt = 0;
-	debug_designation();
+	designation_debug(current_designation_mod());
 	debug_step("lookup for '%s'%s",
 	    type_name(level->bl_type),
 	    level->bl_seen_named_member ? ", seen named member" : "");
@@ -941,7 +973,7 @@ initstack_push_struct_or_union(void)
 		level->bl_seen_named_member = true;
 		debug_step("named member '%s'",
 		    current_designation().head->name);
-		designation_shift_level();
+		designation_shift_level(current_designation_mod());
 		cnt = level->bl_type->t_tspec == STRUCT ? 2 : 1;
 	}
 	level->bl_brace = true;
@@ -1021,7 +1053,7 @@ again:
 		break;
 	}
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -1061,7 +1093,7 @@ initstack_next_brace(void)
 {
 
 	debug_enter();
-	debug_initstack();
+	initialization_debug(current_init());
 
 	if (brace_level_rvalue->bl_type != NULL &&
 	    is_scalar(brace_level_rvalue->bl_type->t_tspec)) {
@@ -1075,14 +1107,14 @@ initstack_next_brace(void)
 		initstack_push();
 	if (!initerr) {
 		brace_level_lvalue->bl_brace = true;
-		debug_designation();
+		designation_debug(current_designation_mod());
 		debug_step("expecting type '%s'",
 		    type_name(brace_level_rvalue->bl_type != NULL
 			? brace_level_rvalue->bl_type
 			: brace_level_rvalue->bl_subtype));
 	}
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -1120,7 +1152,7 @@ initstack_next_nobrace(tnode_t *tn)
 		initstack_push();
 	}
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -1132,7 +1164,7 @@ init_lbrace(void)
 		return;
 
 	debug_enter();
-	debug_initstack();
+	initialization_debug(current_init());
 
 	if ((initsym->s_scl == AUTO || initsym->s_scl == REG) &&
 	    brace_level_rvalue->bl_enclosing == NULL) {
@@ -1150,7 +1182,7 @@ init_lbrace(void)
 
 	initstack_next_brace();
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 }
 
@@ -1281,8 +1313,8 @@ init_using_expr(tnode_t *tn)
 	scl_t	sclass;
 
 	debug_enter();
-	debug_initstack();
-	debug_designation();
+	initialization_debug(current_init());
+	designation_debug(current_designation_mod());
 	debug_step("expr:");
 	debug_node(tn, debug_ind + 1);
 
@@ -1311,11 +1343,11 @@ init_using_expr(tnode_t *tn)
 	check_init_expr(tn, sclass);
 
 done_initstack:
-	debug_initstack();
+	initialization_debug(current_init());
 
 done:
 	while (current_designation().head != NULL)
-		designation_shift_level();
+		designation_shift_level(current_designation_mod());
 
 	debug_leave();
 }
@@ -1334,7 +1366,7 @@ init_array_using_string(tnode_t *tn)
 		return false;
 
 	debug_enter();
-	debug_initstack();
+	initialization_debug(current_init());
 
 	level = brace_level_lvalue;
 	strg = tn->tn_string;
@@ -1416,7 +1448,7 @@ init_array_using_string(tnode_t *tn)
 	/* In every case the array is initialized completely. */
 	level->bl_remaining = 0;
 
-	debug_initstack();
+	initialization_debug(current_init());
 	debug_leave();
 	return true;
 }

Reply via email to