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