Author: Armin Rigo <[email protected]>
Branch:
Changeset: r85023:2384df43b1dd
Date: 2016-06-08 09:29 +0200
http://bitbucket.org/pypy/pypy/changeset/2384df43b1dd/
Log: merge heads
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -25,3 +25,4 @@
80ef432a32d9baa4b3c5a54c215e8ebe499f6374 release-5.1.2
40497617ae91caa1a394d8be6f9cd2de31cb0628 release-pypy3.3-v5.2
40497617ae91caa1a394d8be6f9cd2de31cb0628 release-pypy3.3-v5.2
+c09c19272c990a0611b17569a0085ad1ab00c8ff release-pypy2.7-v5.3
diff --git a/pypy/conftest.py b/pypy/conftest.py
--- a/pypy/conftest.py
+++ b/pypy/conftest.py
@@ -164,13 +164,6 @@
__multicall__.execute()
-def pytest_runtest_teardown(__multicall__, item):
- __multicall__.execute()
-
- if 'pygame' in sys.modules:
- assert option.view, ("should not invoke Pygame "
- "if conftest.option.view is False")
-
class PyPyClassCollector(py.test.collect.Class):
# All pypy Test classes have a "space" member.
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -5,3 +5,17 @@
.. this is a revision shortly after release-pypy2.7-v5.3
.. startrev: 873218a739f1
+.. branch: fix-gen-dfa
+
+Resolves an issue with the generator script to build the dfa for Python syntax.
+
+.. branch: z196-support
+
+Fixes a critical issue in the register allocator and extends support on s390x.
+PyPy runs and translates on the s390x revisions z10 (released February 2008,
experimental)
+and z196 (released August 2010) in addition to zEC12 and z13.
+To target e.g. z196 on a zEC12 machine supply CFLAGS="-march=z196" to your
shell environment.
+
+.. branch: s390x-5.3-catchup
+
+Implement the backend related changes for s390x.
diff --git a/pypy/interpreter/pyparser/genpytokenize.py
b/pypy/interpreter/pyparser/genpytokenize.py
--- a/pypy/interpreter/pyparser/genpytokenize.py
+++ b/pypy/interpreter/pyparser/genpytokenize.py
@@ -191,7 +191,7 @@
newArcPair(states, EMPTY),
pseudoExtras, number, funny, contStr, name))
dfaStates, dfaAccepts = nfaToDfa(states, *pseudoToken)
- return DFA(dfaStates, dfaAccepts)
+ return DFA(dfaStates, dfaAccepts), dfaStates
# ______________________________________________________________________
@@ -205,7 +205,9 @@
newArcPair(states, DEFAULT),
any(states, notGroupStr(states, "'\\")))),
newArcPair(states, "'"))
- singleDFA = DFA(*nfaToDfa(states, *single))
+ states, accepts = nfaToDfa(states, *single)
+ singleDFA = DFA(states, accepts)
+ states_singleDFA = states
states = []
double = chain(states,
any(states, notGroupStr(states, '"\\')),
@@ -215,7 +217,9 @@
newArcPair(states, DEFAULT),
any(states, notGroupStr(states, '"\\')))),
newArcPair(states, '"'))
- doubleDFA = DFA(*nfaToDfa(states, *double))
+ states, accepts = nfaToDfa(states, *double)
+ doubleDFA = DFA(states, accepts)
+ states_doubleDFA = states
states = []
single3 = chain(states,
any(states, notGroupStr(states, "'\\")),
@@ -230,7 +234,9 @@
notChainStr(states, "''"))),
any(states, notGroupStr(states, "'\\")))),
chainStr(states, "'''"))
- single3DFA = NonGreedyDFA(*nfaToDfa(states, *single3))
+ states, accepts = nfaToDfa(states, *single3)
+ single3DFA = NonGreedyDFA(states, accepts)
+ states_single3DFA = states
states = []
double3 = chain(states,
any(states, notGroupStr(states, '"\\')),
@@ -245,9 +251,11 @@
notChainStr(states, '""'))),
any(states, notGroupStr(states, '"\\')))),
chainStr(states, '"""'))
- double3DFA = NonGreedyDFA(*nfaToDfa(states, *double3))
- map = {"'" : singleDFA,
- '"' : doubleDFA,
+ states, accepts = nfaToDfa(states, *double3)
+ double3DFA = NonGreedyDFA(states, accepts)
+ states_double3DFA = states
+ map = {"'" : (singleDFA, states_singleDFA),
+ '"' : (doubleDFA, states_doubleDFA),
"r" : None,
"R" : None,
"u" : None,
@@ -257,25 +265,30 @@
for uniPrefix in ("", "u", "U", "b", "B", ):
for rawPrefix in ("", "r", "R"):
prefix = uniPrefix + rawPrefix
- map[prefix + "'''"] = single3DFA
- map[prefix + '"""'] = double3DFA
+ map[prefix + "'''"] = (single3DFA, states_single3DFA)
+ map[prefix + '"""'] = (double3DFA, states_double3DFA)
return map
# ______________________________________________________________________
-def output(name, dfa_class, dfa):
+def output(name, dfa_class, dfa, states):
import textwrap
+ lines = []
i = 0
for line in textwrap.wrap(repr(dfa.accepts), width = 50):
if i == 0:
- print "accepts =", line
+ lines.append("accepts = ")
else:
- print " ", line
+ lines.append(" ")
+ lines.append(line)
+ lines.append("\n")
i += 1
import StringIO
- print "states = ["
- for numstate, state in enumerate(dfa.states):
- print " #", numstate
+ lines.append("states = [\n")
+ for numstate, state in enumerate(states):
+ lines.append(" # ")
+ lines.append(str(numstate))
+ lines.append('\n')
s = StringIO.StringIO()
i = 0
for k, v in sorted(state.items()):
@@ -298,22 +311,28 @@
for line in text:
line = line.replace('::', ': ')
if i == 0:
- print ' {' + line
+ lines.append(' {')
else:
- print ' ' + line
+ lines.append(' ')
+ lines.append(line)
+ lines.append('\n')
i += 1
- print " ]"
- print "%s = automata.%s(states, accepts)" % (name, dfa_class)
- print
+ lines.append(" ]\n")
+ lines.append("%s = automata.%s(states, accepts)\n" % (name, dfa_class))
+ return ''.join(lines)
def main ():
- pseudoDFA = makePyPseudoDFA()
- output("pseudoDFA", "DFA", pseudoDFA)
+ pseudoDFA, states_pseudoDFA = makePyPseudoDFA()
+ print output("pseudoDFA", "DFA", pseudoDFA, states_pseudoDFA)
endDFAMap = makePyEndDFAMap()
- output("double3DFA", "NonGreedyDFA", endDFAMap['"""'])
- output("single3DFA", "NonGreedyDFA", endDFAMap["'''"])
- output("singleDFA", "DFA", endDFAMap["'"])
- output("doubleDFA", "DFA", endDFAMap['"'])
+ dfa, states = endDFAMap['"""']
+ print output("double3DFA", "NonGreedyDFA", dfa, states)
+ dfa, states = endDFAMap["'''"]
+ print output("single3DFA", "NonGreedyDFA", dfa, states)
+ dfa, states = endDFAMap["'"]
+ print output("singleDFA", "DFA", dfa, states)
+ dfa, states = endDFAMap["\""]
+ print output("doubleDFA", "DFA", dfa, states)
# ______________________________________________________________________
diff --git a/pypy/interpreter/pyparser/test/test_gendfa.py
b/pypy/interpreter/pyparser/test/test_gendfa.py
new file mode 100644
--- /dev/null
+++ b/pypy/interpreter/pyparser/test/test_gendfa.py
@@ -0,0 +1,16 @@
+from pypy.interpreter.pyparser.automata import DFA, DEFAULT
+from pypy.interpreter.pyparser.genpytokenize import output
+
+def test_states():
+ states = [{"\x00": 1}, {"\x01": 0}]
+ d = DFA(states[:], [False, True])
+ assert output('test', DFA, d, states) == """\
+accepts = [False, True]
+states = [
+ # 0
+ {'\\x00': 1},
+ # 1
+ {'\\x01': 0},
+ ]
+test = automata.pypy.interpreter.pyparser.automata.DFA(states, accepts)
+"""
diff --git a/pypy/interpreter/test/test_pyframe.py
b/pypy/interpreter/test/test_pyframe.py
--- a/pypy/interpreter/test/test_pyframe.py
+++ b/pypy/interpreter/test/test_pyframe.py
@@ -1,5 +1,5 @@
-import pytest
from rpython.tool import udir
+from pypy.conftest import option
from pypy.interpreter.gateway import interp2app
def check_no_w_locals(space, w_frame):
@@ -11,7 +11,7 @@
space = cls.space
cls.w_udir = cls.space.wrap(str(udir.udir))
cls.w_tempfile1 = cls.space.wrap(str(udir.udir.join('tempfile1')))
- if not pytest.config.option.runappdirect:
+ if not option.runappdirect:
w_call_further = cls.space.appexec([], """():
def call_further(f):
return f()
diff --git a/pypy/interpreter/test/test_zzpickle_and_slow.py
b/pypy/interpreter/test/test_zzpickle_and_slow.py
--- a/pypy/interpreter/test/test_zzpickle_and_slow.py
+++ b/pypy/interpreter/test/test_zzpickle_and_slow.py
@@ -1,4 +1,5 @@
import py
+from pypy import conftest
from pypy.interpreter import gateway
from rpython.rlib.jit import non_virtual_ref, vref_None
diff --git a/pypy/module/_continuation/test/test_translated.py
b/pypy/module/_continuation/test/test_translated.py
--- a/pypy/module/_continuation/test/test_translated.py
+++ b/pypy/module/_continuation/test/test_translated.py
@@ -89,7 +89,8 @@
class AppTestWrapper:
def setup_class(cls):
"Run test_various_depths() when we are run with 'pypy py.test -A'."
- if not py.test.config.option.runappdirect:
+ from pypy.conftest import option
+ if not option.runappdirect:
py.test.skip("meant only for -A run")
def _setup():
diff --git a/pypy/module/_file/test/test_file.py
b/pypy/module/_file/test/test_file.py
--- a/pypy/module/_file/test/test_file.py
+++ b/pypy/module/_file/test/test_file.py
@@ -516,11 +516,12 @@
assert s == 'bar\n'
def test_flush_at_exit():
+ from pypy import conftest
from pypy.tool.option import make_config, make_objspace
from rpython.tool.udir import udir
tmpfile = udir.join('test_flush_at_exit')
- config = make_config(py.test.config.option)
+ config = make_config(conftest.option)
space = make_objspace(config)
space.appexec([space.wrap(str(tmpfile))], """(tmpfile):
f = open(tmpfile, 'w')
diff --git a/pypy/module/_io/test/test_fileio.py
b/pypy/module/_io/test/test_fileio.py
--- a/pypy/module/_io/test/test_fileio.py
+++ b/pypy/module/_io/test/test_fileio.py
@@ -222,10 +222,14 @@
assert not closed[0] # flush() called before file closed
os.close(fd)
-def test_flush_at_exit(space):
+def test_flush_at_exit():
+ from pypy import conftest
+ from pypy.tool.option import make_config, make_objspace
from rpython.tool.udir import udir
tmpfile = udir.join('test_flush_at_exit')
+ config = make_config(conftest.option)
+ space = make_objspace(config)
space.appexec([space.wrap(str(tmpfile))], """(tmpfile):
import io
f = io.open(tmpfile, 'w', encoding='ascii')
@@ -237,7 +241,12 @@
assert tmpfile.read() == '42'
-def test_flush_at_exit_IOError_and_ValueError(space):
+def test_flush_at_exit_IOError_and_ValueError():
+ from pypy import conftest
+ from pypy.tool.option import make_config, make_objspace
+
+ config = make_config(conftest.option)
+ space = make_objspace(config)
space.appexec([], """():
import io
class MyStream(io.IOBase):
diff --git a/pypy/module/_rawffi/test/test_tracker.py
b/pypy/module/_rawffi/test/test_tracker.py
--- a/pypy/module/_rawffi/test/test_tracker.py
+++ b/pypy/module/_rawffi/test/test_tracker.py
@@ -1,5 +1,5 @@
import py
-from pytest import option
+from pypy.conftest import option
from pypy.module._rawffi.tracker import Tracker
@@ -44,3 +44,4 @@
def teardown_class(cls):
Tracker.DO_TRACING = False
+
diff --git a/pypy/module/cpyext/object.py b/pypy/module/cpyext/object.py
--- a/pypy/module/cpyext/object.py
+++ b/pypy/module/cpyext/object.py
@@ -1,7 +1,7 @@
from rpython.rtyper.lltypesystem import rffi, lltype
from pypy.module.cpyext.api import (
cpython_api, generic_cpy_call, CANNOT_FAIL, Py_ssize_t, Py_ssize_tP,
- PyVarObject, Py_buffer,
+ PyVarObject, Py_buffer, size_t,
Py_TPFLAGS_HEAPTYPE, Py_LT, Py_LE, Py_EQ, Py_NE, Py_GT,
Py_GE, CONST_STRING, FILEP, fwrite)
from pypy.module.cpyext.pyobject import (
@@ -14,14 +14,14 @@
import pypy.module.__builtin__.operation as operation
-@cpython_api([Py_ssize_t], rffi.VOIDP)
+@cpython_api([size_t], rffi.VOIDP)
def PyObject_Malloc(space, size):
# returns non-zero-initialized memory, like CPython
return lltype.malloc(rffi.VOIDP.TO, size,
flavor='raw',
add_memory_pressure=True)
-@cpython_api([rffi.VOIDP, Py_ssize_t], rffi.VOIDP)
+@cpython_api([rffi.VOIDP, size_t], rffi.VOIDP)
def PyObject_Realloc(space, ptr, size):
if not lltype.cast_ptr_to_int(ptr):
return lltype.malloc(rffi.VOIDP.TO, size,
diff --git a/pypy/module/gc/test/test_referents.py
b/pypy/module/gc/test/test_referents.py
--- a/pypy/module/gc/test/test_referents.py
+++ b/pypy/module/gc/test/test_referents.py
@@ -1,4 +1,4 @@
-from pytest import option
+from pypy.conftest import option
class AppTestReferents(object):
diff --git a/pypy/module/imp/test/test_import.py
b/pypy/module/imp/test/test_import.py
--- a/pypy/module/imp/test/test_import.py
+++ b/pypy/module/imp/test/test_import.py
@@ -13,7 +13,7 @@
from pypy.module.imp import importing
-from pytest import config
+from pypy import conftest
def setuppkg(pkgname, **entries):
p = udir.join('impsubdir')
@@ -106,7 +106,7 @@
# create compiled/x.py and a corresponding pyc file
p = setuppkg("compiled", x = "x = 84")
- if config.option.runappdirect:
+ if conftest.option.runappdirect:
import marshal, stat, struct, os, imp
code = py.code.Source(p.join("x.py").read()).compile()
s3 = marshal.dumps(code)
@@ -168,7 +168,7 @@
}
def setup_class(cls):
- cls.w_runappdirect = cls.space.wrap(config.option.runappdirect)
+ cls.w_runappdirect = cls.space.wrap(conftest.option.runappdirect)
cls.saved_modules = _setup(cls.space)
#XXX Compile class
@@ -1494,6 +1494,8 @@
spaceconfig = dict(usemodules=['thread', 'time'])
def setup_class(cls):
+ #if not conftest.option.runappdirect:
+ # py.test.skip("meant as an -A test")
tmpfile = udir.join('test_multithreaded_imp.py')
tmpfile.write('''if 1:
x = 666
diff --git a/pypy/module/micronumpy/test/test_base.py
b/pypy/module/micronumpy/test/test_base.py
--- a/pypy/module/micronumpy/test/test_base.py
+++ b/pypy/module/micronumpy/test/test_base.py
@@ -1,4 +1,4 @@
-from pytest import config
+from pypy.conftest import option
from pypy.module.micronumpy import constants as NPY
@@ -7,7 +7,7 @@
@classmethod
def setup_class(cls):
- if config.option.runappdirect:
+ if option.runappdirect:
import sys
if '__pypy__' not in sys.builtin_module_names:
import numpy
diff --git a/pypy/module/micronumpy/test/test_complex.py
b/pypy/module/micronumpy/test/test_complex.py
--- a/pypy/module/micronumpy/test/test_complex.py
+++ b/pypy/module/micronumpy/test/test_complex.py
@@ -2,6 +2,7 @@
import sys
+from pypy.conftest import option
from pypy.interpreter.error import OperationError
from pypy.interpreter.gateway import interp2app
from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
@@ -22,13 +23,13 @@
# special values testing
if isnan(a):
if isnan(b):
- return True, ''
+ return True,''
raise AssertionError(msg + '%r should be nan' % (b,))
if isinf(a):
if a == b:
- return True, ''
- raise AssertionError(msg + 'finite result where infinity expected: '
+ return True,''
+ raise AssertionError(msg + 'finite result where infinity expected: '+ \
'expected %r, got %r' % (a, b))
# if both a and b are zero, check whether they have the same sign
@@ -38,7 +39,7 @@
if not a and not b:
# only check it if we are running on top of CPython >= 2.6
if sys.version_info >= (2, 6) and copysign(1., a) != copysign(1., b):
- raise AssertionError(msg +
+ raise AssertionError( msg + \
'zero has wrong sign: expected %r, got %r' % (a, b))
# if a-b overflows, or b is infinite, return False. Again, in
@@ -95,6 +96,7 @@
cls.w_testcases128 = cls.space.wrap(list(parse_testfile(fname128)))
cls.w_testcases64 = cls.space.wrap(list(parse_testfile(fname64)))
+ cls.w_runAppDirect = cls.space.wrap(option.runappdirect)
cls.w_isWindows = cls.space.wrap(os.name == 'nt')
if cls.runappdirect:
diff --git a/pypy/module/micronumpy/test/test_dtypes.py
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -1,11 +1,11 @@
-from pytest import config
+from pypy.conftest import option
from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
from pypy.interpreter.gateway import interp2app
class BaseAppTestDtypes(BaseNumpyAppTest):
def setup_class(cls):
BaseNumpyAppTest.setup_class.im_func(cls)
- if config.option.runappdirect:
+ if option.runappdirect:
import platform
bits, linkage = platform.architecture()
ptr_size = int(bits[:-3]) // 8
@@ -1088,7 +1088,7 @@
spaceconfig = dict(usemodules=["micronumpy", "struct", "binascii"])
def setup_class(cls):
BaseNumpyAppTest.setup_class.im_func(cls)
- if config.option.runappdirect:
+ if option.runappdirect:
cls.w_test_for_core_internal = cls.space.wrap(True)
else:
cls.w_test_for_core_internal = cls.space.wrap(False)
@@ -1515,7 +1515,7 @@
else:
assert stor2[1] == '\x01'
assert stor2[0] == '\x00'
- if config.option.runappdirect:
+ if option.runappdirect:
cls.w_check_non_native = lambda *args : None
else:
cls.w_check_non_native =
cls.space.wrap(interp2app(check_non_native))
diff --git a/pypy/module/micronumpy/test/test_ndarray.py
b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -2,7 +2,7 @@
import py
import sys
-from pytest import config
+from pypy.conftest import option
from pypy.module.micronumpy.appbridge import get_appbridge_cache
from pypy.module.micronumpy.strides import Chunk, new_view, EllipsisChunk
from pypy.module.micronumpy.ndarray import W_NDimArray
@@ -3850,7 +3850,7 @@
class AppTestRepr(BaseNumpyAppTest):
def setup_class(cls):
- if config.option.runappdirect:
+ if option.runappdirect:
py.test.skip("Can't be run directly.")
BaseNumpyAppTest.setup_class.im_func(cls)
cache = get_appbridge_cache(cls.space)
@@ -3867,7 +3867,7 @@
assert repr(array(1.5).real) == "array(1.5)"
def teardown_class(cls):
- if config.option.runappdirect:
+ if option.runappdirect:
return
cache = get_appbridge_cache(cls.space)
cache.w_array_repr = cls.old_array_repr
@@ -4343,7 +4343,7 @@
class AppTestPyPy(BaseNumpyAppTest):
def setup_class(cls):
- if config.option.runappdirect and '__pypy__' not in
sys.builtin_module_names:
+ if option.runappdirect and '__pypy__' not in sys.builtin_module_names:
py.test.skip("pypy only test")
BaseNumpyAppTest.setup_class.im_func(cls)
diff --git a/pypy/module/micronumpy/test/test_object_arrays.py
b/pypy/module/micronumpy/test/test_object_arrays.py
--- a/pypy/module/micronumpy/test/test_object_arrays.py
+++ b/pypy/module/micronumpy/test/test_object_arrays.py
@@ -1,9 +1,14 @@
from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
+from pypy.conftest import option
class AppTestObjectDtypes(BaseNumpyAppTest):
spaceconfig = dict(usemodules=["micronumpy", "struct", "binascii"])
+ def setup_class(cls):
+ BaseNumpyAppTest.setup_class.im_func(cls)
+ cls.w_runappdirect = cls.space.wrap(option.runappdirect)
+
def test_scalar_from_object(self):
from numpy import array
import sys
diff --git a/pypy/module/micronumpy/test/test_support_app.py
b/pypy/module/micronumpy/test/test_support_app.py
--- a/pypy/module/micronumpy/test/test_support_app.py
+++ b/pypy/module/micronumpy/test/test_support_app.py
@@ -3,12 +3,11 @@
import py
from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
-from pytest import config
+from pypy.conftest import option
class AppTestSupport(BaseNumpyAppTest):
def setup_class(cls):
- if (config.option.runappdirect and
- '__pypy__' not in sys.builtin_module_names):
+ if option.runappdirect and '__pypy__' not in sys.builtin_module_names:
py.test.skip("pypy only test")
BaseNumpyAppTest.setup_class.im_func(cls)
diff --git a/pypy/module/select/test/test_epoll.py
b/pypy/module/select/test/test_epoll.py
--- a/pypy/module/select/test/test_epoll.py
+++ b/pypy/module/select/test/test_epoll.py
@@ -20,6 +20,10 @@
self.w_sockets = self.space.wrap([])
if platform.machine().startswith('arm'):
self.w_timeout = self.space.wrap(0.06)
+ if platform.machine().startswith('s390x'):
+ # s390x is not slow, but it seems there is one case when epoll
+ # modify method is called that takes longer on s390x
+ self.w_timeout = self.space.wrap(0.06)
else:
self.w_timeout = self.space.wrap(0.02)
diff --git a/pypy/module/test_lib_pypy/support.py
b/pypy/module/test_lib_pypy/support.py
--- a/pypy/module/test_lib_pypy/support.py
+++ b/pypy/module/test_lib_pypy/support.py
@@ -1,6 +1,6 @@
import py
-from pytest import config
+from pypy.conftest import option
from pypy.interpreter.error import OperationError
def import_lib_pypy(space, name, skipmsg=None):
@@ -9,7 +9,7 @@
Raises a pytest Skip on ImportError if a skip message was specified.
"""
- if config.option.runappdirect:
+ if option.runappdirect:
try:
mod = __import__('lib_pypy.' + name)
except ImportError as e:
diff --git a/pypy/objspace/std/test/test_bytearrayobject.py
b/pypy/objspace/std/test/test_bytearrayobject.py
--- a/pypy/objspace/std/test/test_bytearrayobject.py
+++ b/pypy/objspace/std/test/test_bytearrayobject.py
@@ -1,9 +1,9 @@
-from pytest import config
+from pypy import conftest
class AppTestBytesArray:
def setup_class(cls):
- cls.w_runappdirect = cls.space.wrap(config.option.runappdirect)
+ cls.w_runappdirect = cls.space.wrap(conftest.option.runappdirect)
def test_basics(self):
b = bytearray()
diff --git a/pypy/objspace/std/test/test_obj.py
b/pypy/objspace/std/test/test_obj.py
--- a/pypy/objspace/std/test/test_obj.py
+++ b/pypy/objspace/std/test/test_obj.py
@@ -1,4 +1,5 @@
-from pytest import config
+from __future__ import with_statement
+from pypy.conftest import option
class AppTestObject:
@@ -6,13 +7,13 @@
from pypy.interpreter import gateway
import sys
- cpython_behavior = (not config.option.runappdirect
+ cpython_behavior = (not option.runappdirect
or not hasattr(sys, 'pypy_translation_info'))
space = cls.space
cls.w_cpython_behavior = space.wrap(cpython_behavior)
cls.w_cpython_version = space.wrap(tuple(sys.version_info))
- cls.w_appdirect = space.wrap(config.option.runappdirect)
+ cls.w_appdirect = space.wrap(option.runappdirect)
cls.w_cpython_apptest = space.wrap(option.runappdirect and not
hasattr(sys, 'pypy_translation_info'))
def w_unwrap_wrap_unicode(space, w_obj):
diff --git a/pypy/objspace/std/test/test_proxy_usercreated.py
b/pypy/objspace/std/test/test_proxy_usercreated.py
--- a/pypy/objspace/std/test/test_proxy_usercreated.py
+++ b/pypy/objspace/std/test/test_proxy_usercreated.py
@@ -5,7 +5,7 @@
from pypy.interpreter.typedef import TypeDef
from pypy.interpreter.gateway import interp2app
from pypy.objspace.std.transparent import register_proxyable
-from pytest import config
+from pypy.conftest import option
class W_Wrapped(W_Root):
@@ -25,7 +25,7 @@
class AppTestProxyNewtype(AppProxy):
def setup_class(cls):
- if config.option.runappdirect:
+ if option.runappdirect:
py.test.skip("Impossible to run on appdirect")
AppProxy.setup_class.im_func(cls)
cls.w_wrapped = cls.space.wrap(W_Wrapped())
diff --git a/pypy/objspace/test/test_binop_overriding.py
b/pypy/objspace/test/test_binop_overriding.py
--- a/pypy/objspace/test/test_binop_overriding.py
+++ b/pypy/objspace/test/test_binop_overriding.py
@@ -1,5 +1,5 @@
# test about the binop operation rule, see issue 412
-from pytest import config
+from pypy.conftest import option
class AppTestBinopCombinations:
@@ -83,7 +83,7 @@
return Base, do_test
""")
cls.w_helpers = w_helpers
- cls.w_appdirect = cls.space.wrap(config.option.runappdirect)
+ cls.w_appdirect = cls.space.wrap(option.runappdirect)
def test_overriding_base_binop_explict(self):
class MulBase(object):
diff --git a/pypy/tool/pytest/appsupport.py b/pypy/tool/pytest/appsupport.py
--- a/pypy/tool/pytest/appsupport.py
+++ b/pypy/tool/pytest/appsupport.py
@@ -184,6 +184,7 @@
source = str(source).strip()
except py.error.ENOENT:
source = None
+ from pypy import conftest
if source and py.test.config._assertstate.mode != "off":
msg = interpret(source, runner, should_fail=True)
space.setattr(w_self, space.wrap('args'),
diff --git a/pypy/tool/pytest/objspace.py b/pypy/tool/pytest/objspace.py
--- a/pypy/tool/pytest/objspace.py
+++ b/pypy/tool/pytest/objspace.py
@@ -3,13 +3,14 @@
from rpython.config.config import ConflictConfigError
from pypy.tool.option import make_config, make_objspace
from pypy.tool.pytest import appsupport
+from pypy.conftest import option
_SPACECACHE={}
def gettestobjspace(**kwds):
""" helper for instantiating and caching space's for testing.
"""
try:
- config = make_config(py.test.config.option,**kwds)
+ config = make_config(option,**kwds)
except ConflictConfigError as e:
# this exception is typically only raised if a module is not available.
# in this case the test should be skipped
@@ -18,7 +19,7 @@
try:
return _SPACECACHE[key]
except KeyError:
- if getattr(py.test.config.option, 'runappdirect', None):
+ if getattr(option, 'runappdirect', None):
return TinyObjSpace(**kwds)
space = maketestobjspace(config)
_SPACECACHE[key] = space
@@ -26,7 +27,7 @@
def maketestobjspace(config=None):
if config is None:
- config = make_config(py.test.config.option)
+ config = make_config(option)
if config.objspace.usemodules.thread:
config.translation.thread = True
space = make_objspace(config)
diff --git a/rpython/doc/arch/index.rst b/rpython/doc/arch/index.rst
new file mode 100644
--- /dev/null
+++ b/rpython/doc/arch/index.rst
@@ -0,0 +1,11 @@
+.. _arch_index:
+
+Architecture specific notes
+===========================
+
+Here you can find some architecture specific notes.
+
+.. toctree::
+ :maxdepth: 1
+
+ s390x
diff --git a/rpython/doc/arch/s390x.rst b/rpython/doc/arch/s390x.rst
new file mode 100644
--- /dev/null
+++ b/rpython/doc/arch/s390x.rst
@@ -0,0 +1,34 @@
+.. _s390x:
+
+IBM Mainframe S390X
+===================
+
+Our JIT implements the 64 bit version of the IBM Mainframe called s390x.
+Note that this architecture is big endian.
+
+Currently supported ISAs:
+
+* z13 (released January 2015)
+* zEC12 (released September 2012)
+* z196 (released August 2010)
+* z10 (released February 2008)
+
+To check if all the necessary CPU facilities are installed
+on the subject machine, please run the test using a copy of the pypy
+source code::
+
+ $ ./pytest.py rpython/jit/backend/zarch/test/test_assembler -v -k
'test_facility'
+
+In addition you can run the auto encoding test to check if your Linux GCC tool
chain
+is able to compile all instructions used in the JIT backend::
+
+ $ ./pytest.py rpython/jit/backend/zarch/test/test_auto_encoding.py -v
+
+Translating
+-----------
+
+Specifically check for these two dependencies. On old versions of some
+Linux distributions ship older versions.
+
+* libffi (version should do > 3.0.+).
+* CPython 2.7.+.
diff --git a/rpython/doc/index.rst b/rpython/doc/index.rst
--- a/rpython/doc/index.rst
+++ b/rpython/doc/index.rst
@@ -37,7 +37,6 @@
arm
logging
- s390x
Writing your own interpreter in RPython
@@ -61,6 +60,7 @@
getting-started
dir-reference
jit/index
+ arch/index
translation
rtyper
garbage_collection
diff --git a/rpython/doc/s390x.rst b/rpython/doc/s390x.rst
deleted file mode 100644
--- a/rpython/doc/s390x.rst
+++ /dev/null
@@ -1,20 +0,0 @@
-.. _s390x:
-
-S390X JIT Backend
-=================
-
-Our JIT implements the 64 bit version of the IBM Mainframe called s390x.
-Note that this architecture is big endian.
-
-The following facilities need to be installed to operate
-correctly (all of the machines used for development these where installed):
-
-* General-Instructions-Extension
-* Long-Displacement
-* Binary Floating Point (IEEE)
-
-Translating
------------
-
-Ensure that libffi is installed (version should do > 3.0.+).
-CPython should be version 2.7.+.
diff --git a/rpython/jit/backend/ppc/regalloc.py
b/rpython/jit/backend/ppc/regalloc.py
--- a/rpython/jit/backend/ppc/regalloc.py
+++ b/rpython/jit/backend/ppc/regalloc.py
@@ -439,7 +439,7 @@
prepare_int_lshift = helper.prepare_binary_op
prepare_int_rshift = helper.prepare_binary_op
prepare_uint_rshift = helper.prepare_binary_op
- prepare_uint_mul_high = helper.prepare_binary_op
+ prepare_uint_mul_high = helper.prepare_int_mul_ovf
prepare_int_add_ovf = helper.prepare_binary_op
prepare_int_sub_ovf = helper.prepare_binary_op
diff --git a/rpython/jit/backend/zarch/instructions.py
b/rpython/jit/backend/zarch/instructions.py
--- a/rpython/jit/backend/zarch/instructions.py
+++ b/rpython/jit/backend/zarch/instructions.py
@@ -29,6 +29,7 @@
'MGHI': ('ri', ['\xA7','\x0D']),
'MSGFI': ('ril', ['\xC2','\x00']),
'MLGR': ('rre', ['\xB9','\x86'], 'eo,r'),
+ 'MLG': ('rxy', ['\xE3','\x86'], 'eo,bid'),
# div/mod
'DSGR': ('rre', ['\xB9','\x0D'], 'eo,r'),
'DSG': ('rxy', ['\xE3','\x0D'], 'eo,bidl'),
@@ -44,7 +45,6 @@
# rotating
'RISBG': ('rie_f', ['\xEC','\x55']),
- 'RISBGN': ('rie_f', ['\xEC','\x59']),
# invert & negative & absolute
'LPGR': ('rre', ['\xB9','\x00']),
diff --git a/rpython/jit/backend/zarch/opassembler.py
b/rpython/jit/backend/zarch/opassembler.py
--- a/rpython/jit/backend/zarch/opassembler.py
+++ b/rpython/jit/backend/zarch/opassembler.py
@@ -160,11 +160,15 @@
omc.BRC(c.ANY, l.imm(label_end - jmp_neither_lqlr_overflow))
omc.overwrite()
- emit_int_floordiv = gen_emit_div_mod('DSGR', 'DSG')
- emit_uint_floordiv = gen_emit_div_mod('DLGR', 'DLG')
- # NOTE division sets one register with the modulo value, thus
- # the regalloc ensures the right register survives.
- emit_int_mod = gen_emit_div_mod('DSGR', 'DSG')
+ def emit_uint_mul_high(self, op, arglocs, regalloc):
+ r0, _, a1 = arglocs
+ # _ carries the value, contents of r0 are ignored
+ assert not r0.is_imm()
+ assert not a1.is_imm()
+ if a1.is_core_reg():
+ self.mc.MLGR(r0, a1)
+ else:
+ self.mc.MLG(r0, a1)
def emit_int_invert(self, op, arglocs, regalloc):
l0, = arglocs
diff --git a/rpython/jit/backend/zarch/regalloc.py
b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -733,9 +733,6 @@
prepare_int_sub_ovf = helper.prepare_int_sub
prepare_int_mul = helper.prepare_int_mul
prepare_int_mul_ovf = helper.prepare_int_mul_ovf
- prepare_int_floordiv = helper.prepare_int_div
- prepare_uint_floordiv = helper.prepare_int_div
- prepare_int_mod = helper.prepare_int_mod
prepare_nursery_ptr_increment = prepare_int_add
prepare_int_and = helper.prepare_int_logic
@@ -746,6 +743,18 @@
prepare_int_lshift = helper.prepare_int_shift
prepare_uint_rshift = helper.prepare_int_shift
+ def prepare_uint_mul_high(self, op):
+ a0 = op.getarg(0)
+ a1 = op.getarg(1)
+ if a0.is_constant():
+ a0, a1 = a1, a0
+ if helper.check_imm32(a1):
+ l1 = self.ensure_reg(a1)
+ else:
+ l1 = self.ensure_reg_or_pool(a1)
+ lr,lq = self.rm.ensure_even_odd_pair(a0, op, bind_first=True)
+ return [lr, lq, l1]
+
prepare_int_le = helper.generate_cmp_op()
prepare_int_lt = helper.generate_cmp_op()
prepare_int_ge = helper.generate_cmp_op()
diff --git a/rpython/jit/backend/zarch/test/test_assembler.py
b/rpython/jit/backend/zarch/test/test_assembler.py
--- a/rpython/jit/backend/zarch/test/test_assembler.py
+++ b/rpython/jit/backend/zarch/test/test_assembler.py
@@ -155,7 +155,15 @@
s64 = bin(fac_data[1])[2:]
print(f64)
print(s64)
+ for i,c in enumerate(f64):
+ print('index: %d is set? %s' % (i,c))
+
+ assert f64[1] == '1' # The z/Architecture architectural mode is
installed.
+ assert f64[2] == '1' # The z/Architecture architectural mode is active.
assert f64[18] == '1' # long displacement facility
+ assert f64[21] == '1' # extended immediate facility
+ assert f64[34] == '1' # general instruction facility
+ assert f64[41] == '1' # floating-point-support-enhancement
def test_load_byte_zero_extend(self):
adr = self.a.datablockwrapper.malloc_aligned(16, 16)
@@ -189,7 +197,7 @@
@py.test.mark.parametrize('p',
[2**32,2**32+1,2**63-1,2**63-2,0,1,2,3,4,5,6,7,8,10001])
def test_align_withroll(self, p):
self.a.mc.load_imm(r.r2, p & 0xffffFFFFffffFFFF)
- self.a.mc.RISBGN(r.r2, r.r2, loc.imm(0), loc.imm(0x80 | 60),
loc.imm(0))
+ self.a.mc.RISBG(r.r2, r.r2, loc.imm(0), loc.imm(0x80 | 60), loc.imm(0))
self.a.mc.BCR(con.ANY, r.r14)
assert run_asm(self.a) == rffi.cast(rffi.ULONG,p) & ~(7)
@@ -214,7 +222,7 @@
n = 13
l = loc
self.a.mc.load_imm(r.r2, 7<<n)
- self.a.mc.RISBGN(r.r2, r.r2, l.imm(61), l.imm(0x80 | 63), l.imm(64-n))
+ self.a.mc.RISBG(r.r2, r.r2, l.imm(61), l.imm(0x80 | 63), l.imm(64-n))
self.a.mc.BCR(con.ANY, r.r14)
assert run_asm(self.a) == 7
@@ -222,7 +230,7 @@
n = 16
l = loc
self.a.mc.load_imm(r.r2, 0xffFFffFF)
- self.a.mc.RISBGN(r.r2, r.r2, l.imm(60), l.imm(0x80 | 63), l.imm(64-n))
+ self.a.mc.RISBG(r.r2, r.r2, l.imm(60), l.imm(0x80 | 63), l.imm(64-n))
self.a.mc.BCR(con.ANY, r.r14)
assert run_asm(self.a) == 15
diff --git a/rpython/jit/backend/zarch/test/test_auto_encoding.py
b/rpython/jit/backend/zarch/test/test_auto_encoding.py
--- a/rpython/jit/backend/zarch/test/test_auto_encoding.py
+++ b/rpython/jit/backend/zarch/test/test_auto_encoding.py
@@ -204,7 +204,7 @@
g.write('%s\n' % op)
oplist.append(op)
g.write('\t.string "%s"\n' % END_TAG)
- proc = subprocess.Popen(['as', '-m64', '-mzarch', '-march=zEC12',
+ proc = subprocess.Popen(['as', '-m64', '-mzarch', '-march=z196',
inputname, '-o', filename],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
diff --git a/rpython/jit/backend/zarch/test/test_int.py
b/rpython/jit/backend/zarch/test/test_int.py
--- a/rpython/jit/backend/zarch/test/test_int.py
+++ b/rpython/jit/backend/zarch/test/test_int.py
@@ -35,41 +35,13 @@
fail = self.cpu.get_latest_descr(deadframe)
assert fail == finishdescr # ensures that guard is not taken!
- def test_double_evenodd_pair(self):
- code = """
- [i0]
- i1 = int_floordiv(i0, 2)
- i2 = int_floordiv(i0, 3)
- i3 = int_floordiv(i0, 4)
- i4 = int_floordiv(i0, 5)
- i5 = int_floordiv(i0, 6)
- i6 = int_floordiv(i0, 7)
- i7 = int_floordiv(i0, 8)
- i8 = int_le(i1, 0)
- guard_true(i8) [i1,i2,i3,i4,i5,i6,i7]
- finish(i0, descr=faildescr)
- """
- # the guard forces 3 spills because after 4 divisions
- # all even slots of the managed registers are full
- loop = parse(code, namespace={'faildescr': BasicFinalDescr(1)})
- looptoken = JitCellToken()
- self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
- deadframe = self.cpu.execute_token(looptoken, 100)
- fail = self.cpu.get_latest_descr(deadframe)
- for i in range(2,9):
- assert self.cpu.get_int_value(deadframe, i-2) == 100//i
-
-
-
@py.test.mark.parametrize('value', [2,3,15,2**16])
def test_evenodd_pair_extensive(self, value):
instrs = []
failargs = []
values = []
j = 0
- mapping = (('int_floordiv',lambda x,y: x // y),
- ('int_mod', lambda x,y: x % y),
- ('int_mul_ovf', lambda x,y: x * y))
+ mapping = (('int_mul_ovf', lambda x,y: x * y),)
for i in range(20):
name, func = mapping[j]
instrs.append("i{d} = {i}(i0, {d})".format(d=i+1, i=name))
diff --git a/rpython/jit/backend/zarch/test/test_regalloc.py
b/rpython/jit/backend/zarch/test/test_regalloc.py
--- a/rpython/jit/backend/zarch/test/test_regalloc.py
+++ b/rpython/jit/backend/zarch/test/test_regalloc.py
@@ -146,128 +146,3 @@
assert cpu.get_int_value(deadframe, 0) == 0
assert cpu.get_int_value(deadframe, 1) == -1000
-def test_bug_0():
- cpu, deadframe = run([-13, 10, 10, 8, -8, -16, -18, 46, -12, 26], '''
- [i1, i2, i3, i4, i5, i6, i7, i8, i9, i10]
- i11 = uint_gt(i3, -48)
- i12 = int_xor(i8, i1)
- i13 = int_gt(i6, -9)
- i14 = int_le(i13, i2)
- i15 = int_le(i11, i5)
- i16 = uint_ge(i13, i13)
- i17 = int_or(i9, -23)
- i18 = int_lt(i10, i13)
- i19 = int_or(i15, i5)
- i20 = int_xor(i17, 54)
- i21 = int_mul(i8, i10)
- i22 = int_or(i3, i9)
- i41 = int_and(i11, -4)
- i42 = int_or(i41, 1)
- i23 = int_mod(i12, i42)
- i24 = int_is_true(i6)
- i25 = uint_rshift(i15, 6)
- i26 = int_or(-4, i25)
- i27 = int_invert(i8)
- i28 = int_sub(-113, i11)
- i29 = int_neg(i7)
- i30 = int_neg(i24)
- i31 = int_floordiv(i3, 53)
- i32 = int_mul(i28, i27)
- i43 = int_and(i18, -4)
- i44 = int_or(i43, 1)
- i33 = int_mod(i26, i44)
- i34 = int_or(i27, i19)
- i35 = uint_lt(i13, 1)
- i45 = int_and(i21, 31)
- i36 = int_rshift(i21, i45)
- i46 = int_and(i20, 31)
- i37 = uint_rshift(i4, i46)
- i38 = uint_gt(i33, -11)
- i39 = int_neg(i7)
- i40 = int_gt(i24, i32)
- i99 = same_as_i(0)
- guard_true(i99) [i40, i36, i37, i31, i16, i34, i35, i23, i22, i29, i14,
i39, i30, i38]
- finish(42)
- ''')
- assert cpu.get_int_value(deadframe, 0) == 0
- assert cpu.get_int_value(deadframe, 1) == 0
- assert cpu.get_int_value(deadframe, 2) == 0
- assert cpu.get_int_value(deadframe, 3) == 0
- assert cpu.get_int_value(deadframe, 4) == 1
- assert cpu.get_int_value(deadframe, 5) == -7
- assert cpu.get_int_value(deadframe, 6) == 1
- assert cpu.get_int_value(deadframe, 7) == 0
- assert cpu.get_int_value(deadframe, 8) == -2
- assert cpu.get_int_value(deadframe, 9) == 18
- assert cpu.get_int_value(deadframe, 10) == 1
- assert cpu.get_int_value(deadframe, 11) == 18
- assert cpu.get_int_value(deadframe, 12) == -1
- assert cpu.get_int_value(deadframe, 13) == 0
-
-def test_bug_1():
- cpu, deadframe = run([17, -20, -6, 6, 1, 13, 13, 9, 49, 8], '''
- [i1, i2, i3, i4, i5, i6, i7, i8, i9, i10]
- i11 = uint_lt(i6, 0)
- i41 = int_and(i3, 31)
- i12 = int_rshift(i3, i41)
- i13 = int_neg(i2)
- i14 = int_add(i11, i7)
- i15 = int_or(i3, i2)
- i16 = int_or(i12, i12)
- i17 = int_ne(i2, i5)
- i42 = int_and(i5, 31)
- i18 = uint_rshift(i14, i42)
- i43 = int_and(i14, 31)
- i19 = int_lshift(7, i43)
- i20 = int_neg(i19)
- i21 = int_mod(i3, 1)
- i22 = uint_ge(i15, i1)
- i44 = int_and(i16, 31)
- i23 = int_lshift(i8, i44)
- i24 = int_is_true(i17)
- i45 = int_and(i5, 31)
- i25 = int_lshift(i14, i45)
- i26 = int_lshift(i5, 17)
- i27 = int_eq(i9, i15)
- i28 = int_ge(0, i6)
- i29 = int_neg(i15)
- i30 = int_neg(i22)
- i31 = int_add(i7, i16)
- i32 = uint_lt(i19, i19)
- i33 = int_add(i2, 1)
- i34 = int_neg(i5)
- i35 = int_add(i17, i24)
- i36 = uint_lt(2, i16)
- i37 = int_neg(i9)
- i38 = int_gt(i4, i11)
- i39 = int_lt(i27, i22)
- i40 = int_neg(i27)
- i99 = same_as_i(0)
- guard_true(i99) [i40, i10, i36, i26, i13, i30, i21, i33, i18, i25, i31,
i32, i28, i29, i35, i38, i20, i39, i34, i23, i37]
- finish(-42)
- ''')
- assert cpu.get_int_value(deadframe, 0) == 0
- assert cpu.get_int_value(deadframe, 1) == 8
- assert cpu.get_int_value(deadframe, 2) == 1
- assert cpu.get_int_value(deadframe, 3) == 131072
- assert cpu.get_int_value(deadframe, 4) == 20
- assert cpu.get_int_value(deadframe, 5) == -1
- assert cpu.get_int_value(deadframe, 6) == 0
- assert cpu.get_int_value(deadframe, 7) == -19
- assert cpu.get_int_value(deadframe, 8) == 6
- assert cpu.get_int_value(deadframe, 9) == 26
- assert cpu.get_int_value(deadframe, 10) == 12
- assert cpu.get_int_value(deadframe, 11) == 0
- assert cpu.get_int_value(deadframe, 12) == 0
- assert cpu.get_int_value(deadframe, 13) == 2
- assert cpu.get_int_value(deadframe, 14) == 2
- assert cpu.get_int_value(deadframe, 15) == 1
- assert cpu.get_int_value(deadframe, 16) == -57344
- assert cpu.get_int_value(deadframe, 17) == 1
- assert cpu.get_int_value(deadframe, 18) == -1
- if WORD == 4:
- assert cpu.get_int_value(deadframe, 19) == -2147483648
- elif WORD == 8:
- assert cpu.get_int_value(deadframe, 19) == 19327352832
- assert cpu.get_int_value(deadframe, 20) == -49
-
diff --git a/rpython/translator/platform/arch/__init__.py
b/rpython/translator/platform/arch/__init__.py
new file mode 100644
diff --git a/rpython/translator/platform/arch/s390x.py
b/rpython/translator/platform/arch/s390x.py
new file mode 100644
--- /dev/null
+++ b/rpython/translator/platform/arch/s390x.py
@@ -0,0 +1,86 @@
+import re
+
+def extract_s390x_cpu_ids(lines):
+ """ NOT_RPYTHON """
+ ids = []
+
+ re_number = re.compile("processor (\d+):")
+ re_version = re.compile("version = ([0-9A-Fa-f]+)")
+ re_id = re.compile("identification = ([0-9A-Fa-f]+)")
+ re_machine = re.compile("machine = ([0-9A-Fa-f]+)")
+ for line in lines:
+ number = -1
+ version = None
+ ident = None
+ machine = 0
+
+ match = re_number.match(line)
+ if not match:
+ continue
+ number = int(match.group(1))
+
+ match = re_version.search(line)
+ if match:
+ version = match.group(1)
+
+ match = re_version.search(line)
+ if match:
+ version = match.group(1)
+
+ match = re_id.search(line)
+ if match:
+ ident = match.group(1)
+
+ match = re_machine.search(line)
+ if match:
+ machine = int(match.group(1), 16)
+
+ ids.append((number, version, ident, machine))
+
+ return ids
+
+
+def s390x_cpu_revision():
+ """ NOT_RPYTHON """
+ # linux kernel does the same classification
+ #
http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20131028/193311.html
+
+ with open("/proc/cpuinfo", "rb") as fd:
+ lines = fd.read().splitlines()
+ cpu_ids = extract_s390x_cpu_ids(lines)
+ machine = -1
+ for number, version, id, m in cpu_ids:
+ if machine != -1:
+ assert machine == m
+ machine = m
+
+ if machine == 0x2097 or machine == 0x2098:
+ return "z10"
+ if machine == 0x2817 or machine == 0x2818:
+ return "z196"
+ if machine == 0x2827 or machine == 0x2828:
+ return "zEC12"
+ if machine == 0x2964:
+ return "z13"
+
+ # well all others are unsupported!
+ return "unknown"
+
+def update_cflags(cflags):
+ """ NOT_RPYTHON """
+ # force the right target arch for s390x
+ for cflag in cflags:
+ if cflag.startswith('-march='):
+ break
+ else:
+ # the default cpu architecture that is supported
+ # older versions are not supported
+ revision = s390x_cpu_revision()
+ if revision == 'z13':
+ # gcc does not recognize z13 as a compiler flag!
+ revision = 'zEC12'
+
+ assert revision != 'unknown'
+ cflags += ('-march='+revision,)
+ cflags += ('-m64','-mzarch')
+ return cflags
diff --git a/rpython/translator/platform/arch/test/test_s390x.py
b/rpython/translator/platform/arch/test/test_s390x.py
new file mode 100644
--- /dev/null
+++ b/rpython/translator/platform/arch/test/test_s390x.py
@@ -0,0 +1,22 @@
+import py
+import platform
+from rpython.translator.platform.arch.s390x import (s390x_cpu_revision,
+ extract_s390x_cpu_ids)
+
+if platform.machine() != 's390x':
+ py.test.skip("s390x tests only")
+
+def test_cpuid_s390x():
+ revision = s390x_cpu_revision()
+ assert revision != 'unknown', 'the model you are running on might be too
old'
+
+def test_read_processor_info():
+ ids = extract_s390x_cpu_ids("""
+processor 0: machine = 12345
+processor 1: version = FF, identification = AF
+ """.splitlines())
+ assert ids == [(0, None, None, 0x12345),
+ (1, 'FF', 'AF', 0),
+ ]
+
+
diff --git a/rpython/translator/platform/linux.py
b/rpython/translator/platform/linux.py
--- a/rpython/translator/platform/linux.py
+++ b/rpython/translator/platform/linux.py
@@ -22,8 +22,8 @@
so_prefixes = ('lib', '')
if platform.machine() == 's390x':
- # force the right target arch for s390x
- cflags = ('-march=zEC12','-m64','-mzarch') + cflags
+ from rpython.translator.platform.arch import s390x
+ cflags = s390x.update_cflags(cflags)
def _args_for_shared(self, args):
return ['-shared'] + args
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit