[pypy-commit] pypy ppc-jit-backend: Started implementation of NEW, first test passes
hager
noreply at buildbot.pypy.org
Tue Nov 15 15:01:07 CET 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r49436:dd67675a28a9
Date: 2011-11-15 15:00 +0100
http://bitbucket.org/pypy/pypy/changeset/dd67675a28a9/
Log: Started implementation of NEW, first test passes
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
@@ -606,6 +606,10 @@
else:
assert 0, itemsize.value
+ def emit_new(self, op, arglocs, regalloc):
+ # XXX do exception handling here!
+ pass
+
def emit_same_as(self, op, arglocs, regalloc):
argloc, resloc = arglocs
self.regalloc_mov(argloc, resloc)
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
@@ -115,6 +115,7 @@
self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
self.fail_boxes_ptr = values_array(llmemory.GCREF, failargs_limit)
self.mc = None
+ self.malloc_func_addr = 0
self.datablockwrapper = None
self.memcpy_addr = 0
self.fail_boxes_count = 0
@@ -456,6 +457,10 @@
allblocks)
def setup_once(self):
+ gc_ll_descr = self.cpu.gc_ll_descr
+ gc_ll_descr.initialize()
+ ll_new = gc_ll_descr.get_funcptr_for_new()
+ self.malloc_func_addr = rffi.cast(lltype.Signed, ll_new)
self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
self.setup_failure_recovery()
self.exit_code_adr = self._gen_exit_path()
@@ -857,6 +862,34 @@
assert gcrootmap.is_shadow_stack
gcrootmap.write_callshape(mark, force_index)
+ 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
+ # (i.e. where the GC pointers are in the stack) around a CALL
+ # instruction that doesn't already have a force_index.
+ gcrootmap = self.cpu.gc_ll_descr.gcrootmap
+ if gcrootmap and gcrootmap.is_shadow_stack:
+ clt = self.current_clt
+ force_index = clt.reserve_and_record_some_faildescr_index()
+ self._write_fail_index(force_index)
+ return force_index
+ else:
+ return 0
+
+ def _write_fail_index(self, fail_index):
+ self.mc.load_imm(r.r0.value, fail_index)
+ if IS_PPC_32:
+ self.mc.stw(r.r0.value, r.SSP.value, 0)
+ else:
+ self.mc.std(r.r0.value, r.SSP.value, 0)
+
+ def load(self, loc, value):
+ assert loc.is_reg() and value.is_imm()
+ if value.is_imm():
+ self.mc.load_imm(loc, value.getint())
+ elif value.is_imm_float():
+ assert 0, "not implemented yet"
+
def notimplemented_op(self, op, arglocs, regalloc):
raise NotImplementedError, op
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -627,6 +627,17 @@
prepare_cast_ptr_to_int = prepare_same_as
prepare_cast_int_to_ptr = prepare_same_as
+ def prepare_new(self, op):
+ gc_ll_descr = self.assembler.cpu.gc_ll_descr
+ # XXX introduce the fastpath for malloc
+ arglocs = self._prepare_args_for_new_op(op.getdescr())
+ force_index = self.assembler.write_new_force_index()
+ self.assembler._emit_call(force_index, self.assembler.malloc_func_addr,
+ arglocs, self, result=op.result)
+ self.possibly_free_vars(arglocs)
+ self.possibly_free_var(op.result)
+ return []
+
def prepare_call(self, op):
effectinfo = op.getdescr().get_extra_info()
if effectinfo is not None:
@@ -641,6 +652,18 @@
prepare_debug_merge_point = void
prepare_jit_debug = void
+ def _prepare_args_for_new_op(self, new_args):
+ gc_ll_descr = self.cpu.gc_ll_descr
+ args = gc_ll_descr.args_for_new(new_args)
+ arglocs = []
+ for i in range(len(args)):
+ arg = args[i]
+ t = TempInt()
+ l = self.force_allocate_reg(t, selected_reg=r.MANAGED_REGS[i])
+ self.assembler.load(l, imm(arg))
+ arglocs.append(t)
+ return arglocs
+
# from ../x86/regalloc.py:791
def _unpack_fielddescr(self, fielddescr):
assert isinstance(fielddescr, BaseFieldDescr)
More information about the pypy-commit
mailing list