Crash in sorting-benchmark.js on ARM64 with full op_sub FTL coverage.
authormark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Nov 2015 06:59:13 +0000 (06:59 +0000)
committermark.lam@apple.com <mark.lam@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 12 Nov 2015 06:59:13 +0000 (06:59 +0000)
commit6bd05b01700734d310e5dd09cf9d556e2de043cd
tree11cd76b8815b5abb7da9de89fb25bcf6dbe154b3
parentf96765ebff85ca6521563cbd877f82927db3b5a6
Crash in sorting-benchmark.js on ARM64 with full op_sub FTL coverage.
https://bugs.webkit.org/show_bug.cgi?id=150936

Reviewed by Michael Saboff.

The OSR entry thunk does not currently restore the callee saved registers that the baseline
JIT saves but the DFG does not.  As a result, sorting-benchmark.js was crashing with the
following scenario:

    1. There exists 2 functions: benchmark() and bottom_up_merge_sort().
       Let's call them A() and B() respectively for brevity.
    2. A() is FTL compiled.
    3. B() is FTL compiled.
    4. FTL A() calls FTL B().  FTL B() trashes register x26.
    5. FTL B() goes through an OSR exit, and deopts to baseline.  The OSR exit off-ramp
       puts x26's original value in the baseline B()'s stash location for x26 in its stack
       frame.  It expects baseline B() to restore x26 when it returns.
    6. Baseline B() gets DFG optimized, and we OSR enter into DFG B().
       The OSR entry thunk does nothing to restore x26's original value.  Hence, x26 contains
       whatever value FTL B() left in it.
    7. DFG B() returns to FTL A().
       x26 is not one of the callee saved registers used by DFG B().  Hence, it does nothing
       to restore it.
    8. FTL A() tries to use x26 and crashes, because x26 contains FTL B()'s value for it, and
       not FTL A()'s.

This patch fixes this issue by having the OSR entry thunk restore all the callee saved
registers before running the DFG code.

No new test needed because this issue will be covered by sorting-benchmark.js as soon as
https://bugs.webkit.org/show_bug.cgi?id=150712 lands.

* dfg/DFGThunks.cpp:
(JSC::DFG::osrEntryThunkGenerator):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@192352 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGThunks.cpp