diff mbox series

[2/2] xen/types: Rework stdint vs __{u,s}$N types

Message ID 20230621211200.4132989-3-andrew.cooper3@citrix.com (mailing list archive)
State Superseded
Headers show
Series xen/types: Cleanup | expand

Commit Message

Andrew Cooper June 21, 2023, 9:12 p.m. UTC
Xen uses the stdint types.  Rearrange the types headers to define the
compatibility __{u,s}$N types in terms of the stdint types, not the other way
around.

All all supported compilers on architectures other than x86 support the stdint
__*_TYPE__ macros.  Move these into the common types.h to avoid them being
duplicated in each architecture.

For x86 on obsolete compilers, synthesize appropriate types.

This cleanup has the side effect of removing all use of the undocumented
__signed__ GCC keyword.  This is a vestigial remnant of `gcc -traditional`
mode for dialetcs of C prior to the introduction of the signed keyword.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Roger Pau Monné <roger.pau@citrix.com>
CC: Wei Liu <wl@xen.org>
CC: Stefano Stabellini <sstabellini@kernel.org>
CC: Julien Grall <julien@xen.org>
CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
CC: Bertrand Marquis <bertrand.marquis@arm.com>
CC: Bob Eshleman <bobbyeshleman@gmail.com>
CC: Alistair Francis <alistair.francis@wdc.com>
CC: Connor Davis <connojdavis@gmail.com>
CC: Oleksii Kurochko <oleksii.kurochko@gmail.com>
CC: Shawn Anastasio <sanastasio@raptorengineering.com>
CC: Timothy Pearson <tpearson@raptorengineering.com>
CC: Roberto Bagnara <roberto.bagnara@bugseng.com>

I've left the non __ types alone for now.  They're complicated mostly by ARM
having differing ideas of what a paddr_t is.

A different option would be to sort out the stdint types ahead of including
<asm/types.h>, which can either be done by introducing a <asm/stdint.h> or
upping the minimum compiler version for x86; a task which is massively
overdue.
---
 xen/arch/arm/include/asm/types.h   | 19 -------------------
 xen/arch/riscv/include/asm/types.h | 19 -------------------
 xen/arch/x86/include/asm/types.h   | 21 +++++++++------------
 xen/include/xen/types.h            | 28 +++++++++++++++++-----------
 4 files changed, 26 insertions(+), 61 deletions(-)

Comments

Alistair Francis June 22, 2023, 12:56 a.m. UTC | #1
On Thu, Jun 22, 2023 at 7:12 AM Andrew Cooper <andrew.cooper3@citrix.com> wrote:
>
> Xen uses the stdint types.  Rearrange the types headers to define the
> compatibility __{u,s}$N types in terms of the stdint types, not the other way
> around.
>
> All all supported compilers on architectures other than x86 support the stdint
> __*_TYPE__ macros.  Move these into the common types.h to avoid them being
> duplicated in each architecture.
>
> For x86 on obsolete compilers, synthesize appropriate types.
>
> This cleanup has the side effect of removing all use of the undocumented
> __signed__ GCC keyword.  This is a vestigial remnant of `gcc -traditional`
> mode for dialetcs of C prior to the introduction of the signed keyword.
>
> No functional change.
>
> Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
> CC: Jan Beulich <JBeulich@suse.com>
> CC: Roger Pau Monné <roger.pau@citrix.com>
> CC: Wei Liu <wl@xen.org>
> CC: Stefano Stabellini <sstabellini@kernel.org>
> CC: Julien Grall <julien@xen.org>
> CC: Volodymyr Babchuk <Volodymyr_Babchuk@epam.com>
> CC: Bertrand Marquis <bertrand.marquis@arm.com>
> CC: Bob Eshleman <bobbyeshleman@gmail.com>
> CC: Alistair Francis <alistair.francis@wdc.com>
> CC: Connor Davis <connojdavis@gmail.com>
> CC: Oleksii Kurochko <oleksii.kurochko@gmail.com>
> CC: Shawn Anastasio <sanastasio@raptorengineering.com>
> CC: Timothy Pearson <tpearson@raptorengineering.com>
> CC: Roberto Bagnara <roberto.bagnara@bugseng.com>
>
> I've left the non __ types alone for now.  They're complicated mostly by ARM
> having differing ideas of what a paddr_t is.
>
> A different option would be to sort out the stdint types ahead of including
> <asm/types.h>, which can either be done by introducing a <asm/stdint.h> or
> upping the minimum compiler version for x86; a task which is massively
> overdue.
> ---
>  xen/arch/arm/include/asm/types.h   | 19 -------------------
>  xen/arch/riscv/include/asm/types.h | 19 -------------------
>  xen/arch/x86/include/asm/types.h   | 21 +++++++++------------
>  xen/include/xen/types.h            | 28 +++++++++++++++++-----------
>  4 files changed, 26 insertions(+), 61 deletions(-)
>
> diff --git a/xen/arch/arm/include/asm/types.h b/xen/arch/arm/include/asm/types.h
> index fb6618ef247f..545a5e9d1175 100644
> --- a/xen/arch/arm/include/asm/types.h
> +++ b/xen/arch/arm/include/asm/types.h
> @@ -1,25 +1,6 @@
>  #ifndef __ARM_TYPES_H__
>  #define __ARM_TYPES_H__
>
> -typedef __signed__ char __s8;
> -typedef unsigned char __u8;
> -
> -typedef __signed__ short __s16;
> -typedef unsigned short __u16;
> -
> -typedef __signed__ int __s32;
> -typedef unsigned int __u32;
> -
> -#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
> -#if defined(CONFIG_ARM_32)
> -typedef __signed__ long long __s64;
> -typedef unsigned long long __u64;
> -#elif defined (CONFIG_ARM_64)
> -typedef __signed__ long __s64;
> -typedef unsigned long __u64;
> -#endif
> -#endif
> -
>  typedef signed char s8;
>  typedef unsigned char u8;
>
> diff --git a/xen/arch/riscv/include/asm/types.h b/xen/arch/riscv/include/asm/types.h
> index 0c0ce78c8f6e..93a680a8f323 100644
> --- a/xen/arch/riscv/include/asm/types.h
> +++ b/xen/arch/riscv/include/asm/types.h
> @@ -1,25 +1,6 @@
>  #ifndef __RISCV_TYPES_H__
>  #define __RISCV_TYPES_H__
>
> -typedef __signed__ char __s8;
> -typedef unsigned char __u8;
> -
> -typedef __signed__ short __s16;
> -typedef unsigned short __u16;
> -
> -typedef __signed__ int __s32;
> -typedef unsigned int __u32;
> -
> -#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
> -#if defined(CONFIG_RISCV_32)
> -typedef __signed__ long long __s64;
> -typedef unsigned long long __u64;
> -#elif defined (CONFIG_RISCV_64)
> -typedef __signed__ long __s64;
> -typedef unsigned long __u64;
> -#endif
> -#endif
> -
>  typedef signed char s8;
>  typedef unsigned char u8;
>
> diff --git a/xen/arch/x86/include/asm/types.h b/xen/arch/x86/include/asm/types.h
> index 2d56aed66782..a5d4f6e9587a 100644
> --- a/xen/arch/x86/include/asm/types.h
> +++ b/xen/arch/x86/include/asm/types.h
> @@ -1,18 +1,15 @@
>  #ifndef __X86_TYPES_H__
>  #define __X86_TYPES_H__
>
> -typedef __signed__ char __s8;
> -typedef unsigned char __u8;
> -
> -typedef __signed__ short __s16;
> -typedef unsigned short __u16;
> -
> -typedef __signed__ int __s32;
> -typedef unsigned int __u32;
> -
> -#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
> -typedef __signed__ long __s64;
> -typedef unsigned long __u64;
> +#ifndef __INT8_TYPE__ /* GCC <= 4.4 */
> +# define __INT8_TYPE__     signed  char
> +# define __UINT8_TYPE__  unsigned  char
> +# define __INT16_TYPE__           short
> +# define __UINT16_TYPE__ unsigned short
> +# define __INT32_TYPE__             int
> +# define __UINT32_TYPE__ unsigned   int
> +# define __INT64_TYPE__            long
> +# define __UINT64_TYPE__ unsigned  long
>  #endif
>
>  typedef signed char s8;
> diff --git a/xen/include/xen/types.h b/xen/include/xen/types.h
> index 8b22a02eeaa4..4083f1bf18b0 100644
> --- a/xen/include/xen/types.h
> +++ b/xen/include/xen/types.h
> @@ -11,6 +11,15 @@ typedef signed long ssize_t;
>
>  typedef __PTRDIFF_TYPE__ ptrdiff_t;
>
> +typedef __INT8_TYPE__        int8_t;
> +typedef __UINT8_TYPE__      uint8_t;
> +typedef __INT16_TYPE__      int16_t;
> +typedef __UINT16_TYPE__    uint16_t;
> +typedef __INT32_TYPE__      int32_t;
> +typedef __UINT32_TYPE__    uint32_t;
> +typedef __INT64_TYPE__      int64_t;
> +typedef __UINT64_TYPE__    uint64_t;
> +
>  #define BITS_TO_LONGS(bits) \
>      (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
>  #define DECLARE_BITMAP(name,bits) \
> @@ -39,17 +48,14 @@ typedef __PTRDIFF_TYPE__ ptrdiff_t;
>  #define LONG_MIN        (-LONG_MAX - 1)
>  #define ULONG_MAX       (~0UL)
>
> -typedef         __u8            uint8_t;
> -typedef         __s8            int8_t;
> -
> -typedef         __u16           uint16_t;
> -typedef         __s16           int16_t;
> -
> -typedef         __u32           uint32_t;
> -typedef         __s32           int32_t;
> -
> -typedef         __u64           uint64_t;
> -typedef         __s64           int64_t;
> +typedef uint8_t         __u8;
> +typedef int8_t          __s8;
> +typedef uint16_t        __u16;
> +typedef int16_t         __s16;
> +typedef uint32_t        __u32;
> +typedef int32_t         __s32;
> +typedef uint64_t        __u64;
> +typedef int64_t         __s64;
>
>  typedef __u16 __le16;
>  typedef __u16 __be16;
> --
> 2.30.2
>
>
Jan Beulich June 22, 2023, 8:42 a.m. UTC | #2
On 21.06.2023 23:12, Andrew Cooper wrote:
> A different option would be to sort out the stdint types ahead of including
> <asm/types.h>, which can either be done by introducing a <asm/stdint.h> or
> upping the minimum compiler version for x86; a task which is massively
> overdue.

As per my patch moving in this same direction, I strongly think this is
the direction we want to take. (I don't see a reason to introduce
asm/stdint.h for this - the logic you put in x86'es asm/types.h can
well be put in xen/types.h as well, suitably limited by a slightly more
involved #if than you have it now.)

Personally I think using "mode" attributes for the fallbacks would be
the more widely compatible way, but I'm not going to object to your
approach avoiding them. It would feel more safe though if without using
that attribute the fallback wasn't tied to __INT8_TYPE__ being defined
(but instead directly to being on very old gcc).

As to upping the minimal gcc version for x86: While I'm pretty sure I'm
considered the hindering factor here, I continue to think that my
"blocking" request isn't unreasonable at all: We want to establish
clear criteria, by which we can then also go in the future. And we want
to make clear what, if any, baseline requirements are acceptable to put
up beyond consideration of just binutils and compilers (basic utilities,
make, perl, python, etc).

Jan
diff mbox series

Patch

diff --git a/xen/arch/arm/include/asm/types.h b/xen/arch/arm/include/asm/types.h
index fb6618ef247f..545a5e9d1175 100644
--- a/xen/arch/arm/include/asm/types.h
+++ b/xen/arch/arm/include/asm/types.h
@@ -1,25 +1,6 @@ 
 #ifndef __ARM_TYPES_H__
 #define __ARM_TYPES_H__
 
-typedef __signed__ char __s8;
-typedef unsigned char __u8;
-
-typedef __signed__ short __s16;
-typedef unsigned short __u16;
-
-typedef __signed__ int __s32;
-typedef unsigned int __u32;
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-#if defined(CONFIG_ARM_32)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
-#elif defined (CONFIG_ARM_64)
-typedef __signed__ long __s64;
-typedef unsigned long __u64;
-#endif
-#endif
-
 typedef signed char s8;
 typedef unsigned char u8;
 
diff --git a/xen/arch/riscv/include/asm/types.h b/xen/arch/riscv/include/asm/types.h
index 0c0ce78c8f6e..93a680a8f323 100644
--- a/xen/arch/riscv/include/asm/types.h
+++ b/xen/arch/riscv/include/asm/types.h
@@ -1,25 +1,6 @@ 
 #ifndef __RISCV_TYPES_H__
 #define __RISCV_TYPES_H__
 
-typedef __signed__ char __s8;
-typedef unsigned char __u8;
-
-typedef __signed__ short __s16;
-typedef unsigned short __u16;
-
-typedef __signed__ int __s32;
-typedef unsigned int __u32;
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-#if defined(CONFIG_RISCV_32)
-typedef __signed__ long long __s64;
-typedef unsigned long long __u64;
-#elif defined (CONFIG_RISCV_64)
-typedef __signed__ long __s64;
-typedef unsigned long __u64;
-#endif
-#endif
-
 typedef signed char s8;
 typedef unsigned char u8;
 
diff --git a/xen/arch/x86/include/asm/types.h b/xen/arch/x86/include/asm/types.h
index 2d56aed66782..a5d4f6e9587a 100644
--- a/xen/arch/x86/include/asm/types.h
+++ b/xen/arch/x86/include/asm/types.h
@@ -1,18 +1,15 @@ 
 #ifndef __X86_TYPES_H__
 #define __X86_TYPES_H__
 
-typedef __signed__ char __s8;
-typedef unsigned char __u8;
-
-typedef __signed__ short __s16;
-typedef unsigned short __u16;
-
-typedef __signed__ int __s32;
-typedef unsigned int __u32;
-
-#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-typedef __signed__ long __s64;
-typedef unsigned long __u64;
+#ifndef __INT8_TYPE__ /* GCC <= 4.4 */
+# define __INT8_TYPE__     signed  char
+# define __UINT8_TYPE__  unsigned  char
+# define __INT16_TYPE__           short
+# define __UINT16_TYPE__ unsigned short
+# define __INT32_TYPE__             int
+# define __UINT32_TYPE__ unsigned   int
+# define __INT64_TYPE__            long
+# define __UINT64_TYPE__ unsigned  long
 #endif
 
 typedef signed char s8;
diff --git a/xen/include/xen/types.h b/xen/include/xen/types.h
index 8b22a02eeaa4..4083f1bf18b0 100644
--- a/xen/include/xen/types.h
+++ b/xen/include/xen/types.h
@@ -11,6 +11,15 @@  typedef signed long ssize_t;
 
 typedef __PTRDIFF_TYPE__ ptrdiff_t;
 
+typedef __INT8_TYPE__        int8_t;
+typedef __UINT8_TYPE__      uint8_t;
+typedef __INT16_TYPE__      int16_t;
+typedef __UINT16_TYPE__    uint16_t;
+typedef __INT32_TYPE__      int32_t;
+typedef __UINT32_TYPE__    uint32_t;
+typedef __INT64_TYPE__      int64_t;
+typedef __UINT64_TYPE__    uint64_t;
+
 #define BITS_TO_LONGS(bits) \
     (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
 #define DECLARE_BITMAP(name,bits) \
@@ -39,17 +48,14 @@  typedef __PTRDIFF_TYPE__ ptrdiff_t;
 #define LONG_MIN        (-LONG_MAX - 1)
 #define ULONG_MAX       (~0UL)
 
-typedef         __u8            uint8_t;
-typedef         __s8            int8_t;
-
-typedef         __u16           uint16_t;
-typedef         __s16           int16_t;
-
-typedef         __u32           uint32_t;
-typedef         __s32           int32_t;
-
-typedef         __u64           uint64_t;
-typedef         __s64           int64_t;
+typedef uint8_t         __u8;
+typedef int8_t          __s8;
+typedef uint16_t        __u16;
+typedef int16_t         __s16;
+typedef uint32_t        __u32;
+typedef int32_t         __s32;
+typedef uint64_t        __u64;
+typedef int64_t         __s64;
 
 typedef __u16 __le16;
 typedef __u16 __be16;