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