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);