diff options
author | Eric Christopher <echristo@apple.com> | 2006-04-28 23:34:41 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2006-04-28 23:34:41 +0000 |
commit | bba0c4508c0738e9f0caf053959a4a755e7f64e0 (patch) | |
tree | 2bb7b0bf07922213a14b203add90c0b67ddb0d46 | |
parent | 6ccdc6695d4ec46cd21d4b7e92355f00e090ac9d (diff) |
2006-04-27 Eric Christopher <echristo@apple.com>apple/gcc-5339
Radar 4454599
Radar 4481146
* stor-layout.c (update_alignment_for_field): Unconditionalize
ms_bitfield_layout_p code. Handle non-bitfield fields. Remove
extra alignment code.
(place_field): Don't realign if ms_bitfield_layout_p. Unconditionalize
ms_bitfield_layout_p code. Rewrite handling of structure fields.
Rewrite bitfield reversal handling.
2006-04-28 Eric Christopher <echristo@apple.com>
Radar 4454599
* gcc.apple/bitreverse-13.c: Remove.
* gcc.apple/bitreverse-19.c: Ditto.
* gcc.apple/bitreverse-2.c: Ditto.
* gcc.apple/bitreverse-20.c: Ditto.
* gcc.apple/bitreverse-21.c: Ditto.
* gcc.apple/bitreverse-24.c: Ditto.
* gcc.apple/bitreverse-27.c: Ditto.
* gcc.apple/bitreverse-4.c: Ditto.
* gcc.apple/bitreverse-5.c: Ditto.
* gcc.apple/bitreverse-6.c: Ditto.
* gcc.apple/bitreverse-7.c: Ditto.
* gcc.apple/bitreverse-8.c: Ditto.
* gcc.apple/bitreverse-18.c: Add #pragma ms_struct
to locations where we turn on pragma reverse_bitfields.
* gcc.apple/bitreverse-3.c: Ditto.
* gcc.apple/bitreverse-11.c: Ditto.
* gcc.apple/bitreverse-15.c: Ditto.
* gcc.apple/bitreverse-12.c: Ditto.
* gcc.apple/bitreverse-16.c: Ditto.
* gcc.apple/bitreverse-25.c: Ditto.
* gcc.apple/bitreverse-1.c: Ditto.
* gcc.apple/bitreverse-9.c: Ditto.
* gcc.apple/bitreverse-17.c: Ditto.
* gcc.apple/bitreverse-22.c: Ditto.
* gcc.apple/bitreverse-26.c: Ditto.
* gcc.apple/bitreverse-10.c: Ditto.
* gcc.apple/bitreverse-14.c: Ditto.
* g++.dg/bitreverse-10.C: Ditto.
* g++.dg/bitreverse-23.C: Ditto.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/apple/200605-release@113361 138bc75d-0d04-0410-961f-82ee72b054a4
32 files changed, 235 insertions, 1329 deletions
diff --git a/gcc/ChangeLog.apple-ppc b/gcc/ChangeLog.apple-ppc index 36cd241c59d..53805cfa89d 100644 --- a/gcc/ChangeLog.apple-ppc +++ b/gcc/ChangeLog.apple-ppc @@ -1,3 +1,14 @@ +2006-04-27 Eric Christopher <echristo@apple.com> + + Radar 4454599 + Radar 4481146 + * stor-layout.c (update_alignment_for_field): Unconditionalize + ms_bitfield_layout_p code. Handle non-bitfield fields. Remove + extra alignment code. + (place_field): Don't realign if ms_bitfield_layout_p. Unconditionalize + ms_bitfield_layout_p code. Rewrite handling of structure fields. + Rewrite bitfield reversal handling. + 2006-04-27 Hui-May Chang <hm.chang@apple.com> Radar 4314956 diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index aab8d098fdc..0eedc3afdf0 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -360,7 +360,7 @@ layout_decl (tree decl, unsigned int known_align) && ! DECL_PACKED (decl) && ! targetm.ms_bitfield_layout_p (DECL_FIELD_CONTEXT (decl))) { -#ifdef PCC_BITFIELD_TYPE_MATTERS +#ifdef PCC_BITFIELD_TYPE_MATTRS if (PCC_BITFIELD_TYPE_MATTERS) do_type_align (type, decl); else @@ -547,11 +547,6 @@ start_record_layout (tree t) rli->prev_field = 0; rli->pending_statics = 0; rli->packed_maybe_necessary = 0; - /* APPLE LOCAL begin bitfield reversal */ - rli->among_reversed_bitfields = 0; - rli->reversed_bitfield_type_size = 0; - rli->reversed_bitfield_bitpos = 0; - /* APPLE LOCAL end bitfield reversal */ return rli; } @@ -625,6 +620,10 @@ debug_rli (record_layout_info rli) fprintf (stderr, "\naligns: rec = %u, unpack = %u, off = %u\n", rli->record_align, rli->unpacked_align, rli->offset_align); + /* APPLE LOCAL begin ms_struct */ + if (rli->remaining_in_alignment) + fprintf (stderr, "remaining_in_alignment = %u\n", rli->remaining_in_alignment); + /* APPLE LOCAL end ms_struct */ if (rli->packed_maybe_necessary) fprintf (stderr, "packed may be necessary\n"); @@ -706,7 +705,8 @@ update_alignment_for_field (record_layout_info rli, tree field, /* Record must have at least as much alignment as any field. Otherwise, the alignment of the field within the record is meaningless. */ - if (is_bitfield && targetm.ms_bitfield_layout_p (rli->t)) + /* APPLE LOCAL begin ms_struct */ + if (targetm.ms_bitfield_layout_p (rli->t)) { /* Here, the alignment of the underlying type of a bitfield can affect the alignment of a record; even a zero-sized field @@ -714,11 +714,12 @@ update_alignment_for_field (record_layout_info rli, tree field, the type, except that for zero-size bitfields this only applies if there was an immediately prior, nonzero-size bitfield. (That's the way it is, experimentally.) */ - if (! integer_zerop (DECL_SIZE (field)) + if (!is_bitfield + || (!integer_zerop (DECL_SIZE (field)) ? ! DECL_PACKED (field) : (rli->prev_field && DECL_BIT_FIELD_TYPE (rli->prev_field) - && ! integer_zerop (DECL_SIZE (rli->prev_field)))) + && !integer_zerop (DECL_SIZE (rli->prev_field))))) { unsigned int type_align = TYPE_ALIGN (type); type_align = MAX (type_align, desired_align); @@ -728,6 +729,7 @@ update_alignment_for_field (record_layout_info rli, tree field, rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type)); } } + /* APPLE LOCAL end ms_struct */ #ifdef PCC_BITFIELD_TYPE_MATTERS else if (is_bitfield && PCC_BITFIELD_TYPE_MATTERS) { @@ -825,8 +827,6 @@ excess_unit_span (HOST_WIDE_INT byte_offset, HOST_WIDE_INT bit_offset, } #endif -/* APPLE LOCAL begin bitfield reversal */ -/* 4401223 4401224 4420068 4317709 4431497 4433004 4430139 4436477 */ /* RLI contains information about the layout of a RECORD_TYPE. FIELD is a FIELD_DECL to be added after those fields already present in T. (FIELD is not actually added to the TYPE_FIELDS list here; @@ -857,31 +857,7 @@ place_field (record_layout_info rli, tree field) rli->pending_statics); return; } - /* In C++ the list doesn't necessarily end with the last data member. - There always seems to be a TYPE_DECL for the class type in this list - which comes after all the data members, so use that to detect the end. - In C this operation is done at list end (bottom of this function). */ - else if (targetm.reverse_bitfields_p (rli->t) && rli->among_reversed_bitfields - && TREE_CODE (field) == TYPE_DECL && TREE_TYPE(field) == rli->t) - { - /* If we're at the end of the struct and there are dangling reversed bitfields, - adjust rli->bitpos. Needed to get sizeof right. */ - /* Make sure we complete the current allocation unit (e.g. if we've used - 16 of 32 bits these will be the ones at the right, we must move up to - a 32 bit boundary). But, when pragma pack(1) is on, do not use the - full allocation unit size (experiment indicates CW treats pack(1) - different from other pack values, although the reason remains - mysterious.) */ - unsigned int save_bitpos = rli->reversed_bitfield_bitpos; - if (save_bitpos > 0 && rli->reversed_bitfield_type_size > save_bitpos - && maximum_field_alignment != 8) - save_bitpos = rli->reversed_bitfield_type_size; - - rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, bitsize_int (save_bitpos)); - normalize_rli (rli); - rli->among_reversed_bitfields = 0; - return; - } + /* Enumerators and enum types which are local to this class need not be laid out. Likewise for initialized constant fields. */ else if (TREE_CODE (field) != FIELD_DECL) @@ -895,62 +871,15 @@ place_field (record_layout_info rli, tree field) return; } - /* If we're at the non-bitfield terminating a run of reversed bitfields, - or a bitfield that won't fit in the current unit of bitfield allocation, - or a zero-sized field, adjust rli->bitpos by adding in the accumulated - reversed sizes. Nonintuitively, it is correct to check DECL_BIT_FIELD here but - DECL_BIT_FIELD_TYPE below; the information is moved by - update_alignment_for_field. */ - if (targetm.reverse_bitfields_p (rli->t) && rli->among_reversed_bitfields - && (!DECL_BIT_FIELD (field) || integer_zerop (DECL_SIZE (field)))) - { - rli->among_reversed_bitfields = 0; - rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, - bitsize_int (rli->reversed_bitfield_bitpos)); - normalize_rli (rli); - } - else if (targetm.reverse_bitfields_p (rli->t) && rli->among_reversed_bitfields - && ((rli->reversed_bitfield_bitpos + TREE_INT_CST_LOW (DECL_SIZE (field)) - > TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (field)))))) - { - /* In the case where the next bitfield won't fit in the allocation unit, - make sure we complete the current allocation unit (e.g. if we've used - 16 of 32 bits these will be the ones at the right, we must move up to - a 32 bit boundary). Move to the correct boundary for the new allocation - unit, if that's bigger (this boundary may be reduced by packing). */ - unsigned int save_bitpos = rli->reversed_bitfield_bitpos; - unsigned int save_offset_align = rli->offset_align; - unsigned int tsize = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (field))); - if (save_bitpos > 0 && rli->reversed_bitfield_type_size > save_bitpos) - save_bitpos = rli->reversed_bitfield_type_size; - if (save_bitpos > 0 && tsize > save_bitpos - && (maximum_field_alignment == 0 || maximum_field_alignment >= tsize)) - save_bitpos = tsize; - - rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, bitsize_int (save_bitpos)); - - /* For pack(1) etc. normalize to byte boundary only. */ - rli->offset_align = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (field))); - if (maximum_field_alignment != 0 && maximum_field_alignment < rli->offset_align) - rli->offset_align = maximum_field_alignment; - normalize_rli (rli); - rli->offset_align = save_offset_align; - - rli->among_reversed_bitfields = 0; - } - - /* If we're in the middle of a reversed bitfield run (this field is known to - be another bitfield that will fit in the current allocation unit at this point) - we don't want any alignment padding. */ - if (rli->among_reversed_bitfields) - known_align = BIGGEST_ALIGNMENT; /* Work out the known alignment so far. Note that A & (-A) is the value of the least-significant bit in A that is one. */ - else if (! integer_zerop (rli->bitpos)) + if (! integer_zerop (rli->bitpos)) { int realoffset = tree_low_cst (rli->bitpos, 1); + /* APPLE LOCAL begin ms_struct */ if (targetm.reverse_bitfields_p (rli->t)) - realoffset += tree_low_cst (rli->offset, 1) * BITS_PER_UNIT; + realoffset += rli->remaining_in_alignment; + /* APPLE LOCAL end ms_struct */ known_align = realoffset & -realoffset; } else if (integer_zerop (rli->offset)) @@ -982,10 +911,14 @@ place_field (record_layout_info rli, tree field) rli->packed_maybe_necessary = 1; } + /* APPLE LOCAL begin ms_struct */ /* Does this field automatically have alignment it needs by virtue - of the fields that precede it and the record's own alignment? */ - if (known_align < desired_align) + of the fields that precede it and the record's own alignment? + We already align ms_struct fields, so don't re-align them. */ + if (known_align < desired_align + && !targetm.ms_bitfield_layout_p (rli->t)) { + /* APPLE LOCAL end ms_struct */ /* No, we need to skip space before this field. Bump the cumulative size to multiple of field alignment. */ @@ -1122,10 +1055,8 @@ place_field (record_layout_info rli, tree field) Note: for compatibility, we use the type size, not the type alignment to determine alignment, since that matches the documentation */ - - if (targetm.ms_bitfield_layout_p (rli->t) - && ((DECL_BIT_FIELD_TYPE (field) && ! DECL_PACKED (field)) - || (rli->prev_field && ! DECL_PACKED (rli->prev_field)))) + /* APPLE LOCAL begin ms_struct */ + if (targetm.ms_bitfield_layout_p (rli->t)) { /* At this point, either the prior or current are bitfields, (possibly both), and we're dealing with MS packing. */ @@ -1133,7 +1064,7 @@ place_field (record_layout_info rli, tree field) /* Is the prior field a bitfield? If so, handle "runs" of same type size fields. */ - if (rli->prev_field /* necessarily a bitfield if it exists. */) + if (rli->prev_field) { /* If both are bitfields, nonzero, and the same size, this is the middle of a run. Zero declared size fields are special @@ -1152,18 +1083,69 @@ place_field (record_layout_info rli, tree field) /* We're in the middle of a run of equal type size fields; make sure we realign if we run out of bits. (Not decl size, type size!) */ - HOST_WIDE_INT bitsize = tree_low_cst (DECL_SIZE (field), 0); + HOST_WIDE_INT bitsize = tree_low_cst (DECL_SIZE (field), 1); if (rli->remaining_in_alignment < bitsize) { + if (!targetm.reverse_bitfields_p (rli->t)) + { /* out of bits; bump up to next 'word'. */ rli->offset = DECL_FIELD_OFFSET (rli->prev_field); + rli->bitpos = size_binop (PLUS_EXPR, TYPE_SIZE (type), DECL_FIELD_BIT_OFFSET (rli->prev_field)); rli->prev_field = field; rli->remaining_in_alignment - = tree_low_cst (TYPE_SIZE (type), 0); + = tree_low_cst (TYPE_SIZE (type), 1); + } + else + { + /* "Use up" the remaining bits. */ + rli->bitpos + = size_binop (PLUS_EXPR, + rli->bitpos, + size_binop + (MINUS_EXPR, + TYPE_SIZE (type), + bitsize_int (rli->remaining_in_alignment))); + rli->prev_field = field; + rli->remaining_in_alignment + = tree_low_cst (TYPE_SIZE (type), 1); + + /* Move to the top end of the range. We'll add the bitfield + below. */ + rli->bitpos + = size_binop (PLUS_EXPR, + rli->bitpos, + TYPE_SIZE (type)); + } + } + + /* We handle this here instead of later at the end of + field placement. */ + if (targetm.reverse_bitfields_p (rli->t)) + { + /* If we normalized within rli->remaining_in_alignment we'll + possibly need to add some bits. */ + while ((tree_low_cst (rli->bitpos, 0) - bitsize) < 0) + { + rli->offset + = size_binop (MINUS_EXPR, + rli->offset, + fold_convert (sizetype, bitsize_one_node)); + rli->bitpos + = size_binop (PLUS_EXPR, + rli->bitpos, + bitsize_int (BITS_PER_UNIT)); + } + + rli->bitpos = size_binop (MINUS_EXPR, + rli->bitpos, + bitsize_int (bitsize)); + + /* Ensure we don't go negative. */ + gcc_assert (tree_low_cst (rli->bitpos, 0) >= 0); } rli->remaining_in_alignment -= bitsize; @@ -1179,18 +1161,38 @@ place_field (record_layout_info rli, tree field) Note: since the beginning of the field was aligned then of course the end will be too. No round needed. */ + if (!targetm.reverse_bitfields_p (rli->t)) + { + if (!integer_zerop (DECL_SIZE (rli->prev_field)) + && rli->remaining_in_alignment) + { + rli->bitpos + = size_binop (PLUS_EXPR, rli->bitpos, + bitsize_int (rli->remaining_in_alignment)); + } + else + prev_saved = NULL; + } + else + { + /* Difference from above - even if we don't have anything + left in the alignment we should move up to the top of + the word. */ if (!integer_zerop (DECL_SIZE (rli->prev_field))) { - tree type_size = TYPE_SIZE (TREE_TYPE (rli->prev_field)); - rli->bitpos - = size_binop (PLUS_EXPR, type_size, - DECL_FIELD_BIT_OFFSET (rli->prev_field)); + = size_binop + (PLUS_EXPR, rli->bitpos, + size_binop (MINUS_EXPR, + TYPE_SIZE (TREE_TYPE (rli->prev_field)), + bitsize_int (rli->remaining_in_alignment))); + + /* We'll reset this when we have bits to add. */ + rli->remaining_in_alignment = 0; } else - /* We "use up" size zero fields; the code below should behave - as if the prior field was not a bitfield. */ prev_saved = NULL; + } /* Cause a new bitfield to be captured, either this time (if currently a bitfield) or next time we see one. */ @@ -1231,93 +1233,41 @@ place_field (record_layout_info rli, tree field) && host_integerp (TYPE_SIZE (TREE_TYPE (field)), 0) && host_integerp (DECL_SIZE (field), 0)) rli->remaining_in_alignment - = tree_low_cst (TYPE_SIZE (TREE_TYPE(field)), 0) - - tree_low_cst (DECL_SIZE (field), 0); + = tree_low_cst (TYPE_SIZE (TREE_TYPE(field)), 1) + - tree_low_cst (DECL_SIZE (field), 1); /* Now align (conventionally) for the new type. */ - if (!DECL_PACKED(field)) - type_align = MAX(TYPE_ALIGN (type), type_align); - - if (prev_saved - && DECL_BIT_FIELD_TYPE (prev_saved) - /* If the previous bit-field is zero-sized, we've already - accounted for its alignment needs (or ignored it, if - appropriate) while placing it. */ - && ! integer_zerop (DECL_SIZE (prev_saved))) - type_align = MAX (type_align, - TYPE_ALIGN (TREE_TYPE (prev_saved))); + type_align = TYPE_ALIGN (TREE_TYPE (field)); if (maximum_field_alignment != 0) type_align = MIN (type_align, maximum_field_alignment); rli->bitpos = round_up (rli->bitpos, type_align); + /* If we're reversing add this to the field starting at the + "right" end of the alignment. */ + if (targetm.reverse_bitfields_p (rli->t) + && DECL_BIT_FIELD_TYPE (field) + && !integer_zerop (DECL_SIZE (field))) + { + rli->bitpos = size_binop (MINUS_EXPR, + size_binop (PLUS_EXPR, + rli->bitpos, + TYPE_SIZE (type)), + DECL_SIZE (field)); + } + /* If we really aligned, don't allow subsequent bitfields to undo that. */ rli->prev_field = NULL; } + /* Nothing we've done should let bitpos be negative. */ + gcc_assert (tree_low_cst (rli->bitpos, 0) >= 0); } - + /* APPLE LOCAL end ms_struct */ /* Offset so far becomes the position of this field after normalizing. */ normalize_rli (rli); - if (targetm.reverse_bitfields_p (rli->t) && DECL_BIT_FIELD_TYPE (field)) - { - tree fsize = DECL_SIZE (field); - tree tsize = TYPE_SIZE (TREE_TYPE (field)); - unsigned int tsize_int = TREE_INT_CST_LOW (tsize); - - if (!rli->among_reversed_bitfields) - { - unsigned int save_offset_align = rli->offset_align; - unsigned int bitpos_int; - /* Make sure current bit accumulation isn't too big for this basic type. */ - rli->offset_align = tsize_int; - normalize_rli (rli); - rli->offset_align = save_offset_align; - /* If this field won't fit in current allocation unit, finish off the - current allocation unit. Handle :0 here as well. */ - bitpos_int = TREE_INT_CST_LOW (rli->bitpos); - if (tsize_int < (TREE_INT_CST_LOW (fsize) + TREE_INT_CST_LOW (rli->bitpos))) - { - if (bitpos_int > 0 && tsize_int > bitpos_int - && (maximum_field_alignment == 0 || maximum_field_alignment >= tsize_int)) - rli->bitpos = tsize; - if (TREE_INT_CST_LOW (fsize) == 0) - rli->bitpos = tsize; - rli->offset_align = tsize_int; - if (maximum_field_alignment != 0 && maximum_field_alignment < rli->offset_align) - rli->offset_align = maximum_field_alignment; - } - else - { - rli->offset_align = tsize_int; - if (maximum_field_alignment != 0 - && maximum_field_alignment < rli->offset_align - && maximum_field_alignment > 8) /* not for pack(1) !! */ - rli->offset_align = maximum_field_alignment; - } - normalize_rli (rli); - rli->offset_align = save_offset_align; - - rli->among_reversed_bitfields = 1; - rli->reversed_bitfield_bitpos = TREE_INT_CST_LOW (rli->bitpos); - /* We're going to add the reversed-bitpos back into bitpos before doing - anything with bitpos; set to zero now to get this to come out right. */ - rli->bitpos = bitsize_zero_node; - } - DECL_FIELD_BIT_OFFSET (field) = size_binop (MINUS_EXPR, - size_binop (MINUS_EXPR, tsize, fsize), - bitsize_int (rli->reversed_bitfield_bitpos)); - rli->reversed_bitfield_bitpos += TREE_INT_CST_LOW (fsize); - rli->reversed_bitfield_type_size = TREE_INT_CST_LOW (tsize); - /* Do not advance rli->bitpos, as we don't want normalize_rli perturbing things. - Its model is that bits are allocated monotonically from one end of the struct - (possibly skipping over holes); things are not like that with reversal. - Instead, keep a separate total of "bits within the current group of reversed - bitfields", and add that into bitpos when we complete a group. */ - } - else DECL_FIELD_BIT_OFFSET (field) = rli->bitpos; DECL_FIELD_OFFSET (field) = rli->offset; SET_DECL_OFFSET_ALIGN (field, rli->offset_align); @@ -1366,37 +1316,62 @@ place_field (record_layout_info rli, tree field) rli->bitpos = bitsize_zero_node; rli->offset_align = MIN (rli->offset_align, desired_align); } - else if (targetm.reverse_bitfields_p (rli->t) && rli->among_reversed_bitfields) + /* APPLE LOCAL begin ms_struct */ + else if (targetm.ms_bitfield_layout_p (rli->t)) { - /* If we're at the end of the struct and there are dangling reversed bitfields, - adjust rli->bitpos. Needed to get sizeof right. - C++ doesn't terminate the field list with a null; there always seems to be - a TYPE_DECL==rli->t after all data members, which was detected above. */ - if (TREE_CHAIN (field) == NULL_TREE) + if (!targetm.reverse_bitfields_p (rli->t)) + { + rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field)); + + /* If this is the last element in the struct fill out the rest of + the struct - this is only used when we would have packed a bitfield + into less than the base type size of the field type. */ + if ((TREE_CHAIN (field) == NULL + || TREE_CODE (TREE_CHAIN (field)) != FIELD_DECL) + && DECL_BIT_FIELD_TYPE (field) + && !integer_zerop (DECL_SIZE (field))) + rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, + bitsize_int (rli->remaining_in_alignment)); + } + else { - /* Make sure we complete the current allocation unit (e.g. if we've used - 16 of 32 bits these will be the ones at the right, we must move up to - a 32 bit boundary). But, when pragma pack(1) is on, do not use the - full allocation unit size (experiment indicates CW treats pack(1) - different from other pack values, although the reason remains - mysterious.) */ - unsigned int save_bitpos = rli->reversed_bitfield_bitpos; - if (save_bitpos > 0 && rli->reversed_bitfield_type_size > save_bitpos - && maximum_field_alignment != 8) - save_bitpos = rli->reversed_bitfield_type_size; - - rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, bitsize_int (save_bitpos)); - normalize_rli (rli); - rli->among_reversed_bitfields = 0; + unsigned int extension = 0; + + if (integer_zerop (DECL_SIZE (field)) + && rli->remaining_in_alignment + && rli->prev_field + && DECL_BIT_FIELD_TYPE (rli->prev_field) + && !integer_zerop (DECL_SIZE (rli->prev_field))) + extension = + tree_low_cst (TYPE_SIZE (TREE_TYPE (rli->prev_field)), 1) + - rli->remaining_in_alignment; + else if (!integer_zerop (DECL_SIZE (field))) + extension = + tree_low_cst (TYPE_SIZE (TREE_TYPE (field)), 1) + - rli->remaining_in_alignment; + + /* For bitfields we handled the adding of the type earlier. */ + if (!DECL_BIT_FIELD_TYPE (field)) + rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field)); + + /* For reverse bitfields we need to go back to the end of the type. */ + if (extension + && (TREE_CHAIN (field) == NULL + || TREE_CODE (TREE_CHAIN (field)) != FIELD_DECL) + && DECL_BIT_FIELD_TYPE (field)) + rli->bitpos = size_binop (PLUS_EXPR, + rli->bitpos, + bitsize_int (extension)); } + normalize_rli (rli); } + /* APPLE LOCAL end ms_struct */ else { rli->bitpos = size_binop (PLUS_EXPR, rli->bitpos, DECL_SIZE (field)); normalize_rli (rli); } } -/* APPLE LOCAL end bitfield reversal */ /* Assuming that all the fields have been laid out, this function uses RLI to compute the final TYPE_SIZE, TYPE_ALIGN, etc. for the type diff --git a/gcc/testsuite/ChangeLog.apple-ppc b/gcc/testsuite/ChangeLog.apple-ppc index 67dcdc681d2..2d125605d83 100644 --- a/gcc/testsuite/ChangeLog.apple-ppc +++ b/gcc/testsuite/ChangeLog.apple-ppc @@ -1,3 +1,36 @@ +2006-04-28 Eric Christopher <echristo@apple.com> + + Radar 4454599 + * gcc.apple/bitreverse-13.c: Remove. + * gcc.apple/bitreverse-19.c: Ditto. + * gcc.apple/bitreverse-2.c: Ditto. + * gcc.apple/bitreverse-20.c: Ditto. + * gcc.apple/bitreverse-21.c: Ditto. + * gcc.apple/bitreverse-24.c: Ditto. + * gcc.apple/bitreverse-27.c: Ditto. + * gcc.apple/bitreverse-4.c: Ditto. + * gcc.apple/bitreverse-5.c: Ditto. + * gcc.apple/bitreverse-6.c: Ditto. + * gcc.apple/bitreverse-7.c: Ditto. + * gcc.apple/bitreverse-8.c: Ditto. + * gcc.apple/bitreverse-18.c: Add #pragma ms_struct + to locations where we turn on pragma reverse_bitfields. + * gcc.apple/bitreverse-3.c: Ditto. + * gcc.apple/bitreverse-11.c: Ditto. + * gcc.apple/bitreverse-15.c: Ditto. + * gcc.apple/bitreverse-12.c: Ditto. + * gcc.apple/bitreverse-16.c: Ditto. + * gcc.apple/bitreverse-25.c: Ditto. + * gcc.apple/bitreverse-1.c: Ditto. + * gcc.apple/bitreverse-9.c: Ditto. + * gcc.apple/bitreverse-17.c: Ditto. + * gcc.apple/bitreverse-22.c: Ditto. + * gcc.apple/bitreverse-26.c: Ditto. + * gcc.apple/bitreverse-10.c: Ditto. + * gcc.apple/bitreverse-14.c: Ditto. + * g++.dg/bitreverse-10.C: Ditto. + * g++.dg/bitreverse-23.C: Ditto. + 2006-04-27 Hui-May Chang <hm.chang@apple.com> Radar 4314956 diff --git a/gcc/testsuite/g++.dg/bitreverse-10.C b/gcc/testsuite/g++.dg/bitreverse-10.C index 8e22c88b63e..28f9cb60d77 100644 --- a/gcc/testsuite/g++.dg/bitreverse-10.C +++ b/gcc/testsuite/g++.dg/bitreverse-10.C @@ -3,10 +3,10 @@ extern "C" void abort(); typedef struct TestStateNorm { - unsigned int fBlah : 7; // + unsigned int fBlah : 7; // unsigned int fUnused : 2; // Currently Unused unsigned int : 0; - unsigned int fBlah2 : 7; // + unsigned int fBlah2 : 7; // unsigned int fUnused2: 2; // Currently Unused } TestStateNorm; @@ -18,12 +18,13 @@ union u1 { } unorm = { 5, 1, 6, 2 }; #pragma reverse_bitfields on -typedef struct TestState +#pragma ms_struct on +typedef struct TestState { - unsigned int fBlah : 7; // + unsigned int fBlah : 7; // unsigned int fUnused : 2; // Currently Unused unsigned int : 0; - unsigned int fBlah2 : 7; // + unsigned int fBlah2 : 7; // unsigned int fUnused2 : 2; // Currently Unused } TestState; diff --git a/gcc/testsuite/g++.dg/bitreverse-23.C b/gcc/testsuite/g++.dg/bitreverse-23.C index 50710b9dab8..b8df433702f 100644 --- a/gcc/testsuite/g++.dg/bitreverse-23.C +++ b/gcc/testsuite/g++.dg/bitreverse-23.C @@ -4,7 +4,8 @@ extern "C" void abort(); /* Check that layout works in presence of things other than data members. */ #pragma reverse_bitfields on -class X { +#pragma ms_struct on +class X { public: int x : 8; static int y; diff --git a/gcc/testsuite/gcc.apple/bitreverse-1.c b/gcc/testsuite/gcc.apple/bitreverse-1.c index 4a38bca6bb6..8a012f49c26 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-1.c +++ b/gcc/testsuite/gcc.apple/bitreverse-1.c @@ -25,6 +25,7 @@ #pragma reverse_bitfields on +#pragma ms_struct on typedef struct { diff --git a/gcc/testsuite/gcc.apple/bitreverse-10.c b/gcc/testsuite/gcc.apple/bitreverse-10.c index 06fd4db922b..2656ed24ade 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-10.c +++ b/gcc/testsuite/gcc.apple/bitreverse-10.c @@ -19,6 +19,7 @@ union { } unorm = { 5, 1, 6, 2 }; #pragma reverse_bitfields on +#pragma ms_struct on typedef struct TestState { unsigned int fBlah : 7; // diff --git a/gcc/testsuite/gcc.apple/bitreverse-11.c b/gcc/testsuite/gcc.apple/bitreverse-11.c index 70e63c2d7ec..6af03f5275d 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-11.c +++ b/gcc/testsuite/gcc.apple/bitreverse-11.c @@ -6,6 +6,7 @@ extern void abort(void); #pragma reverse_bitfields on +#pragma ms_struct on typedef struct { diff --git a/gcc/testsuite/gcc.apple/bitreverse-12.c b/gcc/testsuite/gcc.apple/bitreverse-12.c index 3e8d5d8c6a8..d28615106cd 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-12.c +++ b/gcc/testsuite/gcc.apple/bitreverse-12.c @@ -4,6 +4,7 @@ /* { dg-options "-w" } */ #pragma reverse_bitfields on +#pragma ms_struct on #pragma pack(1) typedef struct _bee diff --git a/gcc/testsuite/gcc.apple/bitreverse-13.c b/gcc/testsuite/gcc.apple/bitreverse-13.c deleted file mode 100644 index 5d3d153f682..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-13.c +++ /dev/null @@ -1,233 +0,0 @@ -/* APPLE LOCAL file 4350099 */ -/* { dg-do run { target powerpc*-*-darwin* } } */ -extern void abort (); -extern int printf(const char *, ...); -typedef struct _foo1 FOO1; - -struct _foo1 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -FOO1 vDelim1 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f1() { - union { - unsigned int x; - FOO1 y; - } u; - u.y = vDelim1; - if (u.x != 0x80000000U) - abort (); -} -/***********************************************/ -#pragma reverse_bitfields on - -typedef struct _foo2 FOO2; - -struct _foo2 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -FOO2 vDelim2 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f2() { - union { - unsigned int x; - FOO2 y; - } u; - u.y = vDelim2; - if (u.x != 1) - abort(); -} -#pragma reverse_bitfields off -/****************************************************/ -#pragma reverse_bitfields on - -typedef struct _foo3 FOO3; - -#pragma reverse_bitfields off -struct _foo3 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -FOO3 vDelim3 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f3() { - union { - unsigned int x; - FOO3 y; - } u; - u.y = vDelim3; - if (u.x != 0x80000000U) - abort (); -} -#pragma reverse_bitfields off -/****************************************************/ -#pragma reverse_bitfields on - -struct _foo4 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -typedef struct _foo4 FOO4; - -FOO4 vDelim4 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f4() { - union { - unsigned int x; - FOO4 y; - } u; - u.y = vDelim4; - if (u.x != 1) - abort(); -} -#pragma reverse_bitfields off -/****************************************************/ -#pragma reverse_bitfields on - -struct _foo5 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -#pragma reverse_bitfields off -typedef struct _foo5 FOO5; - -FOO5 vDelim5 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f5() { - union { - unsigned int x; - FOO5 y; - } u; - u.y = vDelim5; - if (u.x != 1) - abort(); -} -#pragma reverse_bitfields off -/****************************************************/ -#pragma reverse_bitfields off - -typedef struct _foo6 FOO6; - -#pragma reverse_bitfields on -struct _foo6 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -FOO6 vDelim6 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f6() { - union { - unsigned int x; - FOO6 y; - } u; - u.y = vDelim6; - if (u.x != 1) - abort(); -} -#pragma reverse_bitfields off -/****************************************************/ -#pragma reverse_bitfields off - -struct _foo7 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -typedef struct _foo7 FOO7; - -FOO7 vDelim7 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f7() { - union { - unsigned int x; - FOO7 y; - } u; - u.y = vDelim7; - if (u.x != 0x80000000U) - abort (); -} -#pragma reverse_bitfields off -/****************************************************/ -#pragma reverse_bitfields off - -struct _foo8 -{ - unsigned int fTab:1, - fSpace:1, - fComma:1, - fSemiColon:1, - fCustom:1, - fConsecutive:1, - iTextDelm:2, - chCustom:16; -}; - -#pragma reverse_bitfields on -typedef struct _foo8 FOO8; - -FOO8 vDelim8 = {1, 0, 0, 0, 0, 0, 0, 0}; -void f8() { - union { - unsigned int x; - FOO8 y; - } u; - u.y = vDelim8; - if (u.x != 0x80000000U) - abort (); -} -#pragma reverse_bitfields off -/****************************************************/ -main() { - f1(); f2(); f3(); f4(); f5(); f6(); f7(); f8(); - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-14.c b/gcc/testsuite/gcc.apple/bitreverse-14.c index 4b7790cf824..ed73891c9b9 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-14.c +++ b/gcc/testsuite/gcc.apple/bitreverse-14.c @@ -2,6 +2,7 @@ /* { dg-do compile { target powerpc*-*-darwin* } } */ /* { dg-options "-std=gnu99" } */ #pragma reverse_bitfields on +#pragma ms_struct on #pragma pack(push, 1) typedef struct _kyc diff --git a/gcc/testsuite/gcc.apple/bitreverse-15.c b/gcc/testsuite/gcc.apple/bitreverse-15.c index 80f544445e0..6303aa20dcd 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-15.c +++ b/gcc/testsuite/gcc.apple/bitreverse-15.c @@ -3,6 +3,7 @@ /* { dg-options "-std=gnu99" } */ extern void abort(); #pragma reverse_bitfields on +#pragma ms_struct on #pragma pack(push,2) typedef struct _S2 { diff --git a/gcc/testsuite/gcc.apple/bitreverse-16.c b/gcc/testsuite/gcc.apple/bitreverse-16.c index ee9876b02aa..d3ef99f02f9 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-16.c +++ b/gcc/testsuite/gcc.apple/bitreverse-16.c @@ -3,6 +3,7 @@ extern void abort(); /* { dg-do run { target powerpc*-*-darwin* } } */ /* { dg-options "-std=gnu99" } */ #pragma reverse_bitfields on +#pragma ms_struct on #pragma pack(push,2) typedef struct _S5 diff --git a/gcc/testsuite/gcc.apple/bitreverse-17.c b/gcc/testsuite/gcc.apple/bitreverse-17.c index bfc0c0f5a34..f6cf1ce0bd6 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-17.c +++ b/gcc/testsuite/gcc.apple/bitreverse-17.c @@ -5,6 +5,7 @@ /* { dg-options "-std=gnu99" } */ #pragma reverse_bitfields on +#pragma ms_struct on struct empty {}; struct uc0 { unsigned char content[0]; }; @@ -69,4 +70,3 @@ int main() { return 42; return 0; } -
\ No newline at end of file diff --git a/gcc/testsuite/gcc.apple/bitreverse-18.c b/gcc/testsuite/gcc.apple/bitreverse-18.c index 8103aa080f7..e1ece81b781 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-18.c +++ b/gcc/testsuite/gcc.apple/bitreverse-18.c @@ -9,6 +9,7 @@ typedef unsigned short WORD; typedef unsigned int DWORD; #pragma reverse_bitfields on +#pragma ms_struct on #define USE_STRUCT_WRAPPER 0 diff --git a/gcc/testsuite/gcc.apple/bitreverse-19.c b/gcc/testsuite/gcc.apple/bitreverse-19.c deleted file mode 100644 index 596c6745375..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-19.c +++ /dev/null @@ -1,44 +0,0 @@ -/* APPLE LOCAL file 4430139 */ - -/* CW layout of this one is truly bizarre: - 0000000000aaaaaabbbbbbbbbb000000 - 0000000000cccccccccccccccccccccc -*/ - -extern void abort(); -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ -typedef unsigned short WORD; -typedef unsigned int DWORD; - -#pragma reverse_bitfields on - -#define USE_STRUCT_WRAPPER 0 - -#pragma pack(push, 2) -typedef struct -{ - short a : 6; - int b : 10; - int c : 22; -} Foo; -typedef union { Foo x; int y[6]; } u1; -#pragma pack(pop) - - -int main(int argc, char* argv[]) -{ - int i; - u1 U; - for (i=0; i<6; i++) - U.y[i] = 0; - U.x.a = 1; - U.x.b = 3; - U.x.c = 5; - - if (sizeof(Foo) != 8 - || U.y[0] != 0x000100c0 - || U.y[1] != 0x00000005) - abort(); - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-2.c b/gcc/testsuite/gcc.apple/bitreverse-2.c deleted file mode 100644 index ef74d8eb3ea..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-2.c +++ /dev/null @@ -1,88 +0,0 @@ -/* APPLE LOCAL file */ -#include <stdio.h> -#include <string.h> - -/* Tests interleaving of bitfields and non-bitfields. Note that they - overlap, so the code cannot possibly work, but bug compability is - the requirement. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ - -#pragma reverse_bitfields on - -typedef struct -{ - union - { - unsigned int i1; - struct - { - unsigned int b1: 1; - unsigned int b2: 2; - unsigned int b3: 4; - unsigned int b4: 8; - unsigned int b5: 16; - } bits; - } u1; - char baz; - union - { - struct - { - unsigned int i2; - unsigned int i3; - unsigned int i4; - } ints; - - struct - { - unsigned int b1: 16; - unsigned int b2: 8; - unsigned int b3: 4; - unsigned int b4: 2; - unsigned int b5: 1; - char baz; - unsigned int b6: 2; - unsigned int b7: 4; - char baz2; - unsigned int b8: 8; - unsigned int b9: 16; - } bits; - } u2; -} Bitfields; - - -int main() -{ - Bitfields bitfields; - - - memset(&bitfields, 0, sizeof(bitfields)); - - bitfields.u1.bits.b1 = 1; - bitfields.u1.bits.b2 = 1; - bitfields.u1.bits.b3 = 1; - bitfields.u1.bits.b4 = 1; - bitfields.u1.bits.b5 = 1; - bitfields.baz = 0x55; - bitfields.u2.bits.b1 = 1; - bitfields.u2.bits.b2 = 1; - bitfields.u2.bits.b3 = 1; - bitfields.u2.bits.b4 = 1; - bitfields.u2.bits.b5 = 1; - bitfields.u2.bits.baz = 0xaa; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b6 = 1; - bitfields.u2.bits.b7 = 1; - bitfields.u2.bits.baz2 = 0x33; - bitfields.u2.bits.b8 = 1; - bitfields.u2.bits.b9 = 1; - - if (bitfields.u1.i1 != 0x0000808b - || bitfields.baz != 0x55 - || bitfields.u2.ints.i2 != 0x51010001 - || bitfields.u2.ints.i3 != 0x01003300 - || bitfields.u2.ints.i4 != 0x00000001 - || sizeof(bitfields) != 20) - return 42; - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-20.c b/gcc/testsuite/gcc.apple/bitreverse-20.c deleted file mode 100644 index 5e7726d3416..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-20.c +++ /dev/null @@ -1,38 +0,0 @@ -/* APPLE LOCAL file 4430139 */ -/* Same as bitreverse-19 without #pragma pack; it makes - no difference in this case. */ - -extern void abort(); -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ -typedef unsigned short WORD; -typedef unsigned int DWORD; - -#pragma reverse_bitfields on - -#define USE_STRUCT_WRAPPER 0 - -typedef struct -{ - short a : 6; - int b : 10; - int c : 22; -} Foo; -typedef union { Foo x; int y[6]; } u1; - -int main(int argc, char* argv[]) -{ - int i; - u1 U; - for (i=0; i<6; i++) - U.y[i] = 0; - U.x.a = 1; - U.x.b = 3; - U.x.c = 5; - - if (sizeof(Foo) != 8 - || U.y[0] != 0x000100c0 - || U.y[1] != 0x00000005) - abort(); - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-21.c b/gcc/testsuite/gcc.apple/bitreverse-21.c deleted file mode 100644 index 7b109f74e99..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-21.c +++ /dev/null @@ -1,145 +0,0 @@ -/* APPLE LOCAL file from 4431497 */ -/* Some truly bizarre layouts by CW. */ -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ -extern void abort(); -#pragma reverse_bitfields on - -#pragma pack(push,1) -typedef struct _S3 -{ - unsigned char c1 : 8; - unsigned short s1 : 8; - unsigned short s2 : 8; -} S3; - -typedef struct _S3W -{ - S3 s3; - unsigned char c; -}S3W; -/* c1 and s1 overlap. c and s2 overlap. - Size is 3 although 4 bytes are accessed. */ -#pragma pack(pop) - -typedef union u3 { S3W ss; unsigned int v[6]; } U3; - -int TestS3(void) -{ - U3 u = {0}; - u.ss.s3.c1 = 0x56; - u.ss.s3.s1 = 0x78; - u.ss.c = 0x90; - u.ss.s3.s2 = 0xab; - - if (sizeof(S3) != 3 || sizeof(S3W) != 4 || - u.ss.s3.s1 != 0x78 || u.ss.s3.s2 != 0xab || - u.ss.s3.c1 != 0x78 || u.ss.c != 0xab || - u.v[0] != 0x780000ab || u.v[1] != 0x00000000) - abort(); - return 0; -} - -#pragma pack(push, 2) -typedef struct _S4 -{ - unsigned char c1 : 8; - unsigned short s1 : 8; - unsigned short s2 : 8; -} S4; - -typedef struct _S4W -{ - S4 s4; - unsigned char c; -}S4W; -/* c1 and s1 overlap. */ -#pragma pack(pop) - -typedef union u4 { S4W ss; unsigned int v[6]; } U4; - -int TestS4(void) -{ - U4 u = {0}; - u.ss.s4.c1 = 0x56; - u.ss.s4.s1 = 0x78; - u.ss.s4.s2 = 0xab; - u.ss.c = 0x90; - - if (sizeof(S4) != 4 || sizeof(S4W) != 6 || - u.ss.s4.s1 != 0x78 || u.ss.s4.s2 != 0xab || - u.ss.s4.c1 != 0x78 || u.ss.c != 0x90 || - u.v[0] != 0x780000ab || u.v[1] != 0x90000000) - abort(); - return 0; -} - -#pragma pack(push,1) -typedef struct _S5 -{ - unsigned short s : 16; - unsigned int l1 : 16; - unsigned int l2 : 16; -} S5; - -typedef struct _S5W -{ - S5 s5; - unsigned short s; -}S5W; -/* l1 and s5.s overlap. l2 and s overlap. Size is 6 - although 8 bytes are referenced. */ -#pragma pack(pop) - -typedef union u5 { S5W ss; unsigned int v[6]; } U5; - -int TestS5(void) -{ - U5 u = {0}; - u.ss.s5.s = 0x5678; - u.ss.s5.l1 = 0x1289; - u.ss.s = 0xabcd; - u.ss.s5.l2 = 0xfe34; - if (sizeof(S5) != 6 || sizeof(S5W) != 8 || - u.ss.s5.l1 != 0x1289 || u.ss.s5.l2 != 0xfe34 || - u.ss.s5.s != 0x1289 || u.ss.s != 0xfe34 || - u.v[0] != 0x12890000 || u.v[1] != 0x0000fe34 || u.v[2] != 0x00000000) - abort(); - return 0; -} - -#pragma pack(push,2) -typedef struct _S6 -{ - unsigned short s : 16; - unsigned int l1 : 16; - unsigned int l2 : 16; -} S6; - -typedef struct _S6W -{ - S6 s6; - unsigned short s; -}S6W; -#pragma pack(pop) - -typedef union u6 { S6W ss; unsigned int v[6]; } U6; - -int TestS6(void) -{ - U6 u = {0}; - u.ss.s6.s = 0x5678; - u.ss.s6.l1 = 0x9123; - u.ss.s = 0xabcd; - u.ss.s6.l2 = 0xef04; - if (sizeof(S6) != 8 || sizeof(S6W) != 10 || - u.ss.s6.l1 != 0x9123 || u.ss.s6.l2 != 0xef04 || - u.ss.s6.s != 0x9123 || u.ss.s != 0xabcd || - u.v[0] != 0x91230000 || u.v[1] != 0x0000ef04 || u.v[2] != 0xabcd0000) - abort(); - return 0; -} -int main() -{ - return TestS3() + TestS4() + TestS5() + TestS6(); -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-22.c b/gcc/testsuite/gcc.apple/bitreverse-22.c index 949a1245745..faa92be0602 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-22.c +++ b/gcc/testsuite/gcc.apple/bitreverse-22.c @@ -5,6 +5,7 @@ extern void abort(); /* { dg-options "-std=gnu99" } */ #pragma reverse_bitfields on +#pragma ms_struct on typedef struct _S5 { diff --git a/gcc/testsuite/gcc.apple/bitreverse-24.c b/gcc/testsuite/gcc.apple/bitreverse-24.c deleted file mode 100644 index 5a3f9e5f876..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-24.c +++ /dev/null @@ -1,77 +0,0 @@ -/* APPLE LOCAL file 4430139 */ -extern void abort(); -#include <string.h> -/* This is bitreverse-18 with d and e switched. - Note that this changes the layout and even the size. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ - -typedef unsigned short WORD; -typedef unsigned int DWORD; - -#pragma reverse_bitfields on - -#define USE_STRUCT_WRAPPER 0 - -#pragma pack(push, 2) -typedef struct -{ - DWORD a; -#if USE_STRUCT_WRAPPER - struct { -#endif - WORD b:2, - c:14; -#if USE_STRUCT_WRAPPER - }; -#endif - DWORD d:10, - e:22; - DWORD f; - DWORD g:25, - h:1, - i:6; -#if USE_STRUCT_WRAPPER - struct { -#endif - WORD j:14, - k:2; -#if USE_STRUCT_WRAPPER - }; -#endif -} Foo; -typedef union { Foo x; int y[6]; } u1; -#pragma pack(pop) - - -int main(int argc, char* argv[]) -{ - Foo foo; - int i; - u1 U; - memset (&U, 0, sizeof(u1)); - U.x.a = 1; - U.x.b = 1; - U.x.c = 1; - U.x.d = 1; - U.x.e = 1; - U.x.f = 1; - U.x.g = 1; - U.x.h = 1; - U.x.i = 1; - U.x.j = 1; - U.x.k = 1; - - int s = sizeof(Foo); - - if (sizeof(Foo) != 22 - || U.y[0] != 0x00000001 - || U.y[1] != 0x00010000 - || U.y[2] != 0x00000001 - || U.y[3] != 0x00000001 - || U.y[4] != 0x06000001 - || U.y[5] != 0x40010000) - abort(); - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-25.c b/gcc/testsuite/gcc.apple/bitreverse-25.c index a41515f9d98..f77ba1ad2ff 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-25.c +++ b/gcc/testsuite/gcc.apple/bitreverse-25.c @@ -3,6 +3,7 @@ extern void abort(); /* { dg-do run { target powerpc*-*-darwin* } } */ /* { dg-options "-std=gnu99" } */ #pragma reverse_bitfields on +#pragma ms_struct on #pragma pack(push,1) typedef struct _S2 diff --git a/gcc/testsuite/gcc.apple/bitreverse-26.c b/gcc/testsuite/gcc.apple/bitreverse-26.c index 30791498329..e65b5da1262 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-26.c +++ b/gcc/testsuite/gcc.apple/bitreverse-26.c @@ -3,6 +3,7 @@ extern void abort(); /* { dg-do run { target powerpc*-*-darwin* } } */ /* { dg-options "-std=gnu99" } */ #pragma reverse_bitfields on +#pragma ms_struct on #pragma pack(push,1) typedef struct _S2 diff --git a/gcc/testsuite/gcc.apple/bitreverse-27.c b/gcc/testsuite/gcc.apple/bitreverse-27.c deleted file mode 100644 index d313bd6cccd..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-27.c +++ /dev/null @@ -1,37 +0,0 @@ -/* APPLE LOCAL file 4436477 */ -extern void abort(); -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ - -#pragma reverse_bitfields on - -typedef struct _S5 -{ - unsigned long l1 : 16; - unsigned long l2 : 16; - unsigned char c1; - unsigned short s1 : 8; - unsigned short s2 : 8; - unsigned char c2; -} S5; - -union U { S5 ss; unsigned int x[4]; }; - -int TestS5(void) -{ - union U u = {0}; - - u.ss.c1 = 0x56; - u.ss.c2 = 0x78; - - if (sizeof(S5) != 8 || - u.ss.s1 != 0x56 || u.ss.s2 != 0x78 || - u.x[0] != 0x0000000 || u.x[1] != 0x56000078 || u.x[2] != 0x00000000) - abort(); - return 0; -} - -int main() -{ - return TestS5(); -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-3.c b/gcc/testsuite/gcc.apple/bitreverse-3.c index 034d120f6ba..9b79f0edfe2 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-3.c +++ b/gcc/testsuite/gcc.apple/bitreverse-3.c @@ -48,6 +48,7 @@ typedef struct } u2; } Bitfields; +#pragma ms_struct on #pragma reverse_bitfields on int main() { diff --git a/gcc/testsuite/gcc.apple/bitreverse-4.c b/gcc/testsuite/gcc.apple/bitreverse-4.c deleted file mode 100644 index 1ebf5f7eb07..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-4.c +++ /dev/null @@ -1,92 +0,0 @@ -/* APPLE LOCAL file */ -#include <stdio.h> -#include <string.h> - -/* Tests interleaving of bitfields and non-bitfields. Note that they - overlap, so the code cannot possibly work, but bug compability is - the requirement. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ - -#pragma reverse_bitfields on -typedef struct -{ - union - { - unsigned int i1; - struct - { - int b1: 1; - unsigned int b2: 2; - unsigned int b3: 4; - unsigned int b4: 8; - int b5: 16; - } bits; - } u1; - - short baz; - union - { - struct - { - unsigned int i2; - unsigned int i3; - unsigned int i4; - unsigned int i5; - } ints; - - struct - { - unsigned int b1: 16; - unsigned int b2: 8; - unsigned int b3: 4; - char quux; - unsigned int b4: 2; - unsigned int b5: 1; - short baz; - unsigned int b6: 2; - unsigned int b7: 4; - short baz2; - unsigned int b8: 8; - unsigned int b9: 16; - } bits; - } u2; -} Bitfields; - - -int main() -{ - Bitfields bitfields; - - - memset(&bitfields, 0, sizeof(bitfields)); - - bitfields.u1.bits.b1 = 1; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u1.bits.b2 = 1; - bitfields.u1.bits.b3 = 1; - bitfields.u1.bits.b4 = 1; - bitfields.u1.bits.b5 = 1; - bitfields.baz = 0x5555; - bitfields.u2.bits.b1 = 1; - bitfields.u2.bits.b2 = 1; - bitfields.u2.bits.b3 = 1; - bitfields.u2.bits.quux = 0xa55a; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b4 = 1; - bitfields.u2.bits.b5 = 1; - bitfields.u2.bits.baz = 0xaaaa; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b6 = 1; - bitfields.u2.bits.b7 = 1; - bitfields.u2.bits.baz2 = 0x3333; - bitfields.u2.bits.b8 = 1; - bitfields.u2.bits.b9 = 1; - - if (bitfields.u1.i1 != 0x0000808b - || bitfields.baz != 0x5555 - || bitfields.u2.ints.i2 != 0x01010001 - || bitfields.u2.ints.i3 != 0x5a00aaaa - || bitfields.u2.ints.i4 != 0x00003333 - || bitfields.u2.ints.i5 != 0x00000101 - || sizeof(bitfields) != 24) - return 42; - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-5.c b/gcc/testsuite/gcc.apple/bitreverse-5.c deleted file mode 100644 index 50c4df3879e..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-5.c +++ /dev/null @@ -1,92 +0,0 @@ -/* APPLE LOCAL file */ -#include <stdio.h> -#include <string.h> - -/* Tests interaction with pragma pack, and interleaving of bitfields - and non-bitfields. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ - -#pragma reverse_bitfields on -typedef struct -{ - union - { - unsigned int i1; - struct - { - int b1: 1; - unsigned int b2: 2; - unsigned int b3: 4; - unsigned int b4: 8; - int b5: 16; - } bits; - } u1; - - short baz; - union - { - struct - { - unsigned int i2; - unsigned int i3; - unsigned int i4; - unsigned int i5; - } ints; - -#pragma pack(1) - struct - { - unsigned int b1: 16; - unsigned int b2: 8; - unsigned int b3: 4; - char quux; - unsigned int b4: 2; - unsigned int b5: 1; - short baz; - unsigned int b6: 2; - unsigned int b7: 4; - short baz2; - unsigned int b8: 8; - unsigned int b9: 16; - } bits; - } u2; -} Bitfields; - - -int main() -{ - Bitfields bitfields; - - - memset(&bitfields, 0, sizeof(bitfields)); - - bitfields.u1.bits.b1 = 1; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u1.bits.b2 = 1; - bitfields.u1.bits.b3 = 1; - bitfields.u1.bits.b4 = 1; - bitfields.u1.bits.b5 = 1; - bitfields.baz = 0x5555; - bitfields.u2.bits.b1 = 1; - bitfields.u2.bits.b2 = 1; - bitfields.u2.bits.b3 = 1; - bitfields.u2.bits.quux = 0xa55a; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b4 = 1; - bitfields.u2.bits.b5 = 1; - bitfields.u2.bits.baz = 0xaaaa; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b6 = 1; - bitfields.u2.bits.b7 = 1; - bitfields.u2.bits.baz2 = 0x3333; - bitfields.u2.bits.b8 = 1; - bitfields.u2.bits.b9 = 1; - - if (bitfields.u1.i1 != 0x0000808b - || bitfields.baz != 0x5555 - || bitfields.u2.ints.i2 != 0x01010001 - || bitfields.u2.ints.i3 != 0x5a00aaaa - || bitfields.u2.ints.i4 != 0x01333305 - || bitfields.u2.ints.i5 != 0x00000001 - || sizeof(bitfields) != 22) - return 42; - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-6.c b/gcc/testsuite/gcc.apple/bitreverse-6.c deleted file mode 100644 index d24689f4412..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-6.c +++ /dev/null @@ -1,93 +0,0 @@ -/* APPLE LOCAL file */ -#include <stdio.h> -#include <string.h> - -/* Tests interaction with pragma pack, and interleaving of bitfields - and non-bitfields. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ - -#pragma reverse_bitfields on -typedef struct -{ - union - { - unsigned int i1; -#pragma pack(2) - struct - { - int b1: 1; - unsigned int b2: 2; - unsigned int b3: 4; - unsigned int b4: 8; - int b5: 16; - } bits; - } u1; - - short baz; - union - { - struct - { - unsigned int i2; - unsigned int i3; - unsigned int i4; - unsigned int i5; - } ints; - -#pragma pack(1) - struct - { - unsigned int b1: 16; - unsigned int b2: 8; - unsigned int b3: 4; - char quux; - unsigned int b4: 2; - unsigned int b5: 1; - short baz; - unsigned int b6: 2; - unsigned int b7: 4; - short baz2; - unsigned int b8: 8; - unsigned int b9: 16; - } bits; - } u2; -} Bitfields; - - -int main() -{ - Bitfields bitfields; - - - memset(&bitfields, 0, sizeof(bitfields)); - - bitfields.u1.bits.b1 = 1; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u1.bits.b2 = 1; - bitfields.u1.bits.b3 = 1; - bitfields.u1.bits.b4 = 1; - bitfields.u1.bits.b5 = 1; - bitfields.baz = 0x5555; - bitfields.u2.bits.b1 = 1; - bitfields.u2.bits.b2 = 1; - bitfields.u2.bits.b3 = 1; - bitfields.u2.bits.quux = 0xa55a; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b4 = 1; - bitfields.u2.bits.b5 = 1; - bitfields.u2.bits.baz = 0xaaaa; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b6 = 1; - bitfields.u2.bits.b7 = 1; - bitfields.u2.bits.baz2 = 0x3333; - bitfields.u2.bits.b8 = 1; - bitfields.u2.bits.b9 = 1; - - if (bitfields.u1.i1 != 0x0000808b - || bitfields.baz != 0x5555 - || bitfields.u2.ints.i2 != 0x01010001 - || bitfields.u2.ints.i3 != 0x5a00aaaa - || bitfields.u2.ints.i4 != 0x01333305 - || bitfields.u2.ints.i5 != 0x00000001 - || sizeof(bitfields) != 22) - return 42; - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-7.c b/gcc/testsuite/gcc.apple/bitreverse-7.c deleted file mode 100644 index f09076bd363..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-7.c +++ /dev/null @@ -1,94 +0,0 @@ -/* APPLE LOCAL file */ -#include <stdio.h> -#include <string.h> - -/* Tests interaction with pragma pack, and interleaving of bitfields - and non-bitfields. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ - -#pragma reverse_bitfields on -typedef struct -{ - union - { - unsigned int i1; -#pragma pack(2) - struct - { - short b1: 1; - unsigned int b2: 2; - char b3: 4; - unsigned int b4: 8; - unsigned int b5: 16; - } bits; - } u1; - - short baz; - union - { - struct - { - unsigned int i2; - unsigned int i3; - unsigned int i4; - unsigned int i5; - } ints; - -#pragma pack(1) - struct - { - unsigned int b1: 16; - unsigned int b2: 8; - unsigned int b3: 4; - char quux; - unsigned int b4: 2; - unsigned int b5: 1; - short baz; - unsigned int b6: 2; - unsigned int b7: 4; - short baz2; - unsigned int b8: 8; - unsigned int b9: 16; - } bits; - } u2; -} Bitfields; - - -int main() -{ - Bitfields bitfields; - - - memset(&bitfields, 0, sizeof(bitfields)); - - bitfields.u1.bits.b1 = 1; - bitfields.u1.bits.b2 = 1; - bitfields.u1.bits.b3 = 1; - bitfields.u1.bits.b4 = 1; - bitfields.u1.bits.b5 = 1; - bitfields.baz = 0x5555; - bitfields.u2.bits.b1 = 1; - bitfields.u2.bits.b2 = 1; - bitfields.u2.bits.b3 = 1; - bitfields.u2.bits.quux = 0xa55a; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b4 = 1; - bitfields.u2.bits.b5 = 1; - bitfields.u2.bits.baz = 0xaaaa; - bitfields.u2.bits.b6 = 1; - bitfields.u2.bits.b7 = 1; - bitfields.u2.bits.baz2 = 0x3333; - bitfields.u2.bits.b8 = 1; - bitfields.u2.bits.b9 = 1; - - if (bitfields.u1.i1 != 0x00008082 - || bitfields.baz != 0x5555 - || bitfields.u2.ints.i2 != 0x01010001 - || bitfields.u2.ints.i3 != 0x5a00aaaa - || bitfields.u2.ints.i4 != 0x01333305 - || bitfields.u2.ints.i5 != 0x00000001 - || sizeof(bitfields) != 22) - return 42; - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-8.c b/gcc/testsuite/gcc.apple/bitreverse-8.c deleted file mode 100644 index 77f5d6c6e9d..00000000000 --- a/gcc/testsuite/gcc.apple/bitreverse-8.c +++ /dev/null @@ -1,90 +0,0 @@ -/* APPLE LOCAL file */ -#include <stdio.h> -#include <string.h> - -/* Tests interleaving of bitfields and non-bitfields. */ - -/* { dg-do run { target powerpc*-*-darwin* } } */ -/* { dg-options "-std=gnu99" } */ - -#pragma reverse_bitfields on -typedef struct -{ - union - { - unsigned int i1; - struct - { - short b1: 1; - unsigned int b2: 2; - char b3: 4; - unsigned int b4: 8; - unsigned int b5: 16; - } bits; - } u1; - - short baz; - union - { - struct - { - unsigned int i2; - unsigned int i3; - unsigned int i4; - unsigned int i5; - } ints; - - struct - { - unsigned int b1: 16; - unsigned int b2: 8; - unsigned int b3: 4; - char quux; - unsigned int b4: 2; - unsigned int b5: 1; - short baz; - unsigned int b6: 2; - unsigned int b7: 4; - short baz2; - unsigned int b8: 8; - unsigned int b9: 16; - } bits; - } u2; -} Bitfields; - - -int main() -{ - Bitfields bitfields; - - - memset(&bitfields, 0, sizeof(bitfields)); - - bitfields.u1.bits.b1 = 1; - bitfields.u1.bits.b2 = 1; - bitfields.u1.bits.b3 = 1; - bitfields.u1.bits.b4 = 1; - bitfields.u1.bits.b5 = 1; - bitfields.baz = 0x5555; - bitfields.u2.bits.b1 = 1; - bitfields.u2.bits.b2 = 1; - bitfields.u2.bits.b3 = 1; - bitfields.u2.bits.quux = 0xa55a; /* { dg-warning "overflow in implicit constant conversion" } */ - bitfields.u2.bits.b4 = 1; - bitfields.u2.bits.b5 = 1; - bitfields.u2.bits.baz = 0xaaaa; - bitfields.u2.bits.b6 = 1; - bitfields.u2.bits.b7 = 1; - bitfields.u2.bits.baz2 = 0x3333; - bitfields.u2.bits.b8 = 1; - bitfields.u2.bits.b9 = 1; - if (bitfields.u1.i1 != 0x00008082 - || bitfields.baz != 0x5555 - || bitfields.u2.ints.i2 != 0x01010001 - || bitfields.u2.ints.i3 != 0x5a00aaaa - || bitfields.u2.ints.i4 != 0x00003333 - || bitfields.u2.ints.i5 != 0x00000101 - || sizeof(bitfields) != 24) - return 42; - return 0; -} diff --git a/gcc/testsuite/gcc.apple/bitreverse-9.c b/gcc/testsuite/gcc.apple/bitreverse-9.c index f719335b17e..b9c926627a6 100644 --- a/gcc/testsuite/gcc.apple/bitreverse-9.c +++ b/gcc/testsuite/gcc.apple/bitreverse-9.c @@ -53,6 +53,7 @@ typedef struct } u2; } Bitfields; +#pragma ms_struct on #pragma reverse_bitfields on int main() { diff --git a/gcc/tree.h b/gcc/tree.h index 70725c3cc90..74d048dc995 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -3159,11 +3159,6 @@ typedef struct record_layout_info_s /* True if we've seen a packed field that didn't have normal alignment anyway. */ int packed_maybe_necessary; - /* APPLE LOCAL begin bitfield reversal */ - int among_reversed_bitfields; - unsigned int reversed_bitfield_type_size; - unsigned int reversed_bitfield_bitpos; - /* APPLE LOCAL end bitfield reversal */ } *record_layout_info; extern void set_lang_adjust_rli (void (*) (record_layout_info)); |