mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-08 04:46:08 +00:00

*** to conform to clang-format’s LLVM style. This kind of mass change has *** two obvious implications: Firstly, merging this particular commit into a downstream fork may be a huge effort. Alternatively, it may be worth merging all changes up to this commit, performing the same reformatting operation locally, and then discarding the merge for this particular commit. The commands used to accomplish this reformatting were as follows (with current working directory as the root of the repository): find . \( -iname "*.c" -or -iname "*.cpp" -or -iname "*.h" -or -iname "*.mm" \) -exec clang-format -i {} + find . -iname "*.py" -exec autopep8 --in-place --aggressive --aggressive {} + ; The version of clang-format used was 3.9.0, and autopep8 was 1.2.4. Secondly, “blame” style tools will generally point to this commit instead of a meaningful prior commit. There are alternatives available that will attempt to look through this change and find the appropriate prior commit. YMMV. llvm-svn: 280751
167 lines
5.3 KiB
Python
167 lines
5.3 KiB
Python
""" This module contains functions used by the test cases to hide the
|
|
architecture and/or the platform dependent nature of the tests. """
|
|
|
|
from __future__ import absolute_import
|
|
|
|
# System modules
|
|
import itertools
|
|
import re
|
|
import subprocess
|
|
import sys
|
|
|
|
# Third-party modules
|
|
import six
|
|
from six.moves.urllib import parse as urlparse
|
|
|
|
# LLDB modules
|
|
from . import configuration
|
|
import use_lldb_suite
|
|
import lldb
|
|
|
|
|
|
def check_first_register_readable(test_case):
|
|
arch = test_case.getArchitecture()
|
|
|
|
if arch in ['x86_64', 'i386']:
|
|
test_case.expect("register read eax", substrs=['eax = 0x'])
|
|
elif arch in ['arm']:
|
|
test_case.expect("register read r0", substrs=['r0 = 0x'])
|
|
elif arch in ['aarch64']:
|
|
test_case.expect("register read x0", substrs=['x0 = 0x'])
|
|
elif re.match("mips", arch):
|
|
test_case.expect("register read zero", substrs=['zero = 0x'])
|
|
elif arch in ['s390x']:
|
|
test_case.expect("register read r0", substrs=['r0 = 0x'])
|
|
else:
|
|
# TODO: Add check for other architectures
|
|
test_case.fail(
|
|
"Unsupported architecture for test case (arch: %s)" %
|
|
test_case.getArchitecture())
|
|
|
|
|
|
def _run_adb_command(cmd, device_id):
|
|
device_id_args = []
|
|
if device_id:
|
|
device_id_args = ["-s", device_id]
|
|
full_cmd = ["adb"] + device_id_args + cmd
|
|
p = subprocess.Popen(
|
|
full_cmd,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE)
|
|
stdout, stderr = p.communicate()
|
|
return p.returncode, stdout, stderr
|
|
|
|
|
|
def _target_is_android():
|
|
if not hasattr(_target_is_android, 'result'):
|
|
triple = lldb.DBG.GetSelectedPlatform().GetTriple()
|
|
match = re.match(".*-.*-.*-android", triple)
|
|
_target_is_android.result = match is not None
|
|
return _target_is_android.result
|
|
|
|
|
|
def android_device_api():
|
|
if not hasattr(android_device_api, 'result'):
|
|
assert configuration.lldb_platform_url is not None
|
|
device_id = None
|
|
parsed_url = urlparse.urlparse(configuration.lldb_platform_url)
|
|
host_name = parsed_url.netloc.split(":")[0]
|
|
if host_name != 'localhost':
|
|
device_id = host_name
|
|
if device_id.startswith('[') and device_id.endswith(']'):
|
|
device_id = device_id[1:-1]
|
|
retcode, stdout, stderr = _run_adb_command(
|
|
["shell", "getprop", "ro.build.version.sdk"], device_id)
|
|
if retcode == 0:
|
|
android_device_api.result = int(stdout)
|
|
else:
|
|
raise LookupError(
|
|
">>> Unable to determine the API level of the Android device.\n"
|
|
">>> stdout:\n%s\n"
|
|
">>> stderr:\n%s\n" %
|
|
(stdout, stderr))
|
|
return android_device_api.result
|
|
|
|
|
|
def match_android_device(device_arch, valid_archs=None, valid_api_levels=None):
|
|
if not _target_is_android():
|
|
return False
|
|
if valid_archs is not None and device_arch not in valid_archs:
|
|
return False
|
|
if valid_api_levels is not None and android_device_api() not in valid_api_levels:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def finalize_build_dictionary(dictionary):
|
|
if _target_is_android():
|
|
if dictionary is None:
|
|
dictionary = {}
|
|
dictionary["OS"] = "Android"
|
|
if android_device_api() >= 16:
|
|
dictionary["PIE"] = 1
|
|
return dictionary
|
|
|
|
|
|
def getHostPlatform():
|
|
"""Returns the host platform running the test suite."""
|
|
# Attempts to return a platform name matching a target Triple platform.
|
|
if sys.platform.startswith('linux'):
|
|
return 'linux'
|
|
elif sys.platform.startswith('win32'):
|
|
return 'windows'
|
|
elif sys.platform.startswith('darwin'):
|
|
return 'darwin'
|
|
elif sys.platform.startswith('freebsd'):
|
|
return 'freebsd'
|
|
elif sys.platform.startswith('netbsd'):
|
|
return 'netbsd'
|
|
else:
|
|
return sys.platform
|
|
|
|
|
|
def getDarwinOSTriples():
|
|
return ['darwin', 'macosx', 'ios']
|
|
|
|
|
|
def getPlatform():
|
|
"""Returns the target platform which the tests are running on."""
|
|
platform = lldb.DBG.GetSelectedPlatform().GetTriple().split('-')[2]
|
|
if platform.startswith('freebsd'):
|
|
platform = 'freebsd'
|
|
elif platform.startswith('netbsd'):
|
|
platform = 'netbsd'
|
|
return platform
|
|
|
|
|
|
def platformIsDarwin():
|
|
"""Returns true if the OS triple for the selected platform is any valid apple OS"""
|
|
return getPlatform() in getDarwinOSTriples()
|
|
|
|
|
|
class _PlatformContext(object):
|
|
"""Value object class which contains platform-specific options."""
|
|
|
|
def __init__(self, shlib_environment_var, shlib_prefix, shlib_extension):
|
|
self.shlib_environment_var = shlib_environment_var
|
|
self.shlib_prefix = shlib_prefix
|
|
self.shlib_extension = shlib_extension
|
|
|
|
|
|
def createPlatformContext():
|
|
if platformIsDarwin():
|
|
return _PlatformContext('DYLD_LIBRARY_PATH', 'lib', 'dylib')
|
|
elif getPlatform() in ("freebsd", "linux", "netbsd"):
|
|
return _PlatformContext('LD_LIBRARY_PATH', 'lib', 'so')
|
|
else:
|
|
return None
|
|
|
|
|
|
def hasChattyStderr(test_case):
|
|
"""Some targets produce garbage on the standard error output. This utility function
|
|
determines whether the tests can be strict about the expected stderr contents."""
|
|
if match_android_device(test_case.getArchitecture(), ['aarch64'], [22]):
|
|
return True # The dynamic linker on the device will complain about unknown DT entries
|
|
return False
|