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