Author: David Malcolm <[email protected]>
Branch: libgccjit-backend
Changeset: r74975:5a904ca20a80
Date: 2014-12-15 12:51 -0500
http://bitbucket.org/pypy/pypy/changeset/5a904ca20a80/
Log: WIP: Initial compilation of test_compile_linear_loop
Tested via: ./pytest.py
rpython/jit/backend/libgccjit/test/test_runner.py -k
test_compile_linear_loop
Doesn't yet run the compiled code
diff --git a/rpython/jit/backend/libgccjit/assembler.py
b/rpython/jit/backend/libgccjit/assembler.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/libgccjit/assembler.py
@@ -0,0 +1,181 @@
+from rpython.jit.backend.llsupport.assembler import BaseAssembler
+from rpython.jit.backend.model import CompiledLoopToken
+from rpython.jit.backend.libgccjit.rffi_bindings import make_eci, Library,
make_param_array
+from rpython.jit.metainterp.history import BoxInt, ConstInt
+from rpython.rtyper.lltypesystem.rffi import *
+
+class AssemblerLibgccjit(BaseAssembler):
+ _regalloc = None
+ #_output_loop_log = None
+ #_second_tmp_reg = ecx
+
+ DEBUG_FRAME_DEPTH = False
+
+ def __init__(self, cpu, translate_support_code=False):
+ BaseAssembler.__init__(self, cpu, translate_support_code)
+ #self.verbose = False
+ self.verbose = True
+ self.loop_run_counters = []
+ self.float_const_neg_addr = 0
+ self.float_const_abs_addr = 0
+ self.malloc_slowpath = 0
+ self.malloc_slowpath_varsize = 0
+ self.wb_slowpath = [0, 0, 0, 0, 0]
+ #self.setup_failure_recovery()
+ self.datablockwrapper = None
+ self.stack_check_slowpath = 0
+ self.propagate_exception_path = 0
+ #self.teardown()
+
+ self.num_anon_loops = 0
+
+ self.make_context()
+ print(self.ctxt)
+ self.t_int = self.lib.gcc_jit_context_get_type(self.ctxt,
+
self.lib.GCC_JIT_TYPE_INT)
+
+ def make_context(self):
+ eci = make_eci()
+ self.lib = Library(eci)
+ self.ctxt = self.lib.gcc_jit_context_acquire()
+ self.lib.gcc_jit_context_set_bool_option(self.ctxt,
+
self.lib.GCC_JIT_BOOL_OPTION_DUMP_INITIAL_GIMPLE,
+ r_int(1))
+ self.lib.gcc_jit_context_set_int_option(self.ctxt,
+
self.lib.GCC_JIT_INT_OPTION_OPTIMIZATION_LEVEL,
+ r_int(3))
+ self.lib.gcc_jit_context_set_bool_option(self.ctxt,
+
self.lib.GCC_JIT_BOOL_OPTION_KEEP_INTERMEDIATES,
+ r_int(1))
+ self.lib.gcc_jit_context_set_bool_option(self.ctxt,
+
self.lib.GCC_JIT_BOOL_OPTION_DUMP_EVERYTHING,
+ r_int(1))
+ self.lib.gcc_jit_context_set_bool_option(self.ctxt,
+
self.lib.GCC_JIT_BOOL_OPTION_DUMP_GENERATED_CODE,
+ r_int(1))
+
+ def assemble_loop(self, inputargs, operations, looptoken, log,
+ loopname, logger):
+ print('assemble_loop')
+ clt = CompiledLoopToken(self.cpu, looptoken.number)
+ print(clt)
+
+ # Make function:
+ self.lvalue_for_box = {}
+ print(' inputargs: %r' % (inputargs, ))
+ params = []
+ for arg in inputargs:
+ param_name = str2charp(str(arg))
+ param = self.lib.gcc_jit_context_new_param(self.ctxt,
+
self.lib.null_location_ptr,
+ self.t_int, # FIXME:
use correct type
+ param_name)
+ self.lvalue_for_box[arg] = self.lib.gcc_jit_param_as_lvalue(param)
+ free_charp(param_name)
+ params.append(param)
+
+ print("loopname: %r" % loopname)
+ if not loopname:
+ loopname = 'anonloop_%i' % self.num_anon_loops
+ self.num_anon_loops += 1
+ fn_name = str2charp(loopname)
+ param_array = make_param_array(self.lib, params)
+ self.fn = self.lib.gcc_jit_context_new_function(self.ctxt,
+
self.lib.null_location_ptr,
+
self.lib.GCC_JIT_FUNCTION_EXPORTED,
+ self.t_int,
+ fn_name,
+ r_int(len(params)),
+ param_array,
+ r_int(0))
+ lltype.free(param_array, flavor='raw')
+ free_charp(fn_name)
+
+ self.b_current = self.lib.gcc_jit_function_new_block(self.fn, NULL)
+
+ for op in operations:
+ print(op)
+ print(type(op))
+ print(dir(op))
+ print(repr(op.getopname()))
+ methname = '_on_%s' % op.getopname()
+ getattr(self, methname) (op)
+
+ jit_result = self.lib.gcc_jit_context_compile(self.ctxt)
+ self.lib.gcc_jit_context_release(self.ctxt)
+ if not jit_result:
+ # FIXME: get error from context
+ raise Exception("jit_result is NULL")
+ raise foo
+
+ def expr_to_rvalue(self, expr):
+ print('expr_to_rvalue')
+ print(' %s' % expr)
+ print(' %r' % expr)
+ print(' %s' % type(expr))
+ print(' %s' % dir(expr))
+ print(' %s' % expr.__dict__)
+
+ if isinstance(expr, BoxInt):
+ return
self.lib.gcc_jit_lvalue_as_rvalue(self.get_box_as_lvalue(expr))
+ elif isinstance(expr, ConstInt):
+ #print('value: %r' % expr.value)
+ #print('type(value): %r' % type(expr.value))
+ return self.lib.gcc_jit_context_new_rvalue_from_int(self.ctxt,
+ self.t_int,
+
r_int(expr.value))
+
+ def get_box_as_lvalue(self, box):
+ if box not in self.lvalue_for_box:
+ local_name = str2charp(str(box))
+ self.lvalue_for_box[box] = (
+ self.lib.gcc_jit_function_new_local(self.fn,
+ self.lib.null_location_ptr,
+ self.t_int, # FIXME: use
correct type
+ local_name))
+ free_charp(local_name)
+ return self.lvalue_for_box[box]
+
+ def expr_to_lvalue(self, expr):
+ print('expr_to_lvalue')
+ print(' %s' % expr)
+ print(' %r' % expr)
+ print(' %s' % type(expr))
+ print(' %s' % dir(expr))
+ print(' %s' % expr.__dict__)
+ if isinstance(expr, BoxInt):
+ return self.get_box_as_lvalue(expr)
+ raise foo
+
+ # Handling of specific ResOperation subclasses
+
+ def _on_int_add(self, op):
+ print(op._arg0)
+ print(op._arg1)
+ print(op.result)
+ print(op.__dict__)
+
+ rval0 = self.expr_to_rvalue(op._arg0)
+ rval1 = self.expr_to_rvalue(op._arg1)
+ lvalres = self.expr_to_lvalue(op.result)
+
+ op_add = (
+ self.lib.gcc_jit_context_new_binary_op(self.ctxt,
+ self.lib.null_location_ptr,
+
self.lib.GCC_JIT_BINARY_OP_PLUS,
+ self.t_int,
+ rval0, rval1))
+
#self.lib.gcc_jit_object_get_debug_string(gcc_jit_rvalue_as_object(op_add))
+ self.lib.gcc_jit_block_add_assignment(self.b_current,
+ self.lib.null_location_ptr,
+ lvalres,
+ op_add)
+
+ def _on_finish(self, op):
+ print(op.__dict__)
+ # FIXME: assume just 1-ary FINISH for now
+ assert len(op._args) == 1
+ result = op._args[0]
+ self.lib.gcc_jit_block_end_with_return(self.b_current,
+ self.lib.null_location_ptr,
+ self.expr_to_rvalue(result))
diff --git a/rpython/jit/backend/libgccjit/rffi_bindings.py
b/rpython/jit/backend/libgccjit/rffi_bindings.py
--- a/rpython/jit/backend/libgccjit/rffi_bindings.py
+++ b/rpython/jit/backend/libgccjit/rffi_bindings.py
@@ -37,6 +37,15 @@
library_dirs=[LIB_DIR])
return eci
+def make_param_array(lib, l):
+ array = lltype.malloc(lib.PARAM_P_P.TO,
+ len(l),
+ flavor='raw') # of maybe gc?
+ for i in range(len(l)):
+ array[i] = l[i]
+ return array
+ # FIXME: don't leak!
+
class Library:
def __init__(self, eci):
self.eci = eci
diff --git a/rpython/jit/backend/libgccjit/test/test_rffi_bindings.py
b/rpython/jit/backend/libgccjit/test/test_rffi_bindings.py
--- a/rpython/jit/backend/libgccjit/test/test_rffi_bindings.py
+++ b/rpython/jit/backend/libgccjit/test/test_rffi_bindings.py
@@ -34,7 +34,7 @@
assert xf() == 3
"""
-from rpython.jit.backend.libgccjit.rffi_bindings import make_eci, Library
+from rpython.jit.backend.libgccjit.rffi_bindings import make_eci, Library,
make_param_array
def test_compile_empty_context():
eci = make_eci()
@@ -51,15 +51,6 @@
f1 ()
#assert False # to see stderr
-def make_param_array(lib, l):
- array = lltype.malloc(lib.PARAM_P_P.TO,
- len(l),
- flavor='raw') # of maybe gc?
- for i in range(len(l)):
- array[i] = l[i]
- return array
- # FIXME: don't leak!
-
def test_compile_add_one_to():
eci = make_eci()
diff --git a/rpython/jit/backend/libgccjit/test/test_runner.py
b/rpython/jit/backend/libgccjit/test/test_runner.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/libgccjit/test/test_runner.py
@@ -0,0 +1,31 @@
+import py
+from rpython.jit.backend.detect_cpu import getcpuclass
+from rpython.jit.backend.test.runner_test import LLtypeBackendTest,\
+ boxfloat, constfloat
+from rpython.jit.metainterp.history import (BasicFailDescr, BasicFinalDescr,
+ BoxInt)
+from rpython.jit.metainterp.resoperation import ResOperation, rop
+from rpython.jit.tool.oparser import parse
+from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.rtyper import rclass
+from rpython.rtyper.annlowlevel import llhelper
+from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.jit.metainterp.history import JitCellToken, TargetToken
+from rpython.jit.codewriter import longlong
+
+
+CPU = getcpuclass()
+
+class FakeStats(object):
+ pass
+
+
+class TestLibGccjit(LLtypeBackendTest):
+
+ # for the individual tests see
+ # ====> ../../test/runner_test.py
+
+ def get_cpu(self):
+ cpu = CPU(rtyper=None, stats=FakeStats())
+ cpu.setup_once()
+ return cpu
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit