[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