Fix for pri and scn formats

This commit is contained in:
Andre Simoes Dias Vieira 2015-08-27 11:50:25 +01:00 committed by Corinna Vinschen
parent 9074b9b8ad
commit 892cfcb7c2
3 changed files with 270 additions and 124 deletions

View File

@ -1,3 +1,13 @@
2015-08-27 Andre Vieira <andre.simoesdiasvieira@arm.com>
* libc/include/sys/_intsup.h: Defined new __INTxx, __FASTxx and
__LEASTxx macro's to hold information regarding the respective types
print and scan formats.
* libc/include/inttypes.h: Defined LEAST and FAST specific PRI and SCN
macro's as these are not always the same as the INT variants. Used the
new __INTxx, __FASTxx and __LEASTxx macro's in their corresponding PRI
and SCN macros.
2015-08-07 Stefan Wallentowitz <stefan.wallentowitz@tum.de> 2015-08-07 Stefan Wallentowitz <stefan.wallentowitz@tum.de>
* libc/sys/or1k/mlock.c: Fix exception enable saving * libc/sys/or1k/mlock.c: Fix exception enable saving

View File

@ -23,7 +23,9 @@
#define __STRINGIFY(a) #a #define __STRINGIFY(a) #a
/* 8-bit types */ /* 8-bit types */
#define __PRI8(x) __STRINGIFY(x) #define __PRI8(x) __INT8 __STRINGIFY(x)
#define __PRI8LEAST(x) __LEAST8 __STRINGIFY(x)
#define __PRI8FAST(x) __FAST8 __STRINGIFY(x)
/* NOTICE: scanning 8-bit types requires use of the hh specifier /* NOTICE: scanning 8-bit types requires use of the hh specifier
* which is only supported on newlib platforms that * which is only supported on newlib platforms that
@ -36,7 +38,9 @@
*/ */
#if defined(_WANT_IO_C99_FORMATS) #if defined(_WANT_IO_C99_FORMATS)
#define __SCN8(x) __STRINGIFY(hh##x) #define __SCN8(x) __INT8 __STRINGIFY(x)
#define __SCN8LEAST(x) __LEAST8 __STRINGIFY(x)
#define __SCN8FAST(x) __FAST8 __STRINGIFY(x)
#endif /* _WANT_IO_C99_FORMATS */ #endif /* _WANT_IO_C99_FORMATS */
@ -59,45 +63,49 @@
#endif /* _WANT_IO_C99_FORMATS */ #endif /* _WANT_IO_C99_FORMATS */
#define PRIdLEAST8 __PRI8(d) #define PRIdLEAST8 __PRI8LEAST(d)
#define PRIiLEAST8 __PRI8(i) #define PRIiLEAST8 __PRI8LEAST(i)
#define PRIoLEAST8 __PRI8(o) #define PRIoLEAST8 __PRI8LEAST(o)
#define PRIuLEAST8 __PRI8(u) #define PRIuLEAST8 __PRI8LEAST(u)
#define PRIxLEAST8 __PRI8(x) #define PRIxLEAST8 __PRI8LEAST(x)
#define PRIXLEAST8 __PRI8(X) #define PRIXLEAST8 __PRI8LEAST(X)
/* Macros below are only enabled for a newlib built with C99 I/O format support. */ /* Macros below are only enabled for a newlib built with C99 I/O format support. */
#if defined(_WANT_IO_C99_FORMATS) #if defined(_WANT_IO_C99_FORMATS)
#define SCNdLEAST8 __SCN8(d) #define SCNdLEAST8 __SCN8LEAST(d)
#define SCNiLEAST8 __SCN8(i) #define SCNiLEAST8 __SCN8LEAST(i)
#define SCNoLEAST8 __SCN8(o) #define SCNoLEAST8 __SCN8LEAST(o)
#define SCNuLEAST8 __SCN8(u) #define SCNuLEAST8 __SCN8LEAST(u)
#define SCNxLEAST8 __SCN8(x) #define SCNxLEAST8 __SCN8LEAST(x)
#endif /* _WANT_IO_C99_FORMATS */ #endif /* _WANT_IO_C99_FORMATS */
#define PRIdFAST8 __PRI8(d) #define PRIdFAST8 __PRI8FAST(d)
#define PRIiFAST8 __PRI8(i) #define PRIiFAST8 __PRI8FAST(i)
#define PRIoFAST8 __PRI8(o) #define PRIoFAST8 __PRI8FAST(o)
#define PRIuFAST8 __PRI8(u) #define PRIuFAST8 __PRI8FAST(u)
#define PRIxFAST8 __PRI8(x) #define PRIxFAST8 __PRI8FAST(x)
#define PRIXFAST8 __PRI8(X) #define PRIXFAST8 __PRI8FAST(X)
/* Macros below are only enabled for a newlib built with C99 I/O format support. */ /* Macros below are only enabled for a newlib built with C99 I/O format support. */
#if defined(_WANT_IO_C99_FORMATS) #if defined(_WANT_IO_C99_FORMATS)
#define SCNdFAST8 __SCN8(d) #define SCNdFAST8 __SCN8FAST(d)
#define SCNiFAST8 __SCN8(i) #define SCNiFAST8 __SCN8FAST(i)
#define SCNoFAST8 __SCN8(o) #define SCNoFAST8 __SCN8FAST(o)
#define SCNuFAST8 __SCN8(u) #define SCNuFAST8 __SCN8FAST(u)
#define SCNxFAST8 __SCN8(x) #define SCNxFAST8 __SCN8FAST(x)
#endif /* _WANT_IO_C99_FORMATS */ #endif /* _WANT_IO_C99_FORMATS */
/* 16-bit types */ /* 16-bit types */
#define __PRI16(x) __STRINGIFY(x) #define __PRI16(x) __INT16 __STRINGIFY(x)
#define __SCN16(x) __STRINGIFY(h##x) #define __PRI16LEAST(x) __LEAST16 __STRINGIFY(x)
#define __PRI16FAST(x) __FAST16 __STRINGIFY(x)
#define __SCN16(x) __INT16 __STRINGIFY(x)
#define __SCN16LEAST(x) __LEAST16 __STRINGIFY(x)
#define __SCN16FAST(x) __FAST16 __STRINGIFY(x)
#define PRId16 __PRI16(d) #define PRId16 __PRI16(d)
@ -114,41 +122,40 @@
#define SCNx16 __SCN16(x) #define SCNx16 __SCN16(x)
#define PRIdLEAST16 __PRI16(d) #define PRIdLEAST16 __PRI16LEAST(d)
#define PRIiLEAST16 __PRI16(i) #define PRIiLEAST16 __PRI16LEAST(i)
#define PRIoLEAST16 __PRI16(o) #define PRIoLEAST16 __PRI16LEAST(o)
#define PRIuLEAST16 __PRI16(u) #define PRIuLEAST16 __PRI16LEAST(u)
#define PRIxLEAST16 __PRI16(x) #define PRIxLEAST16 __PRI16LEAST(x)
#define PRIXLEAST16 __PRI16(X) #define PRIXLEAST16 __PRI16LEAST(X)
#define SCNdLEAST16 __SCN16(d) #define SCNdLEAST16 __SCN16LEAST(d)
#define SCNiLEAST16 __SCN16(i) #define SCNiLEAST16 __SCN16LEAST(i)
#define SCNoLEAST16 __SCN16(o) #define SCNoLEAST16 __SCN16LEAST(o)
#define SCNuLEAST16 __SCN16(u) #define SCNuLEAST16 __SCN16LEAST(u)
#define SCNxLEAST16 __SCN16(x) #define SCNxLEAST16 __SCN16LEAST(x)
#define PRIdFAST16 __PRI16(d) #define PRIdFAST16 __PRI16FAST(d)
#define PRIiFAST16 __PRI16(i) #define PRIiFAST16 __PRI16FAST(i)
#define PRIoFAST16 __PRI16(o) #define PRIoFAST16 __PRI16FAST(o)
#define PRIuFAST16 __PRI16(u) #define PRIuFAST16 __PRI16FAST(u)
#define PRIxFAST16 __PRI16(x) #define PRIxFAST16 __PRI16FAST(x)
#define PRIXFAST16 __PRI16(X) #define PRIXFAST16 __PRI16FAST(X)
#define SCNdFAST16 __SCN16(d) #define SCNdFAST16 __SCN16FAST(d)
#define SCNiFAST16 __SCN16(i) #define SCNiFAST16 __SCN16FAST(i)
#define SCNoFAST16 __SCN16(o) #define SCNoFAST16 __SCN16FAST(o)
#define SCNuFAST16 __SCN16(u) #define SCNuFAST16 __SCN16FAST(u)
#define SCNxFAST16 __SCN16(x) #define SCNxFAST16 __SCN16FAST(x)
/* 32-bit types */ /* 32-bit types */
#if defined (_INT32_EQ_LONG) #define __PRI32(x) __INT32 __STRINGIFY(x)
#define __PRI32(x) __STRINGIFY(l##x) #define __SCN32(x) __INT32 __STRINGIFY(x)
#define __SCN32(x) __STRINGIFY(l##x) #define __PRI32LEAST(x) __LEAST32 __STRINGIFY(x)
#else #define __SCN32LEAST(x) __LEAST32 __STRINGIFY(x)
#define __PRI32(x) __STRINGIFY(x) #define __PRI32FAST(x) __FAST32 __STRINGIFY(x)
#define __SCN32(x) __STRINGIFY(x) #define __SCN32FAST(x) __FAST32 __STRINGIFY(x)
#endif
#define PRId32 __PRI32(d) #define PRId32 __PRI32(d)
#define PRIi32 __PRI32(i) #define PRIi32 __PRI32(i)
@ -164,46 +171,44 @@
#define SCNx32 __SCN32(x) #define SCNx32 __SCN32(x)
#define PRIdLEAST32 __PRI32(d) #define PRIdLEAST32 __PRI32LEAST(d)
#define PRIiLEAST32 __PRI32(i) #define PRIiLEAST32 __PRI32LEAST(i)
#define PRIoLEAST32 __PRI32(o) #define PRIoLEAST32 __PRI32LEAST(o)
#define PRIuLEAST32 __PRI32(u) #define PRIuLEAST32 __PRI32LEAST(u)
#define PRIxLEAST32 __PRI32(x) #define PRIxLEAST32 __PRI32LEAST(x)
#define PRIXLEAST32 __PRI32(X) #define PRIXLEAST32 __PRI32LEAST(X)
#define SCNdLEAST32 __SCN32(d) #define SCNdLEAST32 __SCN32LEAST(d)
#define SCNiLEAST32 __SCN32(i) #define SCNiLEAST32 __SCN32LEAST(i)
#define SCNoLEAST32 __SCN32(o) #define SCNoLEAST32 __SCN32LEAST(o)
#define SCNuLEAST32 __SCN32(u) #define SCNuLEAST32 __SCN32LEAST(u)
#define SCNxLEAST32 __SCN32(x) #define SCNxLEAST32 __SCN32LEAST(x)
#define PRIdFAST32 __PRI32(d) #define PRIdFAST32 __PRI32FAST(d)
#define PRIiFAST32 __PRI32(i) #define PRIiFAST32 __PRI32FAST(i)
#define PRIoFAST32 __PRI32(o) #define PRIoFAST32 __PRI32FAST(o)
#define PRIuFAST32 __PRI32(u) #define PRIuFAST32 __PRI32FAST(u)
#define PRIxFAST32 __PRI32(x) #define PRIxFAST32 __PRI32FAST(x)
#define PRIXFAST32 __PRI32(X) #define PRIXFAST32 __PRI32FAST(X)
#define SCNdFAST32 __SCN32(d) #define SCNdFAST32 __SCN32FAST(d)
#define SCNiFAST32 __SCN32(i) #define SCNiFAST32 __SCN32FAST(i)
#define SCNoFAST32 __SCN32(o) #define SCNoFAST32 __SCN32FAST(o)
#define SCNuFAST32 __SCN32(u) #define SCNuFAST32 __SCN32FAST(u)
#define SCNxFAST32 __SCN32(x) #define SCNxFAST32 __SCN32FAST(x)
/* 64-bit types */ /* 64-bit types */
#if __have_long64 #define __PRI64(x) __INT64 __STRINGIFY(x)
#define __PRI64(x) __STRINGIFY(l##x) #define __SCN64(x) __INT64 __STRINGIFY(x)
#define __SCN64(x) __STRINGIFY(l##x)
#elif __have_longlong64
#define __PRI64(x) __STRINGIFY(ll##x)
#define __SCN64(x) __STRINGIFY(ll##x)
#else
#define __PRI64(x) __STRINGIFY(x)
#define __SCN64(x) __STRINGIFY(x)
#endif
#define __PRI64LEAST(x) __LEAST64 __STRINGIFY(x)
#define __SCN64LEAST(x) __LEAST64 __STRINGIFY(x)
#define __PRI64FAST(x) __FAST64 __STRINGIFY(x)
#define __SCN64FAST(x) __FAST64 __STRINGIFY(x)
#if __int64_t_defined
#define PRId64 __PRI64(d) #define PRId64 __PRI64(d)
#define PRIi64 __PRI64(i) #define PRIi64 __PRI64(i)
#define PRIo64 __PRI64(o) #define PRIo64 __PRI64(o)
@ -216,34 +221,36 @@
#define SCNo64 __SCN64(o) #define SCNo64 __SCN64(o)
#define SCNu64 __SCN64(u) #define SCNu64 __SCN64(u)
#define SCNx64 __SCN64(x) #define SCNx64 __SCN64(x)
#endif
#if __int64_t_defined #if __int_least64_t_defined
#define PRIdLEAST64 __PRI64(d) #define PRIdLEAST64 __PRI64LEAST(d)
#define PRIiLEAST64 __PRI64(i) #define PRIiLEAST64 __PRI64LEAST(i)
#define PRIoLEAST64 __PRI64(o) #define PRIoLEAST64 __PRI64LEAST(o)
#define PRIuLEAST64 __PRI64(u) #define PRIuLEAST64 __PRI64LEAST(u)
#define PRIxLEAST64 __PRI64(x) #define PRIxLEAST64 __PRI64LEAST(x)
#define PRIXLEAST64 __PRI64(X) #define PRIXLEAST64 __PRI64LEAST(X)
#define SCNdLEAST64 __SCN64(d) #define SCNdLEAST64 __SCN64LEAST(d)
#define SCNiLEAST64 __SCN64(i) #define SCNiLEAST64 __SCN64LEAST(i)
#define SCNoLEAST64 __SCN64(o) #define SCNoLEAST64 __SCN64LEAST(o)
#define SCNuLEAST64 __SCN64(u) #define SCNuLEAST64 __SCN64LEAST(u)
#define SCNxLEAST64 __SCN64(x) #define SCNxLEAST64 __SCN64LEAST(x)
#endif
#if __int_fast64_t_defined
#define PRIdFAST64 __PRI64FAST(d)
#define PRIiFAST64 __PRI64FAST(i)
#define PRIoFAST64 __PRI64FAST(o)
#define PRIuFAST64 __PRI64FAST(u)
#define PRIxFAST64 __PRI64FAST(x)
#define PRIXFAST64 __PRI64FAST(X)
#define PRIdFAST64 __PRI64(d) #define SCNdFAST64 __SCN64FAST(d)
#define PRIiFAST64 __PRI64(i) #define SCNiFAST64 __SCN64FAST(i)
#define PRIoFAST64 __PRI64(o) #define SCNoFAST64 __SCN64FAST(o)
#define PRIuFAST64 __PRI64(u) #define SCNuFAST64 __SCN64FAST(u)
#define PRIxFAST64 __PRI64(x) #define SCNxFAST64 __SCN64FAST(x)
#define PRIXFAST64 __PRI64(X)
#define SCNdFAST64 __SCN64(d)
#define SCNiFAST64 __SCN64(i)
#define SCNoFAST64 __SCN64(o)
#define SCNuFAST64 __SCN64(u)
#define SCNxFAST64 __SCN64(x)
#endif #endif
/* max-bit types */ /* max-bit types */

View File

@ -33,38 +33,167 @@
#define __have_long32 1 #define __have_long32 1
#endif #endif
/* Determine how intptr_t and int32_t are defined by gcc for this target. This /* Determine how intptr_t and intN_t fastN_t and leastN_t are defined by gcc
is used to determine the correct printf() constant in inttypes.h and other for this target. This is used to determine the correct printf() constant in
constants in stdint.h. */ inttypes.h and other constants in stdint.h.
So we end up with
?(signed|unsigned) char == 0
?(signed|unsigned) short == 1
?(signed|unsigned) int == 2
?(signed|unsigned) short int == 3
?(signed|unsigned) long == 4
?(signed|unsigned) long int == 6
?(signed|unsigned) long long == 8
?(signed|unsigned) long long int == 10
*/
#pragma push_macro("signed") #pragma push_macro("signed")
#pragma push_macro("unsigned")
#pragma push_macro("char")
#pragma push_macro("short")
#pragma push_macro("int") #pragma push_macro("int")
#pragma push_macro("long") #pragma push_macro("long")
#undef signed #undef signed
#undef unsigned
#undef char
#undef short
#undef int #undef int
#undef long #undef long
#define signed +0 #define signed +0
#define int +0 #define unsigned +0
#define long +1 #define char +0
#if __INTPTR_TYPE__ == 2 #define short +1
#define int +2
#define long +4
#if (__INTPTR_TYPE__ == 8 || __INTPTR_TYPE__ == 10)
#define _INTPTR_EQ_LONGLONG #define _INTPTR_EQ_LONGLONG
#elif __INTPTR_TYPE__ == 1 #elif (__INTPTR_TYPE__ == 4 || __INTPTR_TYPE__ == 6)
#define _INTPTR_EQ_LONG #define _INTPTR_EQ_LONG
#elif __INTPTR_TYPE__ == 0 #elif __INTPTR_TYPE__ == 2
/* Nothing to define because intptr_t is safe to print as an int. */ /* Nothing to define because intptr_t is safe to print as an int. */
#else #else
#error "Unable to determine type definition of intptr_t" #error "Unable to determine type definition of intptr_t"
#endif #endif
#if __INT32_TYPE__ == 1 #if (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6)
#define _INT32_EQ_LONG #define _INT32_EQ_LONG
#elif __INT32_TYPE__ == 0 #elif __INT32_TYPE__ == 2
/* Nothing to define because int32_t is safe to print as an int. */ /* Nothing to define because int32_t is safe to print as an int. */
#else #else
#error "Unable to determine type definition of int32_t" #error "Unable to determine type definition of int32_t"
#endif #endif
#undef long
#undef int #if (__INT8_TYPE__ == 0)
#define __INT8 "hh"
#elif (__INT8_TYPE__ == 1 || __INT8_TYPE__ == 3)
#define __INT8 "h"
#elif (__INT8_TYPE__ == 2)
#define __INT8
#elif (__INT8_TYPE__ == 4 || __INT8_TYPE__ == 6)
#define __INT8 "l"
#elif (__INT8_TYPE__ == 8 || __INT8_TYPE__ == 10)
#define __INT8 "ll"
#endif
#if (__INT16_TYPE__ == 1 || __INT16_TYPE__ == 3)
#define __INT16 "h"
#elif (__INT16_TYPE__ == 2)
#define __INT16
#elif (__INT16_TYPE__ == 4 || __INT16_TYPE__ == 6)
#define __INT16 "l"
#elif (__INT16_TYPE__ == 8 || __INT16_TYPE__ == 10)
#define __INT16 "ll"
#endif
#if (__INT32_TYPE__ == 2)
#define __INT32
#elif (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6)
#define __INT32 "l"
#elif (__INT32_TYPE__ == 8 || __INT32_TYPE__ == 10)
#define __INT32 "ll"
#endif
#if (__INT64_TYPE__ == 2)
#define __INT64
#elif (__INT64_TYPE__ == 4 || __INT64_TYPE__ == 6)
#define __INT64 "l"
#elif (__INT64_TYPE__ == 8 || __INT64_TYPE__ == 10)
#define __INT64 "ll"
#endif
#if (__INT_FAST8_TYPE__ == 0)
#define __FAST8 "hh"
#elif (__INT_FAST8_TYPE__ == 1 || __INT_FAST8_TYPE__ == 3)
#define __FAST8 "h"
#elif (__INT_FAST8_TYPE__ == 2)
#define __FAST8
#elif (__INT_FAST8_TYPE__ == 4 || __INT_FAST8_TYPE__ == 6)
#define __FAST8 "l"
#elif (__INT_FAST8_TYPE__ == 8 || __INT_FAST8_TYPE__ == 10)
#define __FAST8 "ll"
#endif
#if (__INT_FAST16_TYPE__ == 1 || __INT_FAST16_TYPE__ == 3)
#define __FAST16 "h"
#elif (__INT_FAST16_TYPE__ == 2)
#define __FAST16
#elif (__INT_FAST16_TYPE__ == 4 || __INT_FAST16_TYPE__ == 6)
#define __FAST16 "l"
#elif (__INT_FAST16_TYPE__ == 8 || __INT_FAST16_TYPE__ == 10)
#define __FAST16 "ll"
#endif
#if (__INT_FAST32_TYPE__ == 2)
#define __FAST32
#elif (__INT_FAST32_TYPE__ == 4 || __INT_FAST32_TYPE__ == 6)
#define __FAST32 "l"
#elif (__INT_FAST32_TYPE__ == 8 || __INT_FAST32_TYPE__ == 10)
#define __FAST32 "ll"
#endif
#if (__INT_FAST64_TYPE__ == 2)
#define __FAST64
#elif (__INT_FAST64_TYPE__ == 4 || __INT_FAST64_TYPE__ == 6)
#define __FAST64 "l"
#elif (__INT_FAST64_TYPE__ == 8 || __INT_FAST64_TYPE__ == 10)
#define __FAST64 "ll"
#endif
#if (__INT_LEAST8_TYPE__ == 0)
#define __LEAST8 "hh"
#elif (__INT_LEAST8_TYPE__ == 1 || __INT_LEAST8_TYPE__ == 3)
#define __LEAST8 "h"
#elif (__INT_LEAST8_TYPE__ == 2)
#define __LEAST8
#elif (__INT_LEAST8_TYPE__ == 4 || __INT_LEAST8_TYPE__ == 6)
#define __LEAST8 "l"
#elif (__INT_LEAST8_TYPE__ == 8 || __INT_LEAST8_TYPE__ == 10)
#define __LEAST8 "ll"
#endif
#if (__INT_LEAST16_TYPE__ == 1 || __INT_LEAST16_TYPE__ == 3)
#define __LEAST16 "h"
#elif (__INT_LEAST16_TYPE__ == 2)
#define __LEAST16
#elif (__INT_LEAST16_TYPE__ == 4 || __INT_LEAST16_TYPE__ == 6)
#define __LEAST16 "l"
#elif (__INT_LEAST16_TYPE__ == 8 || __INT_LEAST16_TYPE__ == 10)
#define __LEAST16 "ll"
#endif
#if (__INT_LEAST32_TYPE__ == 2)
#define __LEAST32
#elif (__INT_LEAST32_TYPE__ == 4 || __INT_LEAST32_TYPE__ == 6)
#define __LEAST32 "l"
#elif (__INT_LEAST32_TYPE__ == 8 || __INT_LEAST32_TYPE__ == 10)
#define __LEAST32 "ll"
#endif
#if (__INT_LEAST64_TYPE__ == 2)
#define __LEAST64
#elif (__INT_LEAST64_TYPE__ == 4 || __INT_LEAST64_TYPE__ == 6)
#define __LEAST64 "l"
#elif (__INT_LEAST64_TYPE__ == 8 || __INT_LEAST64_TYPE__ == 10)
#define __LEAST64 "ll"
#endif
#undef signed #undef signed
#undef unsigned
#undef char
#undef short
#undef int
#undef long
#pragma pop_macro("signed") #pragma pop_macro("signed")
#pragma pop_macro("unsigned")
#pragma pop_macro("char")
#pragma pop_macro("short")
#pragma pop_macro("int") #pragma pop_macro("int")
#pragma pop_macro("long") #pragma pop_macro("long")