Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Mar 2015 09:53:30 +1100 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        "Pedro F. Giffuni" <pfg@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r280346 - head/sys/sys
Message-ID:  <20150323084500.C1130@besplex.bde.org>
In-Reply-To: <201503221537.t2MFb6Kf057971@svn.freebsd.org>
References:  <201503221537.t2MFb6Kf057971@svn.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, 22 Mar 2015, Pedro F. Giffuni wrote:

> Log:
>  Small style(9) cleanup.
>
>  #define should always be followed by a tab not space.

Thanks, but not in comments.

> Modified: head/sys/sys/cdefs.h
> ==============================================================================
> --- head/sys/sys/cdefs.h	Sun Mar 22 13:11:56 2015	(r280345)
> +++ head/sys/sys/cdefs.h	Sun Mar 22 15:37:05 2015	(r280346)
> @@ -70,20 +70,20 @@
> #if defined(__GNUC__) || defined(__INTEL_COMPILER)
>
> #if __GNUC__ >= 3 || defined(__INTEL_COMPILER)
> -#define __GNUCLIKE_ASM 3
> -#define __GNUCLIKE_MATH_BUILTIN_CONSTANTS
> +#define	__GNUCLIKE_ASM 3
> +#define	__GNUCLIKE_MATH_BUILTIN_CONSTANTS

The commit that added the __INTEL_COMPILER stuff was well-intentioned
but not ready for commit.  The lines changed by it still have mounds
of style bugs.  They mostly still don't use tabs where they are more
needed -- to line up the #defined values.

The __INTEL_COMPILER stuff was only used in a few places for i386
originally (not even in the corresponding places for amd64), and
has rotted.  It is well intentioned, but mostly just makes the
code uglier where it is actually used.

> ...
> #ifndef __INTEL_COMPILER
> # define __GNUCLIKE_CTOR_SECTION_HANDLING 1
> #endif

Indenting 'define' after '#' is another style bug.  Apparently this
defeated your pattern matcher, so the space after 'define' is not fixed
here.

>
> -#define __GNUCLIKE_BUILTIN_CONSTANT_P 1
> +#define	__GNUCLIKE_BUILTIN_CONSTANT_P 1
> # if defined(__INTEL_COMPILER) && defined(__cplusplus) \
>     && __INTEL_COMPILER < 800

'&&' on a new line is another style bug.  It is gnu-style.

> @@ -111,19 +111,19 @@
> # define __GNUCLIKE_MATH_BUILTIN_RELOPS
> #endif
>
> -#define __GNUCLIKE_BUILTIN_MEMCPY 1
> +#define	__GNUCLIKE_BUILTIN_MEMCPY 1
>
> /* XXX: if __GNUC__ >= 2: not tested everywhere originally, where replaced */
> -#define __CC_SUPPORTS_INLINE 1
> -#define __CC_SUPPORTS___INLINE 1
> -#define __CC_SUPPORTS___INLINE__ 1
> +#define	__CC_SUPPORTS_INLINE 1
> +#define	__CC_SUPPORTS___INLINE 1
> +#define	__CC_SUPPORTS___INLINE__ 1

3 different macros to support the different spellings of 'inline' are
excessive, and also wrong:
- __inline__ is a gnu spelling.  Any use of it is a style and portability
   bug.  Using it defeats portability ifdefs in this file, since only
   the FreeBSD spelling __inline is really supported in this file.  The
   macro __CC_SUPPORTS___INLINE__ to support it shouldn't exist.
   Currently, there are 256 lines in /sys with this style bug (mostly
   in mips, fuse, xen, drm and contrib) :-(.  There are just 3 lines
   which reference the macro:
   - 1 in cdefs.h to define it
   - 1 in cx to do home made portability stuff (inline -> __inline__).
     The FreeBSD spelling of this portability stuff is __inline or just
     plain inline in sloppier code.  Even the sloppier code became
     portable to new compilers with C99.
   - 1 in iir.  iir uses __inline__ a lot, and just fails when the macro
     says that it is not supported.
- __inline is the FreeBSD spelling.  It is used a lot.  About 3500
   times in /sys.  The macro shouldn't exist, since portability ifdefs
   in cdefs.h are supposed to make __inline usable for most cases,
   by defining it to nothing if required.  These portability ifdefs
   are mostly for handling the difference between C90 and gcc in 1990,
   and aren't complicated enough to handle all 1990 model compilers,
   but most code didn't care about the difference even in 1990.  There
   are just 5 uses of the macro (not counting comments or its definition):
   - 2 in cpufunc.h (1 each for amd64 and i386)
   - 3 in in_cksum.h (1 each for amd64, mips, and powerpc.  i386 is
     gratuitously different from amd64 due to different bad fixes for
     bugs in the inline asm).
- inline is the C99 spelling.  It is used almost 6000 times (mostly
   in contrib'ed uglyware).  The macro for it made sense before C99
   existed, but was committed after 1999 and has never been used.

> -#define __CC_SUPPORTS___FUNC__ 1
> -#define __CC_SUPPORTS_WARNING 1
> +#define	__CC_SUPPORTS___FUNC__ 1
> +#define	__CC_SUPPORTS_WARNING 1

__func__ is like __inline, but has better compatibility support, so
the macro for it should not exist.  The macro is used just once
(in ichsmb, for just 1 of 12 instances of __func__ in this file).

>
> -#define __CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */
> +#define	__CC_SUPPORTS_VARADIC_XXX 1 /* see varargs.h */
>
> -#define __CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1
> +#define	__CC_SUPPORTS_DYNAMIC_ARRAY_INIT 1

The features corresponding to these macros are much more arcane than
__inline and __func__.  __CC_SUPPORTS_VARADIC_XXX is used just once
(in i386 varags.h.  Varargs is very compiler-dependent, but only the
implementation should know the details, and <machine/varargs> is a
better place to put them than here even if they only depend on the
compiler).  __CC_SUPPORTS_VARADIC_XXX is not used.  (All counts in
/sys).

> ...
> @@ -139,7 +139,7 @@
>
> /*
>  * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
> - * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
> + * with "#define	OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.

Example of a comment mangled by the substitution.

> @@ -234,13 +234,13 @@
> #define	__section(x)	__attribute__((__section__(x)))
> #endif
> #if defined(__INTEL_COMPILER)
> -#define __dead2		__attribute__((__noreturn__))
> -#define __pure2		__attribute__((__const__))
> -#define __unused	__attribute__((__unused__))
> -#define __used		__attribute__((__used__))
> -#define __packed	__attribute__((__packed__))
> -#define __aligned(x)	__attribute__((__aligned__(x)))
> -#define __section(x)	__attribute__((__section__(x)))
> +#define	__dead2		__attribute__((__noreturn__))
> +#define	__pure2		__attribute__((__const__))
> +#define	__unused	__attribute__((__unused__))
> +#define	__used		__attribute__((__used__))
> +#define	__packed	__attribute__((__packed__))
> +#define	__aligned(x)	__attribute__((__aligned__(x)))
> +#define	__section(x)	__attribute__((__section__(x)))
> #endif
> #endif

__INTEL_COMPILER causes complications by not being fully gcc-compatible,
but here it is fully compatible and the duplication is spam.  Previously,
the spam wasn't even duplication since it had corrupt tabs.

Duplication defeats the point of complicated ifdefs elsewhere, where
the complications go in the direction of putting a single definition
under a complicated condition.

clang would require much messier ifdefs if it were not close to 100%
compatible, since it is actually used.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150323084500.C1130>