Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r50755:81c255a5fb96 Date: 2011-12-20 15:36 +0100 http://bitbucket.org/pypy/pypy/changeset/81c255a5fb96/
Log: begin of exceptopn handling during memory allocation diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py --- a/pypy/jit/backend/ppc/ppcgen/opassembler.py +++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py @@ -838,7 +838,7 @@ self.mc.std(r.r0.value, r.r3.value, self.cpu.vtable_offset) def emit_new_array(self, op, arglocs, regalloc): - # XXX handle memory errors + self.propagate_memoryerror_if_r3_is_null() if len(arglocs) > 0: value_loc, base_loc, ofs_length = arglocs if IS_PPC_32: diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py --- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py +++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py @@ -102,6 +102,7 @@ self.current_clt = None self._regalloc = None self.max_stack_params = 0 + self.propagate_exception_path = 0 def _save_nonvolatiles(self): """ save nonvolatile GPRs in GPR SAVE AREA @@ -290,6 +291,21 @@ locs.append(loc) return locs + def _build_propagate_exception_path(self): + if self.cpu.propagate_exception_v < 0: + return + + mc = PPCBuilder() + with Saved_Volatiles(mc): + addr = self.cpu.get_on_leave_jitted_int(save_exception=True) + mc.bl_abs(addr) + #mc.alloc_scratch_reg(self.cpu.propagate_exception_v) + #mc.mr(r.RES.value, r.SCRATCH.value) + #mc.free_scratch_reg() + mc.load_imm(r.RES, self.cpu.propagate_exception_v) + mc.prepare_insts_blocks() + self.propagate_exception_path = mc.materialize(self.cpu.asmmemmgr, []) + def _gen_leave_jitted_hook_code(self, save_exc=False): mc = PPCBuilder() @@ -328,7 +344,7 @@ # load parameters into parameter registers if IS_PPC_32: mc.lwz(r.r3.value, r.SPP.value, self.ENCODING_AREA) # address of state encoding - else: + else: mc.ld(r.r3.value, r.SPP.value, self.ENCODING_AREA) mc.mr(r.r4.value, r.SP.value) # load stack pointer mc.mr(r.r5.value, r.SPP.value) # load spilling pointer @@ -495,6 +511,7 @@ gc_ll_descr.initialize() ll_new = gc_ll_descr.get_funcptr_for_new() self.malloc_func_addr = rffi.cast(lltype.Signed, ll_new) + self._build_propagate_exception_path() if gc_ll_descr.get_funcptr_for_newarray is not None: ll_new_array = gc_ll_descr.get_funcptr_for_newarray() self.malloc_array_func_addr = rffi.cast(lltype.Signed, @@ -955,6 +972,10 @@ assert gcrootmap.is_shadow_stack gcrootmap.write_callshape(mark, force_index) + def propagate_memoryerror_if_r3_is_null(self): + self.mc.cmp_op(0, r.RES.value, 0, imm=True) + self.mc.b_cond_abs(self.propagate_exception_path, c.EQ) + def write_new_force_index(self): # for shadowstack only: get a new, unused force_index number and # write it to FORCE_INDEX_OFS. Used to record the call shape _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit