From b268e47e273a15c0c53e70a0819d629b5ebfc118 Mon Sep 17 00:00:00 2001
From: mmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Tue, 9 Sep 2003 03:35:31 +0000
Subject: [PATCH] 	* 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@71227 138bc75d-0d04-0410-961f-82ee72b054a4
---
 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 e3895abfb782..b16092ff3032 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 69dd08114986..4e637490430d 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 e7dabd396514..6ce5661c44a5 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 fb1741dea136..a6a4ede30ed2 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 160ac456b7b0..b2b854b3fcb4 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 4561345e46e3..a6e5ff606430 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 c02e8d193977..2fed9f4b99d7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c
index 4d5ed27b3c7d..527054c991f8 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 f5a83ccf9e5e..5089fdaba116 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 622e0626801d..7a003bbcc00d 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 109dfa1a8186..0d86478fc647 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 62652d196f3d..bc34f5b182a6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/gcc.dg/ia64-types1.c b/gcc/testsuite/gcc.dg/ia64-types1.c
new file mode 100644
index 000000000000..521588b47bd1
--- /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 000000000000..30e4ddbf87c4
--- /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;
+}
+
-- 
GitLab