This is an archive of the discontinued LLVM Phabricator instance.

Restore X86 base pointer after call to llvm.eh.sjlj.setjmp
Needs ReviewPublic

Authored by ArchDRobison on Nov 24 2014, 11:07 AM.

Details

Reviewers
hliao
nadav
Summary

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.

Diff Detail

Event Timeline

ArchDRobison retitled this revision from to Restore X86 base pointer after call to llvm.eh.sjlj.setjmp.
ArchDRobison updated this object.
ArchDRobison edited the test plan for this revision. (Show Details)
ArchDRobison added reviewers: nadav, hliao.
ArchDRobison added a subscriber: Unknown Object (MLST).
LuoYuanke added inline comments.
lib/Target/X86/X86MachineFunctionInfo.cpp
24

The real callee saved register should be determined after register allocation. We don't need to save untouched callee registers.

test/CodeGen/X86/sjlj-baseptr.ll
26

The stack slot should be allocated before the stack realignment, so that it can be referenced by ebp.

Herald added a project: Restricted Project. · View Herald TranscriptFeb 23 2023, 1:23 AM