summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86RegisterInfo.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-06-02 22:38:37 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-06-02 22:38:37 +0000
commite8a42360c584f8d52583c5d532376daf60b07639 (patch)
tree8536201b5a5cd1480f3722312ad074dc7a2702c4 /llvm/lib/Target/X86/X86RegisterInfo.cpp
parentf566821f36f1b6500b43a10bfc56e1678dd66575 (diff)
downloadbcm5719-llvm-e8a42360c584f8d52583c5d532376daf60b07639.tar.gz
bcm5719-llvm-e8a42360c584f8d52583c5d532376daf60b07639.zip
Cygwin support. Patch by Anton Korobeynikov!
llvm-svn: 28672
Diffstat (limited to 'llvm/lib/Target/X86/X86RegisterInfo.cpp')
-rw-r--r--llvm/lib/Target/X86/X86RegisterInfo.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86RegisterInfo.cpp b/llvm/lib/Target/X86/X86RegisterInfo.cpp
index 58180b61fff..ec4a24d503c 100644
--- a/llvm/lib/Target/X86/X86RegisterInfo.cpp
+++ b/llvm/lib/Target/X86/X86RegisterInfo.cpp
@@ -14,9 +14,12 @@
#include "X86.h"
#include "X86RegisterInfo.h"
+#include "X86Subtarget.h"
+#include "X86TargetMachine.h"
#include "X86InstrBuilder.h"
#include "llvm/Constants.h"
#include "llvm/Type.h"
+#include "llvm/Function.h"
#include "llvm/CodeGen/ValueTypes.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -635,7 +638,14 @@ X86RegisterInfo::getCalleeSaveRegClasses() const {
// if frame pointer elimination is disabled.
//
static bool hasFP(MachineFunction &MF) {
- return NoFramePointerElim || MF.getFrameInfo()->hasVarSizedObjects();
+ const Function* Fn = MF.getFunction();
+ const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
+
+ return (NoFramePointerElim ||
+ MF.getFrameInfo()->hasVarSizedObjects() ||
+ (Fn->hasExternalLinkage() &&
+ Fn->getName() == "main" &&
+ Subtarget->TargetType == X86Subtarget::isCygwin));
}
void X86RegisterInfo::
@@ -730,6 +740,9 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
MachineBasicBlock &MBB = MF.front(); // Prolog goes in entry BB
MachineBasicBlock::iterator MBBI = MBB.begin();
MachineFrameInfo *MFI = MF.getFrameInfo();
+ unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment();
+ const Function* Fn = MF.getFunction();
+ const X86Subtarget* Subtarget = &MF.getTarget().getSubtarget<X86Subtarget>();
MachineInstr *MI;
// Get the number of bytes to allocate from the FrameInfo
@@ -744,7 +757,6 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
// Round the size to a multiple of the alignment (don't forget the 4 byte
// offset though).
- unsigned Align = MF.getTarget().getFrameInfo()->getStackAlignment();
NumBytes = ((NumBytes+4)+Align-1)/Align*Align - 4;
}
@@ -775,6 +787,13 @@ void X86RegisterInfo::emitPrologue(MachineFunction &MF) const {
MBB.insert(MBBI, MI);
}
+
+ // If it's main() on Cygwin\Mingw32 we should align stack as well
+ if (Fn->hasExternalLinkage() && Fn->getName() == "main" &&
+ Subtarget->TargetType == X86Subtarget::isCygwin) {
+ MI = BuildMI(X86::AND32ri, 2, X86::ESP).addImm(-Align);
+ MBB.insert(MBBI, MI);
+ }
}
void X86RegisterInfo::emitEpilogue(MachineFunction &MF,
OpenPOWER on IntegriCloud