diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterInfo.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp index cdb579c5387..3c087bdeb98 100644 --- a/llvm/lib/Target/X86/X86RegisterInfo.cpp +++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp @@ -294,13 +294,20 @@ X86RegisterInfo::getCrossCopyRegClass(const TargetRegisterClass *RC) const {  const unsigned *  X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {    bool callsEHReturn = false; +  bool ghcCall = false;    if (MF) {      const MachineFrameInfo *MFI = MF->getFrameInfo();      const MachineModuleInfo *MMI = MFI->getMachineModuleInfo();      callsEHReturn = (MMI ? MMI->callsEHReturn() : false); +    const Function *F = MF->getFunction(); +    ghcCall = (F ? F->getCallingConv() == CallingConv::GHC : false);    } +  static const unsigned GhcCalleeSavedRegs[] = { +    0 +  }; +    static const unsigned CalleeSavedRegs32Bit[] = {      X86::ESI, X86::EDI, X86::EBX, X86::EBP,  0    }; @@ -326,7 +333,9 @@ X86RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {      X86::XMM14, X86::XMM15, 0    }; -  if (Is64Bit) { +  if (ghcCall) { +    return GhcCalleeSavedRegs; +  } else if (Is64Bit) {      if (IsWin64)        return CalleeSavedRegsWin64;      else | 

