diff options
Diffstat (limited to 'lib/CodeGen/TargetFrameLoweringImpl.cpp')
| -rw-r--r-- | lib/CodeGen/TargetFrameLoweringImpl.cpp | 31 | 
1 files changed, 30 insertions, 1 deletions
diff --git a/lib/CodeGen/TargetFrameLoweringImpl.cpp b/lib/CodeGen/TargetFrameLoweringImpl.cpp index b2151eb49655..f0cfa2fbe4fd 100644 --- a/lib/CodeGen/TargetFrameLoweringImpl.cpp +++ b/lib/CodeGen/TargetFrameLoweringImpl.cpp @@ -36,6 +36,13 @@ bool TargetFrameLowering::noFramePointerElim(const MachineFunction &MF) const {    return Attr.getValueAsString() == "true";  } +bool TargetFrameLowering::enableCalleeSaveSkip(const MachineFunction &MF) const { +  assert(MF.getFunction().hasFnAttribute(Attribute::NoReturn) && +         MF.getFunction().hasFnAttribute(Attribute::NoUnwind) && +         !MF.getFunction().hasFnAttribute(Attribute::UWTable)); +  return false; +} +  /// Returns the displacement from the frame register to the stack  /// frame of the specified index, along with the frame register used  /// (in output arg FrameReg). This is the default implementation which @@ -85,6 +92,19 @@ void TargetFrameLowering::determineCalleeSaves(MachineFunction &MF,    if (MF.getFunction().hasFnAttribute(Attribute::Naked))      return; +  // Noreturn+nounwind functions never restore CSR, so no saves are needed. +  // Purely noreturn functions may still return through throws, so those must +  // save CSR for caller exception handlers. +  // +  // If the function uses longjmp to break out of its current path of +  // execution we do not need the CSR spills either: setjmp stores all CSRs +  // it was called with into the jmp_buf, which longjmp then restores. +  if (MF.getFunction().hasFnAttribute(Attribute::NoReturn) && +        MF.getFunction().hasFnAttribute(Attribute::NoUnwind) && +        !MF.getFunction().hasFnAttribute(Attribute::UWTable) && +        enableCalleeSaveSkip(MF)) +    return; +    // Functions which call __builtin_unwind_init get all their registers saved.    bool CallsUnwindInit = MF.callsUnwindInit();    const MachineRegisterInfo &MRI = MF.getRegInfo(); @@ -100,7 +120,16 @@ unsigned TargetFrameLowering::getStackAlignmentSkew(    // When HHVM function is called, the stack is skewed as the return address    // is removed from the stack before we enter the function.    if (LLVM_UNLIKELY(MF.getFunction().getCallingConv() == CallingConv::HHVM)) -    return MF.getTarget().getPointerSize(); +    return MF.getTarget().getAllocaPointerSize();    return 0;  } + +int TargetFrameLowering::getInitialCFAOffset(const MachineFunction &MF) const { +  llvm_unreachable("getInitialCFAOffset() not implemented!"); +} + +unsigned TargetFrameLowering::getInitialCFARegister(const MachineFunction &MF) +    const { +  llvm_unreachable("getInitialCFARegister() not implemented!"); +}
\ No newline at end of file  | 
