<!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>[161913] branches/jsCStack/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/161913">161913</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2014-01-13 15:23:52 -0800 (Mon, 13 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>CStack Branch: Fix unwind on branch for X86-64
https://bugs.webkit.org/show_bug.cgi?id=126932

Reviewed by Geoffrey Garen.

Added code to push bp ; move sp, bp as the first instructions in callToJavaScript.
This complies with what happens at the top of most functions.  This added push
is used to restore bp in the prologue.  The values for the return PC and save BP in 
the sentinel frame are only used for unwinding.  Made similar mods to other platforms.
Added eh_frame directives to LLInt global labels to get unwinding through them working
as well.

* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter.cpp:
* llint/LowLevelInterpreter64.asm:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjsCStackSourceJavaScriptCoreChangeLog">branches/jsCStack/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreterasm">branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorellintLowLevelInterpretercpp">branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreter64asm">branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjsCStackSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/ChangeLog (161912 => 161913)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/ChangeLog        2014-01-13 23:03:47 UTC (rev 161912)
+++ branches/jsCStack/Source/JavaScriptCore/ChangeLog        2014-01-13 23:23:52 UTC (rev 161913)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-01-13  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        CStack Branch: Fix unwind on branch for X86-64
+        https://bugs.webkit.org/show_bug.cgi?id=126932
+
+        Reviewed by Geoffrey Garen.
+
+        Added code to push bp ; move sp, bp as the first instructions in callToJavaScript.
+        This complies with what happens at the top of most functions.  This added push
+        is used to restore bp in the prologue.  The values for the return PC and save BP in 
+        the sentinel frame are only used for unwinding.  Made similar mods to other platforms.
+        Added eh_frame directives to LLInt global labels to get unwinding through them working
+        as well.
+
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter.cpp:
+        * llint/LowLevelInterpreter64.asm:
+
</ins><span class="cx"> 2014-01-12  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         internal-js-tests.yaml/Octane/mandreel.js.default-ftl fails about 1/30 times with &quot;TypeError: undefined is not an object&quot;
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (161912 => 161913)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-01-13 23:03:47 UTC (rev 161912)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-01-13 23:23:52 UTC (rev 161913)
</span><span class="lines">@@ -305,11 +305,14 @@
</span><span class="cx"> 
</span><span class="cx"> macro callToJavaScriptPrologue()
</span><span class="cx">     if X86 or X86_64
</span><ins>+        push cfr
+        move sp, cfr
+        push t0
</ins><span class="cx">     elsif ARM64
</span><span class="cx">         pushLRAndFP
</span><span class="cx">     elsif ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS
</span><ins>+        push lr
</ins><span class="cx">         push cfr
</span><del>-        push lr
</del><span class="cx">     end
</span><span class="cx">     pushCalleeSaves
</span><span class="cx"> end
</span><span class="lines">@@ -320,11 +323,13 @@
</span><span class="cx"> 
</span><span class="cx">     popCalleeSaves
</span><span class="cx">     if X86 or X86_64
</span><ins>+        pop t6
+        pop cfr
</ins><span class="cx">     elsif ARM64
</span><span class="cx">         popLRAndFP
</span><span class="cx">     elsif ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS
</span><ins>+        pop cfr
</ins><span class="cx">         pop lr
</span><del>-        pop cfr
</del><span class="cx">     end
</span><span class="cx"> end
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpretercpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp (161912 => 161913)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2014-01-13 23:03:47 UTC (rev 161912)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2014-01-13 23:23:52 UTC (rev 161913)
</span><span class="lines">@@ -513,8 +513,17 @@
</span><span class="cx"> //
</span><span class="cx"> 
</span><span class="cx"> // These are for building an interpreter from generated assembly code:
</span><ins>+#if CPU(X86_64)
+#define OFFLINE_ASM_BEGIN   asm (                \
+    &quot;.cfi_startproc\n&quot;
+
+#define OFFLINE_ASM_END                          \
+    &quot;.cfi_endproc\n&quot;                             \
+                            );
+#else
</ins><span class="cx"> #define OFFLINE_ASM_BEGIN   asm (
</span><span class="cx"> #define OFFLINE_ASM_END     );
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> #define OFFLINE_ASM_OPCODE_LABEL(__opcode) OFFLINE_ASM_GLOBAL_LABEL(llint_##__opcode)
</span><span class="cx"> #define OFFLINE_ASM_GLUE_LABEL(__opcode)   OFFLINE_ASM_GLOBAL_LABEL(__opcode)
</span><span class="lines">@@ -527,6 +536,15 @@
</span><span class="cx">     &quot;.thumb\n&quot;                                   \
</span><span class="cx">     &quot;.thumb_func &quot; THUMB_FUNC_PARAM(label) &quot;\n&quot;  \
</span><span class="cx">     SYMBOL_STRING(label) &quot;:\n&quot;
</span><ins>+#elif CPU(X86_64)
+#define OFFLINE_ASM_GLOBAL_LABEL(label)         \
+    &quot;.text\n&quot;                                   \
+    &quot;.globl &quot; SYMBOL_STRING(label) &quot;\n&quot;         \
+    HIDE_SYMBOL(label) &quot;\n&quot;                     \
+    SYMBOL_STRING(label) &quot;:\n&quot;                  \
+    &quot;.cfi_def_cfa_offset 16\n&quot;                  \
+    &quot;.cfi_offset %rbp, -16\n&quot;                   \
+    &quot;.cfi_def_cfa_register rbp\n&quot;
</ins><span class="cx"> #else
</span><span class="cx"> #define OFFLINE_ASM_GLOBAL_LABEL(label)         \
</span><span class="cx">     &quot;.text\n&quot;                                   \
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (161912 => 161913)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-01-13 23:03:47 UTC (rev 161912)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-01-13 23:23:52 UTC (rev 161913)
</span><span class="lines">@@ -113,11 +113,14 @@
</span><span class="cx">         const temp3 = t6
</span><span class="cx">     end
</span><span class="cx"> 
</span><ins>+    callToJavaScriptPrologue()
+
</ins><span class="cx">     if X86_64
</span><del>-        loadp [sp], previousPC
</del><ins>+        loadp 7*8[sp], previousPC
+        move 6*8[sp], previousCFR
+    elsif ARM64
+        move cfr, previousCFR
</ins><span class="cx">     end
</span><del>-    move cfr, previousCFR
-    callToJavaScriptPrologue()
</del><span class="cx"> 
</span><span class="cx">     checkStackPointerAlignment(temp2, 0xbad0dc01)
</span><span class="cx"> 
</span><span class="lines">@@ -211,7 +214,11 @@
</span><span class="cx"> 
</span><span class="cx">     checkStackPointerAlignment(temp3, 0xbad0dc04)
</span><span class="cx"> 
</span><ins>+    if X86_64
+        pop t5
+    end
</ins><span class="cx">     callToJavaScriptEpilogue()
</span><ins>+
</ins><span class="cx">     ret
</span><span class="cx"> end
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>