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;