[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