1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

Support for the mno-stack-arg-probe flag

Adds support for this flag. There is also another piece for clang
(separate review). More info:
https://bugs.llvm.org/show_bug.cgi?id=36221

By Ruslan Nikolaev!

Differential Revision: https://reviews.llvm.org/D43107

llvm-svn: 325900
This commit is contained in:
Hans Wennborg 2018-02-23 13:46:25 +00:00
parent 155e56455f
commit 740ebeb8fa
6 changed files with 64 additions and 9 deletions

View File

@ -1561,6 +1561,8 @@ example:
inlined into a function that has no ``"stack-probe-size"`` attribute
at all, the resulting function has the ``"stack-probe-size"`` attribute
of the callee.
``"no-stack-arg-probe"``
This attribute disables ABI-required stack probes, if any.
``writeonly``
On a function, this attribute indicates that the function may write to but
does not read from memory.

View File

@ -369,7 +369,8 @@ static bool windowsRequiresStackProbe(MachineFunction &MF,
F.getFnAttribute("stack-probe-size")
.getValueAsString()
.getAsInteger(0, StackProbeSize);
return StackSizeInBytes >= StackProbeSize;
return (StackSizeInBytes >= StackProbeSize) &&
!F.hasFnAttribute("no-stack-arg-probe");
}
bool AArch64FrameLowering::shouldCombineCSRLocalStackBump(

View File

@ -209,7 +209,8 @@ static bool WindowsRequiresStackProbe(const MachineFunction &MF,
F.getFnAttribute("stack-probe-size")
.getValueAsString()
.getAsInteger(0, StackProbeSize);
return StackSizeInBytes >= StackProbeSize;
return (StackSizeInBytes >= StackProbeSize) &&
!F.hasFnAttribute("no-stack-arg-probe");
}
namespace {

View File

@ -39186,7 +39186,8 @@ StringRef X86TargetLowering::getStackProbeSymbolName(MachineFunction &MF) const
// Generally, if we aren't on Windows, the platform ABI does not include
// support for stack probes, so don't emit them.
if (!Subtarget.isOSWindows() || Subtarget.isTargetMachO())
if (!Subtarget.isOSWindows() || Subtarget.isTargetMachO() ||
MF.getFunction().hasFnAttribute("no-stack-arg-probe"))
return "";
// We need a stack probe to conform to the Windows ABI. Choose the right

View File

@ -62,6 +62,7 @@ private:
unsigned StackPtr;
unsigned SlotSize;
int64_t StackProbeSize;
bool NoStackArgProbe;
StringRef getPassName() const override { return "X86 WinAlloca Expander"; }
static char ID;
@ -240,13 +241,21 @@ void X86WinAllocaExpander::lower(MachineInstr* MI, Lowering L) {
}
break;
case Probe:
// The probe lowering expects the amount in RAX/EAX.
BuildMI(*MBB, MI, DL, TII->get(TargetOpcode::COPY), RegA)
.addReg(MI->getOperand(0).getReg());
if (!NoStackArgProbe) {
// The probe lowering expects the amount in RAX/EAX.
BuildMI(*MBB, MI, DL, TII->get(TargetOpcode::COPY), RegA)
.addReg(MI->getOperand(0).getReg());
// Do the probe.
STI->getFrameLowering()->emitStackProbe(*MBB->getParent(), *MBB, MI, DL,
/*InPrologue=*/false);
// Do the probe.
STI->getFrameLowering()->emitStackProbe(*MBB->getParent(), *MBB, MI, DL,
/*InPrologue=*/false);
} else {
// Sub
BuildMI(*MBB, I, DL, TII->get(Is64Bit ? X86::SUB64rr : X86::SUB32rr),
StackPtr)
.addReg(StackPtr)
.addReg(MI->getOperand(0).getReg());
}
break;
}
@ -285,6 +294,9 @@ bool X86WinAllocaExpander::runOnMachineFunction(MachineFunction &MF) {
.getValueAsString()
.getAsInteger(0, StackProbeSize);
}
NoStackArgProbe = MF.getFunction().hasFnAttribute("no-stack-arg-probe");
if (NoStackArgProbe)
StackProbeSize = INT64_MAX;
LoweringMap Lowerings;
computeLowerings(MF, Lowerings);

View File

@ -0,0 +1,38 @@
; This test is attempting to detect that the compiler disables stack
; probe calls when the corresponding option is specified.
;
; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s
target datalayout = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
define i32 @test1() "no-stack-arg-probe" {
%buffer = alloca [4095 x i8]
ret i32 0
; CHECK-LABEL: _test1:
; CHECK-NOT: movl $4095, %eax
; CHECK: subl $4095, %esp
; CHECK-NOT: calll __chkstk
}
define i32 @test2() "no-stack-arg-probe" {
%buffer = alloca [4096 x i8]
ret i32 0
; CHECK-LABEL: _test2:
; CHECK-NOT: movl $4096, %eax
; CHECK: subl $4096, %esp
; CHECK-NOT: calll __chkstk
}
define i32 @test3(i32 %size) "no-stack-arg-probe" {
%buffer = alloca i8, i32 %size
ret i32 0
; CHECK-LABEL: _test3:
; CHECK: subl {{.*}}, %esp
; CHECK-NOT: calll __chkstk
}