mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
Added a MRegisterInfo hook that tells PEI the target is responsible for
rounding the stack frame to a multiple of stack alignment. llvm-svn: 33504
This commit is contained in:
parent
696a1c1143
commit
b64363a085
@ -367,6 +367,12 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// targetHandlesStackFrameRounding - Returns true if the target is responsible
|
||||
/// for rounding up the stack frame (probably at emitPrologue time).
|
||||
virtual bool targetHandlesStackFrameRounding() const {
|
||||
return false;
|
||||
}
|
||||
|
||||
/// hasFP - Return true if the specified function should have a dedicated frame
|
||||
/// pointer register. For most targets this is true only if the function has
|
||||
/// variable sized allocas or if frame pointer elimination is disabled.
|
||||
|
@ -389,11 +389,12 @@ void PEI::calculateFrameObjectOffsets(MachineFunction &Fn) {
|
||||
// Round up the size to a multiple of the alignment, but only if there are
|
||||
// calls or alloca's in the function. This ensures that any calls to
|
||||
// subroutines have their stack frames suitable aligned.
|
||||
if (FFI->hasCalls() || FFI->hasVarSizedObjects()) {
|
||||
const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
||||
if (!RegInfo->targetHandlesStackFrameRounding() &&
|
||||
(FFI->hasCalls() || FFI->hasVarSizedObjects())) {
|
||||
// When we have no frame pointer, we reserve argument space for call sites
|
||||
// in the function immediately on entry to the current function. This
|
||||
// eliminates the need for add/sub sp brackets around call sites.
|
||||
const MRegisterInfo *RegInfo = Fn.getTarget().getRegisterInfo();
|
||||
if (!RegInfo->hasFP(Fn))
|
||||
Offset += FFI->getMaxCallFrameSize();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user