[pypy-svn] r65642 - in pypy/branch/pyjitpl5-experiments/pypy/jit/backend: llvm test
arigo at codespeak.net
arigo at codespeak.net
Sun Jun 7 16:18:02 CEST 2009
Author: arigo
Date: Sun Jun 7 16:18:01 2009
New Revision: 65642
Modified:
pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py
pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py
Log:
setfield/getfield with pointer fields.
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/llvm/runner.py Sun Jun 7 16:18:01 2009
@@ -8,6 +8,7 @@
from pypy.jit.metainterp import resoperation
from pypy.jit.metainterp.history import TreeLoop
from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.backend.x86 import symbolic # xxx
TreeLoop._llvm_compiled_index = -1
@@ -217,13 +218,15 @@
return llmemory.cast_ptr_to_adr(rffi.cast(llmemory.GCREF, x))
def fielddescrof(self, S, fieldname):
- from pypy.jit.backend.x86 import symbolic # xxx
try:
return self._descr_caches['field', S, fieldname]
except KeyError:
pass
ofs, size = symbolic.get_field_token(S, fieldname,
self.translate_support_code)
+ if (isinstance(getattr(S, fieldname), lltype.Ptr) and
+ getattr(S, fieldname).TO._gckind == 'gc'):
+ size = -1
descr = FieldDescr(ofs, size)
self._descr_caches['field', S, fieldname] = descr
return descr
@@ -232,7 +235,7 @@
class FieldDescr(AbstractDescr):
def __init__(self, offset, size):
self.offset = offset
- self.size = size
+ self.size = size # set to -1 to mark a pointer field
# ____________________________________________________________
@@ -617,21 +620,28 @@
self.getptrarg(v_structure),
indices, 1, "")
lltype.free(indices, flavor='raw')
- return llvm_rffi.LLVMBuildBitCast(self.builder,
- location,
- self.cpu.ty_int_ptr, # XXX
- "")
+ if fielddescr.size < 0: # pointer field
+ ty = self.cpu.ty_char_ptr_ptr
+ else:
+ assert fielddescr.size == symbolic.get_size(lltype.Signed, # XXX
+ self.cpu.translate_support_code)
+ ty = self.cpu.ty_int_ptr
+ return llvm_rffi.LLVMBuildBitCast(self.builder, location, ty, "")
def generate_GETFIELD_GC(self, op):
loc = self._generate_field_gep(op.args[0], op.descr)
+ # XXX zero-extension for char fields
self.vars[op.result] = llvm_rffi.LLVMBuildLoad(self.builder,
loc, "")
def generate_SETFIELD_GC(self, op):
loc = self._generate_field_gep(op.args[0], op.descr)
- llvm_rffi.LLVMBuildStore(self.builder,
- self.getintarg(op.args[1]), # XXX
- loc, "")
+ if llvm_rffi.LLVMTypeOf(loc) == self.cpu.ty_char_ptr_ptr:
+ value_ref = self.getptrarg(op.args[1])
+ else:
+ value_ref = self.getintarg(op.args[1])
+ # XXX mask for char fields
+ llvm_rffi.LLVMBuildStore(self.builder, value_ref, loc, "")
# ____________________________________________________________
Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py (original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/backend/test/runner_test.py Sun Jun 7 16:18:01 2009
@@ -245,6 +245,15 @@
res = self.execute_operation(rop.GETFIELD_GC, [t_box],
'int', descr=fielddescr)
assert res.value == 39082
+ #
+ u_box, U_box = self.alloc_instance(self.U)
+ fielddescr2 = self.cpu.fielddescrof(self.S, 'next')
+ res = self.execute_operation(rop.SETFIELD_GC, [t_box, u_box],
+ 'void', descr=fielddescr2)
+ assert res is None
+ res = self.execute_operation(rop.GETFIELD_GC, [t_box],
+ 'ptr', descr=fielddescr2)
+ assert res.value == u_box.value
def test_passing_guards(self):
for (opname, args) in [(rop.GUARD_TRUE, [BoxInt(1)]),
More information about the Pypy-commit
mailing list