Changes in directory llvm/lib/Target/X86:
X86ISelDAGToDAG.cpp updated: 1.72 -> 1.73 X86RegisterInfo.cpp updated: 1.155 -> 1.156 --- Log message: Cygwin support. Patch by Anton Korobeynikov! --- Diffs of the changes: (+28 -4) X86ISelDAGToDAG.cpp | 9 +++++++-- X86RegisterInfo.cpp | 23 +++++++++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.72 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.73 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.72 Fri Jun 2 16:20:34 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Fri Jun 2 17:38:37 2006 @@ -129,6 +129,8 @@ 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 @@ /// 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); Index: llvm/lib/Target/X86/X86RegisterInfo.cpp diff -u llvm/lib/Target/X86/X86RegisterInfo.cpp:1.155 llvm/lib/Target/X86/X86RegisterInfo.cpp:1.156 --- llvm/lib/Target/X86/X86RegisterInfo.cpp:1.155 Wed May 31 14:00:07 2006 +++ llvm/lib/Target/X86/X86RegisterInfo.cpp Fri Jun 2 17:38:37 2006 @@ -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 @@ // 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 @@ 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 @@ // 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 @@ 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, _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits