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

Reply via email to