Author: Armin Rigo <ar...@tunes.org> Branch: shadowstack-perf Changeset: r46016:b09fe84eef7b Date: 2011-07-27 15:27 +0200 http://bitbucket.org/pypy/pypy/changeset/b09fe84eef7b/
Log: Revert the last 4 commits, up to c292d7b6630f. It should be done with a proper merge of the branch r15-for-exception, at some point. diff --git a/pypy/rlib/register.py b/pypy/rlib/register.py deleted file mode 100644 --- a/pypy/rlib/register.py +++ /dev/null @@ -1,81 +0,0 @@ -from pypy.translator.tool.cbuild import ExternalCompilationInfo -from pypy.rpython.tool import rffi_platform - -# On platforms with enough hardware registers and with gcc, we can -# (ab)use gcc to globally assign a register to a single global void* -# variable. We use it with a double meaning: -# -# - when it is NULL upon return from a function, it means that an -# exception occurred. It allows the caller to quickly check for -# exceptions. -# -# - in other cases, with --gcrootfinder=shadowstack, it points to -# the top of the shadow stack. - - -# For now, only for x86-64. Tries to use the register r15. -eci = ExternalCompilationInfo( - post_include_bits=[ - 'register void *pypy_r15 asm("r15");\n' - '#define PYPY_GET_SPECIAL_REG() pypy_r15\n' - '#define PYPY_SPECIAL_REG_NONNULL() (pypy_r15 != NULL)\n' - '#define PYPY_SET_SPECIAL_REG(x) (pypy_r15 = x)\n' - ], - ) - -_test_eci = eci.merge(ExternalCompilationInfo( - post_include_bits=[""" - void f(void) { - pypy_r15 = &f; - } - """])) - -try: - rffi_platform.verify_eci(_test_eci) - register_number = 15 # r15 -except rffi_platform.CompilationError: - eci = None - register_number = None -else: - - from pypy.rpython.lltypesystem import lltype, llmemory, rffi - - # use addr=load_from_reg() and store_into_reg(addr) to load and store - # an Address out of the special register. When running on top of Python, - # the behavior is emulated. - - _value_reg = None - - def _pypy_get_special_reg(): - assert _value_reg is not None - return _value_reg - - def _pypy_special_reg_nonnull(): - assert _value_reg is not None - return bool(_value_reg) - - def _pypy_set_special_reg(addr): - global _value_reg - _value_reg = addr - - load_from_reg = rffi.llexternal('PYPY_GET_SPECIAL_REG', [], - llmemory.Address, - _callable=_pypy_get_special_reg, - compilation_info=eci, - _nowrapper=True) - - reg_is_nonnull = rffi.llexternal('PYPY_SPECIAL_REG_NONNULL', [], - lltype.Bool, - _callable=_pypy_special_reg_nonnull, - compilation_info=eci, - _nowrapper=True) - - store_into_reg = rffi.llexternal('PYPY_SET_SPECIAL_REG', - [llmemory.Address], - lltype.Void, - _callable=_pypy_set_special_reg, - compilation_info=eci, - _nowrapper=True) - - # xxx temporary - nonnull = llmemory.cast_int_to_adr(-1) diff --git a/pypy/rlib/test/test_register.py b/pypy/rlib/test/test_register.py deleted file mode 100644 --- a/pypy/rlib/test/test_register.py +++ /dev/null @@ -1,55 +0,0 @@ -import py -from pypy.rlib import register -from pypy.rpython.lltypesystem import lltype, llmemory, rffi -from pypy.translator.c.test.test_standalone import StandaloneTests - - -def test_register(): - # - from pypy.jit.backend.detect_cpu import autodetect - if autodetect() == 'x86_64': - assert register.eci is not None - assert register.register_number == 15 # r15 - else: - assert register.eci is None - assert register.register_number is None - - -class TestLoadStore(object): - def setup_class(cls): - if register.register_number is None: - py.test.skip("rlib/register not supported on this platform") - - def test_direct(self): - a = rffi.cast(llmemory.Address, 27) - register.store_into_reg(a) - b = register.load_from_reg() - assert lltype.typeOf(b) == llmemory.Address - assert rffi.cast(lltype.Signed, b) == 27 - - def test_llinterp(self): - from pypy.rpython.test.test_llinterp import interpret - def f(n): - a = rffi.cast(llmemory.Address, n) - register.store_into_reg(a) - b = register.load_from_reg() - return rffi.cast(lltype.Signed, b) - res = interpret(f, [41]) - assert res == 41 - - -class TestLoadStoreCompiled(StandaloneTests): - def setup_class(cls): - if register.register_number is None: - py.test.skip("rlib/register not supported on this platform") - - def test_compiled(self): - def f(argv): - a = rffi.cast(llmemory.Address, 43) - register.store_into_reg(a) - b = register.load_from_reg() - print rffi.cast(lltype.Signed, b) - return 0 - t, cbuilder = self.compile(f) - data = cbuilder.cmdexec('') - assert data.startswith('43\n') diff --git a/pypy/translator/c/database.py b/pypy/translator/c/database.py --- a/pypy/translator/c/database.py +++ b/pypy/translator/c/database.py @@ -60,8 +60,7 @@ if translator is None or translator.rtyper is None: self.exctransformer = None else: - self.exctransformer = translator.getexceptiontransformer( - standalone=standalone) + self.exctransformer = translator.getexceptiontransformer() if translator is not None: self.gctransformer = self.gcpolicy.transformerclass(translator) self.completed = False diff --git a/pypy/translator/c/src/main.h b/pypy/translator/c/src/main.h --- a/pypy/translator/c/src/main.h +++ b/pypy/translator/c/src/main.h @@ -34,10 +34,6 @@ char *errmsg; int i, exitcode; RPyListOfString *list; -#ifdef PYPY_GET_SPECIAL_REG - void *pypy_reg_oldvalue = PYPY_GET_SPECIAL_REG(); - PYPY_SET_SPECIAL_REG((void*)-1); -#endif pypy_asm_stack_bottom(); instrument_setup(); @@ -74,10 +70,6 @@ pypy_debug_catch_fatal_exception(); } -#ifdef PYPY_GET_SPECIAL_REG - PYPY_SET_SPECIAL_REG(pypy_reg_oldvalue); -#endif - return exitcode; memory_out: @@ -87,7 +79,7 @@ fprintf(stderr, "Fatal error during initialization: %s\n", errmsg); #endif abort(); - return 1; /* not actually reachable */ + return 1; } int PYPY_MAIN_FUNCTION(int argc, char *argv[]) diff --git a/pypy/translator/exceptiontransform.py b/pypy/translator/exceptiontransform.py --- a/pypy/translator/exceptiontransform.py +++ b/pypy/translator/exceptiontransform.py @@ -14,7 +14,6 @@ from pypy.rlib.rarithmetic import r_singlefloat from pypy.rlib.debug import ll_assert from pypy.rlib.rstackovf import _StackOverflow -from pypy.rlib import register from pypy.annotation import model as annmodel from pypy.rpython.annlowlevel import MixLevelHelperAnnotator from pypy.tool.sourcetools import func_with_new_name @@ -52,9 +51,8 @@ class BaseExceptionTransformer(object): - def __init__(self, translator, standalone): + def __init__(self, translator): self.translator = translator - self.standalone = standalone self.raise_analyzer = canraise.RaiseAnalyzer(translator) edata = translator.rtyper.getexceptiondata() self.lltype_of_exception_value = edata.lltype_of_exception_value @@ -74,21 +72,9 @@ assertion_error_ll_exc_type) self.c_n_i_error_ll_exc_type = constant_value(n_i_error_ll_exc_type) - use_special_reg = standalone and register.register_number is not None - self.use_special_reg = use_special_reg - if use_special_reg: - self.c_nonnull_specialregister = constant_value(register.nonnull) - self.c_load_from_reg = constant_value(register.load_from_reg) - self.c_reg_is_nonnull = constant_value(register.reg_is_nonnull) - self.c_store_into_reg = constant_value(register.store_into_reg) - def rpyexc_occured(): - if use_special_reg: - # an exception occurred iff the special register is 0 - return register.load_from_reg() == llmemory.NULL - else: - exc_type = exc_data.exc_type - return bool(exc_type) + exc_type = exc_data.exc_type + return bool(exc_type) def rpyexc_fetch_type(): return exc_data.exc_type @@ -97,8 +83,6 @@ return exc_data.exc_value def rpyexc_clear(): - if use_special_reg: - register.store_into_reg(register.nonnull) exc_data.exc_type = null_type exc_data.exc_value = null_value @@ -115,15 +99,11 @@ exc_data.exc_type = etype exc_data.exc_value = evalue lloperation.llop.debug_start_traceback(lltype.Void, etype) - if use_special_reg: - register.store_into_reg(llmemory.NULL) def rpyexc_reraise(etype, evalue): exc_data.exc_type = etype exc_data.exc_value = evalue lloperation.llop.debug_reraise_traceback(lltype.Void, etype) - if use_special_reg: - register.store_into_reg(llmemory.NULL) def rpyexc_fetch_exception(): evalue = rpyexc_fetch_value() @@ -134,8 +114,6 @@ if evalue: exc_data.exc_type = rclass.ll_inst_type(evalue) exc_data.exc_value = evalue - if use_special_reg: - register.store_into_reg(llmemory.NULL) def rpyexc_raise_stack_overflow(): rpyexc_raise(stackovf_ll_exc_type, stackovf_ll_exc) @@ -431,8 +409,6 @@ # self.gen_setfield('exc_value', self.c_null_evalue, llops) self.gen_setfield('exc_type', self.c_null_etype, llops) - if self.use_special_reg: - self.gen_setspecialregister(self.c_nonnull_specialregister, llops) excblock.operations[:] = llops newgraph.exceptblock.inputargs[0].concretetype = self.lltype_of_exception_type newgraph.exceptblock.inputargs[1].concretetype = self.lltype_of_exception_value @@ -456,8 +432,6 @@ if alloc_shortcut: T = spaceop.result.concretetype var_no_exc = self.gen_nonnull(spaceop.result, llops) - elif self.use_special_reg: - var_no_exc = self.gen_specialreg_no_exc(llops) else: v_exc_type = self.gen_getfield('exc_type', llops) var_no_exc = self.gen_isnull(v_exc_type, llops) @@ -553,17 +527,6 @@ def gen_nonnull(self, v, llops): return llops.genop('ptr_nonzero', [v], lltype.Bool) - def gen_getspecialregister(self, llops): - return llops.genop('direct_call', [self.c_load_from_reg], - resulttype = llmemory.Address) - - def gen_specialreg_no_exc(self, llops): - return llops.genop('direct_call', [self.c_reg_is_nonnull], - resulttype = lltype.Bool) - - def gen_setspecialregister(self, v, llops): - llops.genop('direct_call', [self.c_store_into_reg, v]) - def same_obj(self, ptr1, ptr2): return ptr1._same_obj(ptr2) @@ -650,10 +613,10 @@ def build_extra_funcs(self): pass -def ExceptionTransformer(translator, standalone): +def ExceptionTransformer(translator): type_system = translator.rtyper.type_system.name if type_system == 'lltypesystem': - return LLTypeExceptionTransformer(translator, standalone) + return LLTypeExceptionTransformer(translator) else: assert type_system == 'ootypesystem' - return OOTypeExceptionTransformer(translator, standalone) + return OOTypeExceptionTransformer(translator) diff --git a/pypy/translator/translator.py b/pypy/translator/translator.py --- a/pypy/translator/translator.py +++ b/pypy/translator/translator.py @@ -108,14 +108,13 @@ type_system = type_system) return self.rtyper - def getexceptiontransformer(self, standalone): + def getexceptiontransformer(self): if self.rtyper is None: raise ValueError("no rtyper") if self.exceptiontransformer is not None: - assert self.exceptiontransformer.standalone == standalone return self.exceptiontransformer from pypy.translator.exceptiontransform import ExceptionTransformer - self.exceptiontransformer = ExceptionTransformer(self, standalone) + self.exceptiontransformer = ExceptionTransformer(self) return self.exceptiontransformer def checkgraphs(self): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit