[pypy-commit] pypy jitframe-on-heap: enough work to avoid an assert

fijal noreply at buildbot.pypy.org
Thu Jan 24 13:10:49 CET 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: jitframe-on-heap
Changeset: r60417:d2c1694ddea7
Date: 2013-01-24 14:10 +0200
http://bitbucket.org/pypy/pypy/changeset/d2c1694ddea7/

Log:	enough work to avoid an assert

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
@@ -2339,9 +2339,12 @@
             mask = descr.jit_wb_if_flag_singlebyte | -0x80
         #
         loc_base = arglocs[0]
-        mc.TEST8(addr_add_const(loc_base,
-                                     descr.jit_wb_if_flag_byteofs + extra_ofs),
-                      imm(mask))
+        if loc_base is ebp:
+            loc = raw_stack(descr.jit_wb_if_flag_byteofs + extra_ofs)
+        else:
+            loc = addr_add_const(loc_base, descr.jit_wb_if_flag_byteofs +
+                                 extra_ofs)
+        mc.TEST8(loc, imm(mask))
         mc.J_il8(rx86.Conditions['Z'], 0) # patched later
         jz_location = mc.get_relative_pos()
 
diff --git a/rpython/jit/backend/x86/rx86.py b/rpython/jit/backend/x86/rx86.py
--- a/rpython/jit/backend/x86/rx86.py
+++ b/rpython/jit/backend/x86/rx86.py
@@ -582,6 +582,7 @@
     CDQ = insn(rex_nw, '\x99')
 
     TEST8_mi = insn(rex_nw, '\xF6', orbyte(0<<3), mem_reg_plus_const(1), immediate(2, 'b'))
+    TEST8_bi = insn(rex_nw, '\xF6', orbyte(0<<3), stack_bp(1), immediate(2, 'b'))
     TEST8_ji = insn(rex_nw, '\xF6', orbyte(0<<3), abs_, immediate(1), immediate(2, 'b'))
     TEST_rr = insn(rex_w, '\x85', register(2,8), register(1), '\xC0')
 
diff --git a/rpython/jit/backend/x86/test/test_gc_integration.py b/rpython/jit/backend/x86/test/test_gc_integration.py
--- a/rpython/jit/backend/x86/test/test_gc_integration.py
+++ b/rpython/jit/backend/x86/test/test_gc_integration.py
@@ -3,14 +3,14 @@
 """
 
 from rpython.jit.metainterp.history import TargetToken, BasicFinalDescr,\
-     JitCellToken, BasicFailDescr
+     JitCellToken, BasicFailDescr, AbstractDescr
 from rpython.jit.backend.llsupport.gc import GcLLDescription, GcLLDescr_boehm,\
      GcLLDescr_framework, GcCache
 from rpython.jit.backend.detect_cpu import getcpuclass
 from rpython.jit.backend.x86.arch import WORD, JITFRAME_FIXED_SIZE
 from rpython.jit.backend.llsupport import jitframe
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
-from rpython.rtyper.annlowlevel import llhelper
+from rpython.rtyper.annlowlevel import llhelper, llhelper_args
 
 from rpython.jit.backend.x86.test.test_regalloc import BaseTestRegalloc
 from rpython.jit.backend.x86.regalloc import gpr_reg_mgr_cls
@@ -125,8 +125,8 @@
 
 class GCDescrFastpathMalloc(GcLLDescription):
     gcrootmap = None
+    passes_frame = True
     write_barrier_descr = None
-    passes_frame = True
 
     def __init__(self, callback):
         GcLLDescription.__init__(self, None)
@@ -321,19 +321,35 @@
     def get_root_stack_top_addr(self):
         return rffi.cast(lltype.Signed, self.stack_addr)
 
+class WriteBarrierDescr(AbstractDescr):
+    jit_wb_cards_set = 0
+    jit_wb_if_flag_singlebyte = 1
+    
+    def __init__(self, gc_ll_descr):
+        def write_barrier(x):
+            import pdb
+            pdb.set_trace()
+
+        self.write_barrier_fn = llhelper_args(write_barrier,
+                                              [lltype.Signed], lltype.Void)
+
+    def get_write_barrier_fn(self, cpu):
+        return self.write_barrier_fn
+
 class GCDescrShadowstackDirect(GcLLDescr_framework):
     layoutbuilder = None
-    write_barrier_descr = None
 
     class GCClass:
         JIT_WB_IF_FLAG = 0
 
     def __init__(self, nursery_size=100):
         GcCache.__init__(self, False, None)
+        self._generated_functions = []
         self.gcrootmap = MockShadowStackRootMap()
         self.nursery = lltype.malloc(rffi.CArray(lltype.Char), nursery_size,
                                      flavor='raw')
         self.nursery_addr = rffi.cast(lltype.Signed, self.nursery)
+        self.write_barrier_descr = WriteBarrierDescr(self)
 
     def get_malloc_slowpath_addr(self):
         return 0
@@ -361,11 +377,19 @@
     def setup_method(self, meth):
         cpu = CPU(None, None)
         cpu.gc_ll_descr = GCDescrShadowstackDirect()
-        cpu.setup_once()
+        wbd = cpu.gc_ll_descr.write_barrier_descr
+        wbd.jit_wb_if_flag_byteofs = 0 # directly into 'hdr' field
+        cpu.setup_once() 
+        S = lltype.GcForwardReference()
+        S.become(lltype.GcStruct('S',
+                                 ('hdr', lltype.Signed),
+                                 ('x', lltype.Ptr(S))))
+        self.S = S
         self.cpu = cpu
 
     def test_shadowstack_call(self):
         cpu = self.cpu
+        S = self.S
         ofs = cpu.get_baseofs_of_frame_field()
         frames = []
         
@@ -397,9 +421,6 @@
         checkdescr = cpu.calldescrof(CHECK, CHECK.ARGS, CHECK.RESULT,
                                           EffectInfo.MOST_GENERAL)
 
-        S = lltype.GcForwardReference()
-        S.become(lltype.GcStruct('S',
-                                 ('x', lltype.Ptr(S))))
         loop = self.parse("""
         [p0, p1, p2]
         i0 = force_token() # this is a bit below the frame
@@ -437,6 +458,3 @@
         assert gcmap[0] < 29
         item = rffi.cast(lltype.Ptr(S), frame.jf_frame[gcmap[0]])
         assert item == new_items[2]
-
-    def test_malloc_slowpath(self):
-        cpu = self.cpu
diff --git a/rpython/rtyper/annlowlevel.py b/rpython/rtyper/annlowlevel.py
--- a/rpython/rtyper/annlowlevel.py
+++ b/rpython/rtyper/annlowlevel.py
@@ -365,6 +365,8 @@
     else:
         return lltype.functionptr(F.TO, f.func_name, _callable=f)
 
+def llhelper_args(f, ARGS, RESULT):
+    return llhelper(lltype.Ptr(lltype.FuncType(ARGS, RESULT)), f)
 
 class LLHelperEntry(extregistry.ExtRegistryEntry):
     _about_ = llhelper


More information about the pypy-commit mailing list