exp_dbug.ads: Adjust type names in comments.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 16 Oct 2009 19:28:52 +0000 (19:28 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 16 Oct 2009 19:28:52 +0000 (19:28 +0000)
* exp_dbug.ads: Adjust type names in comments.
* gcc-interface/decl.c (maybe_pad_type): Remove NAME_TRAILER parameter,
add new IS_COMPONENT_TYPE parameter.  Adjust.  Remove dead code.
(gnat_to_gnu_entity): Adjust for above change.
(gnat_to_gnu_component_type): Likewise.
(gnat_to_gnu_field): Likewise.
* gcc-interface/trans.c (call_to_gnu): Likewise.  Do not unnecessarily
call max_size.
* gcc-interface/utils.c (finish_record_type): Remove obsolete code.
* gcc-interface/gigi.h (maybe_pad_type): Adjust prototype.

From-SVN: r152916

gcc/ada/ChangeLog
gcc/ada/exp_dbug.ads
gcc/ada/gcc-interface/decl.c
gcc/ada/gcc-interface/gigi.h
gcc/ada/gcc-interface/trans.c
gcc/ada/gcc-interface/utils.c

index 2e65233339cc91cf4c03bdd5b7600dba26fa9dab..4338d03d16780f4b749c2bc08bcdadc44b9ffd03 100644 (file)
@@ -1,3 +1,16 @@
+2009-10-16  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * exp_dbug.ads: Adjust type names in comments.
+       * gcc-interface/decl.c (maybe_pad_type): Remove NAME_TRAILER parameter,
+       add new IS_COMPONENT_TYPE parameter.  Adjust.  Remove dead code.
+       (gnat_to_gnu_entity): Adjust for above change.
+       (gnat_to_gnu_component_type): Likewise.
+       (gnat_to_gnu_field): Likewise.
+       * gcc-interface/trans.c (call_to_gnu): Likewise.  Do not unnecessarily
+       call max_size.
+       * gcc-interface/utils.c (finish_record_type): Remove obsolete code.
+       * gcc-interface/gigi.h (maybe_pad_type): Adjust prototype.
+
 2009-10-16  Joel Sherrill <joel.sherrill@oarcorp.com>
 
        * s-osinte-rtems.ads: Add mutex type to pthread_mutexattr_t
index 3c3144641d8266b84cce8dfb3fd38fab14d946d5..1d26bb3ef754fb24e37fe8cdf4315608c27bd993 100644 (file)
@@ -873,12 +873,12 @@ package Exp_Dbug is
       --  the element type for AT1 might have a type defined as if it had
       --  been written:
       --
-      --     type at1___C_PAD is record null; end record;
-      --     for at1___C_PAD'Size use 16 * 8;
+      --     type at1___PAD is record null; end record;
+      --     for at1___PAD'Size use 16 * 8;
       --
       --  and there would also be
       --
-      --     type at1___C_PAD___XVS is record t1: Integer; end record;
+      --     type at1___PAD___XVS is record t1: Integer; end record;
       --     type t1 is ...
       --
       --  Had the subtype Int been dynamic:
@@ -888,7 +888,7 @@ package Exp_Dbug is
       --  Then the compiler would also generate a declaration whose effect
       --  would be
       --
-      --     at1___C_PAD___XVZ: constant Integer := 32 + M * 8 + padding term;
+      --     at1___PAD___XVZ: constant Integer := 32 + M * 8 + padding term;
       --
       --  Not all unconstrained types are so encoded; the XVS convention may be
       --  unnecessary for unconstrained types of fixed size. However, this
index f2f0f159abd29b182838a865ddafdd130585a7e5..afef46ec8093ee81bcfaeebf6f36a09e870b16c8 100644 (file)
@@ -633,7 +633,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
            else
              gnu_type
                = maybe_pad_type (gnu_type, NULL_TREE, align, gnat_entity,
-                                 "PAD", false, definition, true);
+                                 false, false, definition, true);
          }
 
        /* If we are defining the object, see if it has a Size value and
@@ -838,7 +838,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
        gnu_object_size = gnu_size ? gnu_size : TYPE_SIZE (gnu_type);
        if (gnu_size || align > 0)
          gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity,
-                                    "PAD", false, definition,
+                                    false, false, definition,
                                     gnu_size ? true : false);
 
        /* If this is a renaming, avoid as much as possible to create a new
@@ -1017,8 +1017,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
            && !gnu_expr
            && TREE_CODE (gnu_type) == RECORD_TYPE
            && (TYPE_CONTAINS_TEMPLATE_P (gnu_type)
-               /* Beware that padding might have been introduced
-                  via maybe_pad_type above.  */
+               /* Beware that padding might have been introduced above.  */
                || (TYPE_IS_PADDING_P (gnu_type)
                    && TREE_CODE (TREE_TYPE (TYPE_FIELDS (gnu_type)))
                       == RECORD_TYPE
@@ -4446,7 +4445,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
         us when we make the new TYPE_DECL below.  */
       if (gnu_size || align > 0)
        gnu_type = maybe_pad_type (gnu_type, gnu_size, align, gnat_entity,
-                                  "PAD", true, definition, false);
+                                  false, true, definition, false);
 
       if (TREE_CODE (gnu_type) == RECORD_TYPE
          && TYPE_IS_PADDING_P (gnu_type))
@@ -5037,7 +5036,7 @@ gnat_to_gnu_component_type (Entity_Id gnat_array, bool definition,
        orig_type = gnu_type;
 
       gnu_type = maybe_pad_type (gnu_type, gnu_comp_size, 0, gnat_array,
-                                "C_PAD", false, definition, true);
+                                true, false, definition, true);
 
       /* If a padding record was made, declare it now since it will never be
         declared otherwise.  This is necessary to ensure that its subtrees
@@ -6046,25 +6045,20 @@ make_packable_type (tree type, bool in_record)
 \f
 /* Ensure that TYPE has SIZE and ALIGN.  Make and return a new padded type
    if needed.  We have already verified that SIZE and TYPE are large enough.
-
-   GNAT_ENTITY and NAME_TRAILER are used to name the resulting record and
-   to issue a warning.
-
-   IS_USER_TYPE is true if we must complete the original type.
-
-   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.  */
+   GNAT_ENTITY is used to name the resulting record and to issue a warning.
+   IS_COMPONENT_TYPE is true if this is being done for the component type
+   of an array.  IS_USER_TYPE is true if we must complete the original type.
+   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.  */
 
 tree
 maybe_pad_type (tree type, tree size, unsigned int align,
-               Entity_Id gnat_entity, const char *name_trailer,
+               Entity_Id gnat_entity, bool is_component_type,
                bool is_user_type, bool definition, bool same_rm_size)
 {
   tree orig_rm_size = same_rm_size ? NULL_TREE : rm_size (type);
   tree orig_size = TYPE_SIZE (type);
-  unsigned int orig_align = align;
   tree record, field;
 
   /* If TYPE is a padded type, see if it agrees with any size and alignment
@@ -6124,15 +6118,12 @@ maybe_pad_type (tree type, tree size, unsigned int align,
   TYPE_IS_PADDING_P (record) = 1;
 
   if (Present (gnat_entity))
-    TYPE_NAME (record) = create_concat_name (gnat_entity, name_trailer);
+    TYPE_NAME (record) = create_concat_name (gnat_entity, "PAD");
 
   TYPE_VOLATILE (record)
     = Present (gnat_entity) && Treat_As_Volatile (gnat_entity);
 
   TYPE_ALIGN (record) = align;
-  if (orig_align)
-    TYPE_USER_ALIGN (record) = align;
-
   TYPE_SIZE (record) = size ? size : orig_size;
   TYPE_SIZE_UNIT (record)
     = convert (sizetype,
@@ -6256,7 +6247,7 @@ maybe_pad_type (tree type, tree size, unsigned int align,
            post_error_ne_tree ("{^ }bits of & unused?",
                                gnat_error_node, gnat_entity,
                                size_diffop (size, orig_size));
-         else if (name_trailer[0] == 'C')
+         else if (is_component_type)
            post_error_ne_tree ("component of& padded{ by ^ bits}?",
                                gnat_entity, gnat_entity,
                                size_diffop (size, orig_size));
@@ -6634,7 +6625,7 @@ gnat_to_gnu_field (Entity_Id gnat_field, tree gnu_record_type, int packed,
 
       orig_field_type = gnu_field_type;
       gnu_field_type = maybe_pad_type (gnu_field_type, gnu_size, 0, gnat_field,
-                                      "PAD", false, definition, true);
+                                      false, false, definition, true);
 
       /* If a padding record was made, declare it now since it will never be
         declared otherwise.  This is necessary to ensure that its subtrees
index ea1a65d485be7958162fdee9cb7f8732a699b62d..f376b22e2ccecca2ec06b81beaedd921ec58b5f3 100644 (file)
@@ -124,21 +124,16 @@ extern tree make_aligning_type (tree type, unsigned int align, tree size,
 
 /* Ensure that TYPE has SIZE and ALIGN.  Make and return a new padded type
    if needed.  We have already verified that SIZE and TYPE are large enough.
-
-   GNAT_ENTITY and NAME_TRAILER are used to name the resulting record and
-   to issue a warning.
-
-   IS_USER_TYPE is true if we must be sure we complete the original type.
-
-   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 its TYPE_SIZE; otherwise, it's set to the RM_Size of the original
-   type.  */
+   GNAT_ENTITY is used to name the resulting record and to issue a warning.
+   IS_COMPONENT_TYPE is true if this is being done for the component type
+   of an array.  IS_USER_TYPE is true if we must complete the original type.
+   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.  */
 extern tree maybe_pad_type (tree type, tree size, unsigned int align,
-                            Entity_Id gnat_entity, const char *name_trailer,
+                           Entity_Id gnat_entity, bool is_component_type,
                            bool is_user_type, bool definition,
-                            bool same_rm_size);
+                           bool same_rm_size);
 
 /* Given a GNU tree and a GNAT list of choices, generate an expression to test
    the value passed against the list of choices.  */
index d94d1f45bfc17142e51b21eb86f5a9ec7810dd88..74aa2b67ef422643eccbfc6879fd2017c6cfe992 100644 (file)
@@ -2423,22 +2423,27 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
       }
     }
 
-  /* If we are calling by supplying a pointer to a target, set up that
-     pointer as the first argument.  Use GNU_TARGET if one was passed;
-     otherwise, make a target by building a variable of the maximum size
-     of the type.  */
+  /* If we are calling by supplying a pointer to a target, set up that pointer
+     as the first argument.  Use GNU_TARGET if one was passed; otherwise, make
+     a target by building a variable and use the maximum size of the type if
+     it has self-referential size.  */
   if (TYPE_RETURNS_BY_TARGET_PTR_P (gnu_subprog_type))
     {
-      tree gnu_real_ret_type
+      tree gnu_ret_type
        = TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (gnu_subprog_type)));
 
       if (!gnu_target)
        {
-         tree gnu_obj_type
-           = maybe_pad_type (gnu_real_ret_type,
-                             max_size (TYPE_SIZE (gnu_real_ret_type), true),
-                             0, Etype (Name (gnat_node)), "PAD", false,
-                             false, false);
+         tree gnu_obj_type;
+
+         if (CONTAINS_PLACEHOLDER_P (TYPE_SIZE (gnu_ret_type)))
+           gnu_obj_type
+             = maybe_pad_type (gnu_ret_type,
+                               max_size (TYPE_SIZE (gnu_ret_type), true),
+                               0, Etype (Name (gnat_node)), false, false,
+                               false, true);
+         else
+           gnu_obj_type = gnu_ret_type;
 
          /* ??? We may be about to create a static temporary if we happen to
             be at the global binding level.  That's a regression from what
@@ -2454,7 +2459,7 @@ call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target)
       gnu_actual_list
        = tree_cons (NULL_TREE,
                     build_unary_op (ADDR_EXPR, NULL_TREE,
-                                    unchecked_convert (gnu_real_ret_type,
+                                    unchecked_convert (gnu_ret_type,
                                                        gnu_target,
                                                        false)),
                     NULL_TREE);
index 7acb2ce2de4ec8343c887eb4890cbe06dc6f20f3..f1a4b0065ba0cdc5968dd000bb1860c73671f99f 100644 (file)
@@ -739,11 +739,6 @@ finish_record_type (tree record_type, tree fieldlist, int rep_level,
   if (code == QUAL_UNION_TYPE)
     nreverse (fieldlist);
 
-  /* If the type is discriminated, it can be used to access all its
-     constrained subtypes, so force structural equality checks.  */
-  if (CONTAINS_PLACEHOLDER_P (size))
-    SET_TYPE_STRUCTURAL_EQUALITY (record_type);
-
   if (rep_level < 2)
     {
       /* If this is a padding record, we never want to make the size smaller