Module Name:    src
Committed By:   rillig
Date:           Thu Jun 29 12:52:07 UTC 2023

Modified Files:
        src/usr.bin/xlint/common: tyname.c
        src/usr.bin/xlint/lint1: decl.c lint1.h tree.c

Log Message:
lint: use standard terminology for bit-field width

No functional change.


To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/usr.bin/xlint/common/tyname.c
cvs rdiff -u -r1.321 -r1.322 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.168 -r1.169 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.531 -r1.532 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/common/tyname.c
diff -u src/usr.bin/xlint/common/tyname.c:1.55 src/usr.bin/xlint/common/tyname.c:1.56
--- src/usr.bin/xlint/common/tyname.c:1.55	Sat Apr 22 17:49:14 2023
+++ src/usr.bin/xlint/common/tyname.c	Thu Jun 29 12:52:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tyname.c,v 1.55 2023/04/22 17:49:14 rillig Exp $	*/
+/*	$NetBSD: tyname.c,v 1.56 2023/06/29 12:52:06 rillig Exp $	*/
 
 /*-
  * Copyright (c) 2005 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: tyname.c,v 1.55 2023/04/22 17:49:14 rillig Exp $");
+__RCSID("$NetBSD: tyname.c,v 1.56 2023/06/29 12:52:06 rillig Exp $");
 #endif
 
 #include <assert.h>
@@ -263,7 +263,7 @@ type_name(const type_t *tp)
 #ifdef IS_LINT1
 	if (tp->t_bitfield) {
 		buf_add(&buf, ":");
-		buf_add_int(&buf, (int)tp->t_flen);
+		buf_add_int(&buf, (int)tp->t_bit_field_width);
 	}
 #endif
 

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.321 src/usr.bin/xlint/lint1/decl.c:1.322
--- src/usr.bin/xlint/lint1/decl.c:1.321	Thu Jun 29 10:31:33 2023
+++ src/usr.bin/xlint/lint1/decl.c	Thu Jun 29 12:52:06 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.321 2023/06/29 10:31:33 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.322 2023/06/29 12:52:06 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.321 2023/06/29 10:31:33 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.322 2023/06/29 12:52:06 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -456,14 +456,16 @@ set_first_typedef(type_t *tp, sym_t *sym
 }
 
 static unsigned int
-bit_field_size(sym_t **mem)
+bit_field_width(sym_t **mem)
 {
-	unsigned int len = (*mem)->s_type->t_flen;
+	unsigned int width = (*mem)->s_type->t_bit_field_width;
 	while (*mem != NULL && (*mem)->s_type->t_bitfield) {
-		len += (*mem)->s_type->t_flen;
+		width += (*mem)->s_type->t_bit_field_width;
 		*mem = (*mem)->s_next;
 	}
-	return len - len % INT_SIZE;
+	// XXX: Why INT_SIZE? C99 6.7.2.1p4 allows bit-fields to have type
+	// XXX: _Bool or another implementation-defined type.
+	return width - width % INT_SIZE;
 }
 
 static void
@@ -482,7 +484,7 @@ set_packed_size(type_t *tp)
 			unsigned int x;
 
 			if (mem->s_type->t_bitfield) {
-				sp->sou_size_in_bits += bit_field_size(&mem);
+				sp->sou_size_in_bits += bit_field_width(&mem);
 				if (mem == NULL)
 					break;
 			}
@@ -1047,10 +1049,11 @@ check_bit_field_type(sym_t *dsym, type_t
 		/* illegal bit-field type '%s' */
 		warning(35, type_name(btp));
 
-		unsigned int sz = tp->t_flen;
+		// XXX: What about _Bool bit-fields since C99 6.7.2.1?
+		unsigned int width = tp->t_bit_field_width;
 		dsym->s_type = tp = block_dup_type(gettyp(t = INT));
-		if ((tp->t_flen = sz) > size_in_bits(t))
-			tp->t_flen = size_in_bits(t);
+		if ((tp->t_bit_field_width = width) > size_in_bits(t))
+			tp->t_bit_field_width = size_in_bits(t);
 		*inout_t = t;
 		*inout_tp = tp;
 	}
@@ -1059,21 +1062,20 @@ check_bit_field_type(sym_t *dsym, type_t
 static void
 declare_bit_field(sym_t *dsym, tspec_t *inout_t, type_t **const inout_tp)
 {
-	type_t *tp;
-	tspec_t t;
 
 	check_bit_field_type(dsym, inout_tp, inout_t);
 
-	tp = *inout_tp;
-	t = *inout_t;
-	if (tp->t_flen > size_in_bits(t)) {
+	type_t *tp = *inout_tp;
+	tspec_t t = *inout_t;
+	unsigned int t_width = size_in_bits(t);
+	if (tp->t_bit_field_width > t_width) {
 		/* illegal bit-field size: %d */
-		error(36, tp->t_flen);
-		tp->t_flen = size_in_bits(t);
-	} else if (tp->t_flen == 0 && dsym->s_name != unnamed) {
+		error(36, (int)tp->t_bit_field_width);
+		tp->t_bit_field_width = t_width;
+	} else if (tp->t_bit_field_width == 0 && dsym->s_name != unnamed) {
 		/* zero size bit-field */
 		error(37);
-		tp->t_flen = size_in_bits(t);
+		tp->t_bit_field_width = t_width;
 	}
 	if (dsym->s_scl == UNION_MEMBER) {
 		/* bit-field in union is very unusual */
@@ -1133,12 +1135,12 @@ declare_member(sym_t *dsym)
 		dcs->d_offset_in_bits = 0;
 	}
 	if (dsym->s_bitfield) {
-		dcs_align(alignment_in_bits(tp), tp->t_flen);
+		dcs_align(alignment_in_bits(tp), tp->t_bit_field_width);
 		dsym->u.s_member.sm_offset_in_bits = dcs->d_offset_in_bits -
 		    dcs->d_offset_in_bits % size_in_bits(t);
-		tp->t_foffs = dcs->d_offset_in_bits -
+		tp->t_bit_field_offset = dcs->d_offset_in_bits -
 		    dsym->u.s_member.sm_offset_in_bits;
-		dcs->d_offset_in_bits += tp->t_flen;
+		dcs->d_offset_in_bits += tp->t_bit_field_width;
 	} else {
 		dcs_align(alignment_in_bits(tp), 0);
 		dsym->u.s_member.sm_offset_in_bits = dcs->d_offset_in_bits;
@@ -1158,34 +1160,23 @@ declare_member(sym_t *dsym)
 	return dsym;
 }
 
-/*
- * Aligns the next structure element as required.
- *
- * al contains the required alignment, len the length of a bit-field.
- */
+/* Aligns the next structure element as required. */
 static void
-dcs_align(unsigned int al, unsigned int len)
+dcs_align(unsigned int member_alignment, unsigned int bit_field_width)
 {
-	unsigned int no;
 
-	/*
-	 * The alignment of the current element becomes the alignment of
-	 * the struct/union if it is larger than the current alignment
-	 * of the struct/union.
-	 */
-	if (al > dcs->d_sou_align_in_bits)
-		dcs->d_sou_align_in_bits = al;
+	if (member_alignment > dcs->d_sou_align_in_bits)
+		dcs->d_sou_align_in_bits = member_alignment;
 
-	no = (dcs->d_offset_in_bits + (al - 1)) & ~(al - 1);
-	if (len == 0 || dcs->d_offset_in_bits + len > no)
-		dcs->d_offset_in_bits = no;
+	unsigned int offset = (dcs->d_offset_in_bits + member_alignment - 1)
+	    & ~(member_alignment - 1);
+	if (bit_field_width == 0
+	    || dcs->d_offset_in_bits + bit_field_width > offset)
+		dcs->d_offset_in_bits = offset;
 }
 
-/*
- * Remember the width of the field in its type structure.
- */
 sym_t *
-set_bit_field_width(sym_t *dsym, int len)
+set_bit_field_width(sym_t *dsym, int bit_field_width)
 {
 
 	if (dsym == NULL) {
@@ -1198,7 +1189,7 @@ set_bit_field_width(sym_t *dsym, int len
 	}
 	dsym->s_type = block_dup_type(dsym->s_type);
 	dsym->s_type->t_bitfield = true;
-	dsym->s_type->t_flen = len;
+	dsym->s_type->t_bit_field_width = bit_field_width;
 	dsym->s_bitfield = true;
 	return dsym;
 }
@@ -1814,7 +1805,7 @@ complete_struct_or_union(sym_t *first_me
 		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 += bit_field_size(&mem);
+				sp->sou_size_in_bits += bit_field_width(&mem);
 				if (mem == NULL)
 					break;
 			}

Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.168 src/usr.bin/xlint/lint1/lint1.h:1.169
--- src/usr.bin/xlint/lint1/lint1.h:1.168	Thu Jun 29 05:47:41 2023
+++ src/usr.bin/xlint/lint1/lint1.h	Thu Jun 29 12:52:06 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.168 2023/06/29 05:47:41 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.169 2023/06/29 12:52:06 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -179,21 +179,17 @@ struct lint1_type {
 		enumeration	*_t_enum;
 		struct	sym *_t_args;	/* arguments (if t_proto) */
 	} t_u;
-	struct {
-		unsigned int	_t_flen:8;	/* length of bit-field */
-		unsigned int	_t_foffs:24;	/* offset of bit-field */
-	} t_b;
-	struct	lint1_type *t_subt; /* element type (if ARRAY),
-				 * return value (if FUNC),
-				 * target type (if PTR) */
+	unsigned int	t_bit_field_width:8;
+	unsigned int	t_bit_field_offset:24;
+	struct	lint1_type *t_subt;	/* element type (if ARRAY),
+					 * return value (if FUNC),
+					 * target type (if PTR) */
 };
 
 #define	t_dim	t_u._t_dim
 #define	t_sou	t_u._t_sou
 #define	t_enum	t_u._t_enum
 #define	t_args	t_u._t_args
-#define	t_flen	t_b._t_flen
-#define	t_foffs	t_b._t_foffs
 
 /*
  * types of symbols

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.531 src/usr.bin/xlint/lint1/tree.c:1.532
--- src/usr.bin/xlint/lint1/tree.c:1.531	Sat Jun 24 20:50:54 2023
+++ src/usr.bin/xlint/lint1/tree.c	Thu Jun 29 12:52:06 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.531 2023/06/24 20:50:54 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.532 2023/06/29 12:52:06 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.531 2023/06/24 20:50:54 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.532 2023/06/29 12:52:06 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -93,7 +93,9 @@ width_in_bits(const type_t *tp)
 {
 
 	lint_assert(is_integer(tp->t_tspec));
-	return tp->t_bitfield ? tp->t_flen : size_in_bits(tp->t_tspec);
+	return tp->t_bitfield
+	    ? tp->t_bit_field_width
+	    : size_in_bits(tp->t_tspec);
 }
 
 static bool
@@ -1899,11 +1901,11 @@ all_members_compatible(const sym_t *msym
 			if (csym->s_bitfield != sym->s_bitfield)
 				return false;
 			if (csym->s_bitfield) {
-				type_t *tp1 = csym->s_type;
-				type_t *tp2 = sym->s_type;
-				if (tp1->t_flen != tp2->t_flen)
+				if (csym->s_type->t_bit_field_width
+				    != sym->s_type->t_bit_field_width)
 					return false;
-				if (tp1->t_foffs != tp2->t_foffs)
+				if (csym->s_type->t_bit_field_offset
+				    != sym->s_type->t_bit_field_offset)
 					return false;
 			}
 		}
@@ -3264,10 +3266,12 @@ static tspec_t
 promote_c90(const tnode_t *tn, tspec_t t, bool farg)
 {
 	if (tn->tn_type->t_bitfield) {
-		unsigned int len = tn->tn_type->t_flen;
-		if (len < size_in_bits(INT))
+		unsigned int width = tn->tn_type->t_bit_field_width;
+		unsigned int int_width = size_in_bits(INT);
+		// XXX: What about _Bool bit-fields, since C99?
+		if (width < int_width)
 			return INT;
-		if (len == size_in_bits(INT))
+		if (width == int_width)
 			return is_uinteger(t) ? UINT : INT;
 		return t;
 	}
@@ -3912,7 +3916,7 @@ convert_constant_check_range(tspec_t ot,
 	uint64_t xmask, xmsk1;
 
 	obitsz = size_in_bits(ot);
-	nbitsz = tp->t_bitfield ? tp->t_flen : size_in_bits(nt);
+	nbitsz = tp->t_bitfield ? tp->t_bit_field_width : size_in_bits(nt);
 	xmask = value_bits(nbitsz) ^ value_bits(obitsz);
 	xmsk1 = value_bits(nbitsz) ^ value_bits(obitsz - 1);
 	/*
@@ -3982,7 +3986,7 @@ convert_constant(op_t op, int arg, const
 
 	if (is_integer(nt)) {
 		nv->v_quad = convert_integer(nv->v_quad, nt,
-		    tp->t_bitfield ? tp->t_flen : size_in_bits(nt));
+		    tp->t_bitfield ? tp->t_bit_field_width : size_in_bits(nt));
 	}
 
 	if (range_check && op != CVT)

Reply via email to