[U-Boot] Fwd: [PATCH 1/1] include: update log2 header from the Linux kernel

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Apr 30 09:35:16 UTC 2018


Cc: Fabio Estevam <fabio.estevam at nxp.com>
(Fabio Estevam <fabio.estevam at freescale.com> is not valid anymore)

On 04/30/2018 09:09 AM, Heinrich Schuchardt wrote:
> Without the patch gcc 8 produces:
> warning: ignoring attribute ‘noreturn’ because it conflicts with
> attribute ‘const’ [-Wattributes]
>  int ____ilog2_NaN(void);
> 
> So let's update the include from Linux kernel v4.16.
> 
> This removes static checks of ilog2() arguments.
> 
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  include/linux/log2.h | 63 +++++++++++++++++++++++++-------------------
>  1 file changed, 36 insertions(+), 27 deletions(-)
> 
> diff --git a/include/linux/log2.h b/include/linux/log2.h
> index aa1de63090..41a1ae0109 100644
> --- a/include/linux/log2.h
> +++ b/include/linux/log2.h
> @@ -3,7 +3,10 @@
>   * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.
>   * Written by David Howells (dhowells at redhat.com)
>   *
> - * SPDX-License-Identifier:	GPL-2.0+
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License
> + * as published by the Free Software Foundation; either version
> + * 2 of the License, or (at your option) any later version.
>   */
>  
>  #ifndef _LINUX_LOG2_H
> @@ -12,12 +15,6 @@
>  #include <linux/types.h>
>  #include <linux/bitops.h>
>  
> -/*
> - * deal with unrepresentable constant logarithms
> - */
> -extern __attribute__((const, noreturn))
> -int ____ilog2_NaN(void);
> -
>  /*
>   * non-constant log of base 2 calculators
>   * - the arch may override these in asm/bitops.h if they can be implemented
> @@ -40,19 +37,23 @@ int __ilog2_u64(u64 n)
>  }
>  #endif
>  
> -/*
> - *  Determine whether some value is a power of two, where zero is
> +/**
> + * is_power_of_2() - check if a value is a power of two
> + * @n: the value to check
> + *
> + * Determine whether some value is a power of two, where zero is
>   * *not* considered a power of two.
> + * Return: true if @n is a power of 2, otherwise false.
>   */
> -
>  static inline __attribute__((const))
>  bool is_power_of_2(unsigned long n)
>  {
>  	return (n != 0 && ((n & (n - 1)) == 0));
>  }
>  
> -/*
> - * round up to nearest power of two
> +/**
> + * __roundup_pow_of_two() - round up to nearest power of two
> + * @n: value to round up
>   */
>  static inline __attribute__((const))
>  unsigned long __roundup_pow_of_two(unsigned long n)
> @@ -60,8 +61,9 @@ unsigned long __roundup_pow_of_two(unsigned long n)
>  	return 1UL << fls_long(n - 1);
>  }
>  
> -/*
> - * round down to nearest power of two
> +/**
> + * __rounddown_pow_of_two() - round down to nearest power of two
> + * @n: value to round down
>   */
>  static inline __attribute__((const))
>  unsigned long __rounddown_pow_of_two(unsigned long n)
> @@ -70,19 +72,19 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  }
>  
>  /**
> - * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value
> - * @n - parameter
> + * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value
> + * @n: parameter
>   *
>   * constant-capable log of base 2 calculation
>   * - this can be used to initialise global variables from constant data, hence
> - *   the massive ternary operator construction
> + * the massive ternary operator construction
>   *
>   * selects the appropriately-sized optimised version depending on sizeof(n)
>   */
>  #define ilog2(n)				\
>  (						\
>  	__builtin_constant_p(n) ? (		\
> -		(n) < 1 ? ____ilog2_NaN() :	\
> +		(n) < 2 ? 0 :			\
>  		(n) & (1ULL << 63) ? 63 :	\
>  		(n) & (1ULL << 62) ? 62 :	\
>  		(n) & (1ULL << 61) ? 61 :	\
> @@ -145,10 +147,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  		(n) & (1ULL <<  4) ?  4 :	\
>  		(n) & (1ULL <<  3) ?  3 :	\
>  		(n) & (1ULL <<  2) ?  2 :	\
> -		(n) & (1ULL <<  1) ?  1 :	\
> -		(n) & (1ULL <<  0) ?  0 :	\
> -		____ilog2_NaN()			\
> -				   ) :		\
> +		1) :				\
>  	(sizeof(n) <= 4) ?			\
>  	__ilog2_u32(n) :			\
>  	__ilog2_u64(n)				\
> @@ -156,7 +155,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  
>  /**
>   * roundup_pow_of_two - round the given value up to nearest power of two
> - * @n - parameter
> + * @n: parameter
>   *
>   * round the given value up to the nearest power of two
>   * - the result is undefined when n == 0
> @@ -173,7 +172,7 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  
>  /**
>   * rounddown_pow_of_two - round the given value down to nearest power of two
> - * @n - parameter
> + * @n: parameter
>   *
>   * round the given value down to the nearest power of two
>   * - the result is undefined when n == 0
> @@ -186,6 +185,12 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>  	__rounddown_pow_of_two(n)		\
>   )
>  
> +static inline __attribute_const__
> +int __order_base_2(unsigned long n)
> +{
> +	return n > 1 ? ilog2(n - 1) + 1 : 0;
> +}
> +
>  /**
>   * order_base_2 - calculate the (rounded up) base 2 order of the argument
>   * @n: parameter
> @@ -199,7 +204,11 @@ unsigned long __rounddown_pow_of_two(unsigned long n)
>   *  ob2(5) = 3
>   *  ... and so on.
>   */
> -
> -#define order_base_2(n) ilog2(roundup_pow_of_two(n))
> -
> +#define order_base_2(n)				\
> +(						\
> +	__builtin_constant_p(n) ? (		\
> +		((n) == 0 || (n) == 1) ? 0 :	\
> +		ilog2((n) - 1) + 1) :		\
> +	__order_base_2(n)			\
> +)
>  #endif /* _LINUX_LOG2_H */
> 



More information about the U-Boot mailing list