diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1994-09-27 18:29:21 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1994-09-27 18:29:21 -0400 |
commit | b88a3142921977eaf465ba2c947b1a3b09bae896 (patch) | |
tree | 5cf8244d4e0e795f023d60633bd5f6292e244387 | |
parent | 5b065c2142e716bad47cacb9d710a1243491d796 (diff) | |
download | gcc-b88a3142921977eaf465ba2c947b1a3b09bae896.zip gcc-b88a3142921977eaf465ba2c947b1a3b09bae896.tar.gz gcc-b88a3142921977eaf465ba2c947b1a3b09bae896.tar.bz2 |
(optimize_bit_field): Put any insns made by change_address in front of INSN.
(expand_function_end): Don't pass DECL_INITIAL to setjmp_protect if it is
error_mark_node.
From-SVN: r8146
-rw-r--r-- | gcc/function.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/function.c b/gcc/function.c index 9737dae..ec83bab 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -2192,6 +2192,8 @@ optimize_bit_field (body, insn, equiv_mem) and then for which byte of the word is wanted. */ register int offset = INTVAL (XEXP (bitfield, 2)); + rtx insns; + /* Adjust OFFSET to count bits from low-address byte. */ #if BITS_BIG_ENDIAN != BYTES_BIG_ENDIAN offset = (GET_MODE_BITSIZE (GET_MODE (XEXP (bitfield, 0))) @@ -2210,8 +2212,12 @@ optimize_bit_field (body, insn, equiv_mem) #endif } - memref = change_address (memref, mode, + start_sequence (); + memref = change_address (memref, mode, plus_constant (XEXP (memref, 0), offset)); + insns = get_insns (); + end_sequence (); + emit_insns_before (insns, insn); /* Store this memory reference where we found the bit field reference. */ @@ -5064,7 +5070,9 @@ expand_function_end (filename, line, end_bindings) on a machine that fails to restore the registers. */ if (NON_SAVING_SETJMP && current_function_calls_setjmp) { - setjmp_protect (DECL_INITIAL (current_function_decl)); + if (DECL_INITIAL (current_function_decl) != error_mark_node) + setjmp_protect (DECL_INITIAL (current_function_decl)); + setjmp_protect_args (); } #endif |