From 9649812aae971f307ade9756b14a1c961fbc8905 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 9 Sep 2003 03:35:31 +0000 Subject: [PATCH] langhooks-def.h (lhd_register_builtin_type): New function. * langhooks-def.h (lhd_register_builtin_type): New function. (LANG_HOOKS_REGISTER_BUILTIN_TYPE): New macro. (LANG_HOOKS_FOR_TYPES_INITIALIZER): Update. * langhooks.h (lang_hooks_for_types): Add register_builtin_type. * langhooks.c (lhd_register_builtin_type): New function. * c-common.h (c_register_builtin_type): Declare. * c-common.c (c_register_builtin_type): New function. * c-lang.c (LANG_HOOKS_REGISTER_BUILTIN_TYPE): Define to c_register_builtin_type. * config/ia64/hpux.h (TARGET_OS_CPP_BUILTINS): Remove __fpreg, __float80, and __float128 macros. * config/ia64/ia64.c (ia64_init_builtins): Create __fpreg, __float80, and __float128 types. * cp-lang.c (LANG_HOOKS_REGISTER_BUILTIN_TYPE): Define to c_register_builtin_type. * gcc.dg/ia64-types1.c: New test. * gcc.dg/ia64-types2.c: Likewise. From-SVN: r71227 --- gcc/ChangeLog | 16 ++++++++++++ gcc/c-common.c | 15 +++++++++++ gcc/c-common.h | 1 + gcc/c-lang.c | 2 ++ gcc/config/ia64/hpux.h | 6 ----- gcc/config/ia64/ia64.c | 42 ++++++++++++++++++++++++++++++ gcc/cp/ChangeLog | 3 +++ gcc/cp/cp-lang.c | 2 ++ gcc/langhooks-def.h | 3 +++ gcc/langhooks.c | 7 +++++ gcc/langhooks.h | 9 +++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/ia64-types1.c | 41 +++++++++++++++++++++++++++++ gcc/testsuite/gcc.dg/ia64-types2.c | 20 ++++++++++++++ 14 files changed, 166 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/ia64-types1.c create mode 100644 gcc/testsuite/gcc.dg/ia64-types2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e3895abfb78..b16092ff303 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2003-09-08 Mark Mitchell + + * langhooks-def.h (lhd_register_builtin_type): New function. + (LANG_HOOKS_REGISTER_BUILTIN_TYPE): New macro. + (LANG_HOOKS_FOR_TYPES_INITIALIZER): Update. + * langhooks.h (lang_hooks_for_types): Add register_builtin_type. + * langhooks.c (lhd_register_builtin_type): New function. + * c-common.h (c_register_builtin_type): Declare. + * c-common.c (c_register_builtin_type): New function. + * c-lang.c (LANG_HOOKS_REGISTER_BUILTIN_TYPE): Define to + c_register_builtin_type. + * config/ia64/hpux.h (TARGET_OS_CPP_BUILTINS): Remove __fpreg, + __float80, and __float128 macros. + * config/ia64/ia64.c (ia64_init_builtins): Create __fpreg, + __float80, and __float128 types. + 2003-09-08 Kaveh R. Ghazi * builtin-types.def diff --git a/gcc/c-common.c b/gcc/c-common.c index 69dd0811498..4e637490430 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -2005,6 +2005,21 @@ c_common_signed_or_unsigned_type (int unsignedp, tree type) return type; } + +/* The C version of the register_builtin_type langhook. */ + +void +c_register_builtin_type (tree type, const char* name) +{ + tree decl; + + decl = build_decl (TYPE_DECL, get_identifier (name), type); + DECL_ARTIFICIAL (decl) = 1; + if (!TYPE_NAME (type)) + TYPE_NAME (type) = decl; + pushdecl (decl); +} + /* Return the minimum number of bits needed to represent VALUE in a signed or unsigned type, UNSIGNEDP says which. */ diff --git a/gcc/c-common.h b/gcc/c-common.h index e7dabd39651..6ce5661c44a 100644 --- a/gcc/c-common.h +++ b/gcc/c-common.h @@ -948,6 +948,7 @@ extern bool c_common_init (void); extern void c_common_finish (void); extern void c_common_parse_file (int); extern HOST_WIDE_INT c_common_get_alias_set (tree); +extern void c_register_builtin_type (tree, const char*); extern bool c_promoting_integer_type_p (tree); extern int self_promoting_args_p (tree); extern tree strip_array_types (tree); diff --git a/gcc/c-lang.c b/gcc/c-lang.c index fb1741dea13..a6a4ede30ed 100644 --- a/gcc/c-lang.c +++ b/gcc/c-lang.c @@ -133,6 +133,8 @@ enum c_language_kind c_language = clk_c; #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR c_incomplete_type_error #undef LANG_HOOKS_TYPE_PROMOTES_TO #define LANG_HOOKS_TYPE_PROMOTES_TO c_type_promotes_to +#undef LANG_HOOKS_REGISTER_BUILTIN_TYPE +#define LANG_HOOKS_REGISTER_BUILTIN_TYPE c_register_builtin_type #undef LANG_HOOKS_WRITE_GLOBALS #define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations diff --git a/gcc/config/ia64/hpux.h b/gcc/config/ia64/hpux.h index 160ac456b7b..b2b854b3fcb 100644 --- a/gcc/config/ia64/hpux.h +++ b/gcc/config/ia64/hpux.h @@ -26,9 +26,6 @@ Boston, MA 02111-1307, USA. */ #define TARGET_VERSION fprintf (stderr, " (IA-64) HP-UX"); /* Target OS builtins. */ -/* -D__fpreg=long double is needed to compensate for - the lack of __fpreg which is a primitive type in - HP C but does not exist in GNU C. */ #define TARGET_OS_CPP_BUILTINS() \ do { \ builtin_assert("system=hpux"); \ @@ -39,9 +36,6 @@ do { \ builtin_define("__IA64__"); \ builtin_define("_LONGLONG"); \ builtin_define("_UINT128_T"); \ - builtin_define("__fpreg=long double"); \ - builtin_define("__float80=long double"); \ - builtin_define("__float128=long double"); \ if (c_dialect_cxx () || !flag_iso) \ { \ builtin_define("_HPUX_SOURCE"); \ diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 4561345e46e..a6e5ff60643 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -7694,6 +7694,48 @@ ia64_init_builtins (void) tree void_ftype_pdi = build_function_type_list (void_type_node, pdi_type_node, NULL_TREE); + tree fpreg_type; + + /* The __fpreg type. */ + fpreg_type = make_node (REAL_TYPE); + /* ??? Once the IA64 back end supports both 80-bit and 128-bit + floating types, this type should have XFmode, not TFmode. + TYPE_PRECISION should be 80 bits, not 128. And, the back end + should know to load/save __fpreg variables using the ldf.fill and + stf.spill instructions. */ + TYPE_PRECISION (fpreg_type) = 128; + layout_type (fpreg_type); + (*lang_hooks.types.register_builtin_type) (fpreg_type, "__fpreg"); + + /* The __float80 type. */ + if (INTEL_EXTENDED_IEEE_FORMAT) + /* The __float80 type is a synonym for "long double". */ + (*lang_hooks.types.register_builtin_type) (long_double_type_node, + "__float80"); + else + { + tree float80_type = make_node (REAL_TYPE); + /* ??? Once the IA64 back end supports both 80-bit and 128-bit + floating types, this type should have XFmode, not TFmode. + TYPE_PRECISION should be 80 bits, not 128. */ + TYPE_PRECISION (float80_type) = 128; + layout_type (float80_type); + (*lang_hooks.types.register_builtin_type) (float80_type, "__float80"); + } + + /* The __float128 type. */ + if (INTEL_EXTENDED_IEEE_FORMAT) + { + tree float128_type = make_node (REAL_TYPE); + TYPE_PRECISION (float128_type) = 128; + layout_type (float128_type); + (*lang_hooks.types.register_builtin_type) (float128_type, "__float128"); + } + else + /* This is a synonym for "long double". */ + (*lang_hooks.types.register_builtin_type) (long_double_type_node, + "__float128"); + #define def_builtin(name, type, code) \ builtin_function ((name), (type), (code), BUILT_IN_MD, NULL, NULL_TREE) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index c02e8d19397..2fed9f4b99d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2003-09-08 Mark Mitchell + * cp-lang.c (LANG_HOOKS_REGISTER_BUILTIN_TYPE): Define to + c_register_builtin_type. + PR c++/11786 * decl2.c (add_function): Do not complain about seeing the same non-function twice. diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index 4d5ed27b3c7..527054c991f 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -184,6 +184,8 @@ static void cxx_initialize_diagnostics (diagnostic_context *); #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error #undef LANG_HOOKS_TYPE_PROMOTES_TO #define LANG_HOOKS_TYPE_PROMOTES_TO cxx_type_promotes_to +#undef LANG_HOOKS_REGISTER_BUILTIN_TYPE +#define LANG_HOOKS_REGISTER_BUILTIN_TYPE c_register_builtin_type /* Each front end provides its own hooks, for toplev.c. */ const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h index f5a83ccf9e5..5089fdaba11 100644 --- a/gcc/langhooks-def.h +++ b/gcc/langhooks-def.h @@ -61,6 +61,7 @@ extern bool lhd_can_use_bit_fields_p (void); extern bool lhd_warn_unused_global_decl (tree); extern void lhd_incomplete_type_error (tree, tree); extern tree lhd_type_promotes_to (tree); +extern void lhd_register_builtin_type (tree, const char *); extern bool lhd_decl_ok_for_sibcall (tree); extern tree lhd_expr_size (tree); extern bool lhd_decl_uninit (tree); @@ -213,6 +214,7 @@ extern int lhd_tree_dump_type_quals (tree); #define LANG_HOOKS_MAKE_TYPE make_node #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error #define LANG_HOOKS_TYPE_PROMOTES_TO lhd_type_promotes_to +#define LANG_HOOKS_REGISTER_BUILTIN_TYPE lhd_register_builtin_type #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \ LANG_HOOKS_MAKE_TYPE, \ @@ -222,6 +224,7 @@ extern int lhd_tree_dump_type_quals (tree); LANG_HOOKS_SIGNED_TYPE, \ LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, \ LANG_HOOKS_TYPE_PROMOTES_TO, \ + LANG_HOOKS_REGISTER_BUILTIN_TYPE, \ LANG_HOOKS_INCOMPLETE_TYPE_ERROR \ } diff --git a/gcc/langhooks.c b/gcc/langhooks.c index 622e0626801..7a003bbcc00 100644 --- a/gcc/langhooks.c +++ b/gcc/langhooks.c @@ -208,6 +208,13 @@ lhd_type_promotes_to (tree type ATTRIBUTE_UNUSED) abort (); } +/* Registration of machine- or os-specific builtin types. */ +void +lhd_register_builtin_type (tree type ATTRIBUTE_UNUSED, + const char* name ATTRIBUTE_UNUSED) +{ +} + /* Invalid use of an incomplete type. */ void lhd_incomplete_type_error (tree value ATTRIBUTE_UNUSED, tree type) diff --git a/gcc/langhooks.h b/gcc/langhooks.h index 109dfa1a818..0d86478fc64 100644 --- a/gcc/langhooks.h +++ b/gcc/langhooks.h @@ -136,6 +136,15 @@ struct lang_hooks_for_types arguments. The default hook aborts. */ tree (*type_promotes_to) (tree); + /* Register TYPE as a builtin type with the indicated NAME. The + TYPE is placed in the outermost lexical scope. The semantics + should be analogous to: + + typedef TYPE NAME; + + in C. The default hook ignores the declaration. */ + void (*register_builtin_type) (tree, const char *); + /* This routine is called in tree.c to print an error message for invalid use of an incomplete type. VALUE is the expression that was used (or 0 if that isn't known) and TYPE is the type that was diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 62652d196f3..bc34f5b182a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-09-08 Mark Mitchell + + * gcc.dg/ia64-types1.c: New test. + * gcc.dg/ia64-types2.c: Likewise. + 2003-09-08 Kaveh R. Ghazi * gcc.dg/builtins-1.c: Add more _Complex tests. diff --git a/gcc/testsuite/gcc.dg/ia64-types1.c b/gcc/testsuite/gcc.dg/ia64-types1.c new file mode 100644 index 00000000000..521588b47bd --- /dev/null +++ b/gcc/testsuite/gcc.dg/ia64-types1.c @@ -0,0 +1,41 @@ +/* { dg-do compile { target ia64*-hp-hpux* } } */ + +/* Test that __fpreg is distinct from any other builtin type. */ + +extern float fr1; /* { dg-error "" } */ +extern __fpreg fr1; /* { dg-error "" } */ +extern double fr2; /* { dg-error "" } */ +extern __fpreg fr2; /* { dg-error "" } */ +extern long double fr3; /* { dg-error "" } */ +extern __fpreg fr3; /* { dg-error "" } */ +extern __float80 fr4; /* { dg-error "" } */ +extern __fpreg fr4; /* { dg-error "" } */ +extern __float128 fr5; /* { dg-error "" } */ +extern __fpreg fr5; /* { dg-error "" } */ + +/* Test that __float80 is distinct from any other builtin type. */ + +extern float f801; /* { dg-error "" } */ +extern __float80 f801; /* { dg-error "" } */ +extern double f802; /* { dg-error "" } */ +extern __float80 f802; /* { dg-error "" } */ +extern long double f803; /* { dg-error "" } */ +extern __float80 f803; /* { dg-error "" } */ +extern __fpreg f804; /* { dg-error "" } */ +extern __float80 f804; /* { dg-error "" } */ +extern __float128 f805; /* { dg-error "" } */ +extern __float80 f805; /* { dg-error "" } */ + +/* Test that __float128 is distinct from any other builtin type -- + except "long double", for which it is a synonym. */ + +extern float f1281; /* { dg-error "" } */ +extern __float128 f1281; /* { dg-error "" } */ +extern double f1282; /* { dg-error "" } */ +extern __float128 f1282; /* { dg-error "" } */ +extern long double f1283; +extern __float128 f1283; +extern __fpreg f1284; /* { dg-error "" } */ +extern __float128 f1284; /* { dg-error "" } */ +extern __float80 f1285; /* { dg-error "" } */ +extern __float128 f1285; /* { dg-error "" } */ diff --git a/gcc/testsuite/gcc.dg/ia64-types2.c b/gcc/testsuite/gcc.dg/ia64-types2.c new file mode 100644 index 00000000000..30e4ddbf87c --- /dev/null +++ b/gcc/testsuite/gcc.dg/ia64-types2.c @@ -0,0 +1,20 @@ +/* { dg-do run { target ia64*-hp-hpux* } } */ +/* { dg-options } */ + +/* Test that the sizes and alignments of the extra floating-point + types are correct. */ + +int main () { + if (sizeof (__fpreg) != 16) + return 1; + if (__alignof__ (__fpreg) != 16) + return 2; + + if (sizeof (__float80) != 16) + return 3; + if (__alignof__ (__float80) != 16) + return 4; + + return 0; +} + -- 2.30.2