[pypy-commit] pypy fast-slowpath: gcmap support
fijal
noreply at buildbot.pypy.org
Wed Jul 17 17:52:35 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: fast-slowpath
Changeset: r65443:0b84ace95452
Date: 2013-07-17 17:51 +0200
http://bitbucket.org/pypy/pypy/changeset/0b84ace95452/
Log: gcmap support
diff --git a/rpython/jit/backend/llsupport/test/test_gc_integration.py b/rpython/jit/backend/llsupport/test/test_gc_integration.py
--- a/rpython/jit/backend/llsupport/test/test_gc_integration.py
+++ b/rpython/jit/backend/llsupport/test/test_gc_integration.py
@@ -690,6 +690,36 @@
item = rffi.cast(lltype.Ptr(S), frame.jf_frame[gcmap[0]])
assert item == new_items[2]
+ def test_shadowstack_cond_call(self):
+ cpu = self.cpu
+ cpu.gc_ll_descr.init_nursery(100)
+ cpu.setup_once()
+
+ def check(i, frame):
+ frame = lltype.cast_opaque_ptr(JITFRAMEPTR, frame)
+ assert frame.jf_gcmap[0] # is not empty is good enough
+
+ CHECK = lltype.FuncType([lltype.Signed, llmemory.GCREF], lltype.Void)
+ checkptr = llhelper(lltype.Ptr(CHECK), check)
+ checkdescr = cpu.calldescrof(CHECK, CHECK.ARGS, CHECK.RESULT,
+ EffectInfo.MOST_GENERAL)
+
+ loop = self.parse("""
+ [i0, p0]
+ p = force_token()
+ cond_call(i0, ConstClass(funcptr), i0, p, descr=calldescr)
+ guard_true(i0, descr=faildescr) [p0]
+ """, namespace={
+ 'faildescr': BasicFailDescr(),
+ 'funcptr': checkptr,
+ 'calldescr': checkdescr,
+ })
+ token = JitCellToken()
+ cpu.compile_loop(loop.inputargs, loop.operations, token)
+ S = self.S
+ s = lltype.malloc(S)
+ cpu.execute_token(token, 1, s)
+
def test_shadowstack_collecting_call_float(self):
cpu = self.cpu
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -2145,12 +2145,13 @@
self.mc.TEST(cond_loc, cond_loc)
self.mc.J_il8(rx86.Conditions['Z'], 0) # patched later
jmp_adr = self.mc.get_relative_pos()
- self.push_gcmap(self.mc, gcmap, mov=True)
+ self.push_gcmap(self.mc, gcmap, store=True)
self.mc.CALL(imm(self.cond_call_slowpath[len(arglocs)]))
+ self.pop_gcmap(self.mc)
# never any result value
offset = self.mc.get_relative_pos() - jmp_adr
assert 0 < offset <= 127
- self.mc.overwrite(jmp_adr-1, chr(offset))
+ self.mc.overwrite(jmp_adr-1, chr(offset))
def malloc_cond(self, nursery_free_adr, nursery_top_adr, size, gcmap):
assert size & (WORD-1) == 0 # must be correctly aligned
More information about the pypy-commit
mailing list