This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Fix bogus error with packed array type on AVR
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 30 Oct 2009 16:12:13 +0100
- Subject: [Ada] Fix bogus error with packed array type on AVR
The testcase fails to compile for targets that define MAX_FIXED_MODE_SIZE to
something smaller than 64, in particular the AVR. It turns out that the
check responsible for the problem is overzealous and can be relaxed.
Tested on i586-suse-linux, applied on the mainline.
2009-10-30 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (MAX_FIXED_MODE_SIZE): Delete.
(create_field_decl): Update description. In a packed record, round
the size up to a byte boundary only if the field's type has BLKmode.
* gcc-interface/gigi.h (create_field_decl): Update description.
2009-10-30 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/pack5.ads: New test.
--
Eric Botcazou
Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c (revision 153644)
+++ gcc-interface/utils.c (working copy)
@@ -59,10 +59,6 @@
#include "ada-tree.h"
#include "gigi.h"
-#ifndef MAX_FIXED_MODE_SIZE
-#define MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
-#endif
-
#ifndef MAX_BITS_PER_WORD
#define MAX_BITS_PER_WORD BITS_PER_WORD
#endif
@@ -1457,13 +1453,13 @@ aggregate_type_contains_array_p (tree ty
}
}
-/* Return a FIELD_DECL node. FIELD_NAME the field name, FIELD_TYPE is its
- type, and RECORD_TYPE is the type of the parent. PACKED is nonzero if
- this field is in a record type with a "pragma pack". If SIZE is nonzero
- it is the specified size for this field. If POS is nonzero, it is the bit
- position. If ADDRESSABLE is nonzero, it means we are allowed to take
- the address of this field for aliasing purposes. If it is negative, we
- should not make a bitfield, which is used by make_aligning_type. */
+/* Return a FIELD_DECL node. FIELD_NAME is the field's name, FIELD_TYPE is
+ its type and RECORD_TYPE is the type of the enclosing record. PACKED is
+ 1 if the enclosing record is packed, -1 if it has Component_Alignment of
+ Storage_Unit. If SIZE is nonzero, it is the specified size of the field.
+ If POS is nonzero, it is the bit position. If ADDRESSABLE is nonzero, it
+ means we are allowed to take the address of the field; if it is negative,
+ we should not make a bitfield, which is used by make_aligning_type. */
tree
create_field_decl (tree field_name, tree field_type, tree record_type,
@@ -1497,12 +1493,8 @@ create_field_decl (tree field_name, tree
else if (packed == 1)
{
size = rm_size (field_type);
-
- /* For a constant size larger than MAX_FIXED_MODE_SIZE, round up to
- byte. */
- if (TREE_CODE (size) == INTEGER_CST
- && compare_tree_int (size, MAX_FIXED_MODE_SIZE) > 0)
- size = round_up (size, BITS_PER_UNIT);
+ if (TYPE_MODE (field_type) == BLKmode)
+ size = round_up (size, BITS_PER_UNIT);
}
/* If we may, according to ADDRESSABLE, make a bitfield if a size is
Index: gcc-interface/gigi.h
===================================================================
--- gcc-interface/gigi.h (revision 153644)
+++ gcc-interface/gigi.h (working copy)
@@ -643,12 +643,13 @@ extern void record_global_renaming_point
/* Invalidate the global renaming pointers. */
extern void invalidate_global_renaming_pointers (void);
-/* Returns a FIELD_DECL node. FIELD_NAME the field name, FIELD_TYPE is its
- type, and RECORD_TYPE is the type of the parent. PACKED is nonzero if
- this field is in a record type with a "pragma pack". If SIZE is nonzero
- it is the specified size for this field. If POS is nonzero, it is the bit
- position. If ADDRESSABLE is nonzero, it means we are allowed to take
- the address of this field for aliasing purposes. */
+/* Return a FIELD_DECL node. FIELD_NAME is the field's name, FIELD_TYPE is
+ its type and RECORD_TYPE is the type of the enclosing record. PACKED is
+ 1 if the enclosing record is packed, -1 if it has Component_Alignment of
+ Storage_Unit. If SIZE is nonzero, it is the specified size of the field.
+ If POS is nonzero, it is the bit position. If ADDRESSABLE is nonzero, it
+ means we are allowed to take the address of the field; if it is negative,
+ we should not make a bitfield, which is used by make_aligning_type. */
extern tree create_field_decl (tree field_name, tree field_type,
tree record_type, int packed, tree size,
tree pos, int addressable);
package Pack5 is
type Small is range -32 .. 31;
type Arr is array (Integer range <>) of Small;
pragma Pack (Arr);
type Rec is record
Y: Arr (1 .. 10);
end record;
pragma Pack (Rec);
end Pack5;