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
This commit is contained in:
Mark Mitchell 2003-09-09 03:35:31 +00:00 committed by Mark Mitchell
parent 11bf0eb0c7
commit 9649812aae
14 changed files with 166 additions and 6 deletions

View file

@ -1,3 +1,19 @@
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>
* builtin-types.def

View file

@ -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. */

View file

@ -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);

View file

@ -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

View file

@ -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"); \

View file

@ -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)

View file

@ -1,5 +1,8 @@
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
* decl2.c (add_function): Do not complain about seeing the same
non-function twice.

View file

@ -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;

View file

@ -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 \
}

View file

@ -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)

View file

@ -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

View file

@ -1,3 +1,8 @@
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>
* gcc.dg/builtins-1.c: Add more _Complex tests.

View file

@ -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 "" } */

View file

@ -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;
}