Title: [164374] trunk/Source/_javascript_Core
Revision
164374
Author
[email protected]
Date
2014-02-19 11:00:58 -0800 (Wed, 19 Feb 2014)

Log Message

[Win][LLINT] Incorrect stack alignment.
https://bugs.webkit.org/show_bug.cgi?id=129045

Patch by [email protected] <[email protected]> on 2014-02-19
Reviewed by Michael Saboff.

LLINT expects the stack to be 16 byte aligned, but with MSVC it is not.
To align the stack, a new backend, X86_WIN, is created.

* llint/LLIntOfflineAsmConfig.h: Use X86_WIN backend on Windows.
* llint/LowLevelInterpreter.asm: Align stack to 16 byte boundaries. Otherwise, use same implementation for X86_WIN as for X86.
* llint/LowLevelInterpreter32_64.asm: Adjust stack offset to retrieve function parameters now that the stack is aligned.
* offlineasm/backends.rb: Added X86_WIN backend.
* offlineasm/x86.rb: Fix crash caused by incorrect assembly code for double types.

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (164373 => 164374)


--- trunk/Source/_javascript_Core/ChangeLog	2014-02-19 18:58:29 UTC (rev 164373)
+++ trunk/Source/_javascript_Core/ChangeLog	2014-02-19 19:00:58 UTC (rev 164374)
@@ -1,3 +1,19 @@
+2014-02-19  [email protected]  <[email protected]>
+
+        [Win][LLINT] Incorrect stack alignment.
+        https://bugs.webkit.org/show_bug.cgi?id=129045
+
+        Reviewed by Michael Saboff.
+
+        LLINT expects the stack to be 16 byte aligned, but with MSVC it is not.
+        To align the stack, a new backend, X86_WIN, is created.
+
+        * llint/LLIntOfflineAsmConfig.h: Use X86_WIN backend on Windows.
+        * llint/LowLevelInterpreter.asm: Align stack to 16 byte boundaries. Otherwise, use same implementation for X86_WIN as for X86.
+        * llint/LowLevelInterpreter32_64.asm: Adjust stack offset to retrieve function parameters now that the stack is aligned.
+        * offlineasm/backends.rb: Added X86_WIN backend.
+        * offlineasm/x86.rb: Fix crash caused by incorrect assembly code for double types.
+
 2014-02-19  Dániel Bátyai  <[email protected]>
 
         ASSERTION FAILED: (year >= 1970 && yearday >= 0) || (year < 1970 && yearday < 0) in WTF::dateToDaysFrom1970

Modified: trunk/Source/_javascript_Core/llint/LLIntOfflineAsmConfig.h (164373 => 164374)


--- trunk/Source/_javascript_Core/llint/LLIntOfflineAsmConfig.h	2014-02-19 18:58:29 UTC (rev 164373)
+++ trunk/Source/_javascript_Core/llint/LLIntOfflineAsmConfig.h	2014-02-19 19:00:58 UTC (rev 164374)
@@ -48,12 +48,18 @@
 
 #define OFFLINE_ASM_C_LOOP 0
 
-#if CPU(X86)
+#if CPU(X86) && !PLATFORM(WIN)
 #define OFFLINE_ASM_X86 1
 #else
 #define OFFLINE_ASM_X86 0
 #endif
 
+#if CPU(X86) && PLATFORM(WIN)
+#define OFFLINE_ASM_X86_WIN 1
+#else
+#define OFFLINE_ASM_X86_WIN 0
+#endif
+
 #ifdef __ARM_ARCH_7S__
 #define OFFLINE_ASM_ARMv7s 1
 #else

Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm (164373 => 164374)


--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm	2014-02-19 18:58:29 UTC (rev 164373)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm	2014-02-19 19:00:58 UTC (rev 164374)
@@ -78,7 +78,7 @@
 const maxFrameExtentForSlowPathCall = 0
 elsif ARM or ARMv7_TRADITIONAL or ARMv7 or SH4
 const maxFrameExtentForSlowPathCall = 24
-elsif X86
+elsif X86 or X86_WIN
 const maxFrameExtentForSlowPathCall = 40
 elsif MIPS
 const maxFrameExtentForSlowPathCall = 40
@@ -245,7 +245,7 @@
     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
         push lr
         push cfr
-    elsif X86 or X86_64
+    elsif X86 or X86_WIN or X86_64
         push cfr
     elsif ARM64
         pushLRAndFP
@@ -260,7 +260,7 @@
     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
         pop cfr
         pop lr
-    elsif X86 or X86_64
+    elsif X86 or X86_WIN or X86_64
         pop cfr
     elsif ARM64
         popLRAndFP
@@ -271,7 +271,7 @@
     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or ARM64 or MIPS or SH4
         # In C_LOOP case, we're only preserving the bytecode vPC.
         move lr, destinationRegister
-    elsif X86 or X86_64
+    elsif X86 or X86_WIN or X86_64
         pop destinationRegister
     else
         error
@@ -282,7 +282,7 @@
     if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or ARM64 or MIPS or SH4
         # In C_LOOP case, we're only restoring the bytecode vPC.
         move sourceRegister, lr
-    elsif X86 or X86_64
+    elsif X86 or X86_WIN or X86_64
         push sourceRegister
     else
         error
@@ -290,7 +290,7 @@
 end
 
 macro functionPrologue()
-    if X86 or X86_64
+    if X86 or X86_WIN or X86_64
         push cfr
     elsif ARM64
         pushLRAndFP
@@ -302,7 +302,7 @@
 end
 
 macro functionEpilogue()
-    if X86 or X86_64
+    if X86 or X86_WIN or X86_64
         pop cfr
     elsif ARM64
         popLRAndFP
@@ -316,7 +316,7 @@
     if X86_64
         push cfr
         push t0
-    elsif X86
+    elsif X86 or X86_WIN
         push cfr
     elsif ARM64
         pushLRAndFP
@@ -327,6 +327,15 @@
     pushCalleeSaves
     if X86
         subp 12, sp
+    elsif X86_WIN
+        subp 16, sp
+        move sp, t4
+        move t4, t0
+        move t4, t2
+        andp 0xf, t2
+        andp 0xfffffff0, t0
+        move t0, sp
+        storep t4, [sp]
     elsif ARM or ARMv7 or ARMv7_TRADITIONAL
         subp 4, sp
         move sp, t4
@@ -348,6 +357,10 @@
 
     if X86
         addp 12, sp
+    elsif X86_WIN
+        pop t4
+        move t4, sp
+        addp 16, sp
     elsif ARM or ARMv7 or ARMv7_TRADITIONAL
         pop t4
         move t4, sp
@@ -358,7 +371,7 @@
     if X86_64
         pop t2
         pop cfr
-    elsif X86
+    elsif X86 or X86_WIN
         pop cfr
     elsif ARM64
         popLRAndFP
@@ -618,8 +631,6 @@
 # stub to call into _javascript_ or Native functions
 # EncodedJSValue callToJavaScript(void* code, ExecState** vmTopCallFrame, ProtoCallFrame* protoFrame)
 # EncodedJSValue callToNativeFunction(void* code, ExecState** vmTopCallFrame, ProtoCallFrame* protoFrame)
-# Note, if these stubs or one of their related macros are changed, make the
-# equivalent changes in jit/JITStubsX86.h and/or jit/JITStubsMSVC64.asm
 
 if C_LOOP
 _llint_call_to_javascript:
@@ -645,7 +656,7 @@
         const vm = t4
         const address = t1
         const zeroValue = t0
-    elsif X86
+    elsif X86 or X86_WIN
         const vm = t2
         const address = t1
         const zeroValue = t0
@@ -655,7 +666,7 @@
         const zeroValue = t2
     end
 
-    if X86
+    if X86 or X86_WIN
         loadp 4[sp], vm
     end
 

Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm (164373 => 164374)


--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm	2014-02-19 18:58:29 UTC (rev 164373)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter32_64.asm	2014-02-19 19:00:58 UTC (rev 164374)
@@ -101,7 +101,7 @@
         move arg1, a0
         move arg2, a1
         call function
-    elsif X86
+    elsif X86 or X86_WIN
         subp 8, sp
         push arg2
         push arg1
@@ -133,7 +133,7 @@
         move arg3, a2
         move arg4, a3
         call function
-    elsif X86
+    elsif X86 or X86_WIN
         push arg4
         push arg3
         push arg2
@@ -156,7 +156,7 @@
 end
 
 macro doCallToJavaScript(makeCall)
-    if X86
+    if X86 or X86_WIN
         const entry = t4
         const vm = t3
         const protoCallFrame = t5
@@ -209,6 +209,9 @@
     if X86
         loadp 36[sp], vm
         loadp 32[sp], entry
+    elsif X86_WIN
+        loadp 40[sp, temp3], vm
+        loadp 36[sp, temp3], entry
     else
         move cfr, previousCFR
     end
@@ -228,12 +231,17 @@
     if X86
         loadp 28[sp], previousPC
         loadp 24[sp], previousCFR
+    elsif X86_WIN
+        loadp 32[sp, temp3], previousPC
+        loadp 28[sp, temp3], previousCFR
     end
     storep previousPC, ReturnPC[cfr]
     storep previousCFR, CallerFrame[cfr]
 
     if X86
         loadp 40[sp], protoCallFrame
+    elsif X86_WIN
+        loadp 44[sp, temp3], protoCallFrame
     end
 
     loadi ProtoCallFrame::paddedArgCount[protoCallFrame], temp2
@@ -344,7 +352,7 @@
         storep lr, PtrSize[sp]
         cloopCallNative temp1
     else
-        if X86
+        if X86 or X86_WIN
             # Put callee frame pointer on stack as arg0, also put it in ecx for "fastcall" targets
             move 0, temp2
             move temp2, 4[sp] # put 0 in ReturnPC
@@ -357,7 +365,7 @@
             addp CallerFrameAndPCSize, sp
         end
         call temp1
-        if X86
+        if X86 or X86_WIN
             addp 8, sp
         else
             subp CallerFrameAndPCSize, sp
@@ -2178,7 +2186,7 @@
     loadi ScopeChain + PayloadOffset[t0], t1
     storei CellTag, ScopeChain + TagOffset[cfr]
     storei t1, ScopeChain + PayloadOffset[cfr]
-    if X86
+    if X86 or X86_WIN
         subp 8, sp # align stack pointer
         andp MarkedBlockMask, t1
         loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t1], t3

Modified: trunk/Source/_javascript_Core/offlineasm/backends.rb (164373 => 164374)


--- trunk/Source/_javascript_Core/offlineasm/backends.rb	2014-02-19 18:58:29 UTC (rev 164373)
+++ trunk/Source/_javascript_Core/offlineasm/backends.rb	2014-02-19 19:00:58 UTC (rev 164374)
@@ -33,6 +33,7 @@
 BACKENDS =
     [
      "X86",
+     "X86_WIN",
      "X86_64",
      "ARM",
      "ARMv7",
@@ -51,6 +52,7 @@
 WORKING_BACKENDS =
     [
      "X86",
+     "X86_WIN",
      "X86_64",
      "ARM",
      "ARMv7",

Modified: trunk/Source/_javascript_Core/offlineasm/x86.rb (164373 => 164374)


--- trunk/Source/_javascript_Core/offlineasm/x86.rb	2014-02-19 18:58:29 UTC (rev 164373)
+++ trunk/Source/_javascript_Core/offlineasm/x86.rb	2014-02-19 19:00:58 UTC (rev 164374)
@@ -28,6 +28,8 @@
     case $activeBackend
     when "X86"
         false
+    when "X86_WIN"
+        false
     when "X86_64"
         true
     else
@@ -39,6 +41,8 @@
     case $activeBackend
     when "X86"
         true
+    when "X86_WIN"
+        true
     when "X86_64"
         false
     else
@@ -97,6 +101,8 @@
         size = "dword"
     when :ptr
         size = "dword"
+    when :double
+        size = "qword"
     else
         raise
     end
@@ -408,7 +414,11 @@
     end
     
     def x86Operand(kind)
-        x86AddressOperand(:ptr)
+        if !isIntelSyntax || kind != :double
+            x86AddressOperand(:ptr)
+        else
+            "#{getSizeString(kind)}[#{offset.value} + #{base.x86Operand(:ptr)} + #{index.x86Operand(:ptr)} * #{scale}]"
+        end
     end
 
     def x86CallOperand(kind)
@@ -809,6 +819,11 @@
         raise unless $activeBackend == "X86"
         lowerX86Common
     end
+
+    def lowerX86_WIN
+        raise unless $activeBackend == "X86_WIN" 
+        lowerX86Common
+    end
     
     def lowerX86_64
         raise unless $activeBackend == "X86_64"
@@ -1430,7 +1445,7 @@
                 sp = RegisterID.new(nil, "sp")
                 $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(operands[0].x86Operand(:int), offsetRegister(-8, sp.x86Operand(:ptr)))}"
                 $asm.puts "mov#{x86Suffix(:int)} #{orderOperands(operands[1].x86Operand(:int), offsetRegister(-4, sp.x86Operand(:ptr)))}"
-                $asm.puts "fld#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
+                $asm.puts "fld#{x86Suffix(:ptr)} #{getSizeString(:double)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
                 $asm.puts "fstp #{operands[2].x87Operand(1)}"
             else
                 $asm.puts "movd #{operands[0].x86Operand(:int)}, #{operands[2].x86Operand(:double)}"
@@ -1442,7 +1457,7 @@
             if useX87
                 sp = RegisterID.new(nil, "sp")
                 if (operands[0].x87DefaultStackPosition == 0)
-                    $asm.puts "fst#{x86Suffix(:ptr)} #{getSizeString(:ptr)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
+                    $asm.puts "fst#{x86Suffix(:ptr)} #{getSizeString(:double)}#{offsetRegister(-8, sp.x86Operand(:ptr))}"
                 else
                     $asm.puts "fld #{operands[0].x87Operand(0)}"
                     $asm.puts "fstpl -8(#{sp.x86Operand(:ptr)})"
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to