Author: David Schneider <[email protected]>
Branch:
Changeset: r63566:1891968c05e4
Date: 2013-04-23 18:06 +0200
http://bitbucket.org/pypy/pypy/changeset/1891968c05e4/
Log: Add an alternative method to detect main cpu model and size using
different compiler macros, useful for cross-compilation builds.
diff --git a/rpython/jit/backend/detect_cpu.py
b/rpython/jit/backend/detect_cpu.py
--- a/rpython/jit/backend/detect_cpu.py
+++ b/rpython/jit/backend/detect_cpu.py
@@ -2,12 +2,40 @@
Processor auto-detection
"""
import sys, os
+from rpython.rtyper.tool.rffi_platform import getdefined
+from rpython.translator.platform import is_host_build
class ProcessorAutodetectError(Exception):
pass
+
+def detect_main_model_and_size_from_platform():
+ # based on http://sourceforge.net/p/predef/wiki/Architectures/
+ mapping = {
+ ('x86', '64'): [
+ '__amd64__', '__amd64', '__x86_64__', '__x86_64', # AMD64
+ '__ia64__', '_IA64', '__IA64__' # Intel
Itanium (IA-64)
+ ],
+ ('arm', '32'): ['__arm__', '__thumb__'],
+ ('x86', '32'): ['i386', '__i386', '__i386__', '__i686__',],
+ ('ppc', '64'): ['__powerpc64__'],
+ }
+ for k, v in mapping.iteritems():
+ for macro in v:
+ if not getdefined(macro, ''):
+ continue
+ return k
+ raise ProcessorAutodetectError, "Cannot detect processor using compiler
macros"
+
+
+def detect_main_model_from_platform():
+ return detect_main_model_and_size_from_platform()[0]
+
+
def autodetect_main_model():
+ if not is_host_build():
+ return detect_main_model_from_platform()
mach = None
try:
import platform
@@ -40,6 +68,8 @@
return mach
def autodetect_main_model_and_size():
+ if not is_host_build():
+ return detect_main_model_and_size_from_platform()
model = autodetect_main_model()
if sys.maxint == 2**31-1:
model += '_32'
diff --git a/rpython/jit/backend/test/test_detect_cpu.py
b/rpython/jit/backend/test/test_detect_cpu.py
--- a/rpython/jit/backend/test/test_detect_cpu.py
+++ b/rpython/jit/backend/test/test_detect_cpu.py
@@ -26,3 +26,8 @@
else:
from rpython.jit.backend.model import AbstractCPU
assert issubclass(cpu, AbstractCPU)
+
+
+def test_detect_main_model_and_size_from_platform():
+ info = detect_main_model_and_size_from_platform()
+ assert detect_main_model_and_size_from_platform() == info
diff --git a/rpython/translator/platform/__init__.py
b/rpython/translator/platform/__init__.py
--- a/rpython/translator/platform/__init__.py
+++ b/rpython/translator/platform/__init__.py
@@ -347,3 +347,6 @@
global host
host = platform
+
+def is_host_build():
+ return host == platform
diff --git a/rpython/translator/platform/test/test_platform.py
b/rpython/translator/platform/test/test_platform.py
--- a/rpython/translator/platform/test/test_platform.py
+++ b/rpython/translator/platform/test/test_platform.py
@@ -172,3 +172,13 @@
assert X() == X()
assert Y(3) == Y(3)
assert Y(2) != Y(3)
+
+
+def test_is_host_build():
+ from rpython.translator import platform
+ assert platform.host == platform.platform
+
+ assert platform.is_host_build()
+ platform.set_platform('maemo', None)
+ assert platform.host != platform.platform
+ assert not platform.is_host_build()
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit