[PATCH] Restore X86 base pointer after call to llvm.eh.sjlj.setjmp

Arch D. Robison arch.robison at intel.com
Mon Nov 24 11:07:43 PST 2014


Hi nadav, hliao,

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

Files:
  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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6388.16571.patch
Type: text/x-patch
Size: 7068 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141124/140aa58c/attachment.bin>


More information about the llvm-commits mailing list