Cc: Fabio Estevam <[email protected]>
(Fabio Estevam <[email protected]> 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 <[email protected]>
> ---
>  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 ([email protected])
>   *
> - * 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 */
> 

_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to