From 11b11d77ee6eb5b064312ce4064e9c0869e3b168 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 12 Dec 2013 16:06:58 +0000 Subject: [PATCH] Switch to the new MingW ABI. 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 | 2 +- lib/Target/X86/X86ISelLowering.cpp | 8 ++++---- test/CodeGen/X86/win32_sret.ll | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/Target/X86/X86FastISel.cpp b/lib/Target/X86/X86FastISel.cpp index 97f96ab72c2..28a6ac0ab25 100644 --- a/lib/Target/X86/X86FastISel.cpp +++ b/lib/Target/X86/X86FastISel.cpp @@ -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) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 081433e511e..e08adc2384b 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -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. diff --git a/test/CodeGen/X86/win32_sret.ll b/test/CodeGen/X86/win32_sret.ll index 8c413f4481e..78f1821b1d4 100644 --- a/test/CodeGen/X86/win32_sret.ll +++ b/test/CodeGen/X86/win32_sret.ll @@ -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 -- 2.34.1