Author: David Malcolm <dmalc...@redhat.com>
Branch: libgccjit-backend
Changeset: r75096:a466f0d20644
Date: 2014-12-23 17:13 -0500
http://bitbucket.org/pypy/pypy/changeset/a466f0d20644/

Log:    Initial implementation of rop.CALL

        Working test_runner.py "test_call*" testcases with this commit:
        test_call test_call_many_arguments test_call_stack_alignment
        test_call_with_const_floats

        Failing: test_call_box_func test_call_to_c_function
        test_call_to_c_function_with_callback
        test_call_release_gil_return_types
        test_call_release_gil_variable_function_and_arguments

diff --git a/rpython/jit/backend/libgccjit/assembler.py 
b/rpython/jit/backend/libgccjit/assembler.py
--- a/rpython/jit/backend/libgccjit/assembler.py
+++ b/rpython/jit/backend/libgccjit/assembler.py
@@ -1,6 +1,7 @@
 from rpython.jit.backend.llsupport import jitframe
 from rpython.jit.backend.llsupport.assembler import BaseAssembler
 from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
+from rpython.jit.backend.llsupport.descr import CallDescr
 from rpython.jit.backend.llsupport.regalloc import FrameManager
 from rpython.jit.backend.model import CompiledLoopToken
 from rpython.jit.backend.libgccjit.rffi_bindings import (
@@ -486,7 +487,7 @@
     def get_box_as_lvalue(self, box):
         if box not in self.lvalue_for_box:
             self.lvalue_for_box[box] = (
-                self.fn.new_local(self.get_type_for_box(box),
+                self.fn.new_local(self.get_type_for_expr(box),
                                   str(box)))
         return self.lvalue_for_box[box]
 
@@ -508,15 +509,16 @@
 
         raise NotImplementedError('unhandled expr: %s' % expr)
 
-    def get_type_for_box(self, box):
-        if isinstance(box, BoxInt):
+    def get_type_for_expr(self, expr):
+        if isinstance(expr, (BoxInt, ConstInt)):
             return self.t_Signed;
-        elif isinstance(box, BoxFloat):
+        elif isinstance(expr, (BoxFloat, ConstFloat)):
             return self.t_float;
-        elif isinstance(box, BoxPtr):
+        elif isinstance(expr, (BoxPtr, ConstPtr)):
             return self.t_void_ptr;
         else:
-            raise NotImplementedError('unhandled box: %s %s' % (box, 
type(box)))
+            raise NotImplementedError('unhandled expr: %s %s'
+                                      % (expr, type(expr)))
 
     def get_union_field_for_expr(self, expr):
         if isinstance(expr, (BoxInt, ConstInt)):
@@ -1046,7 +1048,7 @@
         self.b_current.add_assignment(
             lvalres,
             self.ctxt.new_cast(field_lvalue.as_rvalue(),
-                               self.get_type_for_box(resop.result)))
+                               self.get_type_for_expr(resop.result)))
 
     def emit_setfield_gc(self, resop):
         #print(repr(resop))
@@ -1069,6 +1071,53 @@
     def emit_jit_debug(self, resop):
         pass # noop
 
+    # '_CANRAISE_FIRST', # ----- start of can_raise operations -----
+    # '_CALL_FIRST',
+
+    def emit_call(self, resop):
+        print(resop)
+        print(dir(resop))
+        calldescr = resop.getdescr()
+        assert isinstance(calldescr, CallDescr)
+        #size = calldescr.get_result_size()
+        #sign = calldescr.is_result_signed()
+        print('resop.numargs(): %r' % resop.numargs())
+        print('[resop.getarg(i) for i in range(resop.numargs())]: %r'
+              % [resop.getarg(i) for i in range(resop.numargs())])
+        #print('resop.result: %r' % resop.result)
+
+        print('resop.getarg(0): %r' % resop.getarg(0))
+        print('dir(resop.getarg(0)): %r' % dir(resop.getarg(0)))
+        print('resop.getarg(0).type: %r' % resop.getarg(0).type)
+
+        #arg0 is a fnptr
+        #arg1..N are the args to the call
+
+        # FIXME: is the returntype of the fn always that of the result
+        # location?
+        returntype = self.get_type_for_expr(resop.result)
+
+        # FIXME: are the params types always those of the input args?
+        paramtypes = [self.get_type_for_expr(resop.getarg(i))
+                       for i in range(1, resop.numargs())]
+
+        fn_ptr_type = self.ctxt.new_function_ptr_type(
+            returntype,
+            paramtypes,
+            r_int(0)) # is_variadic
+        fn_ptr = self.ctxt.new_cast(self.expr_to_rvalue(resop.getarg(0)),
+                                    fn_ptr_type)
+        arg_rvalues = [self.expr_to_rvalue(resop.getarg(i))
+                       for i in range(1, resop.numargs())]
+        call = self.ctxt.new_call_through_ptr(fn_ptr,
+                                              arg_rvalues)
+        self.b_current.add_assignment(self.expr_to_lvalue(resop.result),
+                                      call)
+
+    #'_CALL_LAST',
+    #'_CANRAISE_LAST', # ----- end of can_raise operations -----
+
+    # '_OVF_FIRST', # ----- start of is_ovf operations -----
     # "INT_*_OVF" operations:
     def _impl_int_ovf(self, resop, builtin_name):
         """
@@ -1094,3 +1143,6 @@
         self._impl_int_ovf(resop, '__builtin_sub_overflow')
     def emit_int_mul_ovf(self, resop):
         self._impl_int_ovf(resop, '__builtin_mul_overflow')
+
+    # '_OVF_LAST', # ----- end of is_ovf operations -----
+    # '_LAST',     # for the backend to add more internal operations
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to