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)})"