Author: Armin Rigo <[email protected]>
Branch: fast-gil
Changeset: r69828:2473e1024a80
Date: 2014-03-09 13:41 +0100
http://bitbucket.org/pypy/pypy/changeset/2473e1024a80/
Log: Fix (32-bit, shadowstack, long long result not correctly
saved/restored in case of threads)
diff --git a/rpython/jit/backend/x86/callbuilder.py
b/rpython/jit/backend/x86/callbuilder.py
--- a/rpython/jit/backend/x86/callbuilder.py
+++ b/rpython/jit/backend/x86/callbuilder.py
@@ -169,12 +169,12 @@
je_location = mc.get_relative_pos()
#
# Yes, we need to call the reopenstack() function
- self.save_result_value_reacq()
+ self.save_result_value_reacq(restore_edx)
if IS_X86_32:
mc.MOV_sr(4, css_value.value)
mc.MOV_sr(0, old_value.value)
mc.CALL(imm(self.asm.reacqgil_addr))
- self.restore_result_value_reacq()
+ self.restore_result_value_reacq(restore_edx)
#
# patch the JE above
offset = mc.get_relative_pos() - je_location
@@ -196,11 +196,11 @@
#else:
# for shadowstack, done for us by _reload_frame_if_necessary()
- def save_result_value_reacq(self):
+ def save_result_value_reacq(self, restore_edx):
"""Overridden in CallBuilder32 and CallBuilder64"""
raise NotImplementedError
- def restore_result_value_reacq(self):
+ def restore_result_value_reacq(self, restore_edx):
"""Overridden in CallBuilder32 and CallBuilder64"""
raise NotImplementedError
@@ -271,7 +271,7 @@
else:
CallBuilderX86.load_result(self)
- def save_result_value_reacq(self):
+ def save_result_value_reacq(self, restore_edx):
# Temporarily save the result value into [ESP+8]. We use "+8"
# in order to leave the two initial words free, in case it's needed.
# Also note that in this 32-bit case, a long long return value is
@@ -283,7 +283,8 @@
# a float or a long long return
if self.restype == 'L':
self.mc.MOV_sr(8, eax.value) # long long
- #self.mc.MOV_sr(12, edx.value) -- already done
+ if not restore_edx:
+ self.mc.MOV_sr(12, edx.value)
else:
self.mc.FSTPL_s(8) # float return
else:
@@ -294,7 +295,7 @@
assert self.ressize <= WORD
self.mc.MOV_sr(8, eax.value)
- def restore_result_value_reacq(self):
+ def restore_result_value_reacq(self, restore_edx):
# Opposite of save_result_value_reacq()
if self.ressize == 0: # void return
return
@@ -302,7 +303,8 @@
# a float or a long long return
if self.restype == 'L':
self.mc.MOV_rs(eax.value, 8) # long long
- #self.mc.MOV_rs(edx.value, 12) -- will be done for us
+ if not restore_edx:
+ self.mc.MOV_rs(edx.value, 12)
else:
self.mc.FLDL_s(8) # float return
else:
@@ -426,7 +428,7 @@
else:
CallBuilderX86.load_result(self)
- def save_result_value_reacq(self):
+ def save_result_value_reacq(self, restore_edx):
# Temporarily save the result value into [ESP].
if self.ressize == 0: # void return
return
@@ -444,7 +446,7 @@
assert self.restype == INT
self.mc.MOV_sr(0, eax.value)
- def restore_result_value_reacq(self):
+ def restore_result_value_reacq(self, restore_edx):
# Opposite of save_result_value_reacq()
if self.ressize == 0: # void return
return
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit