diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2009-04-21 17:05:09 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2009-04-21 17:05:09 +0000 |
commit | b4680ca1ec22b7c8b316fb1ccf8abe306ad398f9 (patch) | |
tree | ba7bd7f71baab2ae605732799c219e06e9ac1bbc | |
parent | 350916301fe8afa02464e3ca84c70015ce2cf74b (diff) | |
download | gcc-b4680ca1ec22b7c8b316fb1ccf8abe306ad398f9.zip gcc-b4680ca1ec22b7c8b316fb1ccf8abe306ad398f9.tar.gz gcc-b4680ca1ec22b7c8b316fb1ccf8abe306ad398f9.tar.bz2 |
ada-tree.h (TYPE_RM_SIZE_NUM): Delete.
* ada-tree.h (TYPE_RM_SIZE_NUM): Delete.
(TYPE_RM_SIZE): Access TYPE_LANG_SLOT_1 directly for integral types.
* decl.c (gnat_to_gnu_entity) <E_Modular_Integer_Type>: Remove useless
support code for packed array types and assert its uselessness.
<E_Signed_Integer_Subtype>: Reuse entity identifier in more places and
adjust for TYPE_RM_SIZE change.
<all> Fix nits in comments. Use Original_Array_Type accessor instead
of Associated_Node_For_Itype accessor for packed array types.
(make_packable_type): Likewise.
(maybe_pad_type): Likewise.
(set_rm_size): Likewise. Rework conditional statement. Adjust for
TYPE_RM_SIZE change.
(make_type_from_size): Adjust for TYPE_RM_SIZE change.
(rm_size): Fix nits in comments. Rework conditional statements.
* misc.c (gnat_print_type): Adjust for TYPE_RM_SIZE change.
* trans.c (Attribute_to_gnu): Fix nits in comments.
* utils.c (gnat_init_decl_processing): Use more appropriate function
to initialize the size_type_node. Adjust for TYPE_RM_SIZE change.
From-SVN: r146530
-rw-r--r-- | gcc/ada/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/ada-tree.h | 13 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 108 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/misc.c | 4 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/trans.c | 4 | ||||
-rw-r--r-- | gcc/ada/gcc-interface/utils.c | 17 |
6 files changed, 89 insertions, 78 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 3b93881..eaf53b8 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,5 +1,26 @@ 2009-04-21 Eric Botcazou <ebotcazou@adacore.com> + * ada-tree.h (TYPE_RM_SIZE_NUM): Delete. + (TYPE_RM_SIZE): Access TYPE_LANG_SLOT_1 directly for integral types. + * decl.c (gnat_to_gnu_entity) <E_Modular_Integer_Type>: Remove useless + support code for packed array types and assert its uselessness. + <E_Signed_Integer_Subtype>: Reuse entity identifier in more places and + adjust for TYPE_RM_SIZE change. + <all> Fix nits in comments. Use Original_Array_Type accessor instead + of Associated_Node_For_Itype accessor for packed array types. + (make_packable_type): Likewise. + (maybe_pad_type): Likewise. + (set_rm_size): Likewise. Rework conditional statement. Adjust for + TYPE_RM_SIZE change. + (make_type_from_size): Adjust for TYPE_RM_SIZE change. + (rm_size): Fix nits in comments. Rework conditional statements. + * misc.c (gnat_print_type): Adjust for TYPE_RM_SIZE change. + * trans.c (Attribute_to_gnu): Fix nits in comments. + * utils.c (gnat_init_decl_processing): Use more appropriate function + to initialize the size_type_node. Adjust for TYPE_RM_SIZE change. + +2009-04-21 Eric Botcazou <ebotcazou@adacore.com> + * gcc-interface/decl.c (gnat_to_gnu_entity): Do not set force_global for imported subprograms. diff --git a/gcc/ada/gcc-interface/ada-tree.h b/gcc/ada/gcc-interface/ada-tree.h index 846dc90..8d1f6a8 100644 --- a/gcc/ada/gcc-interface/ada-tree.h +++ b/gcc/ada/gcc-interface/ada-tree.h @@ -6,7 +6,7 @@ * * * C Header File * * * - * Copyright (C) 1992-2008, Free Software Foundation, Inc. * + * Copyright (C) 1992-2009, Free Software Foundation, Inc. * * * * GNAT is free software; you can redistribute it and/or modify it under * * terms of the GNU General Public License as published by the Free Soft- * @@ -162,6 +162,10 @@ struct lang_type GTY(()) {tree t; }; cico parameter passing mechanism refer to the routine gnat_to_gnu_entity. */ #define TYPE_CI_CO_LIST(NODE) TYPE_LANG_SLOT_1 (FUNCTION_TYPE_CHECK (NODE)) +/* For integral types, this is the RM Size of the type. */ +#define TYPE_RM_SIZE(NODE) \ + TYPE_LANG_SLOT_1 (TREE_CHECK3 (NODE, ENUMERAL_TYPE, BOOLEAN_TYPE, INTEGER_TYPE)) + /* For an INTEGER_TYPE with TYPE_MODULAR_P, this is the value of the modulus. */ #define TYPE_MODULUS(NODE) GET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE)) @@ -182,13 +186,6 @@ struct lang_type GTY(()) {tree t; }; #define SET_TYPE_DIGITS_VALUE(NODE, X) \ SET_TYPE_LANG_SPECIFIC (INTEGER_TYPE_CHECK (NODE), X) -/* For numeric types, stores the RM_Size of the type. */ -#define TYPE_RM_SIZE_NUM(NODE) TYPE_LANG_SLOT_1 (NUMERICAL_TYPE_CHECK (NODE)) - -#define TYPE_RM_SIZE(NODE) \ - (INTEGRAL_TYPE_P (NODE) || TREE_CODE (NODE) == REAL_TYPE \ - ? TYPE_RM_SIZE_NUM (NODE) : 0) - /* For a RECORD_TYPE that is a fat pointer, point to the type for the unconstrained object. Likewise for a RECORD_TYPE that is pointed to by a thin pointer. */ diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 898af24..224b342 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -310,7 +310,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) || kind == E_Anonymous_Access_Protected_Subprogram_Type || kind == E_Access_Subtype))); - /* RM_Size must be specified for all discrete and fixed-point types. */ + /* The RM size must be specified for all discrete and fixed-point types. */ gcc_assert (!IN (kind, Discrete_Or_Fixed_Point_Kind) || !Unknown_RM_Size (gnat_entity)); @@ -1465,28 +1465,23 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) break; case E_Modular_Integer_Type: - /* For modular types, make the unsigned type of the proper number of - bits and then set up the modulus, if required. */ { + /* For modular types, make the unsigned type of the proper number + of bits and then set up the modulus, if required. */ + tree gnu_modulus, gnu_high = NULL_TREE; enum machine_mode mode; - tree gnu_modulus; - tree gnu_high = 0; - if (Is_Packed_Array_Type (gnat_entity)) - esize = UI_To_Int (RM_Size (gnat_entity)); + /* Packed array types are supposed to be subtypes only. */ + gcc_assert (!Is_Packed_Array_Type (gnat_entity)); /* Find the smallest mode at least ESIZE bits wide and make a class using that mode. */ - for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT); GET_MODE_BITSIZE (mode) < esize; mode = GET_MODE_WIDER_MODE (mode)) ; gnu_type = make_unsigned_type (GET_MODE_BITSIZE (mode)); - TYPE_PACKED_ARRAY_TYPE_P (gnu_type) - = (Is_Packed_Array_Type (gnat_entity) - && Is_Bit_Packed_Array (Original_Array_Type (gnat_entity))); /* Get the modulus in this type. If it overflows, assume it is because it is equal to 2**Esize. Note that there is no overflow checking @@ -1510,7 +1505,6 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) && !tree_int_cst_equal (TYPE_MAX_VALUE (gnu_type), gnu_high))) { tree gnu_subtype = make_node (INTEGER_TYPE); - TYPE_NAME (gnu_type) = create_concat_name (gnat_entity, "UMT"); TREE_TYPE (gnu_subtype) = gnu_type; TYPE_MIN_VALUE (gnu_subtype) = TYPE_MIN_VALUE (gnu_type); @@ -1520,11 +1514,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) TYPE_PRECISION (gnu_subtype) = esize; TYPE_UNSIGNED (gnu_subtype) = 1; TYPE_EXTRA_SUBTYPE_P (gnu_subtype) = 1; - TYPE_PACKED_ARRAY_TYPE_P (gnu_subtype) - = (Is_Packed_Array_Type (gnat_entity) - && Is_Bit_Packed_Array (Original_Array_Type (gnat_entity))); layout_type (gnu_subtype); - gnu_type = gnu_subtype; } } @@ -1556,8 +1546,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) && !In_Extended_Main_Code_Unit (Ancestor_Subtype (gnat_entity)) && (!Compile_Time_Known_Value (Type_Low_Bound (gnat_entity)) || !Compile_Time_Known_Value (Type_High_Bound (gnat_entity)))) - gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity), - gnu_expr, 0); + gnat_to_gnu_entity (Ancestor_Subtype (gnat_entity), gnu_expr, 0); gnu_type = make_node (INTEGER_TYPE); TREE_TYPE (gnu_type) = get_unpadded_type (Etype (gnat_entity)); @@ -1627,7 +1616,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) tree gnu_field_type, gnu_field; /* Set the RM size before wrapping up the type. */ - TYPE_RM_SIZE_NUM (gnu_type) + TYPE_RM_SIZE (gnu_type) = UI_To_gnu (RM_Size (gnat_entity), bitsizetype); TYPE_PACKED_ARRAY_TYPE_P (gnu_type) = 1; gnu_field_type = gnu_type; @@ -1644,8 +1633,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) /* Create a stripped-down declaration of the original type, mainly for debugging. */ - create_type_decl (get_entity_name (gnat_entity), gnu_field_type, - NULL, true, debug_info_p, gnat_entity); + create_type_decl (gnu_entity_id, gnu_field_type, NULL, true, + debug_info_p, gnat_entity); /* Don't notify the field as "addressable", since we won't be taking it's address and it would prevent create_field_decl from making a @@ -1670,7 +1659,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) tree gnu_field_type, gnu_field; /* Set the RM size before wrapping up the type. */ - TYPE_RM_SIZE_NUM (gnu_type) + TYPE_RM_SIZE (gnu_type) = UI_To_gnu (RM_Size (gnat_entity), bitsizetype); gnu_field_type = gnu_type; @@ -1682,8 +1671,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) /* Create a stripped-down declaration of the original type, mainly for debugging. */ - create_type_decl (get_entity_name (gnat_entity), gnu_field_type, - NULL, true, debug_info_p, gnat_entity); + create_type_decl (gnu_entity_id, gnu_field_type, NULL, true, + debug_info_p, gnat_entity); /* Don't notify the field as "addressable", since we won't be taking it's address and it would prevent create_field_decl from making a @@ -4750,11 +4739,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) if (this_global) force_global--; + /* If this is a packed array type whose original array type is itself + an Itype without freeze node, make sure the latter is processed. */ if (Is_Packed_Array_Type (gnat_entity) - && Is_Itype (Associated_Node_For_Itype (gnat_entity)) - && No (Freeze_Node (Associated_Node_For_Itype (gnat_entity))) - && !present_gnu_tree (Associated_Node_For_Itype (gnat_entity))) - gnat_to_gnu_entity (Associated_Node_For_Itype (gnat_entity), NULL_TREE, 0); + && Is_Itype (Original_Array_Type (gnat_entity)) + && No (Freeze_Node (Original_Array_Type (gnat_entity))) + && !present_gnu_tree (Original_Array_Type (gnat_entity))) + gnat_to_gnu_entity (Original_Array_Type (gnat_entity), NULL_TREE, 0); return gnu_decl; } @@ -5818,7 +5809,7 @@ make_packable_type (tree type, bool in_record) new_field_type = make_packable_type (new_field_type, true); /* However, for the last field in a not already packed record type - that is of an aggregate type, we need to use the RM_Size in the + that is of an aggregate type, we need to use the RM size in the packable version of the record type, see finish_record_type. */ if (!TREE_CHAIN (old_field) && !TYPE_PACKED (type) @@ -5895,8 +5886,8 @@ make_packable_type (tree type, bool in_record) DEFINITION is true if this type is being defined. - SAME_RM_SIZE is true if the RM_Size of the resulting type is to be set - to SIZE too; otherwise, it's set to the RM_Size of the original type. */ + SAME_RM_SIZE is true if the RM size of the resulting type is to be set + to SIZE too; otherwise, it's set to the RM size of the original type. */ tree maybe_pad_type (tree type, tree size, unsigned int align, @@ -6017,8 +6008,8 @@ maybe_pad_type (tree type, tree size, unsigned int align, /* Do not finalize it until after the auxiliary record is built. */ finish_record_type (record, field, 1, true); - /* Set the same size for its RM_size if requested; otherwise reuse - the RM_size of the original type. */ + /* Set the same size for its RM size if requested; otherwise reuse + the RM size of the original type. */ SET_TYPE_ADA_SIZE (record, same_rm_size ? size : orig_rm_size); /* Unless debugging information isn't being written for the input type, @@ -7256,7 +7247,7 @@ validate_size (Uint uint_size, tree gnu_type, Entity_Id gnat_object, return size; } -/* Similarly, but both validate and process a value of RM_Size. This +/* Similarly, but both validate and process a value of RM size. This routine is only called for types. */ static void @@ -7270,7 +7261,7 @@ set_rm_size (Uint uint_size, tree gnu_type, Entity_Id gnat_entity) tree size; /* Get the size as a tree. Do nothing if none was specified, either - because RM_Size was not Present or if the specified size was zero. + because RM size was not Present or if the specified size was zero. Give an error if a size was specified, but cannot be represented as in sizetype. */ if (No (uint_size) || uint_size == No_Uint) @@ -7315,13 +7306,14 @@ set_rm_size (Uint uint_size, tree gnu_type, Entity_Id gnat_entity) return; } - /* Otherwise, set the RM_Size. */ - if (TREE_CODE (gnu_type) == INTEGER_TYPE - && Is_Discrete_Or_Fixed_Point_Type (gnat_entity)) - TYPE_RM_SIZE_NUM (gnu_type) = size; - else if (TREE_CODE (gnu_type) == ENUMERAL_TYPE - || TREE_CODE (gnu_type) == BOOLEAN_TYPE) - TYPE_RM_SIZE_NUM (gnu_type) = size; + /* Otherwise, set the RM size proper for numerical types... */ + if ((TREE_CODE (gnu_type) == INTEGER_TYPE + && Is_Discrete_Or_Fixed_Point_Type (gnat_entity)) + || (TREE_CODE (gnu_type) == ENUMERAL_TYPE + || TREE_CODE (gnu_type) == BOOLEAN_TYPE)) + TYPE_RM_SIZE (gnu_type) = size; + + /* ...or the Ada size for record and union types. */ else if ((TREE_CODE (gnu_type) == RECORD_TYPE || TREE_CODE (gnu_type) == UNION_TYPE || TREE_CODE (gnu_type) == QUAL_UNION_TYPE) @@ -7383,7 +7375,7 @@ make_type_from_size (tree type, tree size_tree, bool for_biased) TYPE_NAME (new_type) = TYPE_NAME (type); } TYPE_BIASED_REPRESENTATION_P (new_type) = biased_p; - TYPE_RM_SIZE_NUM (new_type) = bitsize_int (size); + TYPE_RM_SIZE (new_type) = bitsize_int (size); return new_type; case RECORD_TYPE: @@ -7727,32 +7719,34 @@ substitute_in_type (tree t, tree f, tree r) } } -/* Return the "RM size" of GNU_TYPE. This is the actual number of bits +/* Return the RM size of GNU_TYPE. This is the actual number of bits needed to represent the object. */ tree rm_size (tree gnu_type) { - /* For integer types, this is the precision. For record types, we store - the size explicitly. For other types, this is just the size. */ - + /* For integer types, this is the precision. */ if (INTEGRAL_TYPE_P (gnu_type) && TYPE_RM_SIZE (gnu_type)) return TYPE_RM_SIZE (gnu_type); - else if (TREE_CODE (gnu_type) == RECORD_TYPE - && TYPE_CONTAINS_TEMPLATE_P (gnu_type)) - /* Return the rm_size of the actual data plus the size of the template. */ + + /* Return the RM size of the actual data plus the size of the template. */ + if (TREE_CODE (gnu_type) == RECORD_TYPE + && TYPE_CONTAINS_TEMPLATE_P (gnu_type)) return size_binop (PLUS_EXPR, rm_size (TREE_TYPE (TREE_CHAIN (TYPE_FIELDS (gnu_type)))), DECL_SIZE (TYPE_FIELDS (gnu_type))); - else if ((TREE_CODE (gnu_type) == RECORD_TYPE - || TREE_CODE (gnu_type) == UNION_TYPE - || TREE_CODE (gnu_type) == QUAL_UNION_TYPE) - && !TYPE_IS_FAT_POINTER_P (gnu_type) - && TYPE_ADA_SIZE (gnu_type)) + + /* For record types, we store the size explicitly. */ + if ((TREE_CODE (gnu_type) == RECORD_TYPE + || TREE_CODE (gnu_type) == UNION_TYPE + || TREE_CODE (gnu_type) == QUAL_UNION_TYPE) + && !TYPE_IS_FAT_POINTER_P (gnu_type) + && TYPE_ADA_SIZE (gnu_type)) return TYPE_ADA_SIZE (gnu_type); - else - return TYPE_SIZE (gnu_type); + + /* For other types, this is just the size. */ + return TYPE_SIZE (gnu_type); } /* Return an identifier representing the external name to be used for diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c index cbb8929..6edf7f4 100644 --- a/gcc/ada/gcc-interface/misc.c +++ b/gcc/ada/gcc-interface/misc.c @@ -544,7 +544,7 @@ gnat_print_type (FILE *file, tree node, int indent) case ENUMERAL_TYPE: case BOOLEAN_TYPE: - print_node (file, "RM size", TYPE_RM_SIZE_NUM (node), indent + 4); + print_node (file, "RM size", TYPE_RM_SIZE (node), indent + 4); break; case INTEGER_TYPE: @@ -558,7 +558,7 @@ gnat_print_type (FILE *file, tree node, int indent) else print_node (file, "index type", TYPE_INDEX_TYPE (node), indent + 4); - print_node (file, "RM size", TYPE_RM_SIZE_NUM (node), indent + 4); + print_node (file, "RM size", TYPE_RM_SIZE (node), indent + 4); break; case ARRAY_TYPE: diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 9558302..50e3fca 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -1297,7 +1297,7 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) /* If we're looking for the size of a field, return the field size. Otherwise, if the prefix is an object, or if 'Object_Size or 'Max_Size_In_Storage_Elements has been specified, the result is the - GCC size of the type. Otherwise, the result is the RM_Size of the + GCC size of the type. Otherwise, the result is the RM size of the type. */ if (TREE_CODE (gnu_prefix) == COMPONENT_REF) gnu_result = DECL_SIZE (TREE_OPERAND (gnu_prefix, 1)); @@ -1306,7 +1306,7 @@ Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute) || attribute == Attr_Max_Size_In_Storage_Elements) { /* If this is a padded type, the GCC size isn't relevant to the - programmer. Normally, what we want is the RM_Size, which was set + programmer. Normally, what we want is the RM size, which was set from the specified size, but if it was not set, we want the size of the relevant field. Using the MAX of those two produces the right result in all case. Don't use the size of the field if it's diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c index 8802827..3375c40 100644 --- a/gcc/ada/gcc-interface/utils.c +++ b/gcc/ada/gcc-interface/utils.c @@ -515,18 +515,17 @@ gnat_init_decl_processing (void) build_common_tree_nodes (true, true); /* In Ada, we use a signed type for SIZETYPE. Use the signed type - corresponding to the size of Pmode. In most cases when ptr_mode and - Pmode differ, C will use the width of ptr_mode as sizetype. But we get - far better code using the width of Pmode. Make this here since we need - this before we can expand the GNAT types. */ - size_type_node = gnat_type_for_size (GET_MODE_BITSIZE (Pmode), 0); + corresponding to the width of Pmode. In most cases when ptr_mode + and Pmode differ, C will use the width of ptr_mode for SIZETYPE. + But we get far better code using the width of Pmode. */ + size_type_node = gnat_type_for_mode (Pmode, 0); set_sizetype (size_type_node); /* In Ada, we use an unsigned 8-bit type for the default boolean type. */ boolean_type_node = make_node (BOOLEAN_TYPE); TYPE_PRECISION (boolean_type_node) = 1; fixup_unsigned_type (boolean_type_node); - TYPE_RM_SIZE_NUM (boolean_type_node) = bitsize_int (1); + TYPE_RM_SIZE (boolean_type_node) = bitsize_int (1); build_common_tree_nodes_2 (0); @@ -2230,7 +2229,7 @@ gnat_types_compatible_p (tree t1, tree t2) && TREE_TYPE (t1) == TREE_TYPE (t2) && (TYPE_DOMAIN (t1) == TYPE_DOMAIN (t2) || (TYPE_DOMAIN (t1) - && TYPE_DOMAIN (t2) + && TYPE_DOMAIN (t2) && tree_int_cst_equal (TYPE_MIN_VALUE (TYPE_DOMAIN (t1)), TYPE_MIN_VALUE (TYPE_DOMAIN (t2))) && tree_int_cst_equal (TYPE_MAX_VALUE (TYPE_DOMAIN (t1)), @@ -5176,10 +5175,10 @@ handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name), bool * ARG_UNUSED (no_add_attrs)) { tree params; - + /* Ensure we have a function type. */ gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE); - + params = TYPE_ARG_TYPES (*node); while (params && ! VOID_TYPE_P (TREE_VALUE (params))) params = TREE_CHAIN (params); |