[X86] Restore X86 base pointer after call to llvm.eh.sjlj.setjmp
authorMichael Liao <michael.liao@intel.com>
Thu, 4 Dec 2014 00:56:38 +0000 (00:56 +0000)
committerMichael Liao <michael.liao@intel.com>
Thu, 4 Dec 2014 00:56:38 +0000 (00:56 +0000)
commitfd0832ea89d79806a0839b57687bf884083c0dcf
tree630a4cc6283a3836c9162b3974d8fc3ae764bab0
parentec086bf087e30f9bbcacbd492e3d30df9202bf6b
[X86] Restore X86 base pointer after call to llvm.eh.sjlj.setjmp

Commit on

- This patch fixes the bug described in
  http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-May/062343.html

The fix allocates an extra slot just below the GPRs and stores the base pointer
there. This is done only for functions containing llvm.eh.sjlj.setjmp that also
need a base pointer. Because code containing llvm.eh.sjlj.setjmp saves all of
the callee-save GPRs in the prologue, the offset to the extra slot can be
computed before prologue generation runs.

Impact at run-time on affected functions is::

  - One extra store in the prologue, The store saves the base pointer.
  - One extra load after a llvm.eh.sjlj.setjmp. The load restores the base pointer.

Because the extra slot is just above a gap between frame-pointer-relative and
base-pointer-relative chunks of memory, there is no impact on other offset
calculations other than ensuring there is room for the extra slot.

http://reviews.llvm.org/D6388

Patch by Arch Robison <arch.robison@intel.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223329 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/X86/X86FrameLowering.cpp
lib/Target/X86/X86ISelLowering.cpp
lib/Target/X86/X86MachineFunctionInfo.cpp
lib/Target/X86/X86MachineFunctionInfo.h
test/CodeGen/X86/sjlj-baseptr.ll [new file with mode: 0644]