diff options
author | Jim Wilson <wilson@cygnus.com> | 2000-10-25 01:30:25 +0000 |
---|---|---|
committer | Jim Wilson <wilson@gcc.gnu.org> | 2000-10-24 18:30:25 -0700 |
commit | a8ca77564609454aa4bad648471204640a55b300 (patch) | |
tree | 9642e7e20204571cf15e101b98b0af82637ce77f /gcc/stor-layout.c | |
parent | c0fc376bcfaaf42823c07e5cd8420343fd56b370 (diff) | |
download | gcc-a8ca77564609454aa4bad648471204640a55b300.tar.gz |
Fixes for C++ structure layout breakage.
* expmed.c (store_bit_field): Move integer pun code down after
code that calls emit_move_insn for entire register move.
* stor-layout.c (compute_record_mode): Revert Mar 25, Aug 18, and
Oct 20 changes. Only store mode in TYPE_MODE if RECORD_TYPE.
From-SVN: r37041
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r-- | gcc/stor-layout.c | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index ea9ee013dd7..797b4cea17d 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -1065,12 +1065,8 @@ compute_record_mode (type) /* If this field is the whole struct, remember its mode so that, say, we can put a double in a class into a DF - register instead of forcing it to live in the stack. However, - we don't support using such a mode if there is no integer mode - of the same size, so don't set it here. */ - if (field == TYPE_FIELDS (type) && TREE_CHAIN (field) == 0 - && int_mode_for_mode (DECL_MODE (field)) != BLKmode - && operand_equal_p (DECL_SIZE (field), TYPE_SIZE (type), 1)) + register instead of forcing it to live in the stack. */ + if (simple_cst_equal (TYPE_SIZE (type), DECL_SIZE (field))) mode = DECL_MODE (field); #ifdef STRUCT_FORCE_BLK @@ -1081,8 +1077,9 @@ compute_record_mode (type) #endif /* STRUCT_FORCE_BLK */ } - if (mode != VOIDmode) - /* We only have one real field; use its mode. */ + /* If we only have one real field; use its mode. This only applies to + RECORD_TYPE. This does not apply to unions. */ + if (TREE_CODE (type) == RECORD_TYPE && mode != VOIDmode) TYPE_MODE (type) = mode; else TYPE_MODE (type) = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1); |