Module Name: src
Committed By: rillig
Date: Wed May 1 10:30:56 UTC 2024
Modified Files:
src/tests/usr.bin/xlint/lint1: gcc_attribute_aligned.c
src/usr.bin/xlint/lint1: decl.c
Log Message:
lint: fix size of struct with large alignment
Lint now successfully passes all compile-time assertions in the amd64
kernel that deal with struct sizes.
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 \
src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c
cvs rdiff -u -r1.399 -r1.400 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/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c
diff -u src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c:1.7 src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c:1.8
--- src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c:1.7 Wed May 1 07:40:11 2024
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c Wed May 1 10:30:56 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_aligned.c,v 1.7 2024/05/01 07:40:11 rillig Exp $ */
+/* $NetBSD: gcc_attribute_aligned.c,v 1.8 2024/05/01 10:30:56 rillig Exp $ */
# 3 "gcc_attribute_aligned.c"
/*
@@ -72,3 +72,13 @@ aligned_struct_member(void)
/* expect+1: error: negative array dimension (-32) [20] */
typedef int ctassert[-(int)sizeof(struct aligned)];
}
+
+void
+alignment_larger_than_size(void)
+{
+ struct s {
+ unsigned u32 __attribute__((__aligned__(32)));
+ } _Alignas(4096);
+ /* expect+1: error: negative array dimension (-4096) [20] */
+ typedef int size[-(int)sizeof(struct s)];
+}
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.399 src/usr.bin/xlint/lint1/decl.c:1.400
--- src/usr.bin/xlint/lint1/decl.c:1.399 Wed May 1 07:40:11 2024
+++ src/usr.bin/xlint/lint1/decl.c Wed May 1 10:30:56 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.399 2024/05/01 07:40:11 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.400 2024/05/01 10:30:56 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.399 2024/05/01 07:40:11 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.400 2024/05/01 10:30:56 rillig Exp $");
#endif
#include <sys/param.h>
@@ -463,6 +463,9 @@ void
dcs_add_alignas(tnode_t *tn)
{
dcs->d_mem_align_in_bits = to_int_constant(tn, true) * CHAR_SIZE;
+ if (dcs->d_type != NULL && is_struct_or_union(dcs->d_type->t_tspec))
+ dcs->d_type->u.sou->sou_align_in_bits =
+ dcs->d_mem_align_in_bits;
}
void
@@ -606,6 +609,7 @@ dcs_begin_type(void)
dcs->d_redeclared_symbol = NULL;
// keep d_sou_size_in_bits
// keep d_sou_align_in_bits
+ dcs->d_mem_align_in_bits = 0;
dcs->d_qual = (type_qualifiers) { .tq_const = false };
dcs->d_inline = false;
dcs->d_multiple_storage_classes = false;
@@ -707,6 +711,8 @@ dcs_merge_declaration_specifiers(void)
debug_dcs();
}
+static void dcs_align(unsigned int, unsigned int);
+
/* Create a type in 'dcs->d_type' from the information gathered in 'dcs'. */
void
dcs_end_type(void)
@@ -741,6 +747,14 @@ dcs_end_type(void)
dcs->d_type->t_const |= dcs->d_qual.tq_const;
dcs->d_type->t_volatile |= dcs->d_qual.tq_volatile;
}
+ unsigned align = dcs->d_mem_align_in_bits;
+ if (align > 0 && dcs->d_type->t_tspec == STRUCT) {
+ dcs_align(align, 0);
+ dcs->d_type->u.sou->sou_align_in_bits = align;
+ dcs->d_type->u.sou->sou_size_in_bits =
+ (dcs->d_type->u.sou->sou_size_in_bits + align - 1)
+ & -align;
+ }
debug_dcs();
debug_leave();
@@ -814,7 +828,6 @@ alignment_in_bits(const type_t *tp)
a = worst_align_in_bits;
}
lint_assert(a >= CHAR_SIZE);
- lint_assert(a <= worst_align_in_bits);
return a;
}