Author: Maciej Fijalkowski <[email protected]>
Branch: jitframe-on-heap
Changeset: r60274:291fb306aafa
Date: 2013-01-21 10:52 +0200
http://bitbucket.org/pypy/pypy/changeset/291fb306aafa/
Log: add _freeze_ to the CPU and move movable state somewhere else. this
is needed for hacking at hacks
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -2,6 +2,11 @@
from rpython.jit.metainterp import compile
from rpython.rtyper.lltypesystem import lltype
+class CPUTotalTracker(object):
+ total_compiled_loops = 0
+ total_compiled_bridges = 0
+ total_freed_loops = 0
+ total_freed_bridges = 0
class AbstractCPU(object):
supports_floats = False
@@ -11,20 +16,18 @@
# Boxes and Consts are BoxFloats and ConstFloats.
supports_singlefloats = False
- total_compiled_loops = 0
- total_compiled_bridges = 0
- total_freed_loops = 0
- total_freed_bridges = 0
-
propagate_exception_descr = None
# for heaptracker
# _all_size_descrs_with_vtable = None
_vtable_to_descr_dict = None
-
def __init__(self):
self.__dict__.update(compile.make_done_loop_tokens())
+ self.tracker = CPUTotalTracker()
+
+ def _freeze_(self):
+ return True
def setup_once(self):
"""Called once by the front-end when the program starts."""
@@ -290,7 +293,7 @@
frame_depth = 0
def __init__(self, cpu, number):
- cpu.total_compiled_loops += 1
+ cpu.tracker.total_compiled_loops += 1
self.cpu = cpu
self.number = number
self.bridges_count = 0
@@ -314,7 +317,7 @@
return n
def compiling_a_bridge(self):
- self.cpu.total_compiled_bridges += 1
+ self.cpu.tracker.total_compiled_bridges += 1
self.bridges_count += 1
debug_start("jit-mem-looptoken-alloc")
debug_print("allocating Bridge #", self.bridges_count, "of Loop #",
self.number)
@@ -325,6 +328,6 @@
debug_print("freeing Loop #", self.number, 'with',
self.bridges_count, 'attached bridges')
self.cpu.free_loop_and_bridges(self)
- self.cpu.total_freed_loops += 1
- self.cpu.total_freed_bridges += self.bridges_count
+ self.cpu.tracker.total_freed_loops += 1
+ self.cpu.tracker.total_freed_bridges += self.bridges_count
debug_stop("jit-mem-looptoken-free")
diff --git a/rpython/jit/backend/test/runner_test.py
b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -223,8 +223,8 @@
assert not wr_i1() and not wr_guard()
def test_compile_bridge(self):
- self.cpu.total_compiled_loops = 0
- self.cpu.total_compiled_bridges = 0
+ self.cpu.tracker.total_compiled_loops = 0
+ self.cpu.tracker.total_compiled_bridges = 0
i0 = BoxInt()
i1 = BoxInt()
i2 = BoxInt()
@@ -260,8 +260,8 @@
res = self.cpu.get_int_value(deadframe, 0)
assert res == 20
- assert self.cpu.total_compiled_loops == 1
- assert self.cpu.total_compiled_bridges == 1
+ assert self.cpu.tracker.total_compiled_loops == 1
+ assert self.cpu.tracker.total_compiled_bridges == 1
return looptoken
def test_compile_bridge_with_holes(self):
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -302,7 +302,7 @@
i = 0
for loc in locs:
if loc is None: # xxx bit kludgy
- continue
+ loc = ebp
arg = inputargs[i]
i += 1
if isinstance(loc, RegLoc):
diff --git a/rpython/jit/backend/x86/runner.py
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -159,11 +159,11 @@
immortal=True)
def force(self, addr_of_force_token):
- descr = self.gc_ll_descr.getframedescrs(self).arraydescr
+ descr = self.signedarraydescr
ofs = self.unpack_arraydescr(descr)
frame = rffi.cast(jitframe.JITFRAMEPTR, addr_of_force_token - ofs)
frame.jf_descr = frame.jf_force_descr
- return frame
+ return lltype.cast_opaque_ptr(llmemory.GCREF, frame)
def redirect_call_assembler(self, oldlooptoken, newlooptoken):
self.assembler.redirect_call_assembler(oldlooptoken, newlooptoken)
@@ -249,6 +249,7 @@
descrs = self.gc_ll_descr.getframedescrs(self)
ad = descrs.arraydescr
# the same as normal JITFRAME, however with an array of pointers
+ self.signedarraydescr = ad
self.refarraydescr = ArrayDescr(ad.basesize, ad.itemsize, ad.lendescr,
FLAG_POINTER)
self.floatarraydescr = ArrayDescr(ad.basesize, ad.itemsize,
ad.lendescr,
@@ -260,8 +261,7 @@
elif type == history.REF:
descr = self.refarraydescr
else:
- descrs = self.gc_ll_descr.getframedescrs(self)
- descr = descrs.arraydescr
+ descr = self.signedarraydescr
return JITFRAME_FIXED_SIZE + index, descr
CPU = CPU386
diff --git a/rpython/jit/backend/x86/test/test_gc_integration.py
b/rpython/jit/backend/x86/test/test_gc_integration.py
--- a/rpython/jit/backend/x86/test/test_gc_integration.py
+++ b/rpython/jit/backend/x86/test/test_gc_integration.py
@@ -2,8 +2,9 @@
""" Tests for register allocation for common constructs
"""
-from rpython.jit.metainterp.history import TargetToken, AbstractDescr
-from rpython.jit.backend.llsupport.gc import GcLLDescription, GcLLDescr_boehm
+from rpython.jit.metainterp.history import TargetToken, BasicFinalDescr
+from rpython.jit.backend.llsupport.gc import GcLLDescription, GcLLDescr_boehm,\
+ GcLLDescr_framework
from rpython.jit.backend.detect_cpu import getcpuclass
from rpython.jit.backend.x86.arch import WORD
from rpython.jit.backend.llsupport import jitframe
@@ -319,3 +320,15 @@
s1ref = self.cpu.get_ref_value(self.deadframe, i)
s1 = lltype.cast_opaque_ptr(lltype.Ptr(S1), s1ref)
assert s1 == getattr(s2, 's%d' % i)
+
+class TestGcShadowstackDirect(object):
+
+ cpu = CPU(None, None)
+ cpu.gc_ll_descr = GcLLDescr_framework(None, None, None)
+ cpu.setup_once()
+
+ def test_shadowstack_call(self):
+ ops = parse("""
+ []
+ finish(i0, descr=finaldescr)
+ """, namespace={'finaldescr': BasicFinalDescr()})
diff --git a/rpython/jit/metainterp/jitprof.py
b/rpython/jit/metainterp/jitprof.py
--- a/rpython/jit/metainterp/jitprof.py
+++ b/rpython/jit/metainterp/jitprof.py
@@ -100,13 +100,13 @@
def get_counter(self, num):
if num == Counters.TOTAL_COMPILED_LOOPS:
- return self.cpu.total_compiled_loops
+ return self.cpu.tracker.total_compiled_loops
elif num == Counters.TOTAL_COMPILED_BRIDGES:
- return self.cpu.total_compiled_bridges
+ return self.cpu.tracker.total_compiled_bridges
elif num == Counters.TOTAL_FREED_LOOPS:
- return self.cpu.total_freed_loops
+ return self.cpu.tracker.total_freed_loops
elif num == Counters.TOTAL_FREED_BRIDGES:
- return self.cpu.total_freed_bridges
+ return self.cpu.tracker.total_freed_bridges
return self.counters[num]
def count_ops(self, opnum, kind=Counters.OPS):
@@ -151,13 +151,13 @@
cpu = self.cpu
if cpu is not None: # for some tests
self._print_intline("Total # of loops",
- cpu.total_compiled_loops)
+ cpu.tracker.total_compiled_loops)
self._print_intline("Total # of bridges",
- cpu.total_compiled_bridges)
+ cpu.tracker.total_compiled_bridges)
self._print_intline("Freed # of loops",
- cpu.total_freed_loops)
+ cpu.tracker.total_freed_loops)
self._print_intline("Freed # of bridges",
- cpu.total_freed_bridges)
+ cpu.tracker.total_freed_bridges)
def _print_line_time(self, string, i, tim):
final = "%s:%s\t%d\t%f" % (string, " " * max(0, 13-len(string)), i,
tim)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit