mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-08 03:01:58 +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:
parent
f67202c94d
commit
e74a088d92
@ -38,8 +38,15 @@
|
|||||||
#include "llvm/ADT/BitVector.h"
|
#include "llvm/ADT/BitVector.h"
|
||||||
#include "llvm/ADT/STLExtras.h"
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
|
#include "llvm/Support/CommandLine.h"
|
||||||
using namespace llvm;
|
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,
|
X86RegisterInfo::X86RegisterInfo(X86TargetMachine &tm,
|
||||||
const TargetInstrInfo &tii)
|
const TargetInstrInfo &tii)
|
||||||
: X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
|
: X86GenRegisterInfo(tm.getSubtarget<X86Subtarget>().is64Bit() ?
|
||||||
@ -471,7 +478,11 @@ bool X86RegisterInfo::needsStackRealignment(const MachineFunction &MF) const {
|
|||||||
if (0 && requiresRealignment && MFI->hasVarSizedObjects())
|
if (0 && requiresRealignment && MFI->hasVarSizedObjects())
|
||||||
report_fatal_error(
|
report_fatal_error(
|
||||||
"Stack realignment in presense of dynamic allocas is not supported");
|
"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);
|
return requiresRealignment && canRealignStack(MF);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -906,6 +917,17 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
|
|||||||
bool HasFP = hasFP(MF);
|
bool HasFP = hasFP(MF);
|
||||||
DebugLoc DL;
|
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.
|
// Add RETADDR move area to callee saved frame size.
|
||||||
int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
|
int TailCallReturnAddrDelta = X86FI->getTCReturnAddrDelta();
|
||||||
if (TailCallReturnAddrDelta < 0)
|
if (TailCallReturnAddrDelta < 0)
|
||||||
@ -1177,6 +1199,17 @@ void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
|
|||||||
unsigned CSSize = X86FI->getCalleeSavedFrameSize();
|
unsigned CSSize = X86FI->getCalleeSavedFrameSize();
|
||||||
uint64_t NumBytes = 0;
|
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)) {
|
if (hasFP(MF)) {
|
||||||
// Calculate required stack adjustment.
|
// Calculate required stack adjustment.
|
||||||
uint64_t FrameSize = StackSize - SlotSize;
|
uint64_t FrameSize = StackSize - SlotSize;
|
||||||
|
21
test/CodeGen/X86/force-align-stack.ll
Normal file
21
test/CodeGen/X86/force-align-stack.ll
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
; RUN: llc < %s -relocation-model=static -force-align-stack | FileCheck %s
|
||||||
|
; Tests to make sure that we always align the stack out to the minimum needed -
|
||||||
|
; in this case 16-bytes.
|
||||||
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
|
||||||
|
target triple = "i386-apple-darwin10.3"
|
||||||
|
|
||||||
|
define void @a() nounwind ssp {
|
||||||
|
entry:
|
||||||
|
; CHECK: _a:
|
||||||
|
; CHECK: andl $-16, %esp
|
||||||
|
%z = alloca <16 x i8> ; <<16 x i8>*> [#uses=2]
|
||||||
|
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
|
||||||
|
store <16 x i8> zeroinitializer, <16 x i8>* %z, align 16
|
||||||
|
call void @b(<16 x i8>* %z) nounwind
|
||||||
|
br label %return
|
||||||
|
|
||||||
|
return: ; preds = %entry
|
||||||
|
ret void
|
||||||
|
}
|
||||||
|
|
||||||
|
declare void @b(<16 x i8>*)
|
Loading…
x
Reference in New Issue
Block a user