mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-06 02:17:20 +00:00
Add an option to always emit realignment code for a particular module.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@110404 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -38,8 +38,15 @@
|
||||
#include "llvm/ADT/BitVector.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
using namespace llvm;
|
||||
|
||||
static cl::opt<bool>
|
||||
ForceStackAlign("force-align-stack",
|
||||
cl::desc("Force align the stack to the minimum alignment"
|
||||
" needed for the function."),
|
||||
cl::init(false), cl::Hidden);
|
||||
|
||||
X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
|
||||
const TargetInstrInfo &tii)
|
||||
: X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
|
||||
@@ -471,7 +478,11 @@ bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
||||
if (0 && requiresRealignment && MFI->hasVarSizedObjects())
|
||||
report_fatal_error(
|
||||
"Stack realignment in presense of dynamic allocas is not supported");
|
||||
|
||||
|
||||
// If we've requested that we force align the stack do so now.
|
||||
if (ForceStackAlign)
|
||||
return canRealignStack(MF);
|
||||
|
||||
return requiresRealignment && canRealignStack(MF);
|
||||
}
|
||||
|
||||
@@ -906,6 +917,17 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
||||
bool HasFP = hasFP(MF);
|
||||
DebugLoc DL;
|
||||
|
||||
// If we're forcing a stack realignment we can't rely on just the frame
|
||||
// info, we need to know the ABI stack alignment as well in case we
|
||||
// have a call out. Otherwise just make sure we have some alignment - we'll
|
||||
// go with the minimum SlotSize.
|
||||
if (ForceStackAlign) {
|
||||
if (MFI->hasCalls())
|
||||
MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
|
||||
else if (MaxAlign < SlotSize)
|
||||
MaxAlign = SlotSize;
|
||||
}
|
||||
|
||||
// Add RETADDR move area to callee saved frame size.
|
||||
int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
|
||||
if (TailCallReturnAddrDelta < 0)
|
||||
@@ -1177,6 +1199,17 @@ void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
|
||||
unsigned CSSize = X86FI->getCalleeSavedFrameSize();
|
||||
uint64_t NumBytes = 0;
|
||||
|
||||
// If we're forcing a stack realignment we can't rely on just the frame
|
||||
// info, we need to know the ABI stack alignment as well in case we
|
||||
// have a call out. Otherwise just make sure we have some alignment - we'll
|
||||
// go with the minimum.
|
||||
if (ForceStackAlign) {
|
||||
if (MFI->hasCalls())
|
||||
MaxAlign = (StackAlign > MaxAlign) ? StackAlign : MaxAlign;
|
||||
else
|
||||
MaxAlign = MaxAlign ? MaxAlign : 4;
|
||||
}
|
||||
|
||||
if (hasFP(MF)) {
|
||||
// Calculate required stack adjustment.
|
||||
uint64_t FrameSize = StackSize - SlotSize;
|
||||
|
Reference in New Issue
Block a user