[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