111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert# 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport importlib 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport lit.util # pylint: disable=import-error,no-name-in-module 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport locale 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport os 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport platform 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertimport sys 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass DefaultTargetInfo(object): 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def __init__(self, full_config): 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert self.full_config = full_config 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def platform(self): 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return sys.platform.lower().strip() 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_locale_features(self, features): 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert self.full_config.lit_config.warning( 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert "No locales entry for target_system: %s" % self.platform()) 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_compile_flags(self, flags): pass 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_link_flags(self, flags): pass 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def configure_env(self, env): pass 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def allow_cxxabi_link(self): return True 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_sanitizer_features(self, sanitizer_type, features): pass 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def use_lit_shell_default(self): return False 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef test_locale(loc): 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert loc is not None 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default_locale = locale.setlocale(locale.LC_ALL) 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try: 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale.setlocale(locale.LC_ALL, loc) 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return True 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert except locale.Error: 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return False 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert finally: 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locale.setlocale(locale.LC_ALL, default_locale) 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef add_common_locales(features, lit_config): 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # A list of locales needed by the test-suite. 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # The list uses the canonical name for the locale used in the test-suite 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # TODO: On Linux ISO8859 *may* needs to hyphenated. 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert locales = [ 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'en_US.UTF-8', 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'fr_FR.UTF-8', 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'ru_RU.UTF-8', 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'zh_CN.UTF-8', 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'fr_CA.ISO8859-1', 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'cs_CZ.ISO8859-2' 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ] 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert for loc in locales: 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if test_locale(loc): 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert features.add('locale.{0}'.format(loc)) 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else: 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert lit_config.warning('The locale {0} is not supported by ' 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'your platform. Some tests will be ' 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 'unsupported.'.format(loc)) 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass DarwinLocalTI(DefaultTargetInfo): 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def __init__(self, full_config): 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert super(DarwinLocalTI, self).__init__(full_config) 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_locale_features(self, features): 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert add_common_locales(features, self.full_config.lit_config) 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_compile_flags(self, flags): 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert try: 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert out = lit.util.capture(['xcrun', '--show-sdk-path']).strip() 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert res = 0 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert except OSError: 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert res = -1 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if res == 0 and out: 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sdk_path = out 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert self.full_config.lit_config.note('using SDKROOT: %r' % sdk_path) 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ["-isysroot", sdk_path] 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_link_flags(self, flags): 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lSystem'] 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def configure_env(self, env): 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert library_paths = [] 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # Configure the library path for libc++ 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if self.full_config.use_system_cxx_lib: 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pass 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert elif self.full_config.cxx_runtime_root: 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert library_paths += [self.full_config.cxx_runtime_root] 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # Configure the abi library path 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if self.full_config.abi_library_root: 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert library_paths += [self.full_config.abi_library_root] 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if library_paths: 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert env['DYLD_LIBRARY_PATH'] = ':'.join(library_paths) 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def allow_cxxabi_link(self): 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # FIXME: PR27405 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # libc++ *should* export all of the symbols found in libc++abi on OS X. 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # For this reason LibcxxConfiguration will not link libc++abi in OS X. 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # However __cxa_throw_bad_new_array_length doesn't get exported into 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # libc++ yet so we still need to explicitly link libc++abi when testing 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # libc++abi 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # See PR22654. 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if(self.full_config.get_lit_conf('name', '') == 'libc++abi'): 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return True 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # Don't link libc++abi explicitly on OS X because the symbols 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # should be available in libc++ directly. 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return False 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_sanitizer_features(self, sanitizer_type, features): 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if san == 'Undefined': 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert features.add('sanitizer-new-delete') 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass FreeBSDLocalTI(DefaultTargetInfo): 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def __init__(self, full_config): 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert super(FreeBSDLocalTI, self).__init__(full_config) 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_locale_features(self, features): 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert add_common_locales(features, self.full_config.lit_config) 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_link_flags(self, flags): 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lc', '-lm', '-lpthread', '-lgcc_s', '-lcxxrt'] 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass LinuxLocalTI(DefaultTargetInfo): 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def __init__(self, full_config): 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert super(LinuxLocalTI, self).__init__(full_config) 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def platform(self): 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return 'linux' 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def platform_name(self): 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert name, _, _ = platform.linux_distribution() 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert name = name.lower().strip() 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return name # Permitted to be None 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def platform_ver(self): 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert _, ver, _ = platform.linux_distribution() 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ver = ver.lower().strip() 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return ver # Permitted to be None. 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_locale_features(self, features): 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert add_common_locales(features, self.full_config.lit_config) 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # Some linux distributions have different locale data than others. 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # Insert the distributions name and name-version into the available 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # features to allow tests to XFAIL on them. 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert name = self.platform_name() 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ver = self.platform_ver() 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if name: 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert features.add(name) 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if name and ver: 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert features.add('%s-%s' % (name, ver)) 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_compile_flags(self, flags): 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-D__STDC_FORMAT_MACROS', 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert '-D__STDC_LIMIT_MACROS', 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert '-D__STDC_CONSTANT_MACROS'] 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_cxx_link_flags(self, flags): 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert enable_threads = ('libcpp-has-no-threads' not in 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert self.full_config.config.available_features) 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert llvm_unwinder = self.full_config.get_lit_bool('llvm_unwinder', False) 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert shared_libcxx = self.full_config.get_lit_bool('enable_shared', True) 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lm'] 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if not llvm_unwinder: 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lgcc_s', '-lgcc'] 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if enable_threads: 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lpthread'] 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if not shared_libcxx: 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lrt'] 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lc'] 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if llvm_unwinder: 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lunwind', '-ldl'] 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert else: 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lgcc_s', '-lgcc'] 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert use_libatomic = self.full_config.get_lit_bool('use_libatomic', False) 18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if use_libatomic: 18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-latomic'] 18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert san = self.full_config.get_lit_conf('use_sanitizer', '').strip() 18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if san: 18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # The libraries and their order are taken from the 19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # linkSanitizerRuntimeDeps function in 19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # clang/lib/Driver/Tools.cpp 19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert flags += ['-lpthread', '-lrt', '-lm', '-ldl'] 19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass WindowsLocalTI(DefaultTargetInfo): 19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def __init__(self, full_config): 19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert super(WindowsLocalTI, self).__init__(full_config) 19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def add_locale_features(self, features): 20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert add_common_locales(features, self.full_config.lit_config) 20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert def use_lit_shell_default(self): 20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # Default to the internal shell on Windows, as bash on Windows is 20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert # usually very slow. 20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return True 20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdef make_target_info(full_config): 20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert default = "libcxx.test.target_info.LocalTI" 21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert info_str = full_config.get_lit_conf('target_info', default) 21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if info_str != default: 21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert mod_path, _, info = info_str.rpartition('.') 21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert mod = importlib.import_module(mod_path) 21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert target_info = getattr(mod, info)(full_config) 21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert full_config.lit_config.note("inferred target_info as: %r" % info_str) 21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return target_info 21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert target_system = platform.system() 21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if target_system == 'Darwin': return DarwinLocalTI(full_config) 21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if target_system == 'FreeBSD': return FreeBSDLocalTI(full_config) 22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if target_system == 'Linux': return LinuxLocalTI(full_config) 22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert if target_system == 'Windows': return WindowsLocalTI(full_config) 22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return DefaultTargetInfo(full_config) 22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 224