mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-30 17:25:21 +00:00
[Sparc] Generate correct code for leaf functions with stack objects
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183067 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "SparcSubtarget.h"
|
||||
#include "Sparc.h"
|
||||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/TargetRegistry.h"
|
||||
|
||||
#define GET_SUBTARGETINFO_TARGET_DESC
|
||||
@@ -44,3 +45,30 @@ SparcSubtarget::SparcSubtarget(const std::string &TT, const std::string &CPU,
|
||||
// Parse features string.
|
||||
ParseSubtargetFeatures(CPUName, FS);
|
||||
}
|
||||
|
||||
|
||||
int SparcSubtarget::getAdjustedFrameSize(int frameSize) const {
|
||||
|
||||
if (is64Bit()) {
|
||||
// All 64-bit stack frames must be 16-byte aligned, and must reserve space
|
||||
// for spilling the 16 window registers at %sp+BIAS..%sp+BIAS+128.
|
||||
frameSize += 128;
|
||||
// Frames with calls must also reserve space for 6 outgoing arguments
|
||||
// whether they are used or not. LowerCall_64 takes care of that.
|
||||
assert(frameSize % 16 == 0 && "Stack size not 16-byte aligned");
|
||||
} else {
|
||||
// Emit the correct save instruction based on the number of bytes in
|
||||
// the frame. Minimum stack frame size according to V8 ABI is:
|
||||
// 16 words for register window spill
|
||||
// 1 word for address of returned aggregate-value
|
||||
// + 6 words for passing parameters on the stack
|
||||
// ----------
|
||||
// 23 words * 4 bytes per word = 92 bytes
|
||||
frameSize += 92;
|
||||
|
||||
// Round up to next doubleword boundary -- a double-word boundary
|
||||
// is required by the ABI.
|
||||
frameSize = RoundUpToAlignment(frameSize, 8);
|
||||
}
|
||||
return frameSize;
|
||||
}
|
||||
|
Reference in New Issue
Block a user