This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Ada] Tweak special IA-64 descriptor type


In order to implement the special descriptor-within-vtable requirement of the 
IA-64 C++ ABI, gigi builds a special descriptor type.  It wasn't a builtin 
type so generated useless debug info.

Tested on ia64-suse-linux and i586-suse-linux, applied on the mainline.


2009-04-19  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (gigi): Make the special IA-64 descriptor type
	a builtin type and give it a name.


-- 
Eric Botcazou
Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 146303)
+++ gcc-interface/trans.c	(working copy)
@@ -544,21 +544,6 @@ gigi (Node_Id gnat_root, int max_gnat_no
     = build_qualified_type (TREE_TYPE (raise_nodefer_decl),
 			    TYPE_QUAL_VOLATILE);
 
-  long_long_float_type
-    = gnat_to_gnu_entity (Base_Type (standard_long_long_float), NULL_TREE, 0);
-
-  if (TREE_CODE (TREE_TYPE (long_long_float_type)) == INTEGER_TYPE)
-    {
-      /* In this case, the builtin floating point types are VAX float,
-	 so make up a type for use.  */
-      longest_float_type_node = make_node (REAL_TYPE);
-      TYPE_PRECISION (longest_float_type_node) = LONG_DOUBLE_TYPE_SIZE;
-      layout_type (longest_float_type_node);
-      record_builtin_type ("longest float type", longest_float_type_node);
-    }
-  else
-    longest_float_type_node = TREE_TYPE (long_long_float_type);
-
   /* Build the special descriptor type and its null node if needed.  */
   if (TARGET_VTABLE_USES_DESCRIPTORS)
     {
@@ -577,10 +562,26 @@ gigi (Node_Id gnat_root, int max_gnat_no
 	  null_list = tree_cons (field, null_node, null_list);
 	}
 
-      finish_record_type (fdesc_type_node, nreverse (field_list), 0, false);
+      finish_record_type (fdesc_type_node, nreverse (field_list), 0, true);
+      record_builtin_type ("descriptor", fdesc_type_node);
       null_fdesc_node = gnat_build_constructor (fdesc_type_node, null_list);
     }
 
+  long_long_float_type
+    = gnat_to_gnu_entity (Base_Type (standard_long_long_float), NULL_TREE, 0);
+
+  if (TREE_CODE (TREE_TYPE (long_long_float_type)) == INTEGER_TYPE)
+    {
+      /* In this case, the builtin floating point types are VAX float,
+	 so make up a type for use.  */
+      longest_float_type_node = make_node (REAL_TYPE);
+      TYPE_PRECISION (longest_float_type_node) = LONG_DOUBLE_TYPE_SIZE;
+      layout_type (longest_float_type_node);
+      record_builtin_type ("longest float type", longest_float_type_node);
+    }
+  else
+    longest_float_type_node = TREE_TYPE (long_long_float_type);
+
   /* Dummy objects to materialize "others" and "all others" in the exception
      tables.  These are exported by a-exexpr.adb, so see this unit for the
      types to use.  */
@@ -6316,7 +6317,7 @@ build_binary_op_trapv (enum tree_code co
       int needed_precision = precision * 2;
 
       if (code == MULT_EXPR && precision == 64)
-	{ 
+	{
 	  tree int_64 = gnat_type_for_size (64, 0);
 
 	  return convert (gnu_type, build_call_2_expr (mulv64_decl,
@@ -6325,7 +6326,7 @@ build_binary_op_trapv (enum tree_code co
 	}
 
       else if (needed_precision <= BITS_PER_WORD
-	       || (code == MULT_EXPR 
+	       || (code == MULT_EXPR
 		   && needed_precision <= LONG_LONG_TYPE_SIZE))
 	{
 	  tree wide_type = gnat_type_for_size (needed_precision, 0);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]