diff options
author | Michael Kuperstein <michael.m.kuperstein@intel.com> | 2015-10-07 07:01:31 +0000 |
---|---|---|
committer | Michael Kuperstein <michael.m.kuperstein@intel.com> | 2015-10-07 07:01:31 +0000 |
commit | 259f1508f08f662eb2ecfab5155cd92e0c03eff8 (patch) | |
tree | 5cf2fc329842d2039ab61ece0d8978b35cb2b946 /llvm/lib/Target/X86/X86FrameLowering.cpp | |
parent | 1a6fd1cc0f3dea144ac6bd6291de48283f990745 (diff) | |
download | bcm5719-llvm-259f1508f08f662eb2ecfab5155cd92e0c03eff8.tar.gz bcm5719-llvm-259f1508f08f662eb2ecfab5155cd92e0c03eff8.zip |
[X86] Emit .cfi_escape GNU_ARGS_SIZE when adjusting the stack before calls
When outgoing function arguments are passed using push instructions, and EH
is enabled, we may need to indicate to the stack unwinder that the stack
pointer was adjusted before the call.
This should fix the exception handling issues in PR24792.
Differential Revision: http://reviews.llvm.org/D13132
llvm-svn: 249522
Diffstat (limited to 'llvm/lib/Target/X86/X86FrameLowering.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86FrameLowering.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp index 1895cd87b10..fc314d76c64 100644 --- a/llvm/lib/Target/X86/X86FrameLowering.cpp +++ b/llvm/lib/Target/X86/X86FrameLowering.cpp @@ -2073,8 +2073,6 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, // If the stack pointer can be changed after prologue, turn the // adjcallstackup instruction into a 'sub ESP, <amt>' and the // adjcallstackdown instruction into 'add ESP, <amt>' - if (Amount == 0) - return; // We need to keep the stack aligned properly. To do this, we round the // amount of space needed for the outgoing arguments up to the next @@ -2082,6 +2080,25 @@ eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, unsigned StackAlign = getStackAlignment(); Amount = RoundUpToAlignment(Amount, StackAlign); + // If we have any exception handlers in this function, and we adjust + // the SP before calls, we may need to indicate this to the unwinder, + // using GNU_ARGS_SIZE. Note that this may be necessary + // even when Amount == 0, because the preceding function may have + // set a non-0 GNU_ARGS_SIZE. + // TODO: We don't need to reset this between subsequent functions, + // if it didn't change. + bool HasDwarfEHHandlers = + !MF.getTarget().getMCAsmInfo()->usesWindowsCFI() && + !MF.getMMI().getLandingPads().empty(); + + if (HasDwarfEHHandlers && !isDestroy && + MF.getInfo<X86MachineFunctionInfo>()->getHasPushSequences()) + BuildCFI(MBB, I, DL,
+ MCCFIInstruction::createGnuArgsSize(nullptr, Amount));
+ + if (Amount == 0) + return; + // Factor out the amount that gets handled inside the sequence // (Pushes of argument for frame setup, callee pops for frame destroy) Amount -= InternalAmt; |