Switch to the new MingW ABI.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 12 Dec 2013 16:06:58 +0000 (16:06 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 12 Dec 2013 16:06:58 +0000 (16:06 +0000)
GCC 4.7 changed the MingW ABI. On the LLVM side it means that sret functions
don't pop the stack.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197163 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86FastISel.cpp
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/win32_sret.ll

index 97f96ab72c242ac86b86763b9e4e79b7b8ca3d1a..28a6ac0ab2571d3f2b24324bf0ef1e5c2665c0bd 100644 (file)
@@ -1863,7 +1863,7 @@ static unsigned computeBytesPoppedByCallee(const X86Subtarget &Subtarget,
                                            const ImmutableCallSite &CS) {
   if (Subtarget.is64Bit())
     return 0;
-  if (Subtarget.isTargetWindows())
+  if (Subtarget.getTargetTriple().isOSMSVCRT())
     return 0;
   CallingConv::ID CC = CS.getCallingConv();
   if (CC == CallingConv::Fast || CC == CallingConv::GHC)
index 081433e511e49977e6a15c7a09cedd17fb3c5bc2..e08adc2384ba15a900bc5fb0f8710d2db4dda825 100644 (file)
@@ -2175,7 +2175,6 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
 
   MachineFrameInfo *MFI = MF.getFrameInfo();
   bool Is64Bit = Subtarget->is64Bit();
-  bool IsWindows = Subtarget->isTargetWindows();
   bool IsWin64 = Subtarget->isCallingConvWin64(CallConv);
 
   assert(!(isVarArg && IsTailCallConvention(CallConv)) &&
@@ -2420,7 +2419,8 @@ X86TargetLowering::LowerFormalArguments(SDValue Chain,
   } else {
     FuncInfo->setBytesToPopOnReturn(0); // Callee pops nothing.
     // If this is an sret function, the return should pop the hidden pointer.
-    if (!Is64Bit && !IsTailCallConvention(CallConv) && !IsWindows &&
+    if (!Is64Bit && !IsTailCallConvention(CallConv) &&
+        !Subtarget->getTargetTriple().isOSMSVCRT() &&
         argsAreStructReturn(Ins) == StackStructReturn)
       FuncInfo->setBytesToPopOnReturn(4);
   }
@@ -2509,7 +2509,6 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
   MachineFunction &MF = DAG.getMachineFunction();
   bool Is64Bit        = Subtarget->is64Bit();
   bool IsWin64        = Subtarget->isCallingConvWin64(CallConv);
-  bool IsWindows      = Subtarget->isTargetWindows();
   StructReturnType SR = callIsStructReturn(Outs);
   bool IsSibcall      = false;
 
@@ -2903,7 +2902,8 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
   if (X86::isCalleePop(CallConv, Is64Bit, isVarArg,
                        getTargetMachine().Options.GuaranteedTailCallOpt))
     NumBytesForCalleeToPush = NumBytes;    // Callee pops everything
-  else if (!Is64Bit && !IsTailCallConvention(CallConv) && !IsWindows &&
+  else if (!Is64Bit && !IsTailCallConvention(CallConv) &&
+           !Subtarget->getTargetTriple().isOSMSVCRT() &&
            SR == StackStructReturn)
     // If this is a call to a struct-return function, the callee
     // pops the hidden struct pointer, so we have to push it back.
index 8c413f4481e6575c95609b141e37b6bdd981bc71..78f1821b1d4a28cdb5f6fa806123654fea6b0679 100644 (file)
@@ -19,7 +19,7 @@ entry:
 ; WIN32:    {{ret$}}
 
 ; MINGW_X86-LABEL:  _sret1:
-; MINGW_X86:  ret $4
+; MINGW_X86:  {{ret$}}
 
 ; LINUX-LABEL:      sret1:
 ; LINUX:      ret $4
@@ -36,7 +36,7 @@ entry:
 ; WIN32:    {{ret$}}
 
 ; MINGW_X86-LABEL:  _sret2:
-; MINGW_X86:  ret $4
+; MINGW_X86:  {{ret$}}
 
 ; LINUX-LABEL:      sret2:
 ; LINUX:      ret $4
@@ -54,7 +54,7 @@ entry:
 ; WIN32:    {{ret$}}
 
 ; MINGW_X86-LABEL:  _sret3:
-; MINGW_X86:  ret $4
+; MINGW_X86:  {{ret$}}
 
 ; LINUX-LABEL:      sret3:
 ; LINUX:      ret $4
@@ -75,7 +75,7 @@ entry:
 ; WIN32:   {{ret$}}
 
 ; MINGW_X86-LABEL: _sret4:
-; MINGW_X86: ret $4
+; MINGW_X86: {{ret$}}
 
 ; LINUX-LABEL:     sret4:
 ; LINUX:     ret $4