diff options
| author | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2013-09-05 05:32:16 +0000 |
|---|---|---|
| committer | Venkatraman Govindaraju <venkatra@cs.wisc.edu> | 2013-09-05 05:32:16 +0000 |
| commit | 55ecb10e995a3e5df9118c48c1b0643d639f6033 (patch) | |
| tree | 6f3895889bd93e0cfe06fc31641d4c8c39ba0614 /llvm/lib/Target/Sparc/SparcRegisterInfo.cpp | |
| parent | ef44edfde470d2f03f6cd808a139f2feafbedee4 (diff) | |
| download | bcm5719-llvm-55ecb10e995a3e5df9118c48c1b0643d639f6033.tar.gz bcm5719-llvm-55ecb10e995a3e5df9118c48c1b0643d639f6033.zip | |
[Sparc] Correctly handle call to functions with ReturnsTwice attribute.
In sparc, setjmp stores only the registers %fp, %sp, %i7 and %o7. longjmp restores
the stack, and the callee-saved registers (all local/in registers: %i0-%i7, %l0-%l7)
using the stored %fp and register windows. However, this does not guarantee that the longjmp
will restore the registers, as they were when the setjmp was called. This is because these
registers may be clobbered after returning from setjmp, but before calling longjmp.
This patch prevents the registers %i0-%i5, %l0-l7 to live across the setjmp call using the register mask.
llvm-svn: 190033
Diffstat (limited to 'llvm/lib/Target/Sparc/SparcRegisterInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcRegisterInfo.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp b/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp index 09f52fb9225..8e14dd95f68 100644 --- a/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp +++ b/llvm/lib/Target/Sparc/SparcRegisterInfo.cpp @@ -48,6 +48,11 @@ SparcRegisterInfo::getCallPreservedMask(CallingConv::ID CC) const { return CSR_RegMask; } +const uint32_t* +SparcRegisterInfo::getRTCallPreservedMask(CallingConv::ID CC) const { + return RTCSR_RegMask; +} + BitVector SparcRegisterInfo::getReservedRegs(const MachineFunction &MF) const { BitVector Reserved(getNumRegs()); // FIXME: G1 reserved for now for large imm generation by frame code. |

