[pypy-svn] pypy jit-shadowstack: hg merge default
arigo
commits-noreply at bitbucket.org
Thu Mar 31 11:43:28 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: jit-shadowstack
Changeset: r43038:ce1ffe4565e2
Date: 2011-03-31 11:41 +0200
http://bitbucket.org/pypy/pypy/changeset/ce1ffe4565e2/
Log: hg merge default
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -217,18 +217,26 @@
self.malloc_fixedsize_slowpath2 = rawstart
def _build_stack_check_slowpath(self):
- from pypy.rlib import rstack
_, _, slowpathaddr = self.cpu.insert_stack_check()
if slowpathaddr == 0 or self.cpu.exit_frame_with_exception_v < 0:
return # no stack check (for tests, or non-translated)
#
+ # make a "function" that is called immediately at the start of
+ # an assembler function. In particular, the stack looks like:
+ #
+ # | ... | <-- aligned to a multiple of 16
+ # | retaddr of caller |
+ # | my own retaddr | <-- esp
+ # +---------------------+
+ #
mc = codebuf.MachineCodeBlockWrapper()
- mc.PUSH_r(ebp.value)
- mc.MOV_rr(ebp.value, esp.value)
#
- if IS_X86_64:
+ if IS_X86_32:
+ stack_size = WORD
+ elif IS_X86_64:
# on the x86_64, we have to save all the registers that may
# have been used to pass arguments
+ stack_size = WORD + 6*WORD + 8*8
for reg in [edi, esi, edx, ecx, r8, r9]:
mc.PUSH_r(reg.value)
mc.SUB_ri(esp.value, 8*8)
@@ -237,11 +245,12 @@
#
if IS_X86_32:
mc.LEA_rb(eax.value, +8)
+ mc.PUSH_r(eax.value) # alignment
mc.PUSH_r(eax.value)
elif IS_X86_64:
mc.LEA_rb(edi.value, +16)
- mc.AND_ri(esp.value, -16)
#
+ # esp is now aligned to a multiple of 16 again
mc.CALL(imm(slowpathaddr))
#
mc.MOV(eax, heap(self.cpu.pos_exception()))
@@ -253,12 +262,10 @@
# restore the registers
for i in range(7, -1, -1):
mc.MOVSD_xs(i, 8*i)
- for i, reg in [(6, r9), (5, r8), (4, ecx),
- (3, edx), (2, esi), (1, edi)]:
- mc.MOV_rb(reg.value, -8*i)
+ mc.ADD_ri(esp.value, 8*8)
+ for reg in [r9, r8, ecx, edx, esi, edi]:
+ mc.POP_r(reg.value)
#
- mc.MOV_rr(esp.value, ebp.value)
- mc.POP_r(ebp.value)
mc.RET()
#
# patch the JNZ above
@@ -283,9 +290,7 @@
# function, and will instead return to the caller's caller. Note
# also that we completely ignore the saved arguments, because we
# are interrupting the function.
- mc.MOV_rr(esp.value, ebp.value)
- mc.POP_r(ebp.value)
- mc.ADD_ri(esp.value, WORD)
+ mc.ADD_ri(esp.value, stack_size)
mc.RET()
#
rawstart = mc.materialize(self.cpu.asmmemmgr, [])
More information about the Pypy-commit
mailing list