Module Name: src Committed By: rillig Date: Thu Feb 20 20:33:10 UTC 2025
Modified Files: src/tests/usr.bin/xlint/lint1: msg_267.c src/usr.bin/xlint/lint1: cgram.y debug.c lint1.h Log Message: lint: support __attribute__((__mode__(TI))) This fixes the wrong lint warnings about the shift amount being greater than the type size in compiler_rt/popcountti2.c. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/msg_267.c cvs rdiff -u -r1.517 -r1.518 src/usr.bin/xlint/lint1/cgram.y cvs rdiff -u -r1.82 -r1.83 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.232 -r1.233 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/msg_267.c diff -u src/tests/usr.bin/xlint/lint1/msg_267.c:1.8 src/tests/usr.bin/xlint/lint1/msg_267.c:1.9 --- src/tests/usr.bin/xlint/lint1/msg_267.c:1.8 Tue Mar 12 07:56:08 2024 +++ src/tests/usr.bin/xlint/lint1/msg_267.c Thu Feb 20 20:33:10 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: msg_267.c,v 1.8 2024/03/12 07:56:08 rillig Exp $ */ +/* $NetBSD: msg_267.c,v 1.9 2025/02/20 20:33:10 rillig Exp $ */ # 3 "msg_267.c" // Test for message: shift amount %u equals bit-size of '%s' [267] @@ -20,15 +20,11 @@ shl32(unsigned int x) } /* - * As of 2022-08-19, lint ignores the GCC-specific 'mode' attribute, treating - * the tetra-int as a plain single-int, thus having width 32. - * * https://gcc.gnu.org/onlinedocs/gccint/Machine-Modes.html */ unsigned function(unsigned __attribute__((mode(TI))) arg) { - /* expect+1: warning: shift amount 32 equals bit-size of 'unsigned int' [267] */ return (arg >> 32) & 3; } Index: src/usr.bin/xlint/lint1/cgram.y diff -u src/usr.bin/xlint/lint1/cgram.y:1.517 src/usr.bin/xlint/lint1/cgram.y:1.518 --- src/usr.bin/xlint/lint1/cgram.y:1.517 Fri Jan 3 03:14:47 2025 +++ src/usr.bin/xlint/lint1/cgram.y Thu Feb 20 20:33:10 2025 @@ -1,5 +1,5 @@ %{ -/* $NetBSD: cgram.y,v 1.517 2025/01/03 03:14:47 rillig Exp $ */ +/* $NetBSD: cgram.y,v 1.518 2025/02/20 20:33:10 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.517 2025/01/03 03:14:47 rillig Exp $"); +__RCSID("$NetBSD: cgram.y,v 1.518 2025/02/20 20:33:10 rillig Exp $"); #endif #include <limits.h> @@ -1033,6 +1033,18 @@ declmod: dcs_set_used(); if ($1.noreturn) dcs->d_noreturn = true; + if ($1.bit_width == 128) { +#ifdef INT128_SIZE + dcs->d_abstract_type = dcs->d_sign_mod == UNSIGN + ? UINT128 : INT128; + dcs->d_sign_mod = NO_TSPEC; +#else + /* Get as close as possible. */ + dcs->d_rank_mod = LLONG; +#endif + } + if ($1.bit_width == 64) + dcs->d_rank_mod = LLONG; } ; @@ -2550,6 +2562,15 @@ gcc_attribute: && $3->args_len == 1) dcs_add_alignas($3->args[0]); $$ = (type_attributes){ .used = false }; + if (is_either(name, "mode", "__mode__") + && $3->args_len == 1 + && $3->args[0]->tn_op == NAME) { + const char *arg_name = $3->args[0]->u.sym->s_name; + if (strcmp(arg_name, "TI") == 0) + $$.bit_width = 128; + if (strcmp(arg_name, "DI") == 0) + $$.bit_width = 64; + } } | type_qualifier { if (!$1.tq_const) Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.82 src/usr.bin/xlint/lint1/debug.c:1.83 --- src/usr.bin/xlint/lint1/debug.c:1.82 Wed Nov 13 03:43:00 2024 +++ src/usr.bin/xlint/lint1/debug.c Thu Feb 20 20:33:10 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.82 2024/11/13 03:43:00 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.83 2025/02/20 20:33:10 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.82 2024/11/13 03:43:00 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.83 2025/02/20 20:33:10 rillig Exp $"); #endif #include <stdlib.h> @@ -359,9 +359,11 @@ type_attributes_string(type_attributes a { static char buf[32]; - snprintf(buf, sizeof(buf), "%s%s", + snprintf(buf, sizeof(buf), "%s%s%s", attrs.used ? " used" : "", - attrs.noreturn ? " noreturn" : ""); + attrs.noreturn ? " noreturn" : "", + attrs.bit_width == 128 ? " 128bit" : + attrs.bit_width == 64 ? " 64bit" : ""); return buf[0] != '\0' ? buf + 1 : "none"; } Index: src/usr.bin/xlint/lint1/lint1.h diff -u src/usr.bin/xlint/lint1/lint1.h:1.232 src/usr.bin/xlint/lint1/lint1.h:1.233 --- src/usr.bin/xlint/lint1/lint1.h:1.232 Fri Jan 3 03:14:47 2025 +++ src/usr.bin/xlint/lint1/lint1.h Thu Feb 20 20:33:10 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: lint1.h,v 1.232 2025/01/03 03:14:47 rillig Exp $ */ +/* $NetBSD: lint1.h,v 1.233 2025/02/20 20:33:10 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -81,6 +81,7 @@ typedef struct { typedef struct { bool used; bool noreturn; + unsigned bit_width; } type_attributes; /* A bool, integer or floating-point value. */