[RFC PATCH] ARM: add workaround for ambiguous C99 stdint.h types

Ard Biesheuvel ard.biesheuvel at linaro.org
Tue Aug 13 14:33:39 EDT 2013


Kinda-acked-by Dave Martin, anyone else care to comment?

On 9 August 2013 09:36, Ard Biesheuvel <ard.biesheuvel at linaro.org> wrote:
> The C99 types uintXX_t that are usually defined in 'stdint.h' are not as
> unambiguous on ARM as you would expect. For the types below, there is a
> difference on ARM between GCC built for bare metal ARM, GCC built for glibc
> and the kernel itself, which results in build errors if you try to build with
> -ffreestanding and include 'stdint.h' (such as when you include 'arm_neon.h'
> in order to use NEON intrinsics)
>
> As the typedefs for these types in 'stdint.h' are based on builtin defines
> supplied by GCC, we can tweak these to align with the kernel's idea of those
> types, so 'linux/types.h' and 'stdint.h' can be safely included from the same
> source file (provided that -ffreestanding is used).
>
>                    int32_t         uint32_t               uintptr_t
> bare metal GCC     long            unsigned long          unsigned long
> glibc GCC          int             unsigned int           unsigned int
> kernel             int             unsigned int           unsigned long
>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
> ---
>
> Hi all,
>
> This is another, less obtrusive way of handling the problem for which I
> previously sent an RFC patch 'types.h: use GCC supplied typedefs if appropriate'
> In this case, only source files that in fact include stdint.h and are being
> built for ARM should be affected.
>
> Regards,
> --
> Ard.
>
>
>  arch/arm/include/asm/types.h | 40 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 40 insertions(+)
>  create mode 100644 arch/arm/include/asm/types.h
>
> diff --git a/arch/arm/include/asm/types.h b/arch/arm/include/asm/types.h
> new file mode 100644
> index 0000000..976ac31
> --- /dev/null
> +++ b/arch/arm/include/asm/types.h
> @@ -0,0 +1,40 @@
> +#ifndef _ASM_TYPES_H
> +#define _ASM_TYPES_H
> +
> +#include <asm-generic/int-ll64.h>
> +
> +/*
> + * The C99 types uintXX_t that are usually defined in 'stdint.h' are not as
> + * unambiguous on ARM as you would expect. For the types below, there is a
> + * difference on ARM between GCC built for bare metal ARM, GCC built for glibc
> + * and the kernel itself, which results in build errors if you try to build with
> + * -ffreestanding and include 'stdint.h' (such as when you include 'arm_neon.h'
> + * in order to use NEON intrinsics)
> + *
> + * As the typedefs for these types in 'stdint.h' are based on builtin defines
> + * supplied by GCC, we can tweak these to align with the kernel's idea of those
> + * types, so 'linux/types.h' and 'stdint.h' can be safely included from the same
> + * source file (provided that -ffreestanding is used).
> + *
> + *                    int32_t         uint32_t               uintptr_t
> + * bare metal GCC     long            unsigned long          unsigned long
> + * glibc GCC          int             unsigned int           unsigned int
> + * kernel             int             unsigned int           unsigned long
> + */
> +
> +#ifdef __INT32__TYPE__
> +#undef __INT32__TYPE__
> +#define __INT32__TYPE__                int
> +#endif
> +
> +#ifdef __UINT32__TYPE__
> +#undef __UINT32__TYPE__
> +#define __UINT32__TYPE__       unsigned int
> +#endif
> +
> +#ifdef __UINTPTR_TYPE__
> +#undef __UINTPTR_TYPE__
> +#define __UINTPTR_TYPE__       unsigned long
> +#endif
> +
> +#endif /* _ASM_TYPES_H */
> --
> 1.8.1.2
>



More information about the linux-arm-kernel mailing list