Author: Armin Rigo <ar...@tunes.org>
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
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to