Author: Armin Rigo <[email protected]>
Branch: tealet
Changeset: r45876:d6075e673700
Date: 2011-07-15 09:38 +0200
http://bitbucket.org/pypy/pypy/changeset/d6075e673700/
Log: Support tealets on asmgcc too. It's actually easy, unless I'm
missing something.
diff --git a/pypy/config/translationoption.py b/pypy/config/translationoption.py
--- a/pypy/config/translationoption.py
+++ b/pypy/config/translationoption.py
@@ -31,8 +31,7 @@
BoolOption("tealet", "enable stackless features via tealets",
default=False, cmdline="--tealet",
requires=[("translation.type_system", "lltype"),
- ("translation.gctransformer", "framework"),
- ("translation.gcrootfinder", "shadowstack")]),
+ ("translation.gctransformer", "framework")]),
ChoiceOption("type_system", "Type system to use when RTyping",
["lltype", "ootype"], cmdline=None, default="lltype",
requires={
diff --git a/pypy/rlib/test/test_rtealet.py b/pypy/rlib/test/test_rtealet.py
--- a/pypy/rlib/test/test_rtealet.py
+++ b/pypy/rlib/test/test_rtealet.py
@@ -29,5 +29,3 @@
class TestTealetAsmgcc(BaseTestTealet):
gcrootfinder = "asmgcc"
- def setup_class(cls):
- py.test.skip("XXX in-progress")
diff --git a/pypy/rpython/lltypesystem/lloperation.py
b/pypy/rpython/lltypesystem/lloperation.py
--- a/pypy/rpython/lltypesystem/lloperation.py
+++ b/pypy/rpython/lltypesystem/lloperation.py
@@ -483,8 +483,8 @@
'gc_dump_rpy_heap' : LLOp(),
'gc_typeids_z' : LLOp(),
- 'gc_save_stack_roots' : LLOp(), # for tealet support
- 'gc_restore_stack_roots': LLOp(), # for tealet support
+ 'gc_save_stack_roots' : LLOp(canunwindgc=True), # for tealet support
+ 'gc_restore_stack_roots': LLOp(canunwindgc=True), # for tealet support
# ------- JIT & GC interaction, only for some GCs ----------
diff --git a/pypy/rpython/memory/gctransform/asmgcroot.py
b/pypy/rpython/memory/gctransform/asmgcroot.py
--- a/pypy/rpython/memory/gctransform/asmgcroot.py
+++ b/pypy/rpython/memory/gctransform/asmgcroot.py
@@ -1,3 +1,4 @@
+from pypy.annotation import model as annmodel
from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer
from pypy.rpython.memory.gctransform.framework import BaseRootWalker
from pypy.rpython.lltypesystem import lltype, llmemory, rffi
@@ -147,6 +148,54 @@
self._extra_gcmapend = lambda: llmemory.NULL
self._extra_mark_sorted = lambda: True
+ def need_tealet_support(self, gctransformer, getfn):
+ # tealet support: hooks to save and restore the GC pointers
+ # from the stack before it is whisked away by "tealet.c".
+ GCPTR_ARRAY = lltype.Ptr(lltype.GcArray(llmemory.GCREF))
+ SIGNED_ARRAY = lltype.Ptr(lltype.GcArray(lltype.Signed))
+ WALKER_PTR = lltype.Ptr(lltype.Struct('walker',
+ ('gcptr_array', GCPTR_ARRAY),
+ ('signed_array', SIGNED_ARRAY)))
+ gcdata = self.gcdata
+ #
+ def ll_count_locations(gc, addr):
+ gcdata._gc_tealet_count += 1
+ #
+ def ll_save_locations(gc, addr):
+ gcref = llmemory.cast_adr_to_ptr(addr.address[0], llmemory.GCREF)
+ gcdata._gc_tealet_array[gcdata._gc_tealet_count] = gcref
+ gcdata._gc_tealet_count += 1
+ #
+ def ll_restore_locations(gc, addr):
+ gcref = gcdata._gc_tealet_array[gcdata._gc_tealet_count]
+ gcdata._gc_tealet_count += 1
+ addr.address[0] = llmemory.cast_ptr_to_adr(gcref)
+ #
+ def ll_save_stack_roots(walker):
+ gcdata._gc_tealet_count = 0
+ self.walk_stack_roots(ll_count_locations)
+ count = gcdata._gc_tealet_count
+ gcdata._gc_tealet_count = 0
+ gcdata._gc_tealet_array = lltype.malloc(GCPTR_ARRAY.TO, count)
+ self.walk_stack_roots(ll_save_locations)
+ walker.gcptr_array = gcdata._gc_tealet_array
+ gcdata._gc_tealet_array = lltype.nullptr(GCPTR_ARRAY.TO)
+ #
+ def ll_restore_stack_roots(walker):
+ gcdata._gc_tealet_array = walker.gcptr_array
+ gcdata._gc_tealet_count = 0
+ self.walk_stack_roots(ll_restore_locations)
+ gcdata._gc_tealet_array = lltype.nullptr(GCPTR_ARRAY.TO)
+ #
+ self.ll_save_stack_roots_ptr = getfn(ll_save_stack_roots,
+ [annmodel.SomePtr(WALKER_PTR)],
+ annmodel.s_None,
+ minimal_transform=False)
+ self.ll_restore_stack_roots_ptr = getfn(ll_restore_stack_roots,
+ [annmodel.SomePtr(WALKER_PTR)],
+ annmodel.s_None,
+ minimal_transform=False)
+
def need_thread_support(self, gctransformer, getfn):
# Threads supported "out of the box" by the rest of the code.
# The whole code in this function is only there to support
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit