<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[188654] branches/jsc-tailcall/Source/JavaScriptCore</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/188654">188654</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2015-08-19 15:26:29 -0700 (Wed, 19 Aug 2015)</dd>
</dl>
<h3>Log Message</h3>
<pre>jsc-tailcall: Unify Register Offset classes
https://bugs.webkit.org/show_bug.cgi?id=148167
Reviewed by Basile Clement.
The is primarily a refactoring change.
Moved ftl/FTLRegisterAtOffset.{cpp,h} to jit/RegisterAtOffset.{cpp,h}.
Factored out the vector of RegisterAtOffsets in ftl/FTLUnwindInfo.{cpp,h} into a new
class in jit/RegisterAtOffsetList.{cpp,h}.
Eliminted UnwindInfo and changed UnwindInfo::parse() into a standalone function named parseUnwindInfo.
That standalone function now returns the callee saves RegisterAtOffsetList. This is stored in the
code block and used instead of UnwindInfo.
Added a little more functionality to RegisterAtOffsetList to use it instead of RegisterSaveMap and
replaced all occurances of RegisterSaveMap.
Eliminated jit/RegisterSaveMap.{cpp,h}.
* CMakeLists.txt:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::setCalleeSaveRegisters):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::calleeSaveRegisters):
* dfg/DFGOSREntry.cpp:
(JSC::DFG::prepareOSREntry):
* ftl/FTLCompile.cpp:
(JSC::FTL::mmAllocateDataSection):
* ftl/FTLJITCode.h:
* ftl/FTLOSRExitCompiler.cpp:
(JSC::FTL::compileStub):
* ftl/FTLRegisterAtOffset.cpp: Removed.
* ftl/FTLRegisterAtOffset.h: Removed.
* ftl/FTLUnwindInfo.cpp:
(JSC::FTL::parseUnwindInfo):
(JSC::FTL::UnwindInfo::UnwindInfo): Deleted.
(JSC::FTL::UnwindInfo::~UnwindInfo): Deleted.
(JSC::FTL::UnwindInfo::parse): Deleted.
(JSC::FTL::UnwindInfo::dump): Deleted.
(JSC::FTL::UnwindInfo::find): Deleted.
(JSC::FTL::UnwindInfo::indexOf): Deleted.
* ftl/FTLUnwindInfo.h:
* interpreter/Interpreter.cpp:
(JSC::UnwindFunctor::copyCalleeSavesToVMCalleeSavesBuffer):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitSaveCalleeSavesFor):
(JSC::AssemblyHelpers::emitRestoreCalleeSavesFor):
(JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer):
(JSC::AssemblyHelpers::copyCalleeSavesFromFrameToVMCalleeSavesBuffer): Deleted.
* jit/RegisterAtOffset.cpp: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp.
(JSC::RegisterAtOffset::dump):
(JSC::FTL::RegisterAtOffset::dump): Deleted.
* jit/RegisterAtOffset.h: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h.
(JSC::RegisterAtOffset::reg):
(JSC::RegisterAtOffset::offset):
(JSC::RegisterAtOffset::offsetAsIndex):
(JSC::RegisterAtOffset::operator==):
(JSC::FTL::RegisterAtOffset::reg): Deleted.
(JSC::FTL::RegisterAtOffset::offset): Deleted.
(JSC::FTL::RegisterAtOffset::operator==): Deleted.
* jit/RegisterAtOffsetList.cpp: Added.
(JSC::RegisterAtOffsetList::RegisterAtOffsetList):
(JSC::RegisterAtOffsetList::sort):
(JSC::RegisterAtOffsetList::dump):
(JSC::RegisterAtOffsetList::find):
(JSC::RegisterAtOffsetList::indexOf):
* jit/RegisterAtOffsetList.h: Added.
(JSC::RegisterAtOffsetList::clear):
(JSC::RegisterAtOffsetList::size):
(JSC::RegisterAtOffsetList::at):
(JSC::RegisterAtOffsetList::append):
* jit/RegisterSaveMap.cpp: Removed.
* jit/RegisterSaveMap.h: Removed.
* jit/RegisterSet.cpp:
(JSC::RegisterSet::dfgCalleeSaveRegisters):
(JSC::RegisterSet::ftlCalleeSaveRegisters):
(JSC::RegisterSet::allVMCalleeSaveRegisters):
(JSC::RegisterSet::allGPRs):
* jit/RegisterSet.h:
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:
(JSC::VM::getCTIStub):
(JSC::VM::getAllCalleeSaveRegisterOffsets):
(JSC::VM::getAllCalleeSaveRegistersMap): Deleted.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreCMakeListstxt">branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreChangeLog">branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockcpp">branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockh">branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoredfgDFGOSREntrycpp">branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLCompilecpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLJITCodeh">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLOSRExitCompilercpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfocpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfoh">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreinterpreterInterpretercpp">branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitAssemblyHelpersh">branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSetcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSeth">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreruntimeVMcpp">branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreruntimeVMh">branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h</a></li>
</ul>
<h3>Added Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffseth">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListh">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h</a></li>
</ul>
<h3>Removed Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffseth">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMapcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMaph">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjsctailcallSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -368,8 +368,9 @@
</span><span class="cx"> jit/JITToDFGDeferredCompilationCallback.cpp
</span><span class="cx"> jit/PolymorphicCallStubRoutine.cpp
</span><span class="cx"> jit/Reg.cpp
</span><ins>+ jit/RegisterAtOffset.cpp
+ jit/RegisterAtOffsetList.cpp
</ins><span class="cx"> jit/RegisterPreservationWrapperGenerator.cpp
</span><del>- jit/RegisterSaveMap.cpp
</del><span class="cx"> jit/RegisterSet.cpp
</span><span class="cx"> jit/Repatch.cpp
</span><span class="cx"> jit/ScratchRegisterAllocator.cpp
</span><span class="lines">@@ -887,7 +888,6 @@
</span><span class="cx"> ftl/FTLOperations.cpp
</span><span class="cx"> ftl/FTLOutput.cpp
</span><span class="cx"> ftl/FTLRecoveryOpcode.cpp
</span><del>- ftl/FTLRegisterAtOffset.cpp
</del><span class="cx"> ftl/FTLSaveRestore.cpp
</span><span class="cx"> ftl/FTLSlowPathCall.cpp
</span><span class="cx"> ftl/FTLSlowPathCallKey.cpp
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,3 +1,91 @@
</span><ins>+2015-08-19 Michael Saboff <msaboff@apple.com>
+
+ jsc-tailcall: Unify Register Offset classes
+ https://bugs.webkit.org/show_bug.cgi?id=148167
+
+ Reviewed by Basile Clement.
+
+ The is primarily a refactoring change.
+
+ Moved ftl/FTLRegisterAtOffset.{cpp,h} to jit/RegisterAtOffset.{cpp,h}.
+ Factored out the vector of RegisterAtOffsets in ftl/FTLUnwindInfo.{cpp,h} into a new
+ class in jit/RegisterAtOffsetList.{cpp,h}.
+ Eliminted UnwindInfo and changed UnwindInfo::parse() into a standalone function named parseUnwindInfo.
+ That standalone function now returns the callee saves RegisterAtOffsetList. This is stored in the
+ code block and used instead of UnwindInfo.
+ Added a little more functionality to RegisterAtOffsetList to use it instead of RegisterSaveMap and
+ replaced all occurances of RegisterSaveMap.
+ Eliminated jit/RegisterSaveMap.{cpp,h}.
+
+ * CMakeLists.txt:
+ * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+ * JavaScriptCore.xcodeproj/project.pbxproj:
+ * bytecode/CodeBlock.cpp:
+ (JSC::CodeBlock::setCalleeSaveRegisters):
+ * bytecode/CodeBlock.h:
+ (JSC::CodeBlock::calleeSaveRegisters):
+ * dfg/DFGOSREntry.cpp:
+ (JSC::DFG::prepareOSREntry):
+ * ftl/FTLCompile.cpp:
+ (JSC::FTL::mmAllocateDataSection):
+ * ftl/FTLJITCode.h:
+ * ftl/FTLOSRExitCompiler.cpp:
+ (JSC::FTL::compileStub):
+ * ftl/FTLRegisterAtOffset.cpp: Removed.
+ * ftl/FTLRegisterAtOffset.h: Removed.
+ * ftl/FTLUnwindInfo.cpp:
+ (JSC::FTL::parseUnwindInfo):
+ (JSC::FTL::UnwindInfo::UnwindInfo): Deleted.
+ (JSC::FTL::UnwindInfo::~UnwindInfo): Deleted.
+ (JSC::FTL::UnwindInfo::parse): Deleted.
+ (JSC::FTL::UnwindInfo::dump): Deleted.
+ (JSC::FTL::UnwindInfo::find): Deleted.
+ (JSC::FTL::UnwindInfo::indexOf): Deleted.
+ * ftl/FTLUnwindInfo.h:
+ * interpreter/Interpreter.cpp:
+ (JSC::UnwindFunctor::copyCalleeSavesToVMCalleeSavesBuffer):
+ * jit/AssemblyHelpers.h:
+ (JSC::AssemblyHelpers::emitSaveCalleeSavesFor):
+ (JSC::AssemblyHelpers::emitRestoreCalleeSavesFor):
+ (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer):
+ (JSC::AssemblyHelpers::copyCalleeSavesFromFrameToVMCalleeSavesBuffer): Deleted.
+ * jit/RegisterAtOffset.cpp: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp.
+ (JSC::RegisterAtOffset::dump):
+ (JSC::FTL::RegisterAtOffset::dump): Deleted.
+ * jit/RegisterAtOffset.h: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h.
+ (JSC::RegisterAtOffset::reg):
+ (JSC::RegisterAtOffset::offset):
+ (JSC::RegisterAtOffset::offsetAsIndex):
+ (JSC::RegisterAtOffset::operator==):
+ (JSC::FTL::RegisterAtOffset::reg): Deleted.
+ (JSC::FTL::RegisterAtOffset::offset): Deleted.
+ (JSC::FTL::RegisterAtOffset::operator==): Deleted.
+ * jit/RegisterAtOffsetList.cpp: Added.
+ (JSC::RegisterAtOffsetList::RegisterAtOffsetList):
+ (JSC::RegisterAtOffsetList::sort):
+ (JSC::RegisterAtOffsetList::dump):
+ (JSC::RegisterAtOffsetList::find):
+ (JSC::RegisterAtOffsetList::indexOf):
+ * jit/RegisterAtOffsetList.h: Added.
+ (JSC::RegisterAtOffsetList::clear):
+ (JSC::RegisterAtOffsetList::size):
+ (JSC::RegisterAtOffsetList::at):
+ (JSC::RegisterAtOffsetList::append):
+ * jit/RegisterSaveMap.cpp: Removed.
+ * jit/RegisterSaveMap.h: Removed.
+ * jit/RegisterSet.cpp:
+ (JSC::RegisterSet::dfgCalleeSaveRegisters):
+ (JSC::RegisterSet::ftlCalleeSaveRegisters):
+ (JSC::RegisterSet::allVMCalleeSaveRegisters):
+ (JSC::RegisterSet::allGPRs):
+ * jit/RegisterSet.h:
+ * runtime/VM.cpp:
+ (JSC::VM::VM):
+ * runtime/VM.h:
+ (JSC::VM::getCTIStub):
+ (JSC::VM::getAllCalleeSaveRegisterOffsets):
+ (JSC::VM::getAllCalleeSaveRegistersMap): Deleted.
+
</ins><span class="cx"> 2015-08-17 Michael Saboff <msaboff@apple.com>
</span><span class="cx">
</span><span class="cx"> jsc-tailcall: Stop saving and restoring all callee saves on vmEntry / exit for platforms with per function callee saves handling
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -532,7 +532,6 @@
</span><span class="cx"> <ClCompile Include="..\ftl\FTLOperations.cpp" />
</span><span class="cx"> <ClCompile Include="..\ftl\FTLOutput.cpp" />
</span><span class="cx"> <ClCompile Include="..\ftl\FTLRecoveryOpcode.cpp" />
</span><del>- <ClCompile Include="..\ftl\FTLRegisterAtOffset.cpp" />
</del><span class="cx"> <ClCompile Include="..\ftl\FTLSaveRestore.cpp" />
</span><span class="cx"> <ClCompile Include="..\ftl\FTLSlowPathCall.cpp" />
</span><span class="cx"> <ClCompile Include="..\ftl\FTLSlowPathCallKey.cpp" />
</span><span class="lines">@@ -634,8 +633,9 @@
</span><span class="cx"> <ClCompile Include="..\jit\SetupVarargsFrame.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\PolymorphicCallStubRoutine.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\Reg.cpp" />
</span><ins>+ <ClCompile Include="..\jit\RegisterAtOffset.cpp" />
+ <ClCompile Include="..\jit\RegisterAtOffsetList.cpp" />
</ins><span class="cx"> <ClCompile Include="..\jit\RegisterPreservationWrapperGenerator.cpp" />
</span><del>- <ClCompile Include="..\jit\RegisterSaveMap.cpp" />
</del><span class="cx"> <ClCompile Include="..\jit\RegisterSet.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\Repatch.cpp" />
</span><span class="cx"> <ClCompile Include="..\jit\ScratchRegisterAllocator.cpp" />
</span><span class="lines">@@ -1249,7 +1249,6 @@
</span><span class="cx"> <ClInclude Include="..\ftl\FTLOperations.h" />
</span><span class="cx"> <ClInclude Include="..\ftl\FTLOutput.h" />
</span><span class="cx"> <ClInclude Include="..\ftl\FTLRecoveryOpcode.h" />
</span><del>- <ClInclude Include="..\ftl\FTLRegisterAtOffset.h" />
</del><span class="cx"> <ClInclude Include="..\ftl\FTLSaveRestore.h" />
</span><span class="cx"> <ClInclude Include="..\ftl\FTLSlowPathCall.h" />
</span><span class="cx"> <ClInclude Include="..\ftl\FTLSlowPathCallKey.h" />
</span><span class="lines">@@ -1399,8 +1398,9 @@
</span><span class="cx"> <ClInclude Include="..\jit\SetupVarargsFrame.h" />
</span><span class="cx"> <ClInclude Include="..\jit\PolymorphicCallStubRoutine.h" />
</span><span class="cx"> <ClInclude Include="..\jit\Reg.h" />
</span><ins>+ <ClInclude Include="..\jit\RegisterAtOffset.h" />
+ <ClInclude Include="..\jit\RegisterAtOffsetList.h" />
</ins><span class="cx"> <ClInclude Include="..\jit\RegisterPreservationWrapperGenerator.h" />
</span><del>- <ClInclude Include="..\jit\RegisterSaveMap.h" />
</del><span class="cx"> <ClInclude Include="..\jit\RegisterSet.h" />
</span><span class="cx"> <ClInclude Include="..\jit\Repatch.h" />
</span><span class="cx"> <ClInclude Include="..\jit\ScratchRegisterAllocator.h" />
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -381,8 +381,6 @@
</span><span class="cx">                 0F6B1CBA1861244C00845D97 /* RegisterPreservationMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F6B1CBD1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */; };
</span><span class="cx">                 0F6B1CBE1861246A00845D97 /* RegisterPreservationWrapperGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                0F6B1CC31862C47800845D97 /* FTLRegisterAtOffset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CBF1862C47800845D97 /* FTLRegisterAtOffset.cpp */; };
-                0F6B1CC41862C47800845D97 /* FTLRegisterAtOffset.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CC01862C47800845D97 /* FTLRegisterAtOffset.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><span class="cx">                 0F6B1CC51862C47800845D97 /* FTLUnwindInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CC11862C47800845D97 /* FTLUnwindInfo.cpp */; };
</span><span class="cx">                 0F6B1CC61862C47800845D97 /* FTLUnwindInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CC21862C47800845D97 /* FTLUnwindInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F6C73501AC9F99F00BE1682 /* VariableWriteFireDetail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6C734E1AC9F99F00BE1682 /* VariableWriteFireDetail.cpp */; };
</span><span class="lines">@@ -974,8 +972,8 @@
</span><span class="cx">                 6511230714046B0A002B101D /* testRegExp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 651122E5140469BA002B101D /* testRegExp.cpp */; };
</span><span class="cx">                 6514F21918B3E1670098FF8B /* Bytecodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 6514F21718B3E1670098FF8B /* Bytecodes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 65303D641447B9E100D3F904 /* ParserTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = 65303D631447B9E100D3F904 /* ParserTokens.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                653D508A1B5D9F9C00DD4BCD /* RegisterSaveMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 65AD9B191B5D9B750098556D /* RegisterSaveMap.h */; settings = {ATTRIBUTES = (Private, ); }; };
-                653D508B1B5DC29000DD4BCD /* RegisterSaveMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65AD9B181B5D9B750098556D /* RegisterSaveMap.cpp */; };
</del><ins>+                6540C7A01B82E1C3000F6B79 /* RegisterAtOffset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6540C79E1B82D9CE000F6B79 /* RegisterAtOffset.cpp */; };
+                6540C7A11B82E1C3000F6B79 /* RegisterAtOffsetList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6540C79C1B82D99D000F6B79 /* RegisterAtOffsetList.cpp */; };
</ins><span class="cx">                 6546F5211A32B313006F07D5 /* NullGetterFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6546F51F1A32A59C006F07D5 /* NullGetterFunction.cpp */; };
</span><span class="cx">                 65525FC51A6DD801007B5495 /* NullSetterFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65525FC31A6DD3B3007B5495 /* NullSetterFunction.cpp */; };
</span><span class="cx">                 6553A33117A1F1EE008CF6F3 /* CommonSlowPathsExceptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6553A32F17A1F1EE008CF6F3 /* CommonSlowPathsExceptions.cpp */; };
</span><span class="lines">@@ -2125,8 +2123,6 @@
</span><span class="cx">                 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterPreservationMode.h; sourceTree = "<group>"; };
</span><span class="cx">                 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterPreservationWrapperGenerator.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterPreservationWrapperGenerator.h; sourceTree = "<group>"; };
</span><del>-                0F6B1CBF1862C47800845D97 /* FTLRegisterAtOffset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLRegisterAtOffset.cpp; path = ftl/FTLRegisterAtOffset.cpp; sourceTree = "<group>"; };
-                0F6B1CC01862C47800845D97 /* FTLRegisterAtOffset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLRegisterAtOffset.h; path = ftl/FTLRegisterAtOffset.h; sourceTree = "<group>"; };
</del><span class="cx">                 0F6B1CC11862C47800845D97 /* FTLUnwindInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLUnwindInfo.cpp; path = ftl/FTLUnwindInfo.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 0F6B1CC21862C47800845D97 /* FTLUnwindInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLUnwindInfo.h; path = ftl/FTLUnwindInfo.h; sourceTree = "<group>"; };
</span><span class="cx">                 0F6C734E1AC9F99F00BE1682 /* VariableWriteFireDetail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableWriteFireDetail.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -2698,6 +2694,10 @@
</span><span class="cx">                 652A3A231651C69700A80AFE /* A64DOpcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = A64DOpcode.h; path = disassembler/ARM64/A64DOpcode.h; sourceTree = "<group>"; };
</span><span class="cx">                 65303D631447B9E100D3F904 /* ParserTokens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParserTokens.h; sourceTree = "<group>"; };
</span><span class="cx">                 65400C100A69BAF200509887 /* PropertyNameArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PropertyNameArray.h; sourceTree = "<group>"; };
</span><ins>+                6540C79C1B82D99D000F6B79 /* RegisterAtOffsetList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterAtOffsetList.cpp; sourceTree = "<group>"; };
+                6540C79D1B82D99D000F6B79 /* RegisterAtOffsetList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterAtOffsetList.h; sourceTree = "<group>"; };
+                6540C79E1B82D9CE000F6B79 /* RegisterAtOffset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterAtOffset.cpp; sourceTree = "<group>"; };
+                6540C79F1B82D9CE000F6B79 /* RegisterAtOffset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterAtOffset.h; sourceTree = "<group>"; };
</ins><span class="cx">                 6546F51F1A32A59C006F07D5 /* NullGetterFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = NullGetterFunction.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
</span><span class="cx">                 6546F5201A32A59C006F07D5 /* NullGetterFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NullGetterFunction.h; sourceTree = "<group>"; };
</span><span class="cx">                 65525FC31A6DD3B3007B5495 /* NullSetterFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NullSetterFunction.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -2716,8 +2716,6 @@
</span><span class="cx">                 658D3A5519638268003C45D6 /* VMEntryRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = VMEntryRecord.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
</span><span class="cx">                 65987F2C167FE84B003C2F8D /* DFGOSRExitCompilationInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGOSRExitCompilationInfo.h; path = dfg/DFGOSRExitCompilationInfo.h; sourceTree = "<group>"; };
</span><span class="cx">                 65987F2F16828A7E003C2F8D /* UnusedPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnusedPointer.h; sourceTree = "<group>"; };
</span><del>-                65AD9B181B5D9B750098556D /* RegisterSaveMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterSaveMap.cpp; sourceTree = "<group>"; };
-                65AD9B191B5D9B750098556D /* RegisterSaveMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterSaveMap.h; sourceTree = "<group>"; };
</del><span class="cx">                 65C0284F171795E200351E35 /* ARMv7Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ARMv7Disassembler.cpp; path = disassembler/ARMv7Disassembler.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 65C0285A1717966800351E35 /* ARMv7DOpcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ARMv7DOpcode.cpp; sourceTree = "<group>"; };
</span><span class="cx">                 65C0285B1717966800351E35 /* ARMv7DOpcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARMv7DOpcode.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -3777,8 +3775,6 @@
</span><span class="cx">                                 0FEA0A06170513DB00BB722C /* FTLOutput.h */,
</span><span class="cx">                                 0F485325187DFDEC0083B687 /* FTLRecoveryOpcode.cpp */,
</span><span class="cx">                                 0F485326187DFDEC0083B687 /* FTLRecoveryOpcode.h */,
</span><del>-                                0F6B1CBF1862C47800845D97 /* FTLRegisterAtOffset.cpp */,
-                                0F6B1CC01862C47800845D97 /* FTLRegisterAtOffset.h */,
</del><span class="cx">                                 0FCEFAA91804C13E00472CE4 /* FTLSaveRestore.cpp */,
</span><span class="cx">                                 0FCEFAAA1804C13E00472CE4 /* FTLSaveRestore.h */,
</span><span class="cx">                                 0F25F1AA181635F300522F39 /* FTLSlowPathCall.cpp */,
</span><span class="lines">@@ -3961,22 +3957,24 @@
</span><span class="cx">                                 0FC712E117CD878F008CC93C /* JITToDFGDeferredCompilationCallback.h */,
</span><span class="cx">                                 A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */,
</span><span class="cx">                                 A76C51741182748D00715B05 /* JSInterfaceJIT.h */,
</span><del>-                                0FEE98421A89227500754E93 /* SetupVarargsFrame.cpp */,
-                                0FEE98401A8865B600754E93 /* SetupVarargsFrame.h */,
</del><span class="cx">                                 0FE834151A6EF97B00D04847 /* PolymorphicCallStubRoutine.cpp */,
</span><span class="cx">                                 0FE834161A6EF97B00D04847 /* PolymorphicCallStubRoutine.h */,
</span><span class="cx">                                 0FA7A8E918B413C80052371D /* Reg.cpp */,
</span><span class="cx">                                 0FA7A8EA18B413C80052371D /* Reg.h */,
</span><ins>+                                6540C79E1B82D9CE000F6B79 /* RegisterAtOffset.cpp */,
+                                6540C79F1B82D9CE000F6B79 /* RegisterAtOffset.h */,
+                                6540C79C1B82D99D000F6B79 /* RegisterAtOffsetList.cpp */,
+                                6540C79D1B82D99D000F6B79 /* RegisterAtOffsetList.h */,
</ins><span class="cx">                                 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */,
</span><span class="cx">                                 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */,
</span><del>-                                65AD9B181B5D9B750098556D /* RegisterSaveMap.cpp */,
-                                65AD9B191B5D9B750098556D /* RegisterSaveMap.h */,
</del><span class="cx">                                 0FC3141418146D7000033232 /* RegisterSet.cpp */,
</span><span class="cx">                                 0FC314101814559100033232 /* RegisterSet.h */,
</span><span class="cx">                                 0F24E54917EE274900ABB217 /* Repatch.cpp */,
</span><span class="cx">                                 0F24E54A17EE274900ABB217 /* Repatch.h */,
</span><span class="cx">                                 0FA7A8ED18CE4FD80052371D /* ScratchRegisterAllocator.cpp */,
</span><span class="cx">                                 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */,
</span><ins>+                                0FEE98421A89227500754E93 /* SetupVarargsFrame.cpp */,
+                                0FEE98401A8865B600754E93 /* SetupVarargsFrame.h */,
</ins><span class="cx">                                 A709F2EF17A0AC0400512E98 /* SlowPathCall.h */,
</span><span class="cx">                                 A7386551118697B400540279 /* SpecializedThunkJIT.h */,
</span><span class="cx">                                 A7FF647A18C52E8500B55307 /* SpillRegistersMode.h */,
</span><span class="lines">@@ -5631,7 +5629,6 @@
</span><span class="cx">                                 52678F911A04177C006A306D /* ControlFlowProfiler.h in Headers */,
</span><span class="cx">                                 52678F8F1A031009006A306D /* BasicBlockLocation.h in Headers */,
</span><span class="cx">                                 A5EA710E19F6DF810098F5EC /* InspectorAlternateBackendDispatchers.h in Headers */,
</span><del>-                                653D508A1B5D9F9C00DD4BCD /* RegisterSaveMap.h in Headers */,
</del><span class="cx">                                 A5EA70EC19F5B3EA0098F5EC /* generate_cpp_alternate_backend_dispatcher_header.py in Headers */,
</span><span class="cx">                                 C4F4B6F31A05C944005CAB76 /* cpp_generator_templates.py in Headers */,
</span><span class="cx">                                 A5EF9B151A1D43FA00702E90 /* generate_cpp_backend_dispatcher_implementation.py in Headers */,
</span><span class="lines">@@ -5996,7 +5993,6 @@
</span><span class="cx">                                 0FEA0A11170513DB00BB722C /* FTLOutput.h in Headers */,
</span><span class="cx">                                 9E72940B190F0514001A91B5 /* BundlePath.h in Headers */,
</span><span class="cx">                                 0F48532A187DFDEC0083B687 /* FTLRecoveryOpcode.h in Headers */,
</span><del>-                                0F6B1CC41862C47800845D97 /* FTLRegisterAtOffset.h in Headers */,
</del><span class="cx">                                 0FCEFAAC1804C13E00472CE4 /* FTLSaveRestore.h in Headers */,
</span><span class="cx">                                 0F25F1B2181635F300522F39 /* FTLSlowPathCall.h in Headers */,
</span><span class="cx">                                 0F25F1B4181635F300522F39 /* FTLSlowPathCallKey.h in Headers */,
</span><span class="lines">@@ -7011,7 +7007,6 @@
</span><span class="cx">                         isa = PBXSourcesBuildPhase;
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><del>-                                653D508B1B5DC29000DD4BCD /* RegisterSaveMap.cpp in Sources */,
</del><span class="cx">                                 9EA5C7A2190F088700508EBE /* InitializeLLVMMac.cpp in Sources */,
</span><span class="cx">                                 9EA5C7A1190F084200508EBE /* BundlePath.mm in Sources */,
</span><span class="cx">                                 52B310FF1975B4240080857C /* TypeLocationCache.cpp in Sources */,
</span><span class="lines">@@ -7266,7 +7261,6 @@
</span><span class="cx">                                 0F235BDF17178E1C00690C7F /* FTLOSRExitCompiler.cpp in Sources */,
</span><span class="cx">                                 0FEA0A2A1709629600BB722C /* FTLOutput.cpp in Sources */,
</span><span class="cx">                                 0F485329187DFDEC0083B687 /* FTLRecoveryOpcode.cpp in Sources */,
</span><del>-                                0F6B1CC31862C47800845D97 /* FTLRegisterAtOffset.cpp in Sources */,
</del><span class="cx">                                 0FCEFAAB1804C13E00472CE4 /* FTLSaveRestore.cpp in Sources */,
</span><span class="cx">                                 0F25F1B1181635F300522F39 /* FTLSlowPathCall.cpp in Sources */,
</span><span class="cx">                                 0F25F1B3181635F300522F39 /* FTLSlowPathCallKey.cpp in Sources */,
</span><span class="lines">@@ -7530,6 +7524,8 @@
</span><span class="cx">                                 0F3E01AA19D353A500F61B7F /* DFGPrePostNumbering.cpp in Sources */,
</span><span class="cx">                                 0FF60AC316740F8800029779 /* ReduceWhitespace.cpp in Sources */,
</span><span class="cx">                                 0FA7A8EB18B413C80052371D /* Reg.cpp in Sources */,
</span><ins>+                                6540C7A11B82E1C3000F6B79 /* RegisterAtOffsetList.cpp in Sources */,
+                                6540C7A01B82E1C3000F6B79 /* RegisterAtOffset.cpp in Sources */,
</ins><span class="cx">                                 14280841107EC0930013E7B2 /* RegExp.cpp in Sources */,
</span><span class="cx">                                 A1712B3B11C7B212007A5315 /* RegExpCache.cpp in Sources */,
</span><span class="cx">                                 0FE0502C1AA9095600D33B33 /* VarOffset.cpp in Sources */,
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx"> #include <wtf/text/UniquedStringImpl.h>
</span><span class="cx">
</span><span class="cx"> #if ENABLE(JIT)
</span><del>-#include "RegisterSaveMap.h"
</del><ins>+#include "RegisterAtOffsetList.h"
</ins><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="lines">@@ -3303,9 +3303,14 @@
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> void CodeBlock::setCalleeSaveRegisters(RegisterSet calleeSaveRegisters)
</span><span class="cx"> {
</span><del>- m_calleeSaveRegisters = std::make_unique<RegisterSaveMap>(calleeSaveRegisters);
</del><ins>+ m_calleeSaveRegisters = std::make_unique<RegisterAtOffsetList>(calleeSaveRegisters);
</ins><span class="cx"> }
</span><span class="cx">
</span><ins>+void CodeBlock::setCalleeSaveRegisters(std::unique_ptr<RegisterAtOffsetList> registerAtOffsetList)
+{
+ m_calleeSaveRegisters = WTF::move(registerAtOffsetList);
+}
+
</ins><span class="cx"> static size_t roundCalleeSaveSpaceAsVirtualRegisters(size_t calleeSaveRegisters)
</span><span class="cx"> {
</span><span class="cx"> static const unsigned cpuRegisterSize = sizeof(void*);
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx">
</span><span class="cx"> class ExecState;
</span><span class="cx"> class LLIntOffsetsExtractor;
</span><del>-class RegisterSaveMap;
</del><ins>+class RegisterAtOffsetList;
</ins><span class="cx"> class RepatchBuffer;
</span><span class="cx"> class TypeLocation;
</span><span class="cx">
</span><span class="lines">@@ -824,8 +824,9 @@
</span><span class="cx"> bool shouldReoptimizeFromLoopNow();
</span><span class="cx">
</span><span class="cx"> void setCalleeSaveRegisters(RegisterSet);
</span><ins>+ void setCalleeSaveRegisters(std::unique_ptr<RegisterAtOffsetList>);
</ins><span class="cx">
</span><del>- RegisterSaveMap* calleeSaveRegisters() const { return m_calleeSaveRegisters.get(); }
</del><ins>+ RegisterAtOffsetList* calleeSaveRegisters() const { return m_calleeSaveRegisters.get(); }
</ins><span class="cx"> #else // No JIT
</span><span class="cx"> static unsigned numberOfLLIntBaselineCalleeSaveRegisters() { return 0; }
</span><span class="cx"> static size_t llintBaselineCalleeSaveSpaceAsVirtualRegisters() { return 0; };
</span><span class="lines">@@ -1025,7 +1026,7 @@
</span><span class="cx"> SentinelLinkedList<LLIntCallLinkInfo, BasicRawSentinelNode<LLIntCallLinkInfo>> m_incomingLLIntCalls;
</span><span class="cx"> RefPtr<JITCode> m_jitCode;
</span><span class="cx"> #if ENABLE(JIT)
</span><del>- std::unique_ptr<RegisterSaveMap> m_calleeSaveRegisters;
</del><ins>+ std::unique_ptr<RegisterAtOffsetList> m_calleeSaveRegisters;
</ins><span class="cx"> Bag<StructureStubInfo> m_stubInfos;
</span><span class="cx"> Vector<ByValInfo> m_byValInfos;
</span><span class="cx"> Bag<CallLinkInfo> m_callLinkInfos;
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoredfgDFGOSREntrycpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -256,14 +256,22 @@
</span><span class="cx"> pivot[i] = JSValue();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- RegisterSaveMap* registerSaveLocations = codeBlock->calleeSaveRegisters();
- unsigned numberRegistersToSave = registerSaveLocations->size();
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- if (registerSaveLocations->has(reg) && reg.isGPR())
- *(bitwise_cast<intptr_t*>(pivot) + numberRegistersToSave - registerSaveLocations->getIndexFor(reg) - 1) = vm->calleeSaveRegistersBuffer[vm->getAllCalleeSaveRegistersMap()->getIndexFor(reg)];
</del><ins>+ // 6) Copy our callee saves to buffer.
+ RegisterAtOffsetList* registerSaveLocations = codeBlock->calleeSaveRegisters();
+ RegisterAtOffsetList* allCalleeSaves = vm->getAllCalleeSaveRegisterOffsets();
+ RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
+
+ unsigned registerCount = registerSaveLocations->size();
+ for (unsigned i = 0; i < registerCount; i++) {
+ RegisterAtOffset currentEntry = registerSaveLocations->at(i);
+ if (dontSaveRegisters.get(currentEntry.reg()))
+ continue;
+ RegisterAtOffset* vmCalleeSavesEntry = allCalleeSaves->find(currentEntry.reg());
+
+ *(bitwise_cast<intptr_t*>(pivot - 1) - currentEntry.offsetAsIndex()) = vm->calleeSaveRegistersBuffer[vmCalleeSavesEntry->offsetAsIndex()];
</ins><span class="cx"> }
</span><span class="cx">
</span><del>- // 6) Fix the call frame to have the right code block.
</del><ins>+ // 7) Fix the call frame to have the right code block.
</ins><span class="cx">
</span><span class="cx"> *bitwise_cast<CodeBlock**>(pivot - 1 - JSStack::CodeBlock) = codeBlock;
</span><span class="cx">
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLCompilecpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -330,7 +330,7 @@
</span><span class="cx">
</span><span class="cx"> static void fixFunctionBasedOnStackMaps(
</span><span class="cx"> State& state, CodeBlock* codeBlock, JITCode* jitCode, GeneratedFunction generatedFunction,
</span><del>- StackMaps::RecordMap& recordMap, bool didSeeUnwindInfo)
</del><ins>+ StackMaps::RecordMap& recordMap)
</ins><span class="cx"> {
</span><span class="cx"> Graph& graph = state.graph;
</span><span class="cx"> VM& vm = graph.m_vm;
</span><span class="lines">@@ -393,7 +393,6 @@
</span><span class="cx"> exitThunkGenerator.emitThunks();
</span><span class="cx"> if (exitThunkGenerator.didThings()) {
</span><span class="cx"> RELEASE_ASSERT(state.finalizer->osrExit.size());
</span><del>- RELEASE_ASSERT(didSeeUnwindInfo);
</del><span class="cx">
</span><span class="cx"> auto linkBuffer = std::make_unique<LinkBuffer>(
</span><span class="cx"> vm, exitThunkGenerator, codeBlock, JITCompilationCanFail);
</span><span class="lines">@@ -813,16 +812,14 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- bool didSeeUnwindInfo = state.jitCode->unwindInfo.parse(
</del><ins>+ std::unique_ptr<RegisterAtOffsetList> registerOffsets = parseUnwindInfo(
</ins><span class="cx"> state.unwindDataSection, state.unwindDataSectionSize,
</span><span class="cx"> state.generatedFunction);
</span><span class="cx"> if (shouldShowDisassembly()) {
</span><span class="cx"> dataLog("Unwind info for ", CodeBlockWithJITType(state.graph.m_codeBlock, JITCode::FTLJIT), ":\n");
</span><del>- if (didSeeUnwindInfo)
- dataLog(" ", state.jitCode->unwindInfo, "\n");
- else
- dataLog(" <no unwind info>\n");
</del><ins>+ dataLog(" ", *registerOffsets, "\n");
</ins><span class="cx"> }
</span><ins>+ state.graph.m_codeBlock->setCalleeSaveRegisters(WTF::move(registerOffsets));
</ins><span class="cx">
</span><span class="cx"> if (state.stackmapsSection && state.stackmapsSection->size()) {
</span><span class="cx"> if (shouldShowDisassembly()) {
</span><span class="lines">@@ -845,7 +842,7 @@
</span><span class="cx"> StackMaps::RecordMap recordMap = state.jitCode->stackmaps.computeRecordMap();
</span><span class="cx"> fixFunctionBasedOnStackMaps(
</span><span class="cx"> state, state.graph.m_codeBlock, state.jitCode.get(), state.generatedFunction,
</span><del>- recordMap, didSeeUnwindInfo);
</del><ins>+ recordMap);
</ins><span class="cx"> if (state.allocationFailed)
</span><span class="cx"> return;
</span><span class="cx">
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLJITCodeh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -78,7 +78,6 @@
</span><span class="cx"> DFG::CommonData common;
</span><span class="cx"> SegmentedVector<OSRExit, 8> osrExit;
</span><span class="cx"> StackMaps stackmaps;
</span><del>- UnwindInfo unwindInfo;
</del><span class="cx">
</span><span class="cx"> private:
</span><span class="cx"> Vector<RefPtr<DataSection>> m_dataSections;
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLOSRExitCompilercpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -161,7 +161,7 @@
</span><span class="cx"> sizeof(EncodedJSValue) * (
</span><span class="cx"> exit.m_values.size() + numMaterializations + maxMaterializationNumArguments) +
</span><span class="cx"> requiredScratchMemorySizeInBytes() +
</span><del>- jitCode->unwindInfo.m_registers.size() * sizeof(uint64_t));
</del><ins>+ codeBlock->calleeSaveRegisters()->size() * sizeof(uint64_t));
</ins><span class="cx"> EncodedJSValue* scratch = scratchBuffer ? static_cast<EncodedJSValue*>(scratchBuffer->dataBuffer()) : 0;
</span><span class="cx"> EncodedJSValue* materializationPointers = scratch + exit.m_values.size();
</span><span class="cx"> EncodedJSValue* materializationArguments = materializationPointers + numMaterializations;
</span><span class="lines">@@ -305,8 +305,8 @@
</span><span class="cx">
</span><span class="cx"> // Before we start messing with the frame, we need to set aside any registers that the
</span><span class="cx"> // FTL code was preserving.
</span><del>- for (unsigned i = jitCode->unwindInfo.m_registers.size(); i--;) {
- RegisterAtOffset entry = jitCode->unwindInfo.m_registers[i];
</del><ins>+ for (unsigned i = codeBlock->calleeSaveRegisters()->size(); i--;) {
+ RegisterAtOffset entry = codeBlock->calleeSaveRegisters()->at(i);
</ins><span class="cx"> jit.load64(
</span><span class="cx"> MacroAssembler::Address(MacroAssembler::framePointerRegister, entry.offset()),
</span><span class="cx"> GPRInfo::regT0);
</span><span class="lines">@@ -385,7 +385,7 @@
</span><span class="cx"> if (!toSave.get(reg))
</span><span class="cx"> continue;
</span><span class="cx"> currentOffset += sizeof(Register);
</span><del>- unsigned unwindIndex = jitCode->unwindInfo.indexOf(reg);
</del><ins>+ unsigned unwindIndex = codeBlock->calleeSaveRegisters()->indexOf(reg);
</ins><span class="cx"> if (unwindIndex == UINT_MAX) {
</span><span class="cx"> // The FTL compilation didn't preserve this register. This means that it also
</span><span class="cx"> // didn't use the register. So its value at the beginning of OSR exit should be
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,41 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "FTLRegisterAtOffset.h"
-
-#if ENABLE(FTL_JIT)
-
-namespace JSC { namespace FTL {
-
-void RegisterAtOffset::dump(PrintStream& out) const
-{
- out.print(reg(), " at ", offset());
-}
-
-} } // namespace JSC::FTL
-
-#endif // ENABLE(FTL_JIT)
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffseth"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,80 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef FTLRegisterAtOffset_h
-#define FTLRegisterAtOffset_h
-
-#if ENABLE(FTL_JIT)
-
-#include "Reg.h"
-#include <wtf/PrintStream.h>
-
-namespace JSC { namespace FTL {
-
-class RegisterAtOffset {
-public:
- RegisterAtOffset()
- : m_offset(0)
- {
- }
-
- RegisterAtOffset(Reg reg, ptrdiff_t offset)
- : m_reg(reg)
- , m_offset(offset)
- {
- }
-
- bool operator!() const { return !m_reg; }
-
- Reg reg() const { return m_reg; }
- ptrdiff_t offset() const { return m_offset; }
-
- bool operator==(const RegisterAtOffset& other) const
- {
- return reg() == other.reg() && offset() == other.offset();
- }
-
- bool operator<(const RegisterAtOffset& other) const
- {
- if (reg() != other.reg())
- return reg() < other.reg();
- return offset() < other.offset();
- }
-
- static Reg getReg(RegisterAtOffset* value) { return value->reg(); }
-
- void dump(PrintStream& out) const;
-
-private:
- Reg m_reg;
- ptrdiff_t m_offset;
-};
-
-} } // namespace JSC::FTL
-
-#endif // ENABLE(FTL_JIT)
-
-#endif // FTLRegisterAtOffset_h
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfocpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -94,6 +94,9 @@
</span><span class="cx"> #include "config.h"
</span><span class="cx"> #include "FTLUnwindInfo.h"
</span><span class="cx">
</span><ins>+#include "CodeBlock.h"
+#include "RegisterAtOffsetList.h"
+
</ins><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx">
</span><span class="cx"> #if OS(DARWIN)
</span><span class="lines">@@ -103,10 +106,6 @@
</span><span class="cx">
</span><span class="cx"> namespace JSC { namespace FTL {
</span><span class="cx">
</span><del>-UnwindInfo::UnwindInfo() { }
-UnwindInfo::~UnwindInfo() { }
-
-
</del><span class="cx"> namespace {
</span><span class="cx"> #if OS(DARWIN)
</span><span class="cx"> struct CompactUnwind {
</span><span class="lines">@@ -654,13 +653,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> } // anonymous namespace
</span><span class="cx">
</span><del>-bool UnwindInfo::parse(void* section, size_t size, GeneratedFunction generatedFunction)
</del><ins>+std::unique_ptr<RegisterAtOffsetList> parseUnwindInfo(void* section, size_t size, GeneratedFunction generatedFunction)
</ins><span class="cx"> {
</span><del>- m_registers.clear();
</del><span class="cx"> RELEASE_ASSERT(!!section);
</span><del>- if (!section)
- return false;
</del><span class="cx">
</span><ins>+ std::unique_ptr<RegisterAtOffsetList> registerOffsets = std::make_unique<RegisterAtOffsetList>();
+
</ins><span class="cx"> #if OS(DARWIN)
</span><span class="cx"> RELEASE_ASSERT(size >= sizeof(CompactUnwind));
</span><span class="cx">
</span><span class="lines">@@ -689,27 +687,27 @@
</span><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case UNWIND_X86_64_REG_RBX:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::ebx, offset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::ebx, offset));
</ins><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case UNWIND_X86_64_REG_R12:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r12, offset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r12, offset));
</ins><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case UNWIND_X86_64_REG_R13:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r13, offset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r13, offset));
</ins><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case UNWIND_X86_64_REG_R14:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r14, offset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r14, offset));
</ins><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case UNWIND_X86_64_REG_R15:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r15, offset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r15, offset));
</ins><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> case UNWIND_X86_64_REG_RBP:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::ebp, offset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::ebp, offset));
</ins><span class="cx"> break;
</span><span class="cx">
</span><span class="cx"> default:
</span><span class="lines">@@ -721,44 +719,44 @@
</span><span class="cx"> #elif CPU(ARM64)
</span><span class="cx"> RELEASE_ASSERT((encoding & UNWIND_ARM64_MODE_MASK) == UNWIND_ARM64_MODE_FRAME);
</span><span class="cx">
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::fp, 0));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::fp, 0));
</ins><span class="cx">
</span><span class="cx"> int32_t offset = 0;
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_X19_X20_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x19, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::x20, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x19, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x20, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_X21_X22_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x21, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::x22, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x21, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x22, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_X23_X24_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x23, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::x24, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x23, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x24, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_X25_X26_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x25, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::x26, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x25, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x26, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_X27_X28_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x27, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::x28, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x27, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x28, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_D8_D9_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q8, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::q9, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q8, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q9, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_D10_D11_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q10, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::q11, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q10, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q11, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_D12_D13_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q12, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::q13, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q12, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q13, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> if (encoding & UNWIND_ARM64_FRAME_D14_D15_PAIR) {
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q14, offset -= 8));
- m_registers.append(RegisterAtOffset(ARM64Registers::q15, offset -= 8));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q14, offset -= 8));
+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q15, offset -= 8));
</ins><span class="cx"> }
</span><span class="cx"> #else
</span><span class="cx"> #error "Unrecognized architecture"
</span><span class="lines">@@ -782,22 +780,22 @@
</span><span class="cx"> if (prolog.savedRegisters[i].saved) {
</span><span class="cx"> switch (i) {
</span><span class="cx"> case UNW_X86_64_rbx:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::ebx, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::ebx, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_X86_64_r12:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_X86_64_r13:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_X86_64_r14:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_X86_64_r15:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::r15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::r15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_X86_64_rbp:
</span><del>- m_registers.append(RegisterAtOffset(X86Registers::ebp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(X86Registers::ebp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case DW_X86_64_RET_addr:
</span><span class="cx"> break;
</span><span class="lines">@@ -816,196 +814,196 @@
</span><span class="cx"> if (prolog.savedRegisters[i].saved) {
</span><span class="cx"> switch (i) {
</span><span class="cx"> case UNW_ARM64_x0:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x1:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x2:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x3:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x4:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x5:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x6:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x7:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x8:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x9:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x10:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x11:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x12:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x13:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x14:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x15:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x16:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x17:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x18:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x19:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x20:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x21:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x22:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x23:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x24:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x25:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x26:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x27:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x28:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_fp:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::fp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::fp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_x30:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::x30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::x30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_sp:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::sp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::sp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v0:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v1:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v2:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v3:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v4:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v5:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v6:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v7:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v8:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v9:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v10:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v11:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v12:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v13:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v14:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v15:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v16:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v17:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v18:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v19:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v20:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v21:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ append(RegisterAtOffset(ARM64Registers::q21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v22:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v23:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v24:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v25:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v26:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v27:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v28:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v29:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q29, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q29, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v30:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> case UNW_ARM64_v31:
</span><del>- m_registers.append(RegisterAtOffset(ARM64Registers::q31, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+ registerOffsets->append(RegisterAtOffset(ARM64Registers::q31, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx"> break;
</span><span class="cx"> default:
</span><span class="cx"> RELEASE_ASSERT_NOT_REACHED(); // non-standard register being saved in prolog
</span><span class="lines">@@ -1017,27 +1015,10 @@
</span><span class="cx"> #endif
</span><span class="cx">
</span><span class="cx"> #endif
</span><del>- std::sort(m_registers.begin(), m_registers.end());
- return true;
</del><ins>+ registerOffsets->sort();
+ return WTF::move(registerOffsets);
</ins><span class="cx"> }
</span><span class="cx">
</span><del>-void UnwindInfo::dump(PrintStream& out) const
-{
- out.print(listDump(m_registers));
-}
-
-RegisterAtOffset* UnwindInfo::find(Reg reg) const
-{
- return tryBinarySearch<RegisterAtOffset, Reg>(m_registers, m_registers.size(), reg, RegisterAtOffset::getReg);
-}
-
-unsigned UnwindInfo::indexOf(Reg reg) const
-{
- if (RegisterAtOffset* pointer = find(reg))
- return pointer - m_registers.begin();
- return UINT_MAX;
-}
-
</del><span class="cx"> } } // namespace JSC::FTL
</span><span class="cx">
</span><span class="cx"> #endif // ENABLE(FTL_JIT)
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfoh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -31,23 +31,11 @@
</span><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx">
</span><span class="cx"> #include "FTLGeneratedFunction.h"
</span><del>-#include "FTLRegisterAtOffset.h"
</del><ins>+class RegisterAtOffsetList;
</ins><span class="cx">
</span><span class="cx"> namespace JSC { namespace FTL {
</span><span class="cx">
</span><del>-struct UnwindInfo {
- UnwindInfo();
- ~UnwindInfo();
-
- bool parse(void*, size_t, GeneratedFunction);
-
- void dump(PrintStream&) const;
-
- RegisterAtOffset* find(Reg) const;
- unsigned indexOf(Reg) const; // Returns UINT_MAX if not found.
-
- Vector<RegisterAtOffset> m_registers;
-};
</del><ins>+std::unique_ptr<RegisterAtOffsetList> parseUnwindInfo(void*, size_t, GeneratedFunction);
</ins><span class="cx">
</span><span class="cx"> } } // namespace JSC::FTL
</span><span class="cx">
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreinterpreterInterpretercpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -658,20 +658,24 @@
</span><span class="cx"> if (visitor->inlineCallFrame())
</span><span class="cx"> return;
</span><span class="cx"> #endif
</span><del>- RegisterSaveMap* currentCalleeSaves = m_codeBlock ? m_codeBlock->calleeSaveRegisters() : nullptr;
</del><ins>+ RegisterAtOffsetList* currentCalleeSaves = m_codeBlock ? m_codeBlock->calleeSaveRegisters() : nullptr;
</ins><span class="cx">
</span><span class="cx"> if (!currentCalleeSaves)
</span><span class="cx"> return;
</span><span class="cx">
</span><span class="cx"> VM& vm = m_callFrame->vm();
</span><del>- RegisterSaveMap* allCalleeSavesMap = vm.getAllCalleeSaveRegistersMap();
- VirtualRegister calleeSaveBase = virtualRegisterForLocal(m_codeBlock->calleeSaveSpaceAsVirtualRegisters() - 1);
</del><ins>+ RegisterAtOffsetList* allCalleeSaves = vm.getAllCalleeSaveRegisterOffsets();
+ RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
+ intptr_t* frame = reinterpret_cast<intptr_t*>(m_callFrame->registers());
</ins><span class="cx">
</span><del>- intptr_t* calleeSaves = reinterpret_cast<intptr_t*>(m_callFrame->registers()) + calleeSaveBase.offset();
-
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- if (currentCalleeSaves->has(reg))
- vm.calleeSaveRegistersBuffer[allCalleeSavesMap->getIndexFor(reg)] = calleeSaves[currentCalleeSaves->getIndexFor(reg)];
</del><ins>+ unsigned registerCount = currentCalleeSaves->size();
+ for (unsigned i = 0; i < registerCount; i++) {
+ RegisterAtOffset currentEntry = currentCalleeSaves->at(i);
+ if (dontCopyRegisters.get(currentEntry.reg()))
+ continue;
+ RegisterAtOffset* vmCalleeSavesEntry = allCalleeSaves->find(currentEntry.reg());
+
+ vm.calleeSaveRegistersBuffer[vmCalleeSavesEntry->offsetAsIndex()] = *(frame + currentEntry.offsetAsIndex());
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> }
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitAssemblyHelpersh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> #include "GPRInfo.h"
</span><span class="cx"> #include "JITCode.h"
</span><span class="cx"> #include "MacroAssembler.h"
</span><del>-#include "RegisterSaveMap.h"
</del><ins>+#include "RegisterAtOffsetList.h"
</ins><span class="cx"> #include "RegisterSet.h"
</span><span class="cx"> #include "TypeofType.h"
</span><span class="cx"> #include "VM.h"
</span><span class="lines">@@ -180,16 +180,15 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(codeBlock);
</span><span class="cx">
</span><del>- RegisterSaveMap* calleeSavesMap = codeBlock->calleeSaveRegisters();
</del><ins>+ RegisterAtOffsetList* calleeSaves = codeBlock->calleeSaveRegisters();
+ RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
+ unsigned registerCount = calleeSaves->size();
</ins><span class="cx">
</span><del>- if (!calleeSavesMap->size())
- return;
-
- VirtualRegister baseVirtualRegister = virtualRegisterForLocal(codeBlock->calleeSaveSpaceAsVirtualRegisters() - 1) + offsetVirtualRegister;
-
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- if (calleeSavesMap->has(reg) && reg.isGPR())
- storePtr(reg.gpr(), Address(framePointerRegister, baseVirtualRegister.offsetInBytes() + calleeSavesMap->getOffsetFor(reg)));
</del><ins>+ for (unsigned i = 0; i < registerCount; i++) {
+ RegisterAtOffset entry = calleeSaves->at(i);
+ if (dontSaveRegisters.get(entry.reg()))
+ continue;
+ storePtr(entry.reg().gpr(), Address(framePointerRegister, offsetVirtualRegister.offsetInBytes() + entry.offset()));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -197,16 +196,15 @@
</span><span class="cx"> {
</span><span class="cx"> ASSERT(codeBlock);
</span><span class="cx">
</span><del>- RegisterSaveMap* calleeSavesMap = codeBlock->calleeSaveRegisters();
-
- if (!calleeSavesMap->size())
- return;
-
- VirtualRegister baseVirtualRegister = virtualRegisterForLocal(codeBlock->calleeSaveSpaceAsVirtualRegisters() - 1);
-
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- if (calleeSavesMap->has(reg) && reg.isGPR())
- loadPtr(Address(framePointerRegister, baseVirtualRegister.offsetInBytes() + calleeSavesMap->getOffsetFor(reg)), reg.gpr());
</del><ins>+ RegisterAtOffsetList* calleeSaves = codeBlock->calleeSaveRegisters();
+ RegisterSet dontRestoreRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
+ unsigned registerCount = calleeSaves->size();
+
+ for (unsigned i = 0; i < registerCount; i++) {
+ RegisterAtOffset entry = calleeSaves->at(i);
+ if (dontRestoreRegisters.get(entry.reg()))
+ continue;
+ loadPtr(Address(framePointerRegister, entry.offset()), entry.reg().gpr());
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -226,11 +224,15 @@
</span><span class="cx">
</span><span class="cx"> move(TrustedImmPtr(m_vm->calleeSaveRegistersBuffer), temp1);
</span><span class="cx">
</span><del>- RegisterSaveMap* allCalleeSavesMap = m_vm->getAllCalleeSaveRegistersMap();
-
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- if (allCalleeSavesMap->has(reg) && reg.isGPR())
- storePtr(reg.gpr(), Address(temp1, allCalleeSavesMap->getOffsetFor(reg)));
</del><ins>+ RegisterAtOffsetList* allCalleeSaves = m_vm->getAllCalleeSaveRegisterOffsets();
+ RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
+ unsigned registerCount = allCalleeSaves->size();
+
+ for (unsigned i = 0; i < registerCount; i++) {
+ RegisterAtOffset entry = allCalleeSaves->at(i);
+ if (dontCopyRegisters.get(entry.reg()))
+ continue;
+ storePtr(entry.reg().gpr(), Address(temp1, entry.offset()));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><span class="lines">@@ -240,46 +242,18 @@
</span><span class="cx">
</span><span class="cx"> move(TrustedImmPtr(m_vm->calleeSaveRegistersBuffer), temp1);
</span><span class="cx">
</span><del>- RegisterSaveMap* allCalleeSavesMap = m_vm->getAllCalleeSaveRegistersMap();
</del><ins>+ RegisterAtOffsetList* allCalleeSaves = m_vm->getAllCalleeSaveRegisterOffsets();
+ RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters();
+ unsigned registerCount = allCalleeSaves->size();
</ins><span class="cx">
</span><del>- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- if (allCalleeSavesMap->has(reg) && reg.isGPR())
- loadPtr(Address(temp1, allCalleeSavesMap->getOffsetFor(reg)), reg.gpr());
</del><ins>+ for (unsigned i = 0; i < registerCount; i++) {
+ RegisterAtOffset entry = allCalleeSaves->at(i);
+ if (dontRestoreRegisters.get(entry.reg()))
+ continue;
+ loadPtr(Address(temp1, entry.offset()), entry.reg().gpr());
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- void copyCalleeSavesFromFrameToVMCalleeSavesBuffer(const TempRegisterSet& usedRegisters = { RegisterSet::nonTempRegisters() })
- {
- GPRReg temp1 = usedRegisters.getFreeGPR(0);
- GPRReg temp2 = usedRegisters.getFreeGPR(1);
- ASSERT(temp2 != InvalidGPRReg);
-
- ASSERT(codeBlock());
-
- // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer
- move(TrustedImmPtr(m_vm->calleeSaveRegistersBuffer), temp1);
-
- RegisterSaveMap* allCalleeSavesMap = m_vm->getAllCalleeSaveRegistersMap();
- RegisterSaveMap* currentCalleeSaves = codeBlock()->calleeSaveRegisters();
- VirtualRegister calleeSaveBase = virtualRegisterForLocal(codeBlock()->calleeSaveSpaceAsVirtualRegisters() - 1);
-
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
- GPRReg regToStore;
-
- if (allCalleeSavesMap->has(reg) && reg.isGPR()) {
- if (currentCalleeSaves->has(reg)) {
- // Load calleeSave from stack into temp register
- regToStore = temp2;
- loadPtr(Address(framePointerRegister, calleeSaveBase.offsetInBytes() + currentCalleeSaves->getOffsetFor(reg)), regToStore);
- } else
- // Just store callee save directly
- regToStore = reg.gpr();
-
- storePtr(regToStore, Address(temp1, allCalleeSavesMap->getOffsetFor(reg)));
- }
- }
- }
-
</del><span class="cx"> void copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer(const TempRegisterSet& usedRegisters = { RegisterSet::nonTempRegisters() })
</span><span class="cx"> {
</span><span class="cx"> GPRReg temp1 = usedRegisters.getFreeGPR(0);
</span><span class="lines">@@ -291,24 +265,28 @@
</span><span class="cx"> // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer
</span><span class="cx"> move(TrustedImmPtr(m_vm->calleeSaveRegistersBuffer), temp1);
</span><span class="cx">
</span><del>- RegisterSaveMap* allCalleeSavesMap = m_vm->getAllCalleeSaveRegistersMap();
- RegisterSaveMap* currentCalleeSaves = codeBlock()->calleeSaveRegisters();
- VirtualRegister calleeSaveBase = virtualRegisterForLocal(codeBlock()->calleeSaveSpaceAsVirtualRegisters() - 1);
-
- for (Reg reg = Reg::first(); reg <= Reg::last(); reg = reg.next()) {
</del><ins>+ RegisterAtOffsetList* allCalleeSaves = m_vm->getAllCalleeSaveRegisterOffsets();
+ RegisterAtOffsetList* currentCalleeSaves = codeBlock()->calleeSaveRegisters();
+ RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
+ unsigned registerCount = allCalleeSaves->size();
+
+ for (unsigned i = 0; i < registerCount; i++) {
</ins><span class="cx"> GPRReg regToStore;
</span><del>-
- if (allCalleeSavesMap->has(reg) && reg.isGPR()) {
- if (currentCalleeSaves->has(reg)) {
- // Load calleeSave from stack into temp register
- regToStore = temp2;
- loadPtr(Address(framePointerRegister, calleeSaveBase.offsetInBytes() + currentCalleeSaves->getOffsetFor(reg)), regToStore);
- } else
- // Just store callee save directly
- regToStore = reg.gpr();
-
- storePtr(regToStore, Address(temp1, allCalleeSavesMap->getOffsetFor(reg)));
- }
</del><ins>+
+ RegisterAtOffset vmEntry = allCalleeSaves->at(i);
+ if (dontCopyRegisters.get(vmEntry.reg()))
+ continue;
+ RegisterAtOffset* currentFrameEntry = currentCalleeSaves->find(vmEntry.reg());
+
+ if (currentFrameEntry) {
+ // Load calleeSave from stack into temp register
+ regToStore = temp2;
+ loadPtr(Address(framePointerRegister, currentFrameEntry->offset()), regToStore);
+ } else
+ // Just store callee save directly
+ regToStore = vmEntry.reg().gpr();
+
+ storePtr(regToStore, Address(temp1, vmEntry.offset()));
</ins><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetcppfromrev188653branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp"></a>
<div class="copfile"><h4>Copied: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp (from rev 188653, branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp) (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp         (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+/*
+ * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RegisterAtOffset.h"
+
+#if ENABLE(JIT)
+
+namespace JSC {
+
+void RegisterAtOffset::dump(PrintStream& out) const
+{
+ out.print(reg(), " at ", offset());
+}
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsethfromrev188653branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffseth"></a>
<div class="copfile"><h4>Copied: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h (from rev 188653, branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h) (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h         (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+/*
+ * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RegisterAtOffset_h
+#define RegisterAtOffset_h
+
+#if ENABLE(JIT)
+
+#include "Reg.h"
+#include <wtf/PrintStream.h>
+
+namespace JSC {
+
+class RegisterAtOffset {
+public:
+ RegisterAtOffset()
+ : m_offset(0)
+ {
+ }
+
+ RegisterAtOffset(Reg reg, ptrdiff_t offset)
+ : m_reg(reg)
+ , m_offset(offset)
+ {
+ }
+
+ bool operator!() const { return !m_reg; }
+
+ Reg reg() const { return m_reg; }
+ ptrdiff_t offset() const { return m_offset; }
+ int offsetAsIndex() const { return offset() / sizeof(void*); }
+
+ bool operator==(const RegisterAtOffset& other) const
+ {
+ return reg() == other.reg() && offset() == other.offset();
+ }
+
+ bool operator<(const RegisterAtOffset& other) const
+ {
+ if (reg() != other.reg())
+ return reg() < other.reg();
+ return offset() < other.offset();
+ }
+
+ static Reg getReg(RegisterAtOffset* value) { return value->reg(); }
+
+ void dump(PrintStream& out) const;
+
+private:
+ Reg m_reg;
+ ptrdiff_t m_offset;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
+#endif // RegisterAtOffset_h
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListcpp"></a>
<div class="addfile"><h4>Added: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp         (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,80 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "RegisterAtOffsetList.h"
+
+#if ENABLE(JIT)
+
+#include <wtf/ListDump.h>
+
+namespace JSC {
+
+RegisterAtOffsetList::RegisterAtOffsetList() { }
+
+RegisterAtOffsetList::RegisterAtOffsetList(RegisterSet registerSet, OffsetBaseType offsetBaseType)
+{
+ size_t numberOfRegisters = registerSet.numberOfSetGPRs();
+ ptrdiff_t offset = 0;
+
+ if (offsetBaseType == FramePointerBased)
+ offset = -(static_cast<ptrdiff_t>(numberOfRegisters) * sizeof(void*));
+
+ for (Reg reg = Reg::first(); reg <= Reg::last();reg = reg.next()) {
+ if (registerSet.get(reg) && reg.isGPR()) {
+ append(RegisterAtOffset(reg, offset));
+ offset += sizeof(void*);
+ }
+ }
+
+ sort();
+}
+
+void RegisterAtOffsetList::sort()
+{
+ std::sort(m_registers.begin(), m_registers.end());
+}
+
+void RegisterAtOffsetList::dump(PrintStream& out) const
+{
+ out.print(listDump(m_registers));
+}
+
+RegisterAtOffset* RegisterAtOffsetList::find(Reg reg) const
+{
+ return tryBinarySearch<RegisterAtOffset, Reg>(m_registers, m_registers.size(), reg, RegisterAtOffset::getReg);
+}
+
+unsigned RegisterAtOffsetList::indexOf(Reg reg) const
+{
+ if (RegisterAtOffset* pointer = find(reg))
+ return pointer - m_registers.begin();
+ return UINT_MAX;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListh"></a>
<div class="addfile"><h4>Added: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h         (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,78 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef RegisterAtOffsetList_h
+#define RegisterAtOffsetList_h
+
+#if ENABLE(JIT)
+
+#include "RegisterAtOffset.h"
+#include "RegisterSet.h"
+
+namespace JSC {
+
+class RegisterAtOffsetList {
+public:
+ enum OffsetBaseType { FramePointerBased, ZeroBased };
+
+ RegisterAtOffsetList();
+ RegisterAtOffsetList(RegisterSet, OffsetBaseType = FramePointerBased);
+
+ void dump(PrintStream&) const;
+
+ void clear()
+ {
+ m_registers.clear();
+ }
+
+ size_t size()
+ {
+ return m_registers.size();
+ }
+
+ RegisterAtOffset& at(size_t index)
+ {
+ return m_registers.at(index);
+ }
+
+ void append(RegisterAtOffset registerAtOffset)
+ {
+ m_registers.append(registerAtOffset);
+ }
+
+ void sort();
+ RegisterAtOffset* find(Reg) const;
+ unsigned indexOf(Reg) const; // Returns UINT_MAX if not found.
+
+private:
+ Vector<RegisterAtOffset> m_registers;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
+#endif // RegisterAtOffsetList_h
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMapcpp"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,56 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "RegisterSaveMap.h"
-
-#if ENABLE(JIT)
-
-#include "MacroAssembler.h"
-
-namespace JSC {
-
-RegisterSaveMap::RegisterSaveMap(RegisterSet registers)
-{
- m_numberOfRegisters = 0;
- for (Reg reg = Reg::first(); reg <= Reg::last();reg = reg.next()) {
- if (registers.get(reg) && reg.isGPR()) {
- m_indexForRegister.set(reg.index(), m_numberOfRegisters);
- m_numberOfRegisters++;
- }
- }
-}
-
-unsigned RegisterSaveMap::getIndexFor(Reg reg) const
-{
- auto iter = m_indexForRegister.find(reg.index());
- ASSERT(iter != m_indexForRegister.end());
- return iter->value;
-}
-
-} // namespace JSC
-
-#endif // ENABLE(JIT)
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMaph"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,59 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef RegisterSaveMap_h
-#define RegisterSaveMap_h
-
-#if ENABLE(JIT)
-
-#include "GPRInfo.h"
-#include "Reg.h"
-#include "RegisterSet.h"
-#include <wtf/HashMap.h>
-
-namespace JSC {
-
-class RegisterSaveMap {
-public:
- RegisterSaveMap(RegisterSet registers);
-
- unsigned size() { return m_numberOfRegisters; }
- bool has(Reg reg) { return m_indexForRegister.contains(reg.index()); }
- unsigned maxOffset() { return size() * cpuRegisterSize; }
- unsigned getIndexFor(Reg) const;
- unsigned getOffsetFor(Reg reg) const { return getIndexFor(reg) * cpuRegisterSize; }
-private:
- static const unsigned cpuRegisterSize = sizeof(intptr_t);
-
- unsigned m_numberOfRegisters;
- HashMap<unsigned, unsigned, WTF::IntHash<unsigned>, WTF::UnsignedWithZeroKeyHashTraits<unsigned> > m_indexForRegister;
-};
-
-} // namespace JSC
-
-#endif // ENABLE(JIT)
-
-#endif // RegisterSaveMap_h
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSetcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -228,11 +228,45 @@
</span><span class="cx"> return result;
</span><span class="cx"> }
</span><span class="cx">
</span><ins>+RegisterSet RegisterSet::ftlCalleeSaveRegisters()
+{
+ RegisterSet result;
+#if ENABLE(FTL_JIT)
+#if CPU(X86_64) && !OS(WINDOWS)
+ result.set(GPRInfo::regCS0);
+ result.set(GPRInfo::regCS1);
+ result.set(GPRInfo::regCS2);
+ ASSERT(GPRInfo::regCS3 == GPRInfo::tagTypeNumberRegister);
+ ASSERT(GPRInfo::regCS4 == GPRInfo::tagMaskRegister);
+ result.set(GPRInfo::regCS3);
+ result.set(GPRInfo::regCS4);
+#elif CPU(ARM64)
+ // LLVM might save and use all ARM64 callee saves specified in the ABI.
+ result.set(ARM64Registers::x19);
+ result.set(ARM64Registers::x20);
+ result.set(ARM64Registers::x21);
+ result.set(ARM64Registers::x22);
+ result.set(ARM64Registers::x23);
+ result.set(ARM64Registers::x24);
+ result.set(ARM64Registers::x25);
+ result.set(GPRInfo::regCS0);
+ ASSERT(GPRInfo::regCS1 == GPRInfo::tagTypeNumberRegister);
+ ASSERT(GPRInfo::regCS2 == GPRInfo::tagMaskRegister);
+ result.set(GPRInfo::regCS1);
+ result.set(GPRInfo::regCS2);
+#else
+ UNREACHABLE_FOR_PLATFORM();
+#endif
+#endif
+ return result;
+}
+
</ins><span class="cx"> RegisterSet RegisterSet::allVMCalleeSaveRegisters()
</span><span class="cx"> {
</span><span class="cx"> return RegisterSet(llintCalleeSaveRegisters(),
</span><span class="cx"> baselineCalleeSaveRegisters(),
</span><del>- dfgCalleeSaveRegisters());
</del><ins>+ dfgCalleeSaveRegisters(),
+ ftlCalleeSaveRegisters());
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> RegisterSet RegisterSet::allGPRs()
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSeth"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx"> static RegisterSet llintCalleeSaveRegisters(); // Registers saved and used by the LLInt.
</span><span class="cx"> static RegisterSet baselineCalleeSaveRegisters(); // Registers saved and used by the baseline JIT.
</span><span class="cx"> static RegisterSet dfgCalleeSaveRegisters(); // Registers saved and used by the DFG JIT.
</span><ins>+ static RegisterSet ftlCalleeSaveRegisters(); // Registers that might be saved and used by the FTL JIT.
</ins><span class="cx"> static RegisterSet allVMCalleeSaveRegisters(); // The union of registers saved and used by any VM.
</span><span class="cx"> static RegisterSet nonTempRegisters(); // The union of VM callee save and special registers.
</span><span class="cx"> static RegisterSet allGPRs();
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx"> #include "PropertyMapHashTable.h"
</span><span class="cx"> #include "RegExpCache.h"
</span><span class="cx"> #include "RegExpObject.h"
</span><del>-#include "RegisterSaveMap.h"
</del><ins>+#include "RegisterAtOffsetList.h"
</ins><span class="cx"> #include "RuntimeType.h"
</span><span class="cx"> #include "SimpleTypedArrayController.h"
</span><span class="cx"> #include "SourceProviderCache.h"
</span><span class="lines">@@ -246,7 +246,7 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> jitStubs = std::make_unique<JITThunks>();
</span><del>- allCalleeSaveRegistersMap = std::make_unique<RegisterSaveMap>(RegisterSet::allVMCalleeSaveRegisters());
</del><ins>+ allCalleeSaveRegisterOffsets = std::make_unique<RegisterAtOffsetList>(RegisterSet::allVMCalleeSaveRegisters(), RegisterAtOffsetList::ZeroBased);
</ins><span class="cx"> #endif
</span><span class="cx"> arityCheckData = std::make_unique<CommonSlowPaths::ArityCheckData>();
</span><span class="cx">
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx"> class LegacyProfiler;
</span><span class="cx"> class NativeExecutable;
</span><span class="cx"> class RegExpCache;
</span><del>-class RegisterSaveMap;
</del><ins>+class RegisterAtOffsetList;
</ins><span class="cx"> class ScriptExecutable;
</span><span class="cx"> class SourceProvider;
</span><span class="cx"> class SourceProviderCache;
</span><span class="lines">@@ -349,9 +349,9 @@
</span><span class="cx"> }
</span><span class="cx"> NativeExecutable* getHostFunction(NativeFunction, Intrinsic);
</span><span class="cx">
</span><del>- std::unique_ptr<RegisterSaveMap> allCalleeSaveRegistersMap;
</del><ins>+ std::unique_ptr<RegisterAtOffsetList> allCalleeSaveRegisterOffsets;
</ins><span class="cx">
</span><del>- RegisterSaveMap* getAllCalleeSaveRegistersMap() { return allCalleeSaveRegistersMap.get(); }
</del><ins>+ RegisterAtOffsetList* getAllCalleeSaveRegisterOffsets() { return allCalleeSaveRegisterOffsets.get(); }
</ins><span class="cx">
</span><span class="cx"> #endif // ENABLE(JIT)
</span><span class="cx"> std::unique_ptr<CommonSlowPaths::ArityCheckData> arityCheckData;
</span></span></pre>
</div>
</div>
</body>
</html>