Module Name:    src
Committed By:   rillig
Date:           Sat Apr  9 15:43:42 UTC 2022

Modified Files:
        src/usr.bin/xlint/lint1: Makefile cgram.y ckbool.c debug.c decl.c lex.c
            lint1.h tree.c

Log Message:
lint: disambiguate sym_t.s_value

Having a single variable for 4 different purposes with different types
makes the code unnecessarily hard to follow.

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 src/usr.bin/xlint/lint1/Makefile
cvs rdiff -u -r1.390 -r1.391 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.11 -r1.12 src/usr.bin/xlint/lint1/ckbool.c
cvs rdiff -u -r1.13 -r1.14 src/usr.bin/xlint/lint1/debug.c
cvs rdiff -u -r1.272 -r1.273 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.116 -r1.117 src/usr.bin/xlint/lint1/lex.c
cvs rdiff -u -r1.146 -r1.147 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.421 -r1.422 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/Makefile
diff -u src/usr.bin/xlint/lint1/Makefile:1.89 src/usr.bin/xlint/lint1/Makefile:1.90
--- src/usr.bin/xlint/lint1/Makefile:1.89	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/Makefile	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.89 2022/04/09 14:50:18 rillig Exp $
+#	$NetBSD: Makefile,v 1.90 2022/04/09 15:43:41 rillig Exp $
 
 .include <bsd.own.mk>
 
@@ -58,7 +58,6 @@ ${MAN}.date:	err.c
 
 # Extra -UYYDEBUG since cgram.c contains 'int yydebug; if (yydebug)'.
 cgram.ln: cgram.c
-	: extra
 	${LINT} ${LINTFLAGS} \
 	    ${CPPFLAGS:C/-([IDUW]) */-\1/Wg:M-[IDUW]*} \
 	    -i -UYYDEBUG ${.IMPSRC}

Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.390 src/usr.bin/xlint/lint1/cgram.y:1.391
--- src/usr.bin/xlint/lint1/cgram.y:1.390	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/cgram.y	Sat Apr  9 15:43:41 2022
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.390 2022/04/09 14:50:18 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.391 2022/04/09 15:43:41 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: cgram.y,v 1.390 2022/04/09 14:50:18 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.391 2022/04/09 15:43:41 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -114,7 +114,7 @@ static void
 anonymize(sym_t *s)
 {
 	for ( ; s != NULL; s = s->s_next)
-		s->u.s_sou_type = NULL;
+		s->u.s_member.sm_sou_type = NULL;
 }
 
 #if defined(YYDEBUG) && (defined(YYBYACC) || defined(YYBISON))

Index: src/usr.bin/xlint/lint1/ckbool.c
diff -u src/usr.bin/xlint/lint1/ckbool.c:1.11 src/usr.bin/xlint/lint1/ckbool.c:1.12
--- src/usr.bin/xlint/lint1/ckbool.c:1.11	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/ckbool.c	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ckbool.c,v 1.11 2022/04/09 14:50:18 rillig Exp $ */
+/* $NetBSD: ckbool.c,v 1.12 2022/04/09 15:43:41 rillig Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
 #include <sys/cdefs.h>
 
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: ckbool.c,v 1.11 2022/04/09 14:50:18 rillig Exp $");
+__RCSID("$NetBSD: ckbool.c,v 1.12 2022/04/09 15:43:41 rillig Exp $");
 #endif
 
 #include <string.h>
@@ -243,18 +243,14 @@ fallback_symbol_strict_bool(sym_t *sym)
 	if (Tflag && strcmp(sym->s_name, "__lint_false") == 0) {
 		sym->s_scl = BOOL_CONST;
 		sym->s_type = gettyp(BOOL);
-		sym->s_value.v_tspec = BOOL;
-		sym->s_value.v_unsigned_since_c90 = false;
-		sym->s_value.v_quad = 0;
+		sym->u.s_bool_constant = false;
 		return true;
 	}
 
 	if (Tflag && strcmp(sym->s_name, "__lint_true") == 0) {
 		sym->s_scl = BOOL_CONST;
 		sym->s_type = gettyp(BOOL);
-		sym->s_value.v_tspec = BOOL;
-		sym->s_value.v_unsigned_since_c90 = false;
-		sym->s_value.v_quad = 1;
+		sym->u.s_bool_constant = true;
 		return true;
 	}
 

Index: src/usr.bin/xlint/lint1/debug.c
diff -u src/usr.bin/xlint/lint1/debug.c:1.13 src/usr.bin/xlint/lint1/debug.c:1.14
--- src/usr.bin/xlint/lint1/debug.c:1.13	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/debug.c	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.c,v 1.13 2022/04/09 14:50:18 rillig Exp $ */
+/* $NetBSD: debug.c,v 1.14 2022/04/09 15:43:41 rillig Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: debug.c,v 1.13 2022/04/09 14:50:18 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.14 2022/04/09 15:43:41 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -271,14 +271,17 @@ debug_sym(const char *prefix, const sym_
 		debug_printf(" used-at=%s:%d",
 		    sym->s_use_pos.p_file, sym->s_use_pos.p_line);
 
-	if (sym->s_type != NULL &&
-	    (sym->s_type->t_is_enum || sym->s_type->t_tspec == BOOL))
-		debug_printf(" value=%d", (int)sym->s_value.v_quad);
+	if (sym->s_type != NULL && sym->s_type->t_is_enum)
+		debug_printf(" value=%d", sym->u.s_enum_constant);
+	if (sym->s_type != NULL && sym->s_type->t_tspec == BOOL)
+		debug_printf(" value=%s",
+		    sym->u.s_bool_constant ? "true" : "false");
 
 	if ((sym->s_scl == MOS || sym->s_scl == MOU) &&
-	    sym->u.s_sou_type != NULL) {
-		const char *tag = sym->u.s_sou_type->sou_tag->s_name;
-		const sym_t *def = sym->u.s_sou_type->sou_first_typedef;
+	    sym->u.s_member.sm_sou_type != NULL) {
+		struct_or_union *sou_type = sym->u.s_member.sm_sou_type;
+		const char *tag = sou_type->sou_tag->s_name;
+		const sym_t *def = sou_type->sou_first_typedef;
 		if (tag == unnamed && def != NULL)
 			debug_printf(" sou='typedef %s'", def->s_name);
 		else
@@ -286,11 +289,13 @@ debug_sym(const char *prefix, const sym_
 	}
 
 	if (sym->s_keyword != NULL) {
-		int t = (int)sym->s_value.v_quad;
+		int t = sym->u.s_keyword.sk_token;
 		if (t == T_TYPE || t == T_STRUCT_OR_UNION)
-			debug_printf(" %s", tspec_name(sym->u.s_tspec));
+			debug_printf(" %s",
+			    tspec_name(sym->u.s_keyword.sk_tspec));
 		else if (t == T_QUAL)
-			debug_printf(" %s", tqual_name(sym->u.s_qualifier));
+			debug_printf(" %s",
+			    tqual_name(sym->u.s_keyword.sk_qualifier));
 	}
 
 	debug_word(sym->s_osdef && sym->u.s_old_style_args != NULL,

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.272 src/usr.bin/xlint/lint1/decl.c:1.273
--- src/usr.bin/xlint/lint1/decl.c:1.272	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/decl.c	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.272 2022/04/09 14:50:18 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.273 2022/04/09 15:43:41 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: decl.c,v 1.272 2022/04/09 14:50:18 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.273 2022/04/09 15:43:41 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -1130,8 +1130,8 @@ declarator_1_struct_union(sym_t *dsym)
 		lint_assert(dcs->d_redeclared_symbol->s_scl == MOS ||
 		    dcs->d_redeclared_symbol->s_scl == MOU);
 
-		if (dsym->u.s_sou_type ==
-		    dcs->d_redeclared_symbol->u.s_sou_type) {
+		if (dsym->u.s_member.sm_sou_type ==
+		    dcs->d_redeclared_symbol->u.s_member.sm_sou_type) {
 			/* duplicate member name: %s */
 			error(33, dsym->s_name);
 			rmsym(dcs->d_redeclared_symbol);
@@ -1168,13 +1168,14 @@ declarator_1_struct_union(sym_t *dsym)
 	}
 	if (dsym->s_bitfield) {
 		align(alignment_in_bits(tp), tp->t_flen);
-		dsym->s_value.v_quad =
+		dsym->u.s_member.sm_offset_in_bits =
 		    dcs->d_offset - dcs->d_offset % size_in_bits(t);
-		tp->t_foffs = dcs->d_offset - (int)dsym->s_value.v_quad;
+		tp->t_foffs =
+		    dcs->d_offset - dsym->u.s_member.sm_offset_in_bits;
 		dcs->d_offset += tp->t_flen;
 	} else {
 		align(alignment_in_bits(tp), 0);
-		dsym->s_value.v_quad = dcs->d_offset;
+		dsym->u.s_member.sm_offset_in_bits = dcs->d_offset;
 		dcs->d_offset += sz;
 	}
 	if (dcs->d_ctx == MOU) {
@@ -1575,9 +1576,9 @@ declarator_name(sym_t *sym)
 	case MOS:
 	case MOU:
 		/* Set parent */
-		sym->u.s_sou_type = dcs->d_tagtyp->t_str;
+		sym->u.s_member.sm_sou_type = dcs->d_tagtyp->t_str;
 		sym->s_def = DEF;
-		sym->s_value.v_tspec = INT;
+		/* XXX: Where is sym->u.s_member.sm_offset_in_bits set? */
 		sc = dcs->d_ctx;
 		break;
 	case EXTERN:
@@ -1858,8 +1859,8 @@ complete_tag_struct_or_union(type_t *tp,
 	n = 0;
 	for (mem = fmem; mem != NULL; mem = mem->s_next) {
 		/* bind anonymous members to the structure */
-		if (mem->u.s_sou_type == NULL) {
-			mem->u.s_sou_type = sp;
+		if (mem->u.s_member.sm_sou_type == NULL) {
+			mem->u.s_member.sm_sou_type = sp;
 			if (mem->s_type->t_bitfield) {
 				sp->sou_size_in_bits += bitfieldsize(&mem);
 				if (mem == NULL)
@@ -1925,8 +1926,7 @@ enumeration_constant(sym_t *sym, int val
 	}
 	sym->s_scl = ENUM_CONST;
 	sym->s_type = dcs->d_tagtyp;
-	sym->s_value.v_tspec = INT;
-	sym->s_value.v_quad = val;
+	sym->u.s_enum_constant = val;
 	if (impl && val == TARG_INT_MIN) {
 		/* overflow in enumeration values: %s */
 		warning(48, sym->s_name);

Index: src/usr.bin/xlint/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.116 src/usr.bin/xlint/lint1/lex.c:1.117
--- src/usr.bin/xlint/lint1/lex.c:1.116	Sat Apr  9 13:38:17 2022
+++ src/usr.bin/xlint/lint1/lex.c	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.116 2022/04/09 13:38:17 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.117 2022/04/09 15:43:41 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: lex.c,v 1.116 2022/04/09 13:38:17 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.117 2022/04/09 15:43:41 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -393,13 +393,13 @@ add_keyword(const struct keyword *kw, bo
 	sym = block_zero_alloc(sizeof(*sym));
 	sym->s_name = name;
 	sym->s_keyword = kw;
-	sym->s_value.v_quad = kw->kw_token;
+	sym->u.s_keyword.sk_token = kw->kw_token;
 	if (kw->kw_token == T_TYPE || kw->kw_token == T_STRUCT_OR_UNION) {
-		sym->u.s_tspec = kw->kw_tspec;
+		sym->u.s_keyword.sk_tspec = kw->kw_tspec;
 	} else if (kw->kw_token == T_SCLASS) {
 		sym->s_scl = kw->kw_scl;
 	} else if (kw->kw_token == T_QUAL) {
-		sym->u.s_qualifier = kw->kw_tqual;
+		sym->u.s_keyword.sk_qualifier = kw->kw_tqual;
 	}
 
 	symtab_add(sym);
@@ -454,12 +454,12 @@ lex_keyword(sym_t *sym)
 {
 	int	t;
 
-	if ((t = (int)sym->s_value.v_quad) == T_SCLASS) {
+	if ((t = sym->u.s_keyword.sk_token) == T_SCLASS) {
 		yylval.y_scl = sym->s_scl;
 	} else if (t == T_TYPE || t == T_STRUCT_OR_UNION) {
-		yylval.y_tspec = sym->u.s_tspec;
+		yylval.y_tspec = sym->u.s_keyword.sk_tspec;
 	} else if (t == T_QUAL) {
-		yylval.y_tqual = sym->u.s_qualifier;
+		yylval.y_tqual = sym->u.s_keyword.sk_qualifier;
 	}
 	return t;
 }

Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.146 src/usr.bin/xlint/lint1/lint1.h:1.147
--- src/usr.bin/xlint/lint1/lint1.h:1.146	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/lint1.h	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.146 2022/04/09 14:50:18 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.147 2022/04/09 15:43:41 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -244,14 +244,21 @@ typedef	struct sym {
 	int	s_block_level;	/* level of declaration, -1 if not in symbol
 				   table */
 	type_t	*s_type;
-	val_t	s_value;	/* value (if enum or bool constant) */
 	union {
-		/* XXX: what is the difference to s_type->t_str? */
-		struct_or_union	*s_sou_type;
-		tspec_t	s_tspec;	/* type (only for keywords) */
-		tqual_t	s_qualifier;	/* qualifier (only for keywords) */
-		struct	sym *s_old_style_args; /* arguments in old style
-				 	* function definitions */
+		bool s_bool_constant;
+		int s_enum_constant;	/* XXX: should be TARG_INT */
+		struct {
+			/* XXX: what is the difference to s_type->t_str? */
+			struct_or_union	*sm_sou_type;
+			unsigned int sm_offset_in_bits;
+		} s_member;
+		struct {
+			int sk_token;
+			tspec_t	sk_tspec;	/* only for types */
+			tqual_t	sk_qualifier;	/* only for qualifiers */
+		} s_keyword;
+		struct	sym *s_old_style_args;	/* arguments in an old-style
+						 * function definition */
 	} u;
 	struct	sym *s_symtab_next;	/* next symbol with same hash value */
 	struct	sym **s_symtab_ref;	/* pointer to s_symtab_next of the
@@ -342,7 +349,7 @@ typedef	struct dinfo {
 	type_t	*d_type;	/* after end_type() pointer to the type used
 				   for all declarators */
 	sym_t	*d_redeclared_symbol;
-	unsigned int d_offset;	/* offset of next structure member */
+	unsigned int d_offset;	/* offset of next structure member in bits */
 	unsigned short d_sou_align_in_bits; /* alignment required for current
 				 * structure */
 	scl_t	d_ctx;		/* context of declaration */

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.421 src/usr.bin/xlint/lint1/tree.c:1.422
--- src/usr.bin/xlint/lint1/tree.c:1.421	Sat Apr  9 14:50:18 2022
+++ src/usr.bin/xlint/lint1/tree.c	Sat Apr  9 15:43:41 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.421 2022/04/09 14:50:18 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.422 2022/04/09 15:43:41 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.421 2022/04/09 14:50:18 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.422 2022/04/09 15:43:41 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -279,10 +279,16 @@ build_name(sym_t *sym, bool is_funcname)
 
 	n = expr_alloc_tnode();
 	n->tn_type = sym->s_type;
-	if (sym->s_scl == BOOL_CONST || sym->s_scl == ENUM_CONST) {
+	if (sym->s_scl == BOOL_CONST) {
 		n->tn_op = CON;
 		n->tn_val = expr_zero_alloc(sizeof(*n->tn_val));
-		*n->tn_val = sym->s_value;
+		n->tn_val->v_tspec = BOOL;
+		n->tn_val->v_quad = sym->u.s_bool_constant ? 1 : 0;
+	} else if (sym->s_scl == ENUM_CONST) {
+		n->tn_op = CON;
+		n->tn_val = expr_zero_alloc(sizeof(*n->tn_val));
+		n->tn_val->v_tspec = INT;	/* ENUM is in n->tn_type */
+		n->tn_val->v_quad = sym->u.s_enum_constant;
 	} else {
 		n->tn_op = NAME;
 		n->tn_sym = sym;
@@ -350,11 +356,16 @@ struct_or_union_member(tnode_t *tn, op_t
 		rmsym(msym);
 		msym->s_kind = FMEMBER;
 		msym->s_scl = MOS;
-		msym->u.s_sou_type = expr_zero_alloc(sizeof(*msym->u.s_sou_type));
-		msym->u.s_sou_type->sou_tag = expr_zero_alloc(
-		    sizeof(*msym->u.s_sou_type->sou_tag));
-		msym->u.s_sou_type->sou_tag->s_name = unnamed;
-		msym->s_value.v_tspec = INT;
+
+		struct_or_union *sou = expr_zero_alloc(sizeof(*sou));
+		sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag));
+		sou->sou_tag->s_name = unnamed;
+
+		msym->u.s_member.sm_sou_type = sou;
+		/*
+		 * The member sm_offset_in_bits is not needed here since this
+		 * symbol can only be used for error reporting.
+		 */
 		return msym;
 	}
 
@@ -377,7 +388,7 @@ struct_or_union_member(tnode_t *tn, op_t
 		for (sym = msym; sym != NULL; sym = sym->s_symtab_next) {
 			if (sym->s_scl != MOS && sym->s_scl != MOU)
 				continue;
-			if (sym->u.s_sou_type != str)
+			if (sym->u.s_member.sm_sou_type != str)
 				continue;
 			if (strcmp(sym->s_name, msym->s_name) != 0)
 				continue;
@@ -403,7 +414,8 @@ struct_or_union_member(tnode_t *tn, op_t
 				continue;
 			if (strcmp(csym->s_name, sym->s_name) != 0)
 				continue;
-			if (csym->s_value.v_quad != sym->s_value.v_quad) {
+			if (csym->u.s_member.sm_offset_in_bits !=
+			    sym->u.s_member.sm_offset_in_bits) {
 				eq = false;
 				break;
 			}
@@ -1793,10 +1805,10 @@ check_enum_array_index(const tnode_t *ln
 	max_ec = ec;
 	lint_assert(ec != NULL);
 	for (ec = ec->s_next; ec != NULL; ec = ec->s_next)
-		if (ec->s_value.v_quad > max_ec->s_value.v_quad)
+		if (ec->u.s_enum_constant > max_ec->u.s_enum_constant)
 			max_ec = ec;
 
-	max_enum_value = max_ec->s_value.v_quad;
+	max_enum_value = max_ec->u.s_enum_constant;
 	lint_assert(INT_MIN <= max_enum_value && max_enum_value <= INT_MAX);
 
 	max_array_index = lt->t_dim - 1;
@@ -2764,7 +2776,6 @@ build_struct_access(op_t op, bool sys, t
 	bool	nolval;
 
 	lint_assert(rn->tn_op == NAME);
-	lint_assert(rn->tn_sym->s_value.v_tspec == INT);
 	lint_assert(rn->tn_sym->s_scl == MOS || rn->tn_sym->s_scl == MOU);
 
 	/*
@@ -2782,7 +2793,7 @@ build_struct_access(op_t op, bool sys, t
 	}
 
 	ctn = build_integer_constant(PTRDIFF_TSPEC,
-	    rn->tn_sym->s_value.v_quad / CHAR_SIZE);
+	    rn->tn_sym->u.s_member.sm_offset_in_bits / CHAR_SIZE);
 
 	ntn = new_tnode(PLUS, sys, expr_derive_type(rn->tn_type, PTR),
 	    ln, ctn);

Reply via email to