diff options
| author | Evan Cheng <evan.cheng@apple.com> | 2006-06-02 22:38:37 +0000 |
|---|---|---|
| committer | Evan Cheng <evan.cheng@apple.com> | 2006-06-02 22:38:37 +0000 |
| commit | e8a42360c584f8d52583c5d532376daf60b07639 (patch) | |
| tree | 8536201b5a5cd1480f3722312ad074dc7a2702c4 /llvm | |
| parent | f566821f36f1b6500b43a10bfc56e1678dd66575 (diff) | |
| download | bcm5719-llvm-e8a42360c584f8d52583c5d532376daf60b07639.tar.gz bcm5719-llvm-e8a42360c584f8d52583c5d532376daf60b07639.zip | |
Cygwin support. Patch by Anton Korobeynikov!
llvm-svn: 28672
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86RegisterInfo.cpp | 23 |
2 files changed, 28 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index e8da9d79126..7f7e069b081 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -129,6 +129,8 @@ namespace { SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp); + void EmitSpecialCodeForMain(MachineBasicBlock *BB, MachineFrameInfo *MFI); + inline void getAddressOperands(X86ISelAddressMode &AM, SDOperand &Base, SDOperand &Scale, SDOperand &Index, SDOperand &Disp) { @@ -250,8 +252,11 @@ void X86DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { /// EmitSpecialCodeForMain - Emit any code that needs to be executed only in /// the main function. -static void EmitSpecialCodeForMain(MachineBasicBlock *BB, - MachineFrameInfo *MFI) { +void X86DAGToDAGISel::EmitSpecialCodeForMain(MachineBasicBlock *BB, + MachineFrameInfo *MFI) { + if (Subtarget->TargetType == X86Subtarget::isCygwin) + BuildMI(BB, X86::CALLpcrel32, 1).addExternalSymbol("__main"); + // Switch the FPU to 64-bit precision mode for better compatibility and speed. int CWFrameIdx = MFI->CreateStackObject(2, 2); addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx); 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, |

