Module Name:    src
Committed By:   rillig
Date:           Fri Jun 30 14:39:24 UTC 2023

Modified Files:
        src/usr.bin/xlint/lint1: debug.c decl.c

Log Message:
lint: clean up packing of structs and unions

No functional change outside debug mode.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/usr.bin/xlint/lint1/debug.c
cvs rdiff -u -r1.324 -r1.325 src/usr.bin/xlint/lint1/decl.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/debug.c
diff -u src/usr.bin/xlint/lint1/debug.c:1.37 src/usr.bin/xlint/lint1/debug.c:1.38
--- src/usr.bin/xlint/lint1/debug.c:1.37	Thu Jun 29 22:52:44 2023
+++ src/usr.bin/xlint/lint1/debug.c	Fri Jun 30 14:39:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.c,v 1.37 2023/06/29 22:52:44 rillig Exp $ */
+/* $NetBSD: debug.c,v 1.38 2023/06/30 14:39:23 rillig Exp $ */
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: debug.c,v 1.37 2023/06/29 22:52:44 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.38 2023/06/30 14:39:23 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -125,6 +125,11 @@ debug_type_details(const type_t *tp)
 
 	if (is_struct_or_union(tp->t_tspec)) {
 		debug_indent_inc();
+		debug_step("size %u bits, align %u bits, %s",
+		    tp->t_sou->sou_size_in_bits,
+		    (unsigned int)tp->t_sou->sou_align_in_bits,
+		    tp->t_sou->sou_incomplete ? "incomplete" : "complete");
+
 		for (const sym_t *mem = tp->t_sou->sou_first_member;
 		     mem != NULL; mem = mem->s_next) {
 			debug_sym("", mem, "\n");

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.324 src/usr.bin/xlint/lint1/decl.c:1.325
--- src/usr.bin/xlint/lint1/decl.c:1.324	Fri Jun 30 07:18:02 2023
+++ src/usr.bin/xlint/lint1/decl.c	Fri Jun 30 14:39:23 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.324 2023/06/30 07:18:02 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.325 2023/06/30 14:39:23 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.324 2023/06/30 07:18:02 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.325 2023/06/30 14:39:23 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -471,37 +471,31 @@ bit_field_width(sym_t **mem)
 }
 
 static void
-set_packed_size(type_t *tp)
+pack_struct_or_union(type_t *tp)
 {
-	struct_or_union *sp;
-	sym_t *mem;
 
-	switch (tp->t_tspec) {
-	case STRUCT:
-	case UNION:
-		sp = tp->t_sou;
-		sp->sou_size_in_bits = 0;
-		for (mem = sp->sou_first_member;
-		     mem != NULL; mem = mem->s_next) {
-			unsigned int x;
-
-			if (mem->s_type->t_bitfield) {
-				sp->sou_size_in_bits += bit_field_width(&mem);
-				if (mem == NULL)
-					break;
-			}
-			x = type_size_in_bits(mem->s_type);
-			if (tp->t_tspec == STRUCT)
-				sp->sou_size_in_bits += x;
-			else if (x > sp->sou_size_in_bits)
-				sp->sou_size_in_bits = x;
-		}
-		break;
-	default:
+	if (!is_struct_or_union(tp->t_tspec)) {
 		/* attribute '%s' ignored for '%s' */
 		warning(326, "packed", type_name(tp));
-		break;
+		return;
+	}
+
+	unsigned int bits = 0;
+	for (sym_t *mem = tp->t_sou->sou_first_member;
+	     mem != NULL; mem = mem->s_next) {
+		// TODO: Maybe update mem->u.s_member.sm_offset_in_bits.
+		if (mem->s_type->t_bitfield) {
+			bits += bit_field_width(&mem);
+			if (mem == NULL)
+				break;
+		}
+		unsigned int mem_bits = type_size_in_bits(mem->s_type);
+		if (tp->t_tspec == STRUCT)
+			bits += mem_bits;
+		else if (mem_bits > bits)
+			bits = mem_bits;
 	}
+	tp->t_sou->sou_size_in_bits = bits;
 }
 
 void
@@ -510,7 +504,7 @@ dcs_add_packed(void)
 	if (dcs->d_type == NULL)
 		dcs->d_packed = true;
 	else
-		set_packed_size(dcs->d_type);
+		pack_struct_or_union(dcs->d_type);
 }
 
 void
@@ -1792,7 +1786,7 @@ complete_struct_or_union(sym_t *first_me
 	sp->sou_incomplete = false;
 	sp->sou_first_member = first_member;
 	if (tp->t_packed)
-		set_packed_size(tp);
+		pack_struct_or_union(tp);
 	else
 		sp->sou_size_in_bits = dcs->d_offset_in_bits;
 

Reply via email to