re PR target/34981 (Lazily-bound function called twice)
commitdbc90b65652363253145276cde8cd57d55e53eb3
authorRichard Sandiford <rsandifo@nildram.co.uk>
Sat, 26 Jan 2008 10:22:14 +0000 (26 10:22 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Sat, 26 Jan 2008 10:22:14 +0000 (26 10:22 +0000)
tree4d749e3cf6bc1456deeac94dc4f8c312f6080ba4
parent763a27ee730f23883d6ab6feacb9b22992a8d16c
re PR target/34981 (Lazily-bound function called twice)

gcc/
PR target/34981
* config/mips/mips-protos.h (mips_expand_call): Return an rtx.
* config/mips/mips.h (FIRST_PSEUDO_REGISTER): Rename FAKE_CALL_REGNO
to GOT_VERSION_REGNUM.
(CALL_REALLY_USED_REGISTERS): Set the GOT_VERSION_REGNUM entry to 0.
(EPILOGUE_USES): Include GOT_VERSION_REGNUM if TARGET_USE_GOT.
* config/mips/mips.c (mips_emit_call_insn): New function.
(mips_call_tls_get_addr): Call mips_expand_call directly.
(mips16_copy_fpr_return_value): Use mips_emit_call_insn rather than
emit_call_insn.
(mips16_build_call_stub): Likewise.  Return the call insn or null.
(mips_expand_call): Update the call to mips16_build_call_stub
accordingly and a remove redundant condition.  Assert that MIPS16
stubs do not use lazy binding.  Use mips_emit_call_insn and return
the call insn.
(mips_extra_live_on_entry): Include GOT_VERSION_REGNUM if
TARGET_USE_GOT.
(mips_hard_regno_mode_ok_p): Allow SImode for GOT_VERSION_REGNUM.
(mips_avoid_hazard): Remove hazard_set handling.
* config/mips/mips.md (UNSPEC_EH_RECEIVER): Rename to...
(UNSPEC_RESTORE_GP): ...this.
(UNSPEC_SET_GOT_VERSION, UNSPEC_UPDATE_GOT_VERSION): New constants.
(FAKE_CALL_REGNO): Rename to...
(GOT_VERSION_REGNUM): ...this.
(type): Add "ghost" value.  Add an associated insn reservation.
(hazard_set): Remove.
(exception_receiver): Rename to...
(restore_gp): ...this and update the unspec identifier accordingly.
(exception_receiver, nonlocal_got_receiver): New expanders.
(load_call<mode>): Use GOT_VERSION_REGNUM.  Don't set
FAKE_CALL_REGNO.  Remove hazard_set attribute.
(set_got_version, update_got_version): New patterns.

gcc/testsuite/
PR target/34981
* gcc.target/mips/lazy-binding-1.c: New test.
* gcc.target/mips/mips.exp (setup_mips_tests): Set
mips_forced_no_abicalls and mips_forced_no_shared.
(dg-mips-options): Avoid using -mabicalls with an implicit -mabi=eabi.
Avoid using small data with -mabicalls.  Don't make -G0 force
-mn-abicalls.  Skip -mabicalls and -mshared tests if the multilib
forces the opposite option.

From-SVN: r131860
gcc/ChangeLog
gcc/config/mips/mips-protos.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h
gcc/config/mips/mips.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/lazy-binding-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/mips.exp