summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2018-03-06 06:00:13 +0000
committerMartin Storsjo <martin@martin.st>2018-03-06 06:00:13 +0000
commita7adc3185bef02576a39f0198b26f584cc8a184d (patch)
tree5b6852653c6761aa02572310dbae994cb147eb42 /llvm/lib
parentd43c0e1cb270e69878fc7142be976062897e7477 (diff)
downloadbcm5719-llvm-a7adc3185bef02576a39f0198b26f584cc8a184d.tar.gz
bcm5719-llvm-a7adc3185bef02576a39f0198b26f584cc8a184d.zip
[X86] Handle EAX being live when calling chkstk for x86_64
EAX can turn out to be alive here, when shrink wrapping is done (which is allowed when using dwarf exceptions, contrary to the normal case with WinCFI). This fixes PR36487. Differential Revision: https://reviews.llvm.org/D43968 llvm-svn: 326764
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86FrameLowering.cpp42
1 files changed, 25 insertions, 17 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index 34febe679db..d0529983392 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -1213,30 +1213,34 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
bool isEAXAlive = isEAXLiveIn(MBB);
if (isEAXAlive) {
- // Sanity check that EAX is not livein for this function.
- // It should not be, so throw an assert.
- assert(!Is64Bit && "EAX is livein in x64 case!");
-
- // Save EAX
- BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH32r))
- .addReg(X86::EAX, RegState::Kill)
- .setMIFlag(MachineInstr::FrameSetup);
+ if (Is64Bit) {
+ // Save RAX
+ BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH64r))
+ .addReg(X86::RAX, RegState::Kill)
+ .setMIFlag(MachineInstr::FrameSetup);
+ } else {
+ // Save EAX
+ BuildMI(MBB, MBBI, DL, TII.get(X86::PUSH32r))
+ .addReg(X86::EAX, RegState::Kill)
+ .setMIFlag(MachineInstr::FrameSetup);
+ }
}
if (Is64Bit) {
// Handle the 64-bit Windows ABI case where we need to call __chkstk.
// Function prologue is responsible for adjusting the stack pointer.
- if (isUInt<32>(NumBytes)) {
+ int Alloc = isEAXAlive ? NumBytes - 8 : NumBytes;
+ if (isUInt<32>(Alloc)) {
BuildMI(MBB, MBBI, DL, TII.get(X86::MOV32ri), X86::EAX)
- .addImm(NumBytes)
+ .addImm(Alloc)
.setMIFlag(MachineInstr::FrameSetup);
- } else if (isInt<32>(NumBytes)) {
+ } else if (isInt<32>(Alloc)) {
BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri32), X86::RAX)
- .addImm(NumBytes)
+ .addImm(Alloc)
.setMIFlag(MachineInstr::FrameSetup);
} else {
BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri), X86::RAX)
- .addImm(NumBytes)
+ .addImm(Alloc)
.setMIFlag(MachineInstr::FrameSetup);
}
} else {
@@ -1251,10 +1255,14 @@ void X86FrameLowering::emitPrologue(MachineFunction &MF,
emitStackProbe(MF, MBB, MBBI, DL, true);
if (isEAXAlive) {
- // Restore EAX
- MachineInstr *MI =
- addRegOffset(BuildMI(MF, DL, TII.get(X86::MOV32rm), X86::EAX),
- StackPtr, false, NumBytes - 4);
+ // Restore RAX/EAX
+ MachineInstr *MI;
+ if (Is64Bit)
+ MI = addRegOffset(BuildMI(MF, DL, TII.get(X86::MOV64rm), X86::RAX),
+ StackPtr, false, NumBytes - 8);
+ else
+ MI = addRegOffset(BuildMI(MF, DL, TII.get(X86::MOV32rm), X86::EAX),
+ StackPtr, false, NumBytes - 4);
MI->setFlag(MachineInstr::FrameSetup);
MBB.insert(MBBI, MI);
}
OpenPOWER on IntegriCloud