[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