OSDN Git Service

* gcc-interface/decl.c (gnat_to_gnu_entity) <discrete_type>: Do not
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 6 Jan 2013 12:04:25 +0000 (12:04 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 6 Jan 2013 12:04:25 +0000 (12:04 +0000)
pack the field of the record type made for a misaligned type.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@194944 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/alignment10.adb [new file with mode: 0644]

index b5cbbeb..245a0d2 100644 (file)
@@ -1,5 +1,10 @@
 2013-01-06  Eric Botcazou  <ebotcazou@adacore.com>
 
+       * gcc-interface/decl.c (gnat_to_gnu_entity) <discrete_type>: Do not
+       pack the field of the record type made for a misaligned type.
+
+2013-01-06  Eric Botcazou  <ebotcazou@adacore.com>
+
        Backport from mainline
        2013-01-04  Robert Dewar  <dewar@adacore.com>
 
index 97f8d65..9ae5b4b 100644 (file)
@@ -1896,8 +1896,10 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
        }
 
       /* If the type we are dealing with has got a smaller alignment than the
-        natural one, we need to wrap it up in a record type and under-align
-        the latter.  We reuse the padding machinery for this purpose.  */
+        natural one, we need to wrap it up in a record type and misalign the
+        latter; we reuse the padding machinery for this purpose.  Note that,
+        even if the record type is marked as packed because of misalignment,
+        we don't pack the field so as to give it the size of the type.  */
       else if (align > 0)
        {
          tree gnu_field_type, gnu_field;
@@ -1927,7 +1929,8 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
             a bitfield.  */
          gnu_field
            = create_field_decl (get_identifier ("F"), gnu_field_type,
-                                gnu_type, NULL_TREE, bitsize_zero_node, 1, 0);
+                                gnu_type, TYPE_SIZE (gnu_field_type),
+                                bitsize_zero_node, 0, 0);
 
          finish_record_type (gnu_type, gnu_field, 2, debug_info_p);
          compute_record_mode (gnu_type);
index 7f8d377..1522e1b 100644 (file)
@@ -1,3 +1,7 @@
+2013-01-06  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/alignment10.adb: New test.
+
 2012-12-22  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        Backport from mainline:
diff --git a/gcc/testsuite/gnat.dg/alignment10.adb b/gcc/testsuite/gnat.dg/alignment10.adb
new file mode 100644 (file)
index 0000000..61779f1
--- /dev/null
@@ -0,0 +1,20 @@
+-- { dg-do run }\r
+\r
+procedure Alignment10 is\r
+\r
+   type Short_T is mod 2 ** 16;\r
+   for Short_T'Size use 16;\r
+   for Short_T'Alignment use 1;\r
+\r
+   subtype Short_Sub_T is Short_T range 1000 .. 1005;\r
+\r
+   A : aliased Short_T := 1000;\r
+   B : Short_Sub_T;\r
+   for B'Address use A'Address;\r
+   pragma Import (Ada, B);\r
+\r
+begin\r
+  if B /= 1000 then\r
+    raise Program_Error;\r
+  end if;\r
+end;\r