Commit 9649812a by Mark Mitchell Committed by Mark Mitchell

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
parent 11bf0eb0
2003-09-08 Mark Mitchell <mark@codesourcery.com>
* 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 <ghazi@caip.rutgers.edu> 2003-09-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* builtin-types.def * builtin-types.def
......
...@@ -2005,6 +2005,21 @@ c_common_signed_or_unsigned_type (int unsignedp, tree type) ...@@ -2005,6 +2005,21 @@ c_common_signed_or_unsigned_type (int unsignedp, tree type)
return 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 /* Return the minimum number of bits needed to represent VALUE in a
signed or unsigned type, UNSIGNEDP says which. */ signed or unsigned type, UNSIGNEDP says which. */
......
...@@ -948,6 +948,7 @@ extern bool c_common_init (void); ...@@ -948,6 +948,7 @@ extern bool c_common_init (void);
extern void c_common_finish (void); extern void c_common_finish (void);
extern void c_common_parse_file (int); extern void c_common_parse_file (int);
extern HOST_WIDE_INT c_common_get_alias_set (tree); 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 bool c_promoting_integer_type_p (tree);
extern int self_promoting_args_p (tree); extern int self_promoting_args_p (tree);
extern tree strip_array_types (tree); extern tree strip_array_types (tree);
......
...@@ -133,6 +133,8 @@ enum c_language_kind c_language = clk_c; ...@@ -133,6 +133,8 @@ enum c_language_kind c_language = clk_c;
#define LANG_HOOKS_INCOMPLETE_TYPE_ERROR c_incomplete_type_error #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR c_incomplete_type_error
#undef LANG_HOOKS_TYPE_PROMOTES_TO #undef LANG_HOOKS_TYPE_PROMOTES_TO
#define LANG_HOOKS_TYPE_PROMOTES_TO c_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 #undef LANG_HOOKS_WRITE_GLOBALS
#define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations #define LANG_HOOKS_WRITE_GLOBALS c_write_global_declarations
......
...@@ -26,9 +26,6 @@ Boston, MA 02111-1307, USA. */ ...@@ -26,9 +26,6 @@ Boston, MA 02111-1307, USA. */
#define TARGET_VERSION fprintf (stderr, " (IA-64) HP-UX"); #define TARGET_VERSION fprintf (stderr, " (IA-64) HP-UX");
/* Target OS builtins. */ /* 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() \ #define TARGET_OS_CPP_BUILTINS() \
do { \ do { \
builtin_assert("system=hpux"); \ builtin_assert("system=hpux"); \
...@@ -39,9 +36,6 @@ do { \ ...@@ -39,9 +36,6 @@ do { \
builtin_define("__IA64__"); \ builtin_define("__IA64__"); \
builtin_define("_LONGLONG"); \ builtin_define("_LONGLONG"); \
builtin_define("_UINT128_T"); \ 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) \ if (c_dialect_cxx () || !flag_iso) \
{ \ { \
builtin_define("_HPUX_SOURCE"); \ builtin_define("_HPUX_SOURCE"); \
......
...@@ -7694,6 +7694,48 @@ ia64_init_builtins (void) ...@@ -7694,6 +7694,48 @@ ia64_init_builtins (void)
tree void_ftype_pdi tree void_ftype_pdi
= build_function_type_list (void_type_node, pdi_type_node, NULL_TREE); = 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) \ #define def_builtin(name, type, code) \
builtin_function ((name), (type), (code), BUILT_IN_MD, NULL, NULL_TREE) builtin_function ((name), (type), (code), BUILT_IN_MD, NULL, NULL_TREE)
......
2003-09-08 Mark Mitchell <mark@codesourcery.com> 2003-09-08 Mark Mitchell <mark@codesourcery.com>
* cp-lang.c (LANG_HOOKS_REGISTER_BUILTIN_TYPE): Define to
c_register_builtin_type.
PR c++/11786 PR c++/11786
* decl2.c (add_function): Do not complain about seeing the same * decl2.c (add_function): Do not complain about seeing the same
non-function twice. non-function twice.
......
...@@ -184,6 +184,8 @@ static void cxx_initialize_diagnostics (diagnostic_context *); ...@@ -184,6 +184,8 @@ static void cxx_initialize_diagnostics (diagnostic_context *);
#define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR cxx_incomplete_type_error
#undef LANG_HOOKS_TYPE_PROMOTES_TO #undef LANG_HOOKS_TYPE_PROMOTES_TO
#define LANG_HOOKS_TYPE_PROMOTES_TO cxx_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. */ /* Each front end provides its own hooks, for toplev.c. */
const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER; const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
......
...@@ -61,6 +61,7 @@ extern bool lhd_can_use_bit_fields_p (void); ...@@ -61,6 +61,7 @@ extern bool lhd_can_use_bit_fields_p (void);
extern bool lhd_warn_unused_global_decl (tree); extern bool lhd_warn_unused_global_decl (tree);
extern void lhd_incomplete_type_error (tree, tree); extern void lhd_incomplete_type_error (tree, tree);
extern tree lhd_type_promotes_to (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 bool lhd_decl_ok_for_sibcall (tree);
extern tree lhd_expr_size (tree); extern tree lhd_expr_size (tree);
extern bool lhd_decl_uninit (tree); extern bool lhd_decl_uninit (tree);
...@@ -213,6 +214,7 @@ extern int lhd_tree_dump_type_quals (tree); ...@@ -213,6 +214,7 @@ extern int lhd_tree_dump_type_quals (tree);
#define LANG_HOOKS_MAKE_TYPE make_node #define LANG_HOOKS_MAKE_TYPE make_node
#define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error
#define LANG_HOOKS_TYPE_PROMOTES_TO lhd_type_promotes_to #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 { \ #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \
LANG_HOOKS_MAKE_TYPE, \ LANG_HOOKS_MAKE_TYPE, \
...@@ -222,6 +224,7 @@ extern int lhd_tree_dump_type_quals (tree); ...@@ -222,6 +224,7 @@ extern int lhd_tree_dump_type_quals (tree);
LANG_HOOKS_SIGNED_TYPE, \ LANG_HOOKS_SIGNED_TYPE, \
LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, \ LANG_HOOKS_SIGNED_OR_UNSIGNED_TYPE, \
LANG_HOOKS_TYPE_PROMOTES_TO, \ LANG_HOOKS_TYPE_PROMOTES_TO, \
LANG_HOOKS_REGISTER_BUILTIN_TYPE, \
LANG_HOOKS_INCOMPLETE_TYPE_ERROR \ LANG_HOOKS_INCOMPLETE_TYPE_ERROR \
} }
......
...@@ -208,6 +208,13 @@ lhd_type_promotes_to (tree type ATTRIBUTE_UNUSED) ...@@ -208,6 +208,13 @@ lhd_type_promotes_to (tree type ATTRIBUTE_UNUSED)
abort (); 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. */ /* Invalid use of an incomplete type. */
void void
lhd_incomplete_type_error (tree value ATTRIBUTE_UNUSED, tree type) lhd_incomplete_type_error (tree value ATTRIBUTE_UNUSED, tree type)
......
...@@ -136,6 +136,15 @@ struct lang_hooks_for_types ...@@ -136,6 +136,15 @@ struct lang_hooks_for_types
arguments. The default hook aborts. */ arguments. The default hook aborts. */
tree (*type_promotes_to) (tree); 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 /* This routine is called in tree.c to print an error message for
invalid use of an incomplete type. VALUE is the expression that 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 was used (or 0 if that isn't known) and TYPE is the type that was
......
2003-09-08 Mark Mitchell <mark@codesourcery.com>
* gcc.dg/ia64-types1.c: New test.
* gcc.dg/ia64-types2.c: Likewise.
2003-09-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> 2003-09-08 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/builtins-1.c: Add more _Complex tests. * gcc.dg/builtins-1.c: Add more _Complex tests.
......
/* { 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 "" } */
/* { 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;
}
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