Module Name:    src
Committed By:   rillig
Date:           Sun Aug 29 15:49:04 UTC 2021

Modified Files:
        src/tests/usr.bin/xlint/lint1: msg_215.c
        src/usr.bin/xlint/lint1: decl.c externs1.h tree.c

Log Message:
lint: add __sync_ and _mm_ as prefixes for builtin functions

These two additions cover all cases that occur in the current NetBSD
build on x86_64.  This allows build_name to use the usual pattern 'if
Sflag then error else if sflag then warning'.  That function currently
issues a warning in C99 as well, even though C99 prohibits implicit
function declarations.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/tests/usr.bin/xlint/lint1/msg_215.c
cvs rdiff -u -r1.227 -r1.228 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.136 -r1.137 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.360 -r1.361 src/usr.bin/xlint/lint1/tree.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/msg_215.c
diff -u src/tests/usr.bin/xlint/lint1/msg_215.c:1.9 src/tests/usr.bin/xlint/lint1/msg_215.c:1.10
--- src/tests/usr.bin/xlint/lint1/msg_215.c:1.9	Wed Jun 30 14:42:13 2021
+++ src/tests/usr.bin/xlint/lint1/msg_215.c	Sun Aug 29 15:49:04 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_215.c,v 1.9 2021/06/30 14:42:13 rillig Exp $	*/
+/*	$NetBSD: msg_215.c,v 1.10 2021/08/29 15:49:04 rillig Exp $	*/
 # 3 "msg_215.c"
 
 // Test for message: function '%s' implicitly declared to return int [215]
@@ -15,7 +15,7 @@ struct str {
 
 /* ARGSUSED */
 void
-test(struct str str)
+test(struct str str, const double *p_double)
 {
 	/* expect+1: warning: function 'name' implicitly declared to return int [215] */
 	name();
@@ -31,4 +31,9 @@ test(struct str str)
 	/* https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html */
 	__builtin_whatever(123, "string");
 	__atomic_whatever(123, "string");
+	/* obsolete but still in use, as of 2021 */
+	__sync_whatever(123, "string");
+
+	/* https://software.intel.com/sites/landingpage/IntrinsicsGuide/ */
+	_mm_load_sd(p_double);
 }

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.227 src/usr.bin/xlint/lint1/decl.c:1.228
--- src/usr.bin/xlint/lint1/decl.c:1.227	Sat Aug 28 16:36:54 2021
+++ src/usr.bin/xlint/lint1/decl.c	Sun Aug 29 15:49:04 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.227 2021/08/28 16:36:54 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.228 2021/08/29 15:49:04 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.227 2021/08/28 16:36:54 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.228 2021/08/29 15:49:04 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -1972,7 +1972,7 @@ declare_extern(sym_t *dsym, bool initflg
 		 */
 		rval = dsym->s_type->t_subt->t_tspec != VOID;
 		outfdef(dsym, &dsym->s_def_pos, rval, false, NULL);
-	} else if (!is_gcc_builtin(dsym->s_name)) {
+	} else if (!is_compiler_builtin(dsym->s_name)) {
 		outsym(dsym, dsym->s_scl, dsym->s_def);
 	}
 

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.136 src/usr.bin/xlint/lint1/externs1.h:1.137
--- src/usr.bin/xlint/lint1/externs1.h:1.136	Sat Aug 28 16:36:54 2021
+++ src/usr.bin/xlint/lint1/externs1.h	Sun Aug 29 15:49:04 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.136 2021/08/28 16:36:54 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.137 2021/08/29 15:49:04 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -234,7 +234,7 @@ extern	const char *scl_name(scl_t);
 extern	const tnode_t *before_conversion(const tnode_t *);
 extern	type_t	*derive_type(type_t *, tspec_t);
 extern	type_t	*expr_derive_type(type_t *, tspec_t);
-extern	bool	is_gcc_builtin(const char *);
+extern	bool	is_compiler_builtin(const char *);
 extern	tnode_t	*build_constant(type_t *, val_t *);
 extern	tnode_t	*build_name(sym_t *, int);
 extern	tnode_t	*build_string(strg_t *);

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.360 src/usr.bin/xlint/lint1/tree.c:1.361
--- src/usr.bin/xlint/lint1/tree.c:1.360	Sat Aug 28 16:51:57 2021
+++ src/usr.bin/xlint/lint1/tree.c	Sun Aug 29 15:49:04 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.360 2021/08/28 16:51:57 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.361 2021/08/29 15:49:04 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: tree.c,v 1.360 2021/08/28 16:51:57 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.361 2021/08/29 15:49:04 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -192,17 +192,28 @@ fallback_symbol(sym_t *sym)
 }
 
 /*
- * Functions that are predeclared by GCC can be called with arbitrary
- * arguments.  Since lint usually runs after a successful compilation, it's
- * the compiler's job to catch any errors.
- *
- * https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html
+ * Functions that are predeclared by GCC or other compilers can be called
+ * with arbitrary arguments.  Since lint usually runs after a successful
+ * compilation, it's the compiler's job to catch any errors.
  */
 bool
-is_gcc_builtin(const char *name)
+is_compiler_builtin(const char *name)
 {
-	return strncmp(name, "__atomic_", 9) == 0 ||
-	       strncmp(name, "__builtin_", 10) == 0;
+	/* https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html */
+	if (strncmp(name, "__atomic_", 9) == 0 ||
+	    strncmp(name, "__builtin_", 10) == 0)
+		return true;
+
+	/* https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html */
+	/* obsolete but still in use, as of 2021 */
+	if (strncmp(name, "__sync_", 7) == 0)
+		return true;
+
+	/* https://software.intel.com/sites/landingpage/IntrinsicsGuide/ */
+	if (strncmp(name, "_mm_", 4) == 0)
+		return true;
+
+	return false;
 }
 
 /*
@@ -218,7 +229,7 @@ build_name(sym_t *sym, int follow_token)
 		sym->s_scl = EXTERN;
 		sym->s_def = DECL;
 		if (follow_token == T_LPAREN) {
-			if (gflag && is_gcc_builtin(sym->s_name)) {
+			if (gflag && is_compiler_builtin(sym->s_name)) {
 				/*
 				 * Do not warn about these, just assume that
 				 * they are regular functions compatible with
@@ -3945,7 +3956,8 @@ check_expr_misc(const tnode_t *tn, bool 
 	case CALL:
 		lint_assert(ln->tn_op == ADDR);
 		lint_assert(ln->tn_left->tn_op == NAME);
-		if (!szof && !is_gcc_builtin(ln->tn_left->tn_sym->s_name))
+		if (!szof &&
+		    !is_compiler_builtin(ln->tn_left->tn_sym->s_name))
 			outcall(tn, vctx || tctx, rvdisc);
 		break;
 	case EQ:

Reply via email to