All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/1] include: update log2 header from the Linux kernel
@ 2018-04-30  7:09 Heinrich Schuchardt
  2018-04-30  9:35 ` [U-Boot] Fwd: " Heinrich Schuchardt
  0 siblings, 1 reply; 2+ messages in thread
From: Heinrich Schuchardt @ 2018-04-30  7:09 UTC (permalink / raw)
  To: u-boot

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@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 */
-- 
2.17.0

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [U-Boot] Fwd: [PATCH 1/1] include: update log2 header from the Linux kernel
  2018-04-30  7:09 [U-Boot] [PATCH 1/1] include: update log2 header from the Linux kernel Heinrich Schuchardt
@ 2018-04-30  9:35 ` Heinrich Schuchardt
  0 siblings, 0 replies; 2+ messages in thread
From: Heinrich Schuchardt @ 2018-04-30  9:35 UTC (permalink / raw)
  To: u-boot

Cc: Fabio Estevam <fabio.estevam@nxp.com>
(Fabio Estevam <fabio.estevam@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@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 */
> 

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2018-04-30  9:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-04-30  7:09 [U-Boot] [PATCH 1/1] include: update log2 header from the Linux kernel Heinrich Schuchardt
2018-04-30  9:35 ` [U-Boot] Fwd: " Heinrich Schuchardt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.