Module Name: src
Committed By: rillig
Date: Wed May 1 07:40:11 UTC 2024
Modified Files:
src/tests/usr.bin/xlint/lint1: expr_precedence.c
gcc_attribute_aligned.c
src/usr.bin/xlint/lint1: cgram.y debug.c decl.c externs1.h lint1.h
Log Message:
lint: support _Alignas and __attribute__((__aligned(4)))
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/tests/usr.bin/xlint/lint1/expr_precedence.c
cvs rdiff -u -r1.6 -r1.7 \
src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c
cvs rdiff -u -r1.493 -r1.494 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.75 -r1.76 src/usr.bin/xlint/lint1/debug.c
cvs rdiff -u -r1.398 -r1.399 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.222 -r1.223 src/usr.bin/xlint/lint1/externs1.h \
src/usr.bin/xlint/lint1/lint1.h
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/expr_precedence.c
diff -u src/tests/usr.bin/xlint/lint1/expr_precedence.c:1.11 src/tests/usr.bin/xlint/lint1/expr_precedence.c:1.12
--- src/tests/usr.bin/xlint/lint1/expr_precedence.c:1.11 Tue Mar 28 14:44:34 2023
+++ src/tests/usr.bin/xlint/lint1/expr_precedence.c Wed May 1 07:40:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: expr_precedence.c,v 1.11 2023/03/28 14:44:34 rillig Exp $ */
+/* $NetBSD: expr_precedence.c,v 1.12 2024/05/01 07:40:11 rillig Exp $ */
# 3 "expr_precedence.c"
/*
@@ -20,8 +20,9 @@ int init_error = 3, 4;
int init_syntactically_ok = var = 1 ? 2 : 3;
/*
- * The arguments of __attribute__ must be constant-expression, as assignments
- * don't make sense at that point.
+ * The arguments of __attribute__ must be constant-expression, but for
+ * simplicity of implementation, they are parsed just like function arguments,
+ * even though this allows assignment-expression.
*/
void __attribute__((format(printf,
/*
@@ -32,7 +33,6 @@ void __attribute__((format(printf,
*
* See lex.c, function 'search', keyword 'in_gcc_attribute'.
*/
- /* expect+1: error: syntax error '=' [249] */
var = 1,
/* Syntactically ok, must be a constant expression though. */
var > 0 ? 2 : 1)))
Index: src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c
diff -u src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c:1.6 src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c:1.7
--- src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c:1.6 Fri Jul 7 19:45:22 2023
+++ src/tests/usr.bin/xlint/lint1/gcc_attribute_aligned.c Wed May 1 07:40:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: gcc_attribute_aligned.c,v 1.6 2023/07/07 19:45:22 rillig Exp $ */
+/* $NetBSD: gcc_attribute_aligned.c,v 1.7 2024/05/01 07:40:11 rillig Exp $ */
# 3 "gcc_attribute_aligned.c"
/*
@@ -47,8 +47,8 @@ struct save87 {
struct fpacc87 s87_ac[8];
};
-/* FIXME: @4 2 + @4 2 + @4 2 + @4 8 + @4 8 + @2 (8 * 10) == 108 */
-/* expect+1: error: negative array dimension (-104) [20] */
+/* @4 2 + @4 2 + @4 2 + @4 8 + @4 8 + @2 (8 * 10) == 108 */
+/* expect+1: error: negative array dimension (-108) [20] */
typedef int sizeof_save87[-(int)sizeof(struct save87)];
@@ -69,7 +69,6 @@ aligned_struct_member(void)
*
* https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html
*/
- /* TODO: should be -32 instead of -8. */
- /* expect+1: error: negative array dimension (-8) [20] */
+ /* expect+1: error: negative array dimension (-32) [20] */
typedef int ctassert[-(int)sizeof(struct aligned)];
}
Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.493 src/usr.bin/xlint/lint1/cgram.y:1.494
--- src/usr.bin/xlint/lint1/cgram.y:1.493 Fri Mar 29 08:35:32 2024
+++ src/usr.bin/xlint/lint1/cgram.y Wed May 1 07:40:11 2024
@@ -1,5 +1,5 @@
%{
-/* $NetBSD: cgram.y,v 1.493 2024/03/29 08:35:32 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.494 2024/05/01 07:40:11 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.493 2024/03/29 08:35:32 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.494 2024/05/01 07:40:11 rillig Exp $");
#endif
#include <limits.h>
@@ -423,7 +423,6 @@ is_either(const char *s, const char *a,
/* No type for gcc_attribute_specifier. */
/* No type for gcc_attribute_list. */
/* No type for gcc_attribute. */
-/* No type for gcc_attribute_parameters. */
%type <y_in_system_header> sys
%%
@@ -937,8 +936,12 @@ type_attribute_opt:
type_attribute: /* See C11 6.7 declaration-specifiers */
gcc_attribute_specifier
-| T_ALIGNAS T_LPAREN type_specifier T_RPAREN /* C11 6.7.5 */
-| T_ALIGNAS T_LPAREN constant_expression T_RPAREN /* C11 6.7.5 */
+| T_ALIGNAS T_LPAREN type_specifier T_RPAREN { /* C11 6.7.5 */
+ dcs_add_alignas(build_sizeof($3));
+ }
+| T_ALIGNAS T_LPAREN constant_expression T_RPAREN { /* C11 6.7.5 */
+ dcs_add_alignas($3);
+ }
| T_PACKED {
dcs_add_packed();
}
@@ -2197,18 +2200,18 @@ gcc_attribute:
suppress_fallthrough = true;
}
| T_NAME T_LPAREN T_RPAREN
-| T_NAME T_LPAREN gcc_attribute_parameters T_RPAREN
+| T_NAME T_LPAREN argument_expression_list T_RPAREN {
+ const char *name = $1->sb_name;
+ if (is_either(name, "aligned", "__aligned__")
+ && $3->args_len == 1)
+ dcs_add_alignas($3->args[0]);
+ }
| type_qualifier {
if (!$1.tq_const)
yyerror("Bad attribute");
}
;
-gcc_attribute_parameters:
- constant_expression
-| gcc_attribute_parameters T_COMMA constant_expression
-;
-
sys:
/* empty */ {
$$ = in_system_header;
Index: src/usr.bin/xlint/lint1/debug.c
diff -u src/usr.bin/xlint/lint1/debug.c:1.75 src/usr.bin/xlint/lint1/debug.c:1.76
--- src/usr.bin/xlint/lint1/debug.c:1.75 Sun Mar 31 20:28:45 2024
+++ src/usr.bin/xlint/lint1/debug.c Wed May 1 07:40:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: debug.c,v 1.75 2024/03/31 20:28:45 rillig Exp $ */
+/* $NetBSD: debug.c,v 1.76 2024/05/01 07:40:11 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.75 2024/03/31 20:28:45 rillig Exp $");
+__RCSID("$NetBSD: debug.c,v 1.76 2024/05/01 07:40:11 rillig Exp $");
#endif
#include <stdlib.h>
@@ -461,7 +461,9 @@ debug_decl_level(const decl_level *dl)
if (dl->d_sou_size_in_bits != 0)
debug_printf(" size=%u", dl->d_sou_size_in_bits);
if (dl->d_sou_align_in_bits != 0)
- debug_printf(" align=%u", dl->d_sou_align_in_bits);
+ debug_printf(" sou_align=%u", dl->d_sou_align_in_bits);
+ if (dl->d_mem_align_in_bits != 0)
+ debug_printf(" mem_align=%u", dl->d_mem_align_in_bits);
debug_word(dl->d_qual.tq_const, "const");
debug_word(dl->d_qual.tq_restrict, "restrict");
Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.398 src/usr.bin/xlint/lint1/decl.c:1.399
--- src/usr.bin/xlint/lint1/decl.c:1.398 Sat Mar 30 19:51:00 2024
+++ src/usr.bin/xlint/lint1/decl.c Wed May 1 07:40:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.398 2024/03/30 19:51:00 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.399 2024/05/01 07:40:11 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.398 2024/03/30 19:51:00 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.399 2024/05/01 07:40:11 rillig Exp $");
#endif
#include <sys/param.h>
@@ -460,6 +460,12 @@ pack_struct_or_union(type_t *tp)
}
void
+dcs_add_alignas(tnode_t *tn)
+{
+ dcs->d_mem_align_in_bits = to_int_constant(tn, true) * CHAR_SIZE;
+}
+
+void
dcs_add_packed(void)
{
if (dcs->d_type == NULL)
@@ -1038,7 +1044,9 @@ dcs_add_member(sym_t *mem)
- mem->u.s_member.sm_offset_in_bits;
dcs->d_sou_size_in_bits += tp->t_bit_field_width;
} else {
- dcs_align(alignment_in_bits(tp), 0);
+ unsigned int align_in_bits = dcs->d_mem_align_in_bits > 0
+ ? dcs->d_mem_align_in_bits : alignment_in_bits(tp);
+ dcs_align(align_in_bits, 0);
mem->u.s_member.sm_offset_in_bits = dcs->d_sou_size_in_bits;
dcs->d_sou_size_in_bits += type_size_in_bits(tp);
}
Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.222 src/usr.bin/xlint/lint1/externs1.h:1.223
--- src/usr.bin/xlint/lint1/externs1.h:1.222 Fri Apr 12 05:44:38 2024
+++ src/usr.bin/xlint/lint1/externs1.h Wed May 1 07:40:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: externs1.h,v 1.222 2024/04/12 05:44:38 rillig Exp $ */
+/* $NetBSD: externs1.h,v 1.223 2024/05/01 07:40:11 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -215,6 +215,7 @@ void dcs_add_function_specifier(function
void dcs_add_storage_class(scl_t);
void dcs_add_type(type_t *);
void dcs_add_qualifiers(type_qualifiers);
+void dcs_add_alignas(tnode_t *);
void dcs_add_packed(void);
void dcs_set_used(void);
void begin_declaration_level(decl_level_kind);
Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.222 src/usr.bin/xlint/lint1/lint1.h:1.223
--- src/usr.bin/xlint/lint1/lint1.h:1.222 Sun Mar 31 20:28:45 2024
+++ src/usr.bin/xlint/lint1/lint1.h Wed May 1 07:40:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.222 2024/03/31 20:28:45 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.223 2024/05/01 07:40:11 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -342,6 +342,8 @@ typedef struct decl_level {
* trailing padding */
unsigned int d_sou_align_in_bits; /* alignment of the structure
* or union being built */
+ unsigned int d_mem_align_in_bits; /* alignment of the structure
+ * or union member */
type_qualifiers d_qual; /* in declaration specifiers */
bool d_inline:1; /* inline in declaration specifiers */
bool d_multiple_storage_classes:1; /* reported in dcs_end_type */