Commit 85291069 by Joseph Myers Committed by Joseph Myers

c-common.c (c_stddef_cpp_builtins): Define __INTMAX_TYPE__ and __UINTMAX_TYPE__.

	* c-common.c (c_stddef_cpp_builtins): Define __INTMAX_TYPE__ and
	__UINTMAX_TYPE__.
	* c-cppbuiltin.c (builtin_define_stdint_macros): New.  Define
	__INTMAX_MAX__.
	(c_cpp_builtins): Call it.
	* doc/cpp.texi: Update.

testsuite:
	* gcc.c-torture/execute/builtins/abs-2.c,
	gcc.c-torture/execute/builtins/abs-3.c,
	gcc.c-torture/execute/builtins/lib/abs.c, gcc.dg/format/format.h,
	gcc.dg/torture/builtin-attr-1.c: Use predefined macros for
	intmax_t, uintmax_t and their limits.
	* gcc.dg/intmax_t-1.c: New test.

From-SVN: r85588
parent 5a05b7c5
2004-08-05 Joseph S. Myers <jsm@polyomino.org.uk>
* c-common.c (c_stddef_cpp_builtins): Define __INTMAX_TYPE__ and
__UINTMAX_TYPE__.
* c-cppbuiltin.c (builtin_define_stdint_macros): New. Define
__INTMAX_MAX__.
(c_cpp_builtins): Call it.
* doc/cpp.texi: Update.
2004-08-04 David Edelsohn <edelsohn@gnu.org> 2004-08-04 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/rs6000.c (rs6000_rtx_costs): LABEL_REFs are zero * config/rs6000/rs6000.c (rs6000_rtx_costs): LABEL_REFs are zero
......
...@@ -3883,6 +3883,8 @@ c_stddef_cpp_builtins(void) ...@@ -3883,6 +3883,8 @@ c_stddef_cpp_builtins(void)
builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0); builtin_define_with_value ("__PTRDIFF_TYPE__", PTRDIFF_TYPE, 0);
builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0); builtin_define_with_value ("__WCHAR_TYPE__", MODIFIED_WCHAR_TYPE, 0);
builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0); builtin_define_with_value ("__WINT_TYPE__", WINT_TYPE, 0);
builtin_define_with_value ("__INTMAX_TYPE__", INTMAX_TYPE, 0);
builtin_define_with_value ("__UINTMAX_TYPE__", UINTMAX_TYPE, 0);
} }
static void static void
......
...@@ -54,6 +54,7 @@ static void builtin_define_with_int_value (const char *, HOST_WIDE_INT); ...@@ -54,6 +54,7 @@ static void builtin_define_with_int_value (const char *, HOST_WIDE_INT);
static void builtin_define_with_hex_fp_value (const char *, tree, static void builtin_define_with_hex_fp_value (const char *, tree,
int, const char *, int, const char *,
const char *); const char *);
static void builtin_define_stdint_macros (void);
static void builtin_define_type_max (const char *, tree, int); static void builtin_define_type_max (const char *, tree, int);
static void builtin_define_type_precision (const char *, tree); static void builtin_define_type_precision (const char *, tree);
static void builtin_define_float_constants (const char *, const char *, static void builtin_define_float_constants (const char *, const char *,
...@@ -293,6 +294,23 @@ define__GNUC__ (void) ...@@ -293,6 +294,23 @@ define__GNUC__ (void)
abort (); abort ();
} }
/* Define macros used by <stdint.h>. Currently only defines limits
for intmax_t, used by the testsuite. */
static void
builtin_define_stdint_macros (void)
{
int intmax_long;
if (intmax_type_node == long_long_integer_type_node)
intmax_long = 2;
else if (intmax_type_node == long_integer_type_node)
intmax_long = 1;
else if (intmax_type_node == integer_type_node)
intmax_long = 0;
else
abort ();
builtin_define_type_max ("__INTMAX_MAX__", intmax_type_node, intmax_long);
}
/* Hook that registers front end and target-specific built-ins. */ /* Hook that registers front end and target-specific built-ins. */
void void
c_cpp_builtins (cpp_reader *pfile) c_cpp_builtins (cpp_reader *pfile)
...@@ -354,6 +372,9 @@ c_cpp_builtins (cpp_reader *pfile) ...@@ -354,6 +372,9 @@ c_cpp_builtins (cpp_reader *pfile)
builtin_define_type_precision ("__CHAR_BIT__", char_type_node); builtin_define_type_precision ("__CHAR_BIT__", char_type_node);
/* stdint.h (eventually) and the testsuite need to know these. */
builtin_define_stdint_macros ();
/* float.h needs to know these. */ /* float.h needs to know these. */
builtin_define_with_int_value ("__FLT_EVAL_METHOD__", builtin_define_with_int_value ("__FLT_EVAL_METHOD__",
......
...@@ -2053,8 +2053,11 @@ OSF/rose @option{-mno-underscores} option). ...@@ -2053,8 +2053,11 @@ OSF/rose @option{-mno-underscores} option).
@itemx __PTRDIFF_TYPE__ @itemx __PTRDIFF_TYPE__
@itemx __WCHAR_TYPE__ @itemx __WCHAR_TYPE__
@itemx __WINT_TYPE__ @itemx __WINT_TYPE__
@itemx __INTMAX_TYPE__
@itemx __UINTMAX_TYPE__
These macros are defined to the correct underlying types for the These macros are defined to the correct underlying types for the
@code{size_t}, @code{ptrdiff_t}, @code{wchar_t}, and @code{wint_t} @code{size_t}, @code{ptrdiff_t}, @code{wchar_t}, @code{wint_t},
@code{intmax_t}, and @code{uintmax_t}
typedefs, respectively. They exist to make the standard header files typedefs, respectively. They exist to make the standard header files
@file{stddef.h} and @file{wchar.h} work correctly. You should not use @file{stddef.h} and @file{wchar.h} work correctly. You should not use
these macros directly; instead, include the appropriate headers and use these macros directly; instead, include the appropriate headers and use
...@@ -2072,9 +2075,11 @@ this macro directly; instead, include the appropriate headers. ...@@ -2072,9 +2075,11 @@ this macro directly; instead, include the appropriate headers.
@itemx __INT_MAX__ @itemx __INT_MAX__
@itemx __LONG_MAX__ @itemx __LONG_MAX__
@itemx __LONG_LONG_MAX__ @itemx __LONG_LONG_MAX__
@itemx __INTMAX_MAX__
Defined to the maximum value of the @code{signed char}, @code{wchar_t}, Defined to the maximum value of the @code{signed char}, @code{wchar_t},
@code{signed short}, @code{signed short},
@code{signed int}, @code{signed long}, and @code{signed long long} types @code{signed int}, @code{signed long}, @code{signed long long}, and
@code{intmax_t} types
respectively. They exist to make the standard header given numerical limits respectively. They exist to make the standard header given numerical limits
work correctly. You should not use these macros directly; instead, include work correctly. You should not use these macros directly; instead, include
the appropriate headers. the appropriate headers.
......
2004-08-05 Joseph S. Myers <jsm@polyomino.org.uk>
* gcc.c-torture/execute/builtins/abs-2.c,
gcc.c-torture/execute/builtins/abs-3.c,
gcc.c-torture/execute/builtins/lib/abs.c, gcc.dg/format/format.h,
gcc.dg/torture/builtin-attr-1.c: Use predefined macros for
intmax_t, uintmax_t and their limits.
* gcc.dg/intmax_t-1.c: New test.
2004-08-04 Giovanni Bajo <giovannibajo@gcc.gnu.org> 2004-08-04 Giovanni Bajo <giovannibajo@gcc.gnu.org>
* g++.dg/tc1/dr147.C: Add reference to PR. * g++.dg/tc1/dr147.C: Add reference to PR.
......
/* Test for builtin abs, labs, llabs, imaxabs. */ /* Test for builtin abs, labs, llabs, imaxabs. */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */ /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* These next definitions are kludges. When GCC has a <stdint.h> it
should be used.
*/
#include <limits.h> #include <limits.h>
#if INT_MAX == __LONG_LONG_MAX__ typedef __INTMAX_TYPE__ intmax_t;
typedef int intmax_t; #define INTMAX_MAX __INTMAX_MAX__
#define INTMAX_MAX INT_MAX
#elif LONG_MAX == __LONG_LONG_MAX__
typedef long intmax_t;
#define INTMAX_MAX LONG_MAX
#else
typedef long long intmax_t;
#define INTMAX_MAX __LONG_LONG_MAX__
#endif
extern int abs (int); extern int abs (int);
extern long labs (long); extern long labs (long);
......
/* Test for builtin abs, labs, llabs, imaxabs. Test for __builtin versions. */ /* Test for builtin abs, labs, llabs, imaxabs. Test for __builtin versions. */
/* Origin: Joseph Myers <jsm28@cam.ac.uk> */ /* Origin: Joseph Myers <jsm28@cam.ac.uk> */
/* These next definitions are kludges. When GCC has a <stdint.h> it
should be used.
*/
#include <limits.h> #include <limits.h>
#if INT_MAX == __LONG_LONG_MAX__ typedef __INTMAX_TYPE__ intmax_t;
typedef int intmax_t; #define INTMAX_MAX __INTMAX_MAX__
#define INTMAX_MAX INT_MAX
#elif LONG_MAX == __LONG_LONG_MAX__
typedef long intmax_t;
#define INTMAX_MAX LONG_MAX
#else
typedef long long intmax_t;
#define INTMAX_MAX __LONG_LONG_MAX__
#endif
extern void abort (void); extern void abort (void);
extern void link_error (void); extern void link_error (void);
......
...@@ -6,20 +6,7 @@ extern void abort (void); ...@@ -6,20 +6,7 @@ extern void abort (void);
#define ABORT_INSIDE_MAIN do { } while (0) #define ABORT_INSIDE_MAIN do { } while (0)
#endif #endif
/* These next definitions are kludges. When GCC has a <stdint.h> it typedef __INTMAX_TYPE__ intmax_t;
should be used.
*/
#include <limits.h>
#if INT_MAX == __LONG_LONG_MAX__
typedef int intmax_t;
#define INTMAX_MAX INT_MAX
#elif LONG_MAX == __LONG_LONG_MAX__
typedef long intmax_t;
#define INTMAX_MAX LONG_MAX
#else
typedef long long intmax_t;
#define INTMAX_MAX __LONG_LONG_MAX__
#endif
int int
abs (int x) abs (int x)
......
...@@ -28,31 +28,8 @@ __extension__ typedef unsigned long long int ullong; ...@@ -28,31 +28,8 @@ __extension__ typedef unsigned long long int ullong;
typedef llong quad_t; typedef llong quad_t;
typedef ullong u_quad_t; typedef ullong u_quad_t;
/* This next definition is a kludge. When GCC has a <stdint.h> it __extension__ typedef __INTMAX_TYPE__ intmax_t;
should be used. __extension__ typedef __UINTMAX_TYPE__ uintmax_t;
*/
/* (T *) if E is zero, (void *) otherwise. */
#define type_if_not(T, E) __typeof__(0 ? (T *)0 : (void *)(E))
/* (T *) if E is nonzero, (void *) otherwise. */
#define type_if(T, E) type_if_not(T, !(E))
/* Combine pointer types, all but one (void *). */
#define type_comb2(T1, T2) __typeof__(0 ? (T1)0 : (T2)0)
#define type_comb3(T1, T2, T3) type_comb2(T1, type_comb2(T2, T3))
#define maybe_int_ptr type_if(int, sizeof(int) == sizeof(llong))
#define maybe_uint_ptr type_if(unsigned int, sizeof(unsigned int) == sizeof(ullong))
#define maybe_long_ptr type_if(long, sizeof(long) == sizeof(llong) && sizeof(long) > sizeof(int))
#define maybe_ulong_ptr type_if(unsigned long, sizeof(unsigned long) == sizeof(ullong) && sizeof(unsigned long) > sizeof(unsigned int))
#define maybe_long_long_ptr type_if(llong, sizeof(llong) > sizeof(long))
#define maybe_ulong_long_ptr type_if(ullong, sizeof(ullong) > sizeof(unsigned long))
#define intmax_type_ptr type_comb3(maybe_int_ptr, maybe_long_ptr, maybe_long_long_ptr)
#define uintmax_type_ptr type_comb3(maybe_uint_ptr, maybe_ulong_ptr, maybe_ulong_long_ptr)
typedef __typeof__(*((intmax_type_ptr)0)) intmax_t;
typedef __typeof__(*((uintmax_type_ptr)0)) uintmax_t;
#if __STDC_VERSION__ < 199901L #if __STDC_VERSION__ < 199901L
#define restrict /* "restrict" not in old C standard. */ #define restrict /* "restrict" not in old C standard. */
......
/* { dg-do compile } */
/* { dg-options "-Wall" } */
/* Compile with -Wall to get a warning if built-in and system intmax_t don't
match. */
#include <inttypes.h>
__INTMAX_TYPE__ __im_t__;
__UINTMAX_TYPE__ __uim_t__;
intmax_t *im_t_p;
uintmax_t *uim_t_p;
void
imt (void)
{
im_t_p = &__im_t__;
}
void
uimt (void)
{
uim_t_p = &__uim_t__;
}
...@@ -404,16 +404,7 @@ CPTEST1 (csqrt) ...@@ -404,16 +404,7 @@ CPTEST1 (csqrt)
CPTEST1 (ctan) CPTEST1 (ctan)
CPTEST1 (ctanh) CPTEST1 (ctanh)
/* These next definitions are kludges. When GCC has a <stdint.h> it typedef __INTMAX_TYPE__ intmax_t;
should be used.
*/
#if __INT_MAX__ == __LONG_LONG_MAX__
typedef int intmax_t;
#elif __LONG_MAX__ == __LONG_LONG_MAX__
typedef long intmax_t;
#else
typedef long long intmax_t;
#endif
/* Various other const builtins. */ /* Various other const builtins. */
TEST1 (abs, int, int) TEST1 (abs, int, int)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment