Commit 2f5c7f45 by Geoff Keating Committed by Geoffrey Keating

tree.h (DECL_OFFSET_ALIGN): Make the off_align field of the tree structure an…

tree.h (DECL_OFFSET_ALIGN): Make the off_align field of the tree structure an exponent rather than an...

* tree.h (DECL_OFFSET_ALIGN): Make the off_align field of
the tree structure an exponent rather than an explicit alignment
so it doesn't overflow.
(SET_DECL_OFFSET_ALIGN): New macro.
* stor-layout.c (place_union_field): Use SET_DECL_OFFSET_ALIGN
rather than DECL_OFFSET_ALIGN.
(place_field): Likewise.
* expmed.c (store_bit_field): Abort on align==0 to avoid
antisocial machine behaviour.

From-SVN: r35659
parent 808d8c41
2000-05-13 Geoffrey Keating <geoffk@cygnus.com>
* tree.h (DECL_OFFSET_ALIGN): Make the off_align field of
the tree structure an exponent rather than an explicit alignment
so it doesn't overflow.
(SET_DECL_OFFSET_ALIGN): New macro.
* stor-layout.c (place_union_field): Use SET_DECL_OFFSET_ALIGN
rather than DECL_OFFSET_ALIGN.
(place_field): Likewise.
* expmed.c (store_bit_field): Abort on align==0 to avoid
antisocial machine behaviour.
2000-08-12 Richard Henderson <rth@cygnus.com> 2000-08-12 Richard Henderson <rth@cygnus.com>
* sibcall.c (uses_addressof): Accept both addressof and * sibcall.c (uses_addressof): Accept both addressof and
......
...@@ -245,6 +245,11 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size) ...@@ -245,6 +245,11 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
insv_bitsize = GET_MODE_BITSIZE (op_mode); insv_bitsize = GET_MODE_BITSIZE (op_mode);
#endif #endif
/* It is wrong to have align==0, since every object is aligned at
least at a bit boundary. This usually means a bug elsewhere. */
if (align == 0)
abort ();
/* Discount the part of the structure before the desired byte. /* Discount the part of the structure before the desired byte.
We need to know how many bytes are safe to reference after it. */ We need to know how many bytes are safe to reference after it. */
if (total_size >= 0) if (total_size >= 0)
......
...@@ -584,7 +584,7 @@ place_union_field (rli, field) ...@@ -584,7 +584,7 @@ place_union_field (rli, field)
DECL_FIELD_OFFSET (field) = size_zero_node; DECL_FIELD_OFFSET (field) = size_zero_node;
DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node; DECL_FIELD_BIT_OFFSET (field) = bitsize_zero_node;
DECL_OFFSET_ALIGN (field) = BIGGEST_ALIGNMENT; SET_DECL_OFFSET_ALIGN (field, BIGGEST_ALIGNMENT);
desired_align = DECL_ALIGN (field); desired_align = DECL_ALIGN (field);
...@@ -859,7 +859,7 @@ place_field (rli, field) ...@@ -859,7 +859,7 @@ place_field (rli, field)
normalize_rli (rli); normalize_rli (rli);
DECL_FIELD_OFFSET (field) = rli->offset; DECL_FIELD_OFFSET (field) = rli->offset;
DECL_FIELD_BIT_OFFSET (field) = rli->bitpos; DECL_FIELD_BIT_OFFSET (field) = rli->bitpos;
DECL_OFFSET_ALIGN (field) = rli->offset_align; SET_DECL_OFFSET_ALIGN (field, rli->offset_align);
/* If this field ended up more aligned than we thought it would be (we /* If this field ended up more aligned than we thought it would be (we
approximate this by seeing if its position changed), lay out the field approximate this by seeing if its position changed), lay out the field
......
...@@ -1308,8 +1308,15 @@ struct tree_type ...@@ -1308,8 +1308,15 @@ struct tree_type
#define DECL_SIZE_UNIT(NODE) (DECL_CHECK (NODE)->decl.size_unit) #define DECL_SIZE_UNIT(NODE) (DECL_CHECK (NODE)->decl.size_unit)
/* Holds the alignment required for the datum. */ /* Holds the alignment required for the datum. */
#define DECL_ALIGN(NODE) (DECL_CHECK (NODE)->decl.u1.a.align) #define DECL_ALIGN(NODE) (DECL_CHECK (NODE)->decl.u1.a.align)
/* For FIELD_DECLs, holds the alignment that DECL_FIELD_OFFSET has. */ /* For FIELD_DECLs, off_align holds the number of low-order bits of
#define DECL_OFFSET_ALIGN(NODE) (FIELD_DECL_CHECK (NODE)->decl.u1.a.off_align) DECL_FIELD_OFFSET which are known to be always zero.
DECL_OFFSET_ALIGN thus returns the alignment that DECL_FIELD_OFFSET
has. */
#define DECL_OFFSET_ALIGN(NODE) \
(((unsigned HOST_WIDE_INT)1) << FIELD_DECL_CHECK (NODE)->decl.u1.a.off_align)
/* Specify that DECL_ALIGN(NODE) is a multiple of X. */
#define SET_DECL_OFFSET_ALIGN(NODE, X) \
(FIELD_DECL_CHECK (NODE)->decl.u1.a.off_align = exact_log2 ((X) & -(X)))
/* 1 if the alignment for this type was requested by "aligned" attribute, /* 1 if the alignment for this type was requested by "aligned" attribute,
0 if it is the default for this type. */ 0 if it is the default for this type. */
#define DECL_USER_ALIGN(NODE) (DECL_CHECK (NODE)->decl.user_align) #define DECL_USER_ALIGN(NODE) (DECL_CHECK (NODE)->decl.user_align)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment