[pypy-commit] pypy default: Separate shadow stack stuff from FrameworkGCTransformer and put it in it's own subclass. Also clean up imports.

Manuel Jacob noreply at buildbot.pypy.org
Thu Sep 20 19:26:09 CEST 2012


Author: Manuel Jacob
Branch: 
Changeset: r57410:576d58a1fa96
Date: 2012-09-12 14:12 +0200
http://bitbucket.org/pypy/pypy/changeset/576d58a1fa96/

Log:	Separate shadow stack stuff from FrameworkGCTransformer and put it
	in it's own subclass. Also clean up imports.

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,13 +1,13 @@
-from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer
-from pypy.rpython.memory.gctransform.framework import BaseRootWalker
+from pypy.objspace.flow.model import (Constant, Variable, Block, Link,
+     copygraph, SpaceOperation)
+from pypy.rlib.debug import ll_assert
+from pypy.rpython.annlowlevel import llhelper
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi
 from pypy.rpython.lltypesystem.lloperation import llop
+from pypy.rpython.memory.gctransform.framework import (
+     BaseFrameworkGCTransformer, BaseRootWalker)
 from pypy.rpython.rbuiltin import gen_cast
-from pypy.rpython.annlowlevel import llhelper
-from pypy.objspace.flow.model import Constant, Variable, Block, Link, copygraph
-from pypy.objspace.flow.model import SpaceOperation
 from pypy.translator.unsimplify import copyvar
-from pypy.rlib.debug import ll_assert
 import sys
 
 
@@ -20,7 +20,7 @@
 
 IS_64_BITS = sys.maxint > 2147483647
 
-class AsmGcRootFrameworkGCTransformer(FrameworkGCTransformer):
+class AsmGcRootFrameworkGCTransformer(BaseFrameworkGCTransformer):
     _asmgcc_save_restore_arguments = None
 
     def push_roots(self, hop, keep_current_args=False):
@@ -53,7 +53,7 @@
         if close_stack:
             self.handle_call_with_close_stack(hop)
         else:
-            FrameworkGCTransformer.gct_direct_call(self, hop)
+            BaseFrameworkGCTransformer.gct_direct_call(self, hop)
 
     def handle_call_with_close_stack(self, hop):
         fnptr = hop.spaceop.args[0].value
diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -1,26 +1,20 @@
+from pypy.annotation import model as annmodel
+from pypy.rlib import rgc
+from pypy.rpython import rmodel, annlowlevel
+from pypy.rpython.lltypesystem import lltype, llmemory, rffi, llgroup
+from pypy.rpython.lltypesystem.lloperation import LL_OPERATIONS
+from pypy.rpython.memory import gctypelayout
+from pypy.rpython.memory.gctransform.log import log
+from pypy.rpython.memory.gctransform.support import get_rtti, \
+     ll_call_destructor, type_contains_pyobjs, var_ispyobj
 from pypy.rpython.memory.gctransform.transform import GCTransformer
-from pypy.rpython.memory.gctransform.support import find_gc_ptrs_in_type, \
-     get_rtti, ll_call_destructor, type_contains_pyobjs, var_ispyobj
-from pypy.rpython.lltypesystem import lltype, llmemory, rffi, llgroup
-from pypy.rpython import rmodel
-from pypy.rpython.memory import gctypelayout
-from pypy.rpython.memory.gc import marksweep
-from pypy.rpython.memory.gcheader import GCHeaderBuilder
-from pypy.rlib.rarithmetic import ovfcheck
-from pypy.rlib import rgc
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rpython.memory.gctypelayout import ll_weakref_deref, WEAKREF, \
+     WEAKREFPTR
+from pypy.tool.sourcetools import func_with_new_name
 from pypy.translator.backendopt import graphanalyze
+from pypy.translator.backendopt.finalizer import FinalizerAnalyzer
 from pypy.translator.backendopt.support import var_needsgc
-from pypy.translator.backendopt.finalizer import FinalizerAnalyzer
-from pypy.annotation import model as annmodel
-from pypy.rpython import annlowlevel
-from pypy.rpython.rbuiltin import gen_cast
-from pypy.rpython.memory.gctypelayout import ll_weakref_deref, WEAKREF
-from pypy.rpython.memory.gctypelayout import convert_weakref_to, WEAKREFPTR
-from pypy.rpython.memory.gctransform.log import log
-from pypy.tool.sourcetools import func_with_new_name
-from pypy.rpython.lltypesystem.lloperation import llop, LL_OPERATIONS
-import sys, types
+import types
 
 
 TYPE_ID = llgroup.HALFWORD
@@ -131,7 +125,7 @@
                 cache = set()
     return result
 
-class FrameworkGCTransformer(GCTransformer):
+class BaseFrameworkGCTransformer(GCTransformer):
     root_stack_depth = None    # for tests to override
 
     def __init__(self, translator):
@@ -139,7 +133,8 @@
         from pypy.rpython.memory.gc.base import ARRAY_TYPEID_MAP
         from pypy.rpython.memory.gc import inspector
 
-        super(FrameworkGCTransformer, self).__init__(translator, inline=True)
+        super(BaseFrameworkGCTransformer, self).__init__(translator,
+                                                         inline=True)
         if hasattr(self, 'GC_PARAMS'):
             # for tests: the GC choice can be specified as class attributes
             from pypy.rpython.memory.gc.marksweep import MarkSweepGC
@@ -232,22 +227,11 @@
         # for tests
         self.frameworkgc__teardown_ptr = getfn(frameworkgc__teardown, [],
                                                annmodel.s_None)
-        
-        if root_walker.need_root_stack:
-            self.incr_stack_ptr = getfn(root_walker.incr_stack,
-                                       [annmodel.SomeInteger()],
-                                       annmodel.SomeAddress(),
-                                       inline = True)
-            self.decr_stack_ptr = getfn(root_walker.decr_stack,
-                                       [annmodel.SomeInteger()],
-                                       annmodel.SomeAddress(),
-                                       inline = True)
-        else:
-            self.incr_stack_ptr = None
-            self.decr_stack_ptr = None
+
+        self.get_shadowstack_functions(getfn)
         self.weakref_deref_ptr = self.inittime_helper(
             ll_weakref_deref, [llmemory.WeakRefPtr], llmemory.Address)
-        
+
         classdef = bk.getuniqueclassdef(GCClass)
         s_gc = annmodel.SomeInstance(classdef)
         s_gcref = annmodel.SomePtr(llmemory.GCREF)
@@ -518,10 +502,6 @@
         sko = llmemory.sizeof(gcdata.TYPE_INFO)
         self.c_vtinfo_skip_offset = rmodel.inputconst(lltype.typeOf(sko), sko)
 
-    def build_root_walker(self):
-        from pypy.rpython.memory.gctransform import shadowstack
-        return shadowstack.ShadowStackRootWalker(self)
-
     def consider_constant(self, TYPE, value):
         self.layoutbuilder.consider_constant(TYPE, value, self.gcdata.gc)
 
@@ -534,7 +514,6 @@
 
     def gc_header_for(self, obj, needs_hash=False):
         hdr = self.gcdata.gc.gcheaderbuilder.header_of_object(obj)
-        HDR = self.HDR
         withhash, flag = self.gcdata.gc.withhash_flag_is_in_field
         x = getattr(hdr, withhash)
         TYPE = lltype.typeOf(x)
@@ -642,7 +621,7 @@
             if self.gcdata.gc.can_optimize_clean_setarrayitems():
                 self.clean_sets = self.clean_sets.union(
                     find_clean_setarrayitems(self.collect_analyzer, graph))
-        super(FrameworkGCTransformer, self).transform_graph(graph)
+        super(BaseFrameworkGCTransformer, self).transform_graph(graph)
         if self.write_barrier_ptr:
             self.clean_sets = None
 
@@ -663,8 +642,6 @@
 
     def gct_fv_gc_malloc(self, hop, flags, TYPE, *args):
         op = hop.spaceop
-        flavor = flags['flavor']
-
         PTRTYPE = op.result.concretetype
         assert PTRTYPE.TO == TYPE
         type_id = self.get_type_id(TYPE)
@@ -1214,43 +1191,24 @@
             livevars = [var for var in livevars if not var_ispyobj(var)]
         return livevars
 
-    def push_roots(self, hop, keep_current_args=False):
-        if self.incr_stack_ptr is None:
-            return
-        livevars = self.get_livevars_for_roots(hop, keep_current_args)
-        self.num_pushs += len(livevars)
-        if not livevars:
-            return []
-        c_len = rmodel.inputconst(lltype.Signed, len(livevars) )
-        base_addr = hop.genop("direct_call", [self.incr_stack_ptr, c_len ],
-                              resulttype=llmemory.Address)
-        for k,var in enumerate(livevars):
-            c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr)
-            v_adr = gen_cast(hop.llops, llmemory.Address, var)
-            hop.genop("raw_store", [base_addr, c_k, v_adr])
-        return livevars
-
-    def pop_roots(self, hop, livevars):
-        if self.decr_stack_ptr is None:
-            return
-        if not livevars:
-            return
-        c_len = rmodel.inputconst(lltype.Signed, len(livevars) )
-        base_addr = hop.genop("direct_call", [self.decr_stack_ptr, c_len ],
-                              resulttype=llmemory.Address)
-        if self.gcdata.gc.moving_gc:
-            # for moving collectors, reload the roots into the local variables
-            for k,var in enumerate(livevars):
-                c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr)
-                v_newaddr = hop.genop("raw_load", [base_addr, c_k],
-                                      resulttype=llmemory.Address)
-                hop.genop("gc_reload_possibly_moved", [v_newaddr, var])
-
     def compute_borrowed_vars(self, graph):
         # XXX temporary workaround, should be done more correctly
         if self.gcdata.gc.moving_gc:
             return lambda v: False
-        return super(FrameworkGCTransformer, self).compute_borrowed_vars(graph)
+        return super(BaseFrameworkGCTransformer, self).compute_borrowed_vars(
+                graph)
+
+    def get_shadowstack_functions(self, getfn):
+        pass
+
+    def build_root_walker(self):
+        raise NotImplementedError
+
+    def push_roots(self, hop, keep_current_args=False):
+        raise NotImplementedError
+
+    def pop_roots(self, hop, livevars):
+        raise NotImplementedError
 
 
 class TransformerLayoutBuilder(gctypelayout.TypeLayoutBuilder):
@@ -1334,7 +1292,6 @@
 
 
 class BaseRootWalker(object):
-    need_root_stack = False
     thread_setup = None
 
     def __init__(self, gctransformer):
diff --git a/pypy/rpython/memory/gctransform/shadowstack.py b/pypy/rpython/memory/gctransform/shadowstack.py
--- a/pypy/rpython/memory/gctransform/shadowstack.py
+++ b/pypy/rpython/memory/gctransform/shadowstack.py
@@ -1,15 +1,58 @@
-from pypy.rpython.memory.gctransform.framework import BaseRootWalker
-from pypy.rpython.memory.gctransform.framework import sizeofaddr
+from pypy.annotation import model as annmodel
+from pypy.rlib.debug import ll_assert
+from pypy.rlib.nonconst import NonConstant
+from pypy.rpython import rmodel
 from pypy.rpython.annlowlevel import llhelper
 from pypy.rpython.lltypesystem import lltype, llmemory
-from pypy.rlib.debug import ll_assert
-from pypy.rlib.nonconst import NonConstant
-from pypy.annotation import model as annmodel
+from pypy.rpython.memory.gctransform.framework import (
+     BaseFrameworkGCTransformer, BaseRootWalker, sizeofaddr)
+from pypy.rpython.rbuiltin import gen_cast
+
+
+class ShadowStackFrameworkGCTransformer(BaseFrameworkGCTransformer):
+    def get_shadowstack_functions(self, getfn):
+        self.incr_stack_ptr = getfn(self.root_walker.incr_stack,
+                                   [annmodel.SomeInteger()],
+                                   annmodel.SomeAddress(),
+                                   inline = True)
+        self.decr_stack_ptr = getfn(self.root_walker.decr_stack,
+                                   [annmodel.SomeInteger()],
+                                   annmodel.SomeAddress(),
+                                   inline = True)
+
+    def build_root_walker(self):
+        return ShadowStackRootWalker(self)
+
+    def push_roots(self, hop, keep_current_args=False):
+        livevars = self.get_livevars_for_roots(hop, keep_current_args)
+        self.num_pushs += len(livevars)
+        if not livevars:
+            return []
+        c_len = rmodel.inputconst(lltype.Signed, len(livevars) )
+        base_addr = hop.genop("direct_call", [self.incr_stack_ptr, c_len ],
+                              resulttype=llmemory.Address)
+        for k,var in enumerate(livevars):
+            c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr)
+            v_adr = gen_cast(hop.llops, llmemory.Address, var)
+            hop.genop("raw_store", [base_addr, c_k, v_adr])
+        return livevars
+
+    def pop_roots(self, hop, livevars):
+        if not livevars:
+            return
+        c_len = rmodel.inputconst(lltype.Signed, len(livevars) )
+        base_addr = hop.genop("direct_call", [self.decr_stack_ptr, c_len ],
+                              resulttype=llmemory.Address)
+        if self.gcdata.gc.moving_gc:
+            # for moving collectors, reload the roots into the local variables
+            for k,var in enumerate(livevars):
+                c_k = rmodel.inputconst(lltype.Signed, k * sizeofaddr)
+                v_newaddr = hop.genop("raw_load", [base_addr, c_k],
+                                      resulttype=llmemory.Address)
+                hop.genop("gc_reload_possibly_moved", [v_newaddr, var])
 
 
 class ShadowStackRootWalker(BaseRootWalker):
-    need_root_stack = True
-
     def __init__(self, gctransformer):
         BaseRootWalker.__init__(self, gctransformer)
         # NB. 'self' is frozen, but we can use self.gcdata to store state
@@ -63,8 +106,6 @@
 
     def need_thread_support(self, gctransformer, getfn):
         from pypy.module.thread import ll_thread    # xxx fish
-        from pypy.rpython.memory.support import AddressDict
-        from pypy.rpython.memory.support import copy_without_null_values
         gcdata = self.gcdata
         # the interfacing between the threads and the GC is done via
         # two completely ad-hoc operations at the moment:
diff --git a/pypy/rpython/memory/gctransform/test/test_framework.py b/pypy/rpython/memory/gctransform/test/test_framework.py
--- a/pypy/rpython/memory/gctransform/test/test_framework.py
+++ b/pypy/rpython/memory/gctransform/test/test_framework.py
@@ -1,25 +1,25 @@
+from pypy.annotation.listdef import s_list_of_strings
+from pypy.annotation.model import SomeInteger
 from pypy.objspace.flow.model import Constant, SpaceOperation
-from pypy.annotation.model import SomeInteger
-from pypy.annotation.listdef import s_list_of_strings
+from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rpython.memory.gc.marksweep import MarkSweepGC
-from pypy.rpython.memory.gctransform.test.test_transform import rtype, \
-    rtype_and_transform
+from pypy.rpython.memory.gctransform.framework import (CollectAnalyzer,
+     find_initializing_stores, find_clean_setarrayitems)
+from pypy.rpython.memory.gctransform.shadowstack import (
+     ShadowStackFrameworkGCTransformer)
+from pypy.rpython.memory.gctransform.test.test_transform import rtype
 from pypy.rpython.memory.gctransform.transform import GcHighLevelOp
-from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer, \
-    CollectAnalyzer, find_initializing_stores, find_clean_setarrayitems
-from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rpython.rtyper import LowLevelOpList
-from pypy.translator.c.gc import FrameworkGcPolicy
+from pypy.translator.backendopt.all import backend_optimizations
+from pypy.translator.c.gc import BasicFrameworkGcPolicy
+from pypy.translator.exceptiontransform import ExceptionTransformer
 from pypy.translator.translator import TranslationContext, graphof
 from pypy.translator.unsimplify import varoftype
-from pypy.translator.exceptiontransform import ExceptionTransformer
-from pypy.translator.backendopt.all import backend_optimizations
-from pypy import conftest
 
 import py
 
-class FrameworkGcPolicy2(FrameworkGcPolicy):
-    class transformerclass(FrameworkGCTransformer):
+class FrameworkGcPolicy2(BasicFrameworkGcPolicy):
+    class transformerclass(ShadowStackFrameworkGCTransformer):
         root_stack_depth = 100
 
 def test_framework_simple():
@@ -34,7 +34,6 @@
 
     from pypy.rpython.llinterp import LLInterpreter
     from pypy.translator.c.genc import CStandaloneBuilder
-    from pypy.translator.c import gc
 
     t = rtype(entrypoint, [s_list_of_strings])
     cbuild = CStandaloneBuilder(t, entrypoint, t.config,
@@ -99,7 +98,6 @@
 def test_no_collect():
     from pypy.rlib import rgc
     from pypy.translator.c.genc import CStandaloneBuilder
-    from pypy.translator.c import gc
 
     @rgc.no_collect
     def g():
@@ -119,7 +117,6 @@
 def test_no_collect_detection():
     from pypy.rlib import rgc
     from pypy.translator.c.genc import CStandaloneBuilder
-    from pypy.translator.c import gc
 
     class A(object):
         def __init__(self, x):
@@ -142,7 +139,7 @@
     expected = "'no_collect' function can trigger collection: <function g at "
     assert str(f.value).startswith(expected)
 
-class WriteBarrierTransformer(FrameworkGCTransformer):
+class WriteBarrierTransformer(ShadowStackFrameworkGCTransformer):
     clean_sets = {}
     GC_PARAMS = {}
     class GCClass(MarkSweepGC):
diff --git a/pypy/translator/c/gc.py b/pypy/translator/c/gc.py
--- a/pypy/translator/c/gc.py
+++ b/pypy/translator/c/gc.py
@@ -1,11 +1,10 @@
 import sys
 from pypy.objspace.flow.model import Constant
+from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem.lltype import (typeOf, RttiStruct,
+     RuntimeTypeInfo, top_container)
+from pypy.translator.c.node import ContainerNode
 from pypy.translator.c.support import cdecl
-from pypy.translator.c.node import ContainerNode
-from pypy.rpython.lltypesystem.lltype import \
-     typeOf, Ptr, ContainerType, RttiStruct, \
-     RuntimeTypeInfo, getRuntimeTypeInfo, top_container
-from pypy.rpython.lltypesystem import lltype, llmemory
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
 
 class BasicGcPolicy(object):
@@ -106,8 +105,6 @@
 class RefcountingInfo:
     static_deallocator = None
 
-from pypy.rlib.objectmodel import CDefinedIntSymbolic
-
 class RefcountingGcPolicy(BasicGcPolicy):
 
     def gettransformer(self):
@@ -310,13 +307,12 @@
         return eci
 
 
-class FrameworkGcPolicy(BasicGcPolicy):
+class BasicFrameworkGcPolicy(BasicGcPolicy):
 
     def gettransformer(self):
         if hasattr(self, 'transformerclass'):    # for rpython/memory tests
             return self.transformerclass(self.db.translator)
-        from pypy.rpython.memory.gctransform import framework
-        return framework.FrameworkGCTransformer(self.db.translator)
+        raise NotImplementedError
 
     def struct_setup(self, structdefnode, rtti):
         if rtti is not None and hasattr(rtti._obj, 'destructor_funcptr'):
@@ -348,12 +344,12 @@
         yield '%s();' % (self.db.get(fnptr),)
 
     def get_real_weakref_type(self):
-        from pypy.rpython.memory.gctransform import framework
-        return framework.WEAKREF
+        from pypy.rpython.memory.gctypelayout import WEAKREF
+        return WEAKREF
 
     def convert_weakref_to(self, ptarget):
-        from pypy.rpython.memory.gctransform import framework
-        return framework.convert_weakref_to(ptarget)
+        from pypy.rpython.memory.gctypelayout import convert_weakref_to
+        return convert_weakref_to(ptarget)
 
     def OP_GC_RELOAD_POSSIBLY_MOVED(self, funcgen, op):
         if isinstance(op.args[1], Constant):
@@ -407,7 +403,13 @@
     def OP_GC_ASSUME_YOUNG_POINTERS(self, funcgen, op):
         raise Exception("the FramewokGCTransformer should handle this")
 
-class AsmGcRootFrameworkGcPolicy(FrameworkGcPolicy):
+class ShadowStackFrameworkGcPolicy(BasicFrameworkGcPolicy):
+
+    def gettransformer(self):
+        from pypy.rpython.memory.gctransform import shadowstack
+        return shadowstack.ShadowStackFrameworkGCTransformer(self.db.translator)
+
+class AsmGcRootFrameworkGcPolicy(BasicFrameworkGcPolicy):
 
     def gettransformer(self):
         from pypy.rpython.memory.gctransform import asmgcroot
@@ -424,8 +426,8 @@
     'boehm': BoehmGcPolicy,
     'ref': RefcountingGcPolicy,
     'none': NoneGcPolicy,
-    'framework': FrameworkGcPolicy,
-    'framework+asmgcroot': AsmGcRootFrameworkGcPolicy,
+    'framework+shadowstack': ShadowStackFrameworkGcPolicy,
+    'framework+asmgcc': AsmGcRootFrameworkGcPolicy
 }
 
 
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -1,19 +1,19 @@
 import autopath
 import py
 import sys, os
+from pypy.rlib import exports
+from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.typesystem import getfunctionptr
+from pypy.tool import isolate, runsubprocess
+from pypy.tool.nullpath import NullPyPathLocal
+from pypy.tool.udir import udir
+from pypy.translator.c import gc
 from pypy.translator.c.database import LowLevelDatabase
 from pypy.translator.c.extfunc import pre_include_code_lines
+from pypy.translator.c.support import log
+from pypy.translator.gensupp import uniquemodulename, NameManager
 from pypy.translator.llsupport.wrapper import new_wrapper
-from pypy.translator.gensupp import uniquemodulename, NameManager
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
-from pypy.rpython.lltypesystem import lltype
-from pypy.tool.udir import udir
-from pypy.tool import isolate, runsubprocess
-from pypy.translator.c.support import log, c_string_constant
-from pypy.rpython.typesystem import getfunctionptr
-from pypy.translator.c import gc
-from pypy.rlib import exports
-from pypy.tool.nullpath import NullPyPathLocal
 
 _CYGWIN = sys.platform == 'cygwin'
 
@@ -37,7 +37,6 @@
         platform = self.compiler.platform
         if platform.name.startswith('darwin'):
             # XXX incredible hack for darwin
-            cfiles = self.compiler.cfiles
             STR = '/*--no-profiling-for-this-file!--*/'
             no_prof = []
             prof = []
@@ -193,8 +192,8 @@
     def get_gcpolicyclass(self):
         if self.gcpolicy is None:
             name = self.config.translation.gctransformer
-            if self.config.translation.gcrootfinder == "asmgcc":
-                name = "%s+asmgcroot" % (name,)
+            if name == "framework":
+                name = "%s+%s" % (name, self.config.translation.gcrootfinder)
             return gc.name_to_gcpolicy[name]
         return self.gcpolicy
 
@@ -218,7 +217,6 @@
 
     def generate_source(self, db=None, defines={}, exe_name=None):
         assert self.c_source_filename is None
-        translator = self.translator
 
         if db is None:
             db = self.build_database()


More information about the pypy-commit mailing list