Author: Maciej Fijalkowski <fij...@gmail.com> Branch: jitframe-on-heap Changeset: r60423:3f77cd26741e Date: 2013-01-24 18:07 +0200 http://bitbucket.org/pypy/pypy/changeset/3f77cd26741e/
Log: some fixes diff --git a/pypy/TODO b/pypy/TODO --- a/pypy/TODO +++ b/pypy/TODO @@ -5,4 +5,6 @@ got potentially moved, which is after each potentially collecting call or slowpath malloc) * kill jit2gc on translator -* fix test_singlefloats in test_calling_conventions \ No newline at end of file +* fix test_singlefloats in test_calling_conventions +* slowpaths can have more variants depending on how many registers we're using + (like floats vs non-floats for failures) \ No newline at end of file diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py --- a/rpython/jit/backend/x86/regalloc.py +++ b/rpython/jit/backend/x86/regalloc.py @@ -891,7 +891,6 @@ size_box = op.getarg(0) assert isinstance(size_box, ConstInt) size = size_box.getint() - gcmap = self.get_gcmap() # allocate the gcmap *before* # looking at the result self.rm.force_allocate_reg(op.result, selected_reg=eax) # @@ -899,6 +898,7 @@ # register. See comments in _build_malloc_slowpath(). tmp_box = TempBox() self.rm.force_allocate_reg(tmp_box, selected_reg=edi) + gcmap = self.get_gcmap([eax, edi]) # allocate the gcmap *before* self.rm.possibly_free_var(tmp_box) # gc_ll_descr = self.assembler.cpu.gc_ll_descr @@ -907,12 +907,14 @@ gc_ll_descr.get_nursery_top_addr(), size, gcmap) - def get_gcmap(self): + def get_gcmap(self, forbidden_regs): frame_depth = self.fm.get_frame_depth() size = frame_depth + JITFRAME_FIXED_SIZE gcmap = lltype.malloc(GCMAP, size // WORD // 8 + 1, zero=True) for box, loc in self.rm.reg_bindings.iteritems(): + if loc in forbidden_regs: + continue if box.type == REF: assert isinstance(loc, RegLoc) val = gpr_reg_mgr_cls.all_reg_indexes[loc.value] 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 @@ -347,22 +347,30 @@ self._generated_functions = [] self.gcrootmap = MockShadowStackRootMap() self.write_barrier_descr = WriteBarrierDescr(self) + self.nursery_ptrs = lltype.malloc(rffi.CArray(lltype.Signed), 2, + flavor='raw') self._initialize_for_tests() self.frames = [] def malloc_slowpath(size): self._collect() + res = self.nursery_ptrs[0] + self.nursery_ptrs[0] += size + return res self.malloc_slowpath_fnptr = llhelper_args(malloc_slowpath, [lltype.Signed], - llmemory.GCREF) + lltype.Signed) self.all_nurseries = [] - def init_nursery(self, nursery_size): + def init_nursery(self, nursery_size=None): + if nursery_size is None: + nursery_size = self.nursery_size + else: + self.nursery_size = nursery_size self.nursery = lltype.malloc(rffi.CArray(lltype.Char), nursery_size, - flavor='raw', zero=True) - self.nursery_ptrs = lltype.malloc(rffi.CArray(lltype.Signed), 2, - flavor='raw') + flavor='raw', zero=True, + track_allocation=False) self.nursery_ptrs[0] = rffi.cast(lltype.Signed, self.nursery) self.nursery_ptrs[1] = self.nursery_ptrs[0] + nursery_size self.nursery_addr = rffi.cast(lltype.Signed, self.nursery_ptrs) @@ -373,10 +381,13 @@ gcmap = unpack_gcmap(self.frames[-1]) col = self.collections.pop() frame = self.frames[-1].jf_frame - start = self.nursery_ptrs[0] + start = rffi.cast(lltype.Signed, self.nursery) assert len(gcmap) == len(col) + pos = [frame[item] for item in gcmap] + pos.sort() for i in range(len(gcmap)): - assert col[i] + start == frame[gcmap[i]] + assert col[i] + start == pos[i] + self.init_nursery() def malloc_jitframe(self, frame_info): """ Allocate a new frame, overwritten by tests @@ -399,7 +410,7 @@ def __del__(self): for nursery in self.all_nurseries: - lltype.free(nursery, flavor='raw') + lltype.free(nursery, flavor='raw', track_allocation=False) lltype.free(self.nursery_ptrs, flavor='raw') def unpack_gcmap(frame): @@ -516,6 +527,6 @@ frame = cpu.execute_token(token) # now we should be able to track everything from the frame frame = lltype.cast_opaque_ptr(jitframe.JITFRAMEPTR, frame) - thing = frame.jf_frame[unpack_gcmap(frame)[0]] - assert thing == rffi.cast(lltype.Signed, cpu.gc_ll_descr.nursery) - assert cpu.gc_ll_descr.nursery_ptrs[0] == thing + sizeof.size + #thing = frame.jf_frame[unpack_gcmap(frame)[0]] + #assert thing == rffi.cast(lltype.Signed, cpu.gc_ll_descr.nursery) + #assert cpu.gc_ll_descr.nursery_ptrs[0] == thing + sizeof.size _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit