From 077d2ea485c4da12f2cf1eb511964c719b0e2aba Mon Sep 17 00:00:00 2001 From: gnezdo Date: Fri, 14 Nov 2025 09:57:02 +0000 Subject: [PATCH] Fix llvm x86 frame lowering for -msave-args The problem only shows up with KASAN builds where it causes registers saved below SP leading to fills not finding what was spilled. go for it dlg@ --- gnu/llvm/llvm/lib/Target/X86/X86FrameLowering.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gnu/llvm/llvm/lib/Target/X86/X86FrameLowering.cpp b/gnu/llvm/llvm/lib/Target/X86/X86FrameLowering.cpp index 33edb2654c6..d96acb59366 100644 --- a/gnu/llvm/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/gnu/llvm/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -2576,8 +2576,8 @@ void X86FrameLowering::emitEpilogue(MachineFunction &MF, if (TRI->hasStackRealignment(MF)) MBBI = FirstCSPop; unsigned SEHFrameOffset = calculateSetFPREG(SEHStackAllocAmt); - uint64_t LEAAmount = - IsWin64Prologue ? SEHStackAllocAmt - SEHFrameOffset : -CSSize; + uint64_t LEAAmount = IsWin64Prologue ? SEHStackAllocAmt - SEHFrameOffset + : -(CSSize + X86FI->getSaveArgSize()); if (X86FI->hasSwiftAsyncContext()) LEAAmount -= 16; @@ -2726,7 +2726,7 @@ StackOffset X86FrameLowering::getFrameIndexReference(const MachineFunction &MF, "FPDelta isn't aligned per the Win64 ABI!"); } - if (FI >= 0) + if (FI >= 0 && FrameReg != TRI->getStackRegister()) Offset -= X86FI->getSaveArgSize(); if (FrameReg == TRI->getFramePtr()) {