[pypy-svn] pypy 32ptr-on-64bit: In-progress: calls with HiddenGcRef32s as arguments or result.

arigo commits-noreply at bitbucket.org
Sat Apr 16 12:29:49 CEST 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: 32ptr-on-64bit
Changeset: r43397:75a62468dae4
Date: 2011-04-16 12:28 +0200
http://bitbucket.org/pypy/pypy/changeset/75a62468dae4/

Log:	In-progress: calls with HiddenGcRef32s as arguments or result.

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -16,7 +16,7 @@
 from pypy.jit.backend.llsupport.descr import BaseSizeDescr, BaseArrayDescr
 from pypy.jit.backend.llsupport.descr import GcCache, get_field_descr
 from pypy.jit.backend.llsupport.descr import GcPtrFieldDescr
-from pypy.jit.backend.llsupport.descr import get_call_descr
+from pypy.jit.backend.llsupport.descr import get_call_descr, BaseCallDescr
 from pypy.jit.backend.llsupport.descr import GcPtrHidden32FieldDescr
 from pypy.jit.backend.llsupport.descr import GcPtrHidden32ArrayDescr
 from pypy.rpython.memory.gctransform import asmgcroot
@@ -42,7 +42,9 @@
             # skip non-translated tests (using Boehm) if compressed ptrs
             for op in operations:
                 if (isinstance(op.getdescr(), GcPtrHidden32FieldDescr) or
-                    isinstance(op.getdescr(), GcPtrHidden32ArrayDescr)):
+                    isinstance(op.getdescr(), GcPtrHidden32ArrayDescr) or
+                    (isinstance(op.getdescr(), BaseCallDescr) and
+                     'H' in op.getdescr().get_arg_types())):
                     from pypy.jit.metainterp.test.support import SkipThisRun
                     raise SkipThisRun("non-translated test with compressptr")
     def can_inline_malloc(self, descr):
@@ -846,9 +848,10 @@
                         self._gen_write_barrier(newops, op.getarg(0), v)
                         op = op.copy_and_change(rop.SETARRAYITEM_RAW)
             # ---------- compressptr support ----------
+            descr = op.getdescr()
             if (self.supports_compressed_ptrs and
-                (isinstance(op.getdescr(), GcPtrHidden32FieldDescr) or
-                 isinstance(op.getdescr(), GcPtrHidden32ArrayDescr))):
+                (isinstance(descr, GcPtrHidden32FieldDescr) or
+                 isinstance(descr, GcPtrHidden32ArrayDescr))):
                 num = op.getopnum()
                 if (num == rop.GETFIELD_GC or
                     num == rop.GETFIELD_GC_PURE or
@@ -869,6 +872,19 @@
                     newops.append(ResOperation(rop.HIDE_INTO_PTR32, [v1], v2))
                     op = op.copy_and_change(num, args=[op.getarg(0),
                                                        op.getarg(1), v2])
+            elif (self.supports_compressed_ptrs and
+                  isinstance(descr, BaseCallDescr)):
+                args = op.getarglist()
+                arg_classes = descr.get_arg_types()
+                assert len(args) == len(arg_classes)
+                for i in range(len(arg_classes)):
+                    if arg_classes[i] == 'H':
+                        v1 = args[i]
+                        v2 = BoxInt()
+                        newops.append(ResOperation(rop.HIDE_INTO_PTR32,
+                                                   [v1], v2))
+                        args[i] = v2
+                        op = op.copy_and_change(op.getopnum(), args=args)
             # ----------
             newops.append(op)
         del operations[:]

diff --git a/pypy/jit/metainterp/test/test_rcompressed.py b/pypy/jit/metainterp/test/test_rcompressed.py
--- a/pypy/jit/metainterp/test/test_rcompressed.py
+++ b/pypy/jit/metainterp/test/test_rcompressed.py
@@ -44,3 +44,9 @@
             return z.n * 1000 + ord(t.c)
         res = self.interp_operations(f, [42])
         assert res == 42063
+
+    def test_call_argument(self):
+        ...
+
+    def test_call_result(self):
+        ...

diff --git a/pypy/jit/codewriter/heaptracker.py b/pypy/jit/codewriter/heaptracker.py
--- a/pypy/jit/codewriter/heaptracker.py
+++ b/pypy/jit/codewriter/heaptracker.py
@@ -1,4 +1,5 @@
 from pypy.rpython.lltypesystem import lltype, llmemory, rclass
+from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rlib.objectmodel import we_are_translated
 
 
@@ -34,6 +35,18 @@
             raise ValueError(TYPE)
     return result
 
+def cast_to_gcref(value):
+    TYPE = lltype.typeOf(value)
+    if isinstance(TYPE.TO, lltype.GcOpaqueType):
+        if TYPE == llmemory.GCREF:
+            return value
+        elif TYPE == llmemory.HiddenGcRef32:
+            return llop.show_from_ptr32(llmemory.GCREF, value)
+        else:
+            raise TypeError(TYPE)
+    else:
+        return lltype.cast_opaque_ptr(llmemory.GCREF, value)
+
 # ____________________________________________________________
 
 def has_gcstruct_a_vtable(GCSTRUCT):

diff --git a/pypy/jit/codewriter/assembler.py b/pypy/jit/codewriter/assembler.py
--- a/pypy/jit/codewriter/assembler.py
+++ b/pypy/jit/codewriter/assembler.py
@@ -84,7 +84,7 @@
                     return True
             constants = self.constants_i
         elif kind == 'ref':
-            value = lltype.cast_opaque_ptr(llmemory.GCREF, value)
+            value = heaptracker.cast_to_gcref(value)
             constants = self.constants_r
         elif kind == 'float':
             if const.concretetype == lltype.Float:

diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -531,7 +531,7 @@
     def bh_call_r(self, func, calldescr, args_i, args_r, args_f):
         assert isinstance(calldescr, GcPtrCallDescr)
         if not we_are_translated():
-            calldescr.verify_types(args_i, args_r, args_f, history.REF)
+            calldescr.verify_types(args_i, args_r, args_f, history.REF + 'H')
         return calldescr.call_stub(func, args_i, args_r, args_f)
 
     def bh_call_f(self, func, calldescr, args_i, args_r, args_f):

diff --git a/pypy/jit/backend/llsupport/descr.py b/pypy/jit/backend/llsupport/descr.py
--- a/pypy/jit/backend/llsupport/descr.py
+++ b/pypy/jit/backend/llsupport/descr.py
@@ -1,5 +1,6 @@
 import py
 from pypy.rpython.lltypesystem import lltype, rffi, llmemory, rclass
+from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.jit.backend.llsupport import symbolic, support
 from pypy.jit.metainterp.history import AbstractDescr, getkind, BoxInt, BoxPtr
 from pypy.jit.metainterp.history import BasicFailDescr, LoopToken, BoxFloat
@@ -270,7 +271,7 @@
     arg_classes = ''     # <-- annotation hack
 
     def __init__(self, arg_classes, extrainfo=None):
-        self.arg_classes = arg_classes    # string of "r" and "i" (ref/int)
+        self.arg_classes = arg_classes    # string of chars, see get_call_descr
         self.extrainfo = extrainfo
 
     def get_extra_info(self):
@@ -295,6 +296,9 @@
                 c = 'f'
             elif c == 'f' and longlong.supports_longlong:
                 return 'longlong.getrealfloat(%s)' % (process('L'),)
+            elif c == 'H':
+                return 'llop.hide_into_ptr32(llmemory.HiddenGcRef32, %s)' % (
+                    process('r'),)
             arg = 'args_%s[%d]' % (c, seen[c])
             seen[c] += 1
             return arg
@@ -310,6 +314,8 @@
                 return lltype.Void
             elif arg == 'L':
                 return lltype.SignedLongLong
+            elif arg == 'H':
+                return llmemory.HiddenGcRef32
             else:
                 raise AssertionError(arg)
 
@@ -344,7 +350,8 @@
     def verify_types(self, args_i, args_r, args_f, return_type):
         assert self._return_type in return_type
         assert self.arg_classes.count('i') == len(args_i or ())
-        assert self.arg_classes.count('r') == len(args_r or ())
+        assert (self.arg_classes.count('r') +
+                self.arg_classes.count('H')) == len(args_r or ())
         assert (self.arg_classes.count('f') +
                 self.arg_classes.count('L')) == len(args_f or ())
 
@@ -435,10 +442,14 @@
 def get_call_descr(gccache, ARGS, RESULT, extrainfo=None):
     arg_classes = []
     for ARG in ARGS:
-        assert ARG != llmemory.HiddenGcRef32
         kind = getkind(ARG)
-        if   kind == 'int': arg_classes.append('i')
-        elif kind == 'ref': arg_classes.append('r')
+        if kind == 'int':
+            arg_classes.append('i')
+        elif kind == 'ref':
+            if ARG == llmemory.HiddenGcRef32:
+                arg_classes.append('H')
+            else:
+                arg_classes.append('r')
         elif kind == 'float':
             if is_longlong(ARG):
                 arg_classes.append('L')


More information about the Pypy-commit mailing list