Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60412:b06b729af83e
Date: 2013-01-24 01:30 +0200
http://bitbucket.org/pypy/pypy/changeset/b06b729af83e/

Log:    continue writing test until we hit a bug. some stuff still does not
        work though

diff --git a/rpython/jit/backend/llsupport/jitframe.py 
b/rpython/jit/backend/llsupport/jitframe.py
--- a/rpython/jit/backend/llsupport/jitframe.py
+++ b/rpython/jit/backend/llsupport/jitframe.py
@@ -47,7 +47,6 @@
     # guard_not_forced descr
     ('jf_force_descr', llmemory.GCREF),
     # a map of GC pointers
-    ('jf_comingfrom', llmemory.GCREF),
     ('jf_gcmap', lltype.Ptr(GCMAP)),
     # For the front-end: a GCREF for the savedata
     ('jf_savedata', llmemory.GCREF),
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
@@ -862,8 +862,6 @@
         self.mc.RET()
 
     def _call_header_shadowstack(self, gcrootmap):
-        # we need to put two words into the shadowstack: the MARKER_FRAME
-        # and the address of the frame (ebp, actually)
         rst = gcrootmap.get_root_stack_top_addr()
         if rx86.fits_in_32bits(rst):
             self.mc.MOV_rj(eax.value, rst)            # MOV eax, [rootstacktop]
@@ -1252,7 +1250,6 @@
         gcrootmap = self.cpu.gc_ll_descr.gcrootmap
         if gcrootmap and gcrootmap.is_shadow_stack:
             rst = gcrootmap.get_root_stack_top_addr()
-            mc.MOV(ecx, ebp) # debugging
             mc.MOV(edx, heap(rst))
             mc.MOV(ebp, mem(edx, -WORD))
             base_ofs = self.cpu.get_baseofs_of_frame_field()
@@ -2009,6 +2006,8 @@
         ofs = self.cpu.get_ofs_of_frame_field('jf_descr')
         base_ofs = self.cpu.get_baseofs_of_frame_field()
         self.mov(fail_descr_loc, RawStackLoc(ofs))
+        gcmap = self._regalloc.get_gcmap()
+        self.push_gcmap(self.mc, gcmap, store=True)
         self.mc.LEA_rb(eax.value, -base_ofs)
         # exit function
         self._call_footer()
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -119,15 +119,13 @@
             #llop.debug_print(lltype.Void, ">>>> Entering", addr)
             frame_info = clt.frame_info
             frame = jitframe.JITFRAME.allocate(frame_info)
-
-            from rpython.rtyper.annlowlevel import cast_instance_to_gcref
-            
-            frame.jf_comingfrom = cast_instance_to_gcref(executable_token)
             ll_frame = lltype.cast_opaque_ptr(llmemory.GCREF, frame)
             prev_interpreter = None   # help flow space
             if not self.translate_support_code:
                 prev_interpreter = LLInterpreter.current_interpreter
                 LLInterpreter.current_interpreter = self.debug_ll_interpreter
+                if hasattr(self, 'register_frame'):
+                    self.register_frame(frame)
             try:
                 num = JITFRAME_FIXED_SIZE * WORD
                 for i, kind in kinds:
@@ -156,12 +154,6 @@
     cast_ptr_to_int._annspecialcase_ = 'specialize:arglltype(0)'
     cast_ptr_to_int = staticmethod(cast_ptr_to_int)
 
-    all_null_registers = lltype.malloc(rffi.LONGP.TO,
-                                       IS_X86_32 and (16+8)  # 16 + 8 regs
-                                                 or (16+16), # 16 + 16 regs
-                                       flavor='raw', zero=True,
-                                       immortal=True)
-
     def force(self, addr_of_force_token):
         descr = self.signedarraydescr
         ofs = self.unpack_arraydescr(descr)
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,7 +3,7 @@
 """
 
 from rpython.jit.metainterp.history import TargetToken, BasicFinalDescr,\
-     JitCellToken
+     JitCellToken, BasicFailDescr
 from rpython.jit.backend.llsupport.gc import GcLLDescription, GcLLDescr_boehm,\
      GcLLDescr_framework, GcCache
 from rpython.jit.backend.detect_cpu import getcpuclass
@@ -15,6 +15,7 @@
 from rpython.jit.backend.x86.test.test_regalloc import BaseTestRegalloc
 from rpython.jit.backend.x86.regalloc import gpr_reg_mgr_cls
 from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.rtyper.memory.gcheader import GCHeaderBuilder
 
 CPU = getcpuclass()
 
@@ -324,6 +325,9 @@
     layoutbuilder = None
     write_barrier_descr = None
 
+    class GCClass:
+        JIT_WB_IF_FLAG = 0
+
     def get_malloc_slowpath_addr(self):
         return 0
 
@@ -335,9 +339,16 @@
         self.gcrootmap = MockShadowStackRootMap()
 
 def unpack_gcmap(frame):
-    pass
-    #for i in range(len(frame.jf_gcmap)):
-    #    item = frame.jf_gcmap[item]
+    res = []
+    val = 0
+    for i in range(len(frame.jf_gcmap)):
+        item = frame.jf_gcmap[i]
+        while item != 0:
+            if item & 1:
+                res.append(val)
+            val += 1
+            item >>= 1
+    return res
 
 class TestGcShadowstackDirect(BaseTestRegalloc):
     
@@ -352,20 +363,21 @@
         def check(i):
             assert self.cpu.gc_ll_descr.gcrootmap.stack[0] == i - ofs
             frame = rffi.cast(jitframe.JITFRAMEPTR, i - ofs)
-            assert len(frame.jf_frame) == JITFRAME_FIXED_SIZE
+            assert len(frame.jf_frame) == JITFRAME_FIXED_SIZE + 4
             # we "collect"
             frames.append(frame)
             new_frame = frame.copy()
-            self.cpu.gc_ll_descr.gcrootmap.stack[0] = rffi.cast(lltype.Signed, 
new_frame)
+            assert self.cpu.gc_ll_descr.gcrootmap.stack[0] == 
rffi.cast(lltype.Signed, frame)
+            hdrbuilder.new_header(new_frame)
+            #gc_ll_descr.gcrootmap.stack[0] = rffi.cast(lltype.Signed, 
new_frame)
             frames.append(new_frame)
-            import pdb
-            pdb.set_trace()
+            assert unpack_gcmap(frame) == [28, 29, 30]
 
         def check2(i):
             assert self.cpu.gc_ll_descr.gcrootmap.stack[0] == i - ofs
             frame = rffi.cast(jitframe.JITFRAMEPTR, i - ofs)
-            assert frame == frames[1]
-            assert frame != frames[0]
+            #assert frame == frames[1]
+            #assert frame != frames[0]
 
         CHECK = lltype.FuncType([lltype.Signed], lltype.Void)
         checkptr = llhelper(lltype.Ptr(CHECK), check)
@@ -373,15 +385,36 @@
         checkdescr = self.cpu.calldescrof(CHECK, CHECK.ARGS, CHECK.RESULT,
                                           EffectInfo.MOST_GENERAL)
         
+        S = lltype.GcStruct('S',
+                            ('x', lltype.Ptr(lltype.GcArray(lltype.Signed))))
         loop = self.parse("""
-        []
+        [p0, p1, p2]
         i0 = force_token() # this is a bit below the frame
         call(ConstClass(check_adr), i0, descr=checkdescr) # this can collect
+        p3 = getfield_gc(p0, descr=fielddescr)
         call(ConstClass(check2_adr), i0, descr=checkdescr)
-        finish(i0, descr=finaldescr)
+        guard_true(i0, descr=faildescr) [p0, p1, p2, p3]
+        p4 = getfield_gc(p0, descr=fielddescr)
+        finish(p4, descr=finaldescr)
         """, namespace={'finaldescr': BasicFinalDescr(),
+                        'faildescr': BasicFailDescr(),
                         'check_adr': checkptr, 'check2_adr': check2ptr,
-                        'checkdescr': checkdescr})
+                        'checkdescr': checkdescr,
+                        'fielddescr': self.cpu.fielddescrof(S, 'x')})
         token = JitCellToken()
         self.cpu.compile_loop(loop.inputargs, loop.operations, token)
-        frame = self.cpu.execute_token(token)
+        self.cpu.register_frame = lambda frame : hdrbuilder.new_header(frame)
+        HDR = lltype.Struct('HDR', ('tid', lltype.Signed))
+        hdrbuilder = GCHeaderBuilder(HDR)
+        gc_ll_descr = self.cpu.gc_ll_descr
+        gc_ll_descr.gcheaderbuilder = hdrbuilder
+        gc_ll_descr.HDRPTR = lltype.Ptr(HDR)
+        p0 = lltype.malloc(S, zero=True)
+        p1 = lltype.malloc(S)
+        p2 = lltype.malloc(S)
+        hdrbuilder.new_header(p0)
+        hdrbuilder.new_header(p1)
+        hdrbuilder.new_header(p2)
+        frame = self.cpu.execute_token(token, p0, p1, p2)
+        gcmap = unpack_gcmap(lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, 
frame))
+        assert gcmap == [11]
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to