This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Tweak special IA-64 descriptor type
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 19 Apr 2009 15:09:03 +0200
- Subject: [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);