<!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>[161686] trunk/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/161686">161686</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2014-01-10 15:47:12 -0800 (Fri, 10 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(C stack work): stack traces no longer work in CrashTracer, lldb, and other tools
https://bugs.webkit.org/show_bug.cgi?id=126764

Reviewed by Geoffrey Garen.

Updated callToJavaScript and cllToNativeFunction to properly replicate the caller's
return PC and frame pointer in the sentinel frame.  For X86-64, added .cfi_
directives to create eh_frame info for all LLInt symbols so that the various
unwinding code understands that we are using a separate JS stack referenced
by BP and at what offsets in that frame the prior PC (register 16) and prior
BP (register 6) can be found.  These two changes are sufficient for stack tracing
to work for Mac OSX.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpretercpp">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreter64asm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (161685 => 161686)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-01-10 23:36:58 UTC (rev 161685)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-01-10 23:47:12 UTC (rev 161686)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2014-01-10  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        REGRESSION(C stack work): stack traces no longer work in CrashTracer, lldb, and other tools
+        https://bugs.webkit.org/show_bug.cgi?id=126764
+
+        Reviewed by Geoffrey Garen.
+
+        Updated callToJavaScript and cllToNativeFunction to properly replicate the caller's
+        return PC and frame pointer in the sentinel frame.  For X86-64, added .cfi_
+        directives to create eh_frame info for all LLInt symbols so that the various
+        unwinding code understands that we are using a separate JS stack referenced
+        by BP and at what offsets in that frame the prior PC (register 16) and prior
+        BP (register 6) can be found.  These two changes are sufficient for stack tracing
+        to work for Mac OSX.
+
+        * llint/LowLevelInterpreter.cpp:
+        * llint/LowLevelInterpreter64.asm:
+
</ins><span class="cx"> 2014-01-10  Tamas Gergely  &lt;tgergely.u-szeged@partner.samsung.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [EFL][JSC] Enable udis86 disassembler on efl.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorellintLowLevelInterpretercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp (161685 => 161686)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2014-01-10 23:36:58 UTC (rev 161685)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.cpp        2014-01-10 23:47:12 UTC (rev 161686)
</span><span class="lines">@@ -522,8 +522,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">@@ -536,6 +545,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 rbp, 0\n&quot;                     \
+    &quot;.cfi_offset 16, 8\n&quot;                       \
+    &quot;.cfi_offset 6, 0\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="trunkSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (161685 => 161686)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-01-10 23:36:58 UTC (rev 161685)
+++ trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-01-10 23:47:12 UTC (rev 161686)
</span><span class="lines">@@ -140,10 +140,6 @@
</span><span class="cx">         const temp3 = t6
</span><span class="cx">     end
</span><span class="cx"> 
</span><del>-    if X86_64
-        loadp [sp], previousPC
-    end
-    move cfr, previousCFR
</del><span class="cx">     functionPrologue(extraStackSpace)
</span><span class="cx"> 
</span><span class="cx">     move topOfStack, cfr
</span><span class="lines">@@ -153,6 +149,10 @@
</span><span class="cx">     loadp [vmTopCallFrame], temp1
</span><span class="cx">     storep temp1, ScopeChain[cfr]
</span><span class="cx">     storep 1, CodeBlock[cfr]
</span><ins>+    if X86_64
+        loadp 7*8[sp], previousPC
+        loadp 6*8[sp], previousCFR
+    end
</ins><span class="cx">     storep previousPC, ReturnPC[cfr]
</span><span class="cx">     storep previousCFR, CallerFrame[cfr]
</span><span class="cx">     move cfr, temp1
</span></span></pre>
</div>
</div>

</body>
</html>