diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-12-12 16:06:58 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-12-12 16:06:58 +0000 |
commit | 32cb5ac9041865aabd6d84ef410f52f07b309d1f (patch) | |
tree | 15bdbc82e354c00535e11443bde93315ce68d5df | |
parent | 80d333ba22bed8311d71a858d17cd49752145f8b (diff) | |
download | bcm5719-llvm-32cb5ac9041865aabd6d84ef410f52f07b309d1f.tar.gz bcm5719-llvm-32cb5ac9041865aabd6d84ef410f52f07b309d1f.zip |
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.
llvm-svn: 197163
-rw-r--r-- | llvm/lib/Target/X86/X86FastISel.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/win32_sret.ll | 8 |
3 files changed, 9 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp index 97f96ab72c2..28a6ac0ab25 100644 --- a/llvm/lib/Target/X86/X86FastISel.cpp +++ b/llvm/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/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 081433e511e..e08adc2384b 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/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/llvm/test/CodeGen/X86/win32_sret.ll b/llvm/test/CodeGen/X86/win32_sret.ll index 8c413f4481e..78f1821b1d4 100644 --- a/llvm/test/CodeGen/X86/win32_sret.ll +++ b/llvm/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 |