Module Name: src Committed By: rillig Date: Sat Jul 31 19:52:44 UTC 2021
Modified Files: src/tests/usr.bin/xlint/lint1: op_shl_lp64.c op_shl_lp64.exp src/usr.bin/xlint/lint1: decl.c emit1.c lint1.h src/usr.bin/xlint/lint2: read.c Log Message: lint: improve support for __int128_t and __uint128_t For the .ln files, I chose the letter 'J' to represent the 128-bit integer types since it is close to 'I' for int. The naming of 'L' for 'long' is obvious, but 'Q' for 64-bit integers is a quad-16-bit word, which is an unusual measurement unit nowadays. One benefit of choosing 'J' is that the next letter, 'K' can then be used for 256-bit integer types. Support for 128-bit integer types is still very basic. Plus, it is only supported on LP64 platforms, which means that lint cannot be cross-compiled to check for an LP64 platform while running on an ILP32 platform. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/usr.bin/xlint/lint1/op_shl_lp64.c \ src/tests/usr.bin/xlint/lint1/op_shl_lp64.exp cvs rdiff -u -r1.214 -r1.215 src/usr.bin/xlint/lint1/decl.c cvs rdiff -u -r1.46 -r1.47 src/usr.bin/xlint/lint1/emit1.c cvs rdiff -u -r1.119 -r1.120 src/usr.bin/xlint/lint1/lint1.h cvs rdiff -u -r1.45 -r1.46 src/usr.bin/xlint/lint2/read.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/op_shl_lp64.c diff -u src/tests/usr.bin/xlint/lint1/op_shl_lp64.c:1.1 src/tests/usr.bin/xlint/lint1/op_shl_lp64.c:1.2 --- src/tests/usr.bin/xlint/lint1/op_shl_lp64.c:1.1 Sun Jul 4 20:22:31 2021 +++ src/tests/usr.bin/xlint/lint1/op_shl_lp64.c Sat Jul 31 19:52:44 2021 @@ -1,18 +1,25 @@ -/* $NetBSD: op_shl_lp64.c,v 1.1 2021/07/04 20:22:31 rillig Exp $ */ +/* $NetBSD: op_shl_lp64.c,v 1.2 2021/07/31 19:52:44 rillig Exp $ */ # 3 "op_shl_lp64.c" /* - * Test overflow on shl of 128-bit integers, as seen in - * ecp_nistp256.c(296). + * Before decl.c 1.215 from 2021-07-31, lint wrongly treated __uint128_t and + * __int128_t as being equivalent to a missing type specifier, thereby + * defaulting to int. This led to warnings like: + * + * shift amount 105 is greater than bit-size 32 of 'int' [122] + * + * These warnings had been discovered in ecp_nistp256.c(296). */ /* lint1-only-if lp64 */ const __uint128_t zero105 = - /* FIXME: 105 is ok for __uint128_t */ - /* expect+1: warning: shift amount 105 is greater than bit-size 32 of 'int' [122] */ (((__uint128_t)1) << 105) - /* FIXME: 41 is ok for __uint128_t */ - /* expect+1: warning: shift amount 41 is greater than bit-size 32 of 'int' [122] */ - (((__uint128_t)1) << 41) - (((__uint128_t)1) << 9); + +const __uint128_t shl_128_129 = + /* expect+1: warning: shift equal to size of object [267] */ + (((__uint128_t)1) << 128) + /* expect+1: warning: shift amount 129 is greater than bit-size 128 of '__uint128_t' [122] */ + - (((__uint128_t)1) << 129); Index: src/tests/usr.bin/xlint/lint1/op_shl_lp64.exp diff -u src/tests/usr.bin/xlint/lint1/op_shl_lp64.exp:1.1 src/tests/usr.bin/xlint/lint1/op_shl_lp64.exp:1.2 --- src/tests/usr.bin/xlint/lint1/op_shl_lp64.exp:1.1 Sun Jul 4 20:22:31 2021 +++ src/tests/usr.bin/xlint/lint1/op_shl_lp64.exp Sat Jul 31 19:52:44 2021 @@ -1,2 +1,2 @@ -op_shl_lp64.c(14): warning: shift amount 105 is greater than bit-size 32 of 'int' [122] -op_shl_lp64.c(17): warning: shift amount 41 is greater than bit-size 32 of 'int' [122] +op_shl_lp64.c(23): warning: shift equal to size of object [267] +op_shl_lp64.c(25): warning: shift amount 129 is greater than bit-size 128 of '__uint128_t' [122] Index: src/usr.bin/xlint/lint1/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.214 src/usr.bin/xlint/lint1/decl.c:1.215 --- src/usr.bin/xlint/lint1/decl.c:1.214 Sat Jul 31 19:20:59 2021 +++ src/usr.bin/xlint/lint1/decl.c Sat Jul 31 19:52:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.214 2021/07/31 19:20:59 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.215 2021/07/31 19:52:44 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: decl.c,v 1.214 2021/07/31 19:20:59 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.215 2021/07/31 19:52:44 rillig Exp $"); #endif #include <sys/param.h> @@ -126,8 +126,8 @@ initdecl(void) typetab[QUAD].t_tspec = QUAD; typetab[UQUAD].t_tspec = UQUAD; #ifdef INT128_SIZE - /* TODO: add __int128_t */ - /* TODO: add __uint128_t */ + typetab[INT128].t_tspec = INT128; + typetab[UINT128].t_tspec = UINT128; #endif typetab[FLOAT].t_tspec = FLOAT; typetab[DOUBLE].t_tspec = DOUBLE; Index: src/usr.bin/xlint/lint1/emit1.c diff -u src/usr.bin/xlint/lint1/emit1.c:1.46 src/usr.bin/xlint/lint1/emit1.c:1.47 --- src/usr.bin/xlint/lint1/emit1.c:1.46 Thu Jul 15 17:03:50 2021 +++ src/usr.bin/xlint/lint1/emit1.c Sat Jul 31 19:52:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: emit1.c,v 1.46 2021/07/15 17:03:50 rillig Exp $ */ +/* $NetBSD: emit1.c,v 1.47 2021/07/31 19:52:44 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: emit1.c,v 1.46 2021/07/15 17:03:50 rillig Exp $"); +__RCSID("$NetBSD: emit1.c,v 1.47 2021/07/31 19:52:44 rillig Exp $"); #endif #include "lint1.h" @@ -99,6 +99,7 @@ outtype(const type_t *tp) while (tp != NULL) { if ((ts = tp->t_tspec) == INT && tp->t_is_enum) ts = ENUM; + /* Available letters: ----E-GH--K-MNO--R--U-W-YZ */ switch (ts) { case BOOL: t = 'B'; s = '\0'; break; case CHAR: t = 'C'; s = '\0'; break; @@ -112,16 +113,20 @@ outtype(const type_t *tp) case ULONG: t = 'L'; s = 'u'; break; case QUAD: t = 'Q'; s = '\0'; break; case UQUAD: t = 'Q'; s = 'u'; break; +#ifdef INT128_SIZE + case INT128: t = 'J'; s = '\0'; break; + case UINT128: t = 'J'; s = 'u'; break; +#endif case FLOAT: t = 'D'; s = 's'; break; case DOUBLE: t = 'D'; s = '\0'; break; case LDOUBLE: t = 'D'; s = 'l'; break; case VOID: t = 'V'; s = '\0'; break; + case STRUCT: t = 'T'; s = 's'; break; + case UNION: t = 'T'; s = 'u'; break; + case ENUM: t = 'T'; s = 'e'; break; case PTR: t = 'P'; s = '\0'; break; case ARRAY: t = 'A'; s = '\0'; break; case FUNC: t = 'F'; s = '\0'; break; - case ENUM: t = 'T'; s = 'e'; break; - case STRUCT: t = 'T'; s = 's'; break; - case UNION: t = 'T'; s = 'u'; break; case FCOMPLEX: t = 'X'; s = 's'; break; case DCOMPLEX: t = 'X'; s = '\0'; break; case LCOMPLEX: t = 'X'; s = 'l'; break; Index: src/usr.bin/xlint/lint1/lint1.h diff -u src/usr.bin/xlint/lint1/lint1.h:1.119 src/usr.bin/xlint/lint1/lint1.h:1.120 --- src/usr.bin/xlint/lint1/lint1.h:1.119 Sat Jul 31 11:03:04 2021 +++ src/usr.bin/xlint/lint1/lint1.h Sat Jul 31 19:52:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: lint1.h,v 1.119 2021/07/31 11:03:04 rillig Exp $ */ +/* $NetBSD: lint1.h,v 1.120 2021/07/31 19:52:44 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -556,6 +556,13 @@ is_nonzero(const tnode_t *tn) static inline uint64_t bit(unsigned i) { + /* + * TODO: Add proper support for INT128. + * This involves changing val_t to 128 bits. + */ + if (i >= 64) + return 0; /* XXX: not correct for INT128 and UINT128 */ + lint_assert(i < 64); return (uint64_t)1 << i; } Index: src/usr.bin/xlint/lint2/read.c diff -u src/usr.bin/xlint/lint2/read.c:1.45 src/usr.bin/xlint/lint2/read.c:1.46 --- src/usr.bin/xlint/lint2/read.c:1.45 Sun Apr 18 22:51:24 2021 +++ src/usr.bin/xlint/lint2/read.c Sat Jul 31 19:52:44 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: read.c,v 1.45 2021/04/18 22:51:24 rillig Exp $ */ +/* $NetBSD: read.c,v 1.46 2021/07/31 19:52:44 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: read.c,v 1.45 2021/04/18 22:51:24 rillig Exp $"); +__RCSID("$NetBSD: read.c,v 1.46 2021/07/31 19:52:44 rillig Exp $"); #endif #include <ctype.h> @@ -627,6 +627,11 @@ inptype(const char *cp, const char **epp case 'Q': tp->t_tspec = s == 'u' ? UQUAD : QUAD; break; +#ifdef INT128_SIZE + case 'J': + tp->t_tspec = s == 'u' ? UINT128 : INT128; + break; +#endif case 'D': tp->t_tspec = s == 's' ? FLOAT : (s == 'l' ? LDOUBLE : DOUBLE); break;