[libcxx] r302421 - Fix Windows tests when __config_site is present.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Mon May 8 15:03:21 PDT 2017


@Ben you accidentally commited CRLF linefeeds here. Be careful!

Could you revert this and re-commit your change w/o all the noise?

/Eric

On Mon, May 8, 2017 at 7:15 AM, Ben Craig via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: bcraig
> Date: Mon May  8 08:15:22 2017
> New Revision: 302421
>
> URL: http://llvm.org/viewvc/llvm-project?rev=302421&view=rev
> Log:
> Fix Windows tests when __config_site is present.
> Previously, the force includes would complain about a missing _DEBUG
> symbol.
> Now we dump macros before adding the force includes to the command line.
>
> Modified:
>     libcxx/trunk/utils/libcxx/test/config.py
>
> Modified: libcxx/trunk/utils/libcxx/test/config.py
> URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/utils/
> libcxx/test/config.py?rev=302421&r1=302420&r2=302421&view=diff
> ============================================================
> ==================
> --- libcxx/trunk/utils/libcxx/test/config.py (original)
> +++ libcxx/trunk/utils/libcxx/test/config.py Mon May  8 08:15:22 2017
> @@ -1,1113 +1,1113 @@
> -#===-------------------------------------------------------
> ---------------===##
> -#
> -#                     The LLVM Compiler Infrastructure
> -#
> -# This file is dual licensed under the MIT and the University of Illinois
> Open
> -# Source Licenses. See LICENSE.TXT for details.
> -#
> -#===-------------------------------------------------------
> ---------------===##
> -
> -import locale
> -import os
> -import platform
> -import pkgutil
> -import pipes
> -import re
> -import shlex
> -import shutil
> -import sys
> -
> -from libcxx.compiler import CXXCompiler
> -from libcxx.test.target_info import make_target_info
> -from libcxx.test.executor import *
> -from libcxx.test.tracing import *
> -import libcxx.util
> -
> -def loadSiteConfig(lit_config, config, param_name, env_name):
> -    # We haven't loaded the site specific configuration (the user is
> -    # probably trying to run on a test file directly, and either the site
> -    # configuration hasn't been created by the build system, or we are in
> an
> -    # out-of-tree build situation).
> -    site_cfg = lit_config.params.get(param_name,
> -                                     os.environ.get(env_name))
> -    if not site_cfg:
> -        lit_config.warning('No site specific configuration file found!'
> -                           ' Running the tests in the default
> configuration.')
> -    elif not os.path.isfile(site_cfg):
> -        lit_config.fatal(
> -            "Specified site configuration file does not exist: '%s'" %
> -            site_cfg)
> -    else:
> -        lit_config.note('using site specific configuration at %s' %
> site_cfg)
> -        ld_fn = lit_config.load_config
> -
> -        # Null out the load_config function so that lit.site.cfg doesn't
> -        # recursively load a config even if it tries.
> -        # TODO: This is one hell of a hack. Fix it.
> -        def prevent_reload_fn(*args, **kwargs):
> -            pass
> -        lit_config.load_config = prevent_reload_fn
> -        ld_fn(config, site_cfg)
> -        lit_config.load_config = ld_fn
> -
> -class Configuration(object):
> -    # pylint: disable=redefined-outer-name
> -    def __init__(self, lit_config, config):
> -        self.lit_config = lit_config
> -        self.config = config
> -        self.is_windows = platform.system() == 'Windows'
> -        self.cxx = None
> -        self.cxx_is_clang_cl = None
> -        self.cxx_stdlib_under_test = None
> -        self.project_obj_root = None
> -        self.libcxx_src_root = None
> -        self.libcxx_obj_root = None
> -        self.cxx_library_root = None
> -        self.cxx_runtime_root = None
> -        self.abi_library_root = None
> -        self.link_shared = self.get_lit_bool('enable_shared',
> default=True)
> -        self.debug_build = self.get_lit_bool('debug_build',
>  default=False)
> -        self.exec_env = {}
> -        self.use_target = False
> -        self.use_system_cxx_lib = False
> -        self.use_clang_verify = False
> -        self.long_tests = None
> -        self.execute_external = False
> -
> -    def get_lit_conf(self, name, default=None):
> -        val = self.lit_config.params.get(name, None)
> -        if val is None:
> -            val = getattr(self.config, name, None)
> -            if val is None:
> -                val = default
> -        return val
> -
> -    def get_lit_bool(self, name, default=None, env_var=None):
> -        def check_value(value, var_name):
> -            if value is None:
> -                return default
> -            if isinstance(value, bool):
> -                return value
> -            if not isinstance(value, str):
> -                raise TypeError('expected bool or string')
> -            if value.lower() in ('1', 'true'):
> -                return True
> -            if value.lower() in ('', '0', 'false'):
> -                return False
> -            self.lit_config.fatal(
> -                "parameter '{}' should be true or false".format(var_name))
> -
> -        conf_val = self.get_lit_conf(name)
> -        if env_var is not None and env_var in os.environ and \
> -                os.environ[env_var] is not None:
> -            val = os.environ[env_var]
> -            if conf_val is not None:
> -                self.lit_config.warning(
> -                    'Environment variable %s=%s is overriding explicit '
> -                    '--param=%s=%s' % (env_var, val, name, conf_val))
> -            return check_value(val, env_var)
> -        return check_value(conf_val, name)
> -
> -    def make_static_lib_name(self, name):
> -        """Return the full filename for the specified library name"""
> -        if self.is_windows:
> -            assert name == 'c++'  # Only allow libc++ to use this
> function for now.
> -            return 'lib' + name + '.lib'
> -        else:
> -            return 'lib' + name + '.a'
> -
> -    def configure(self):
> -        self.configure_executor()
> -        self.configure_use_system_cxx_lib()
> -        self.configure_target_info()
> -        self.configure_cxx()
> -        self.configure_triple()
> -        self.configure_deployment()
> -        self.configure_availability()
> -        self.configure_src_root()
> -        self.configure_obj_root()
> -        self.configure_cxx_stdlib_under_test()
> -        self.configure_cxx_library_root()
> -        self.configure_use_clang_verify()
> -        self.configure_use_thread_safety()
> -        self.configure_execute_external()
> -        self.configure_ccache()
> -        self.configure_compile_flags()
> -        self.configure_filesystem_compile_flags()
> -        self.configure_link_flags()
> -        self.configure_env()
> -        self.configure_color_diagnostics()
> -        self.configure_debug_mode()
> -        self.configure_warnings()
> -        self.configure_sanitizer()
> -        self.configure_coverage()
> -        self.configure_modules()
> -        self.configure_substitutions()
> -        self.configure_features()
> -
> -    def print_config_info(self):
> -        # Print the final compile and link flags.
> -        self.lit_config.note('Using compiler: %s' % self.cxx.path)
> -        self.lit_config.note('Using flags: %s' % self.cxx.flags)
> -        if self.cxx.use_modules:
> -            self.lit_config.note('Using modules flags: %s' %
> -                                 self.cxx.modules_flags)
> -        self.lit_config.note('Using compile flags: %s'
> -                             % self.cxx.compile_flags)
> -        if len(self.cxx.warning_flags):
> -            self.lit_config.note('Using warnings: %s' %
> self.cxx.warning_flags)
> -        self.lit_config.note('Using link flags: %s' % self.cxx.link_flags)
> -        # Print as list to prevent "set([...])" from being printed.
> -        self.lit_config.note('Using available_features: %s' %
> -                             list(self.config.available_features))
> -        self.lit_config.note('Using environment: %r' % self.exec_env)
> -        sys.stderr.flush()  # Force flushing to avoid broken output on
> Windows
> -
> -    def get_test_format(self):
> -        from libcxx.test.format import LibcxxTestFormat
> -        return LibcxxTestFormat(
> -            self.cxx,
> -            self.use_clang_verify,
> -            self.execute_external,
> -            self.executor,
> -            exec_env=self.exec_env)
> -
> -    def configure_executor(self):
> -        exec_str = self.get_lit_conf('executor', "None")
> -        te = eval(exec_str)
> -        if te:
> -            self.lit_config.note("Using executor: %r" % exec_str)
> -            if self.lit_config.useValgrind:
> -                # We have no way of knowing where in the chain the
> -                # ValgrindExecutor is supposed to go. It is likely
> -                # that the user wants it at the end, but we have no
> -                # way of getting at that easily.
> -                selt.lit_config.fatal("Cannot infer how to create a
> Valgrind "
> -                                      " executor.")
> -        else:
> -            te = LocalExecutor()
> -            if self.lit_config.useValgrind:
> -                te = ValgrindExecutor(self.lit_config.valgrindArgs, te)
> -        self.executor = te
> -
> -    def configure_target_info(self):
> -        self.target_info = make_target_info(self)
> -
> -    def configure_cxx(self):
> -        # Gather various compiler parameters.
> -        cxx = self.get_lit_conf('cxx_under_test')
> -        self.cxx_is_clang_cl = cxx is not None and \
> -                               os.path.basename(cxx) == 'clang-cl.exe'
> -        # If no specific cxx_under_test was given, attempt to infer it as
> -        # clang++.
> -        if cxx is None or self.cxx_is_clang_cl:
> -            search_paths = self.config.environment['PATH']
> -            if cxx is not None and os.path.isabs(cxx):
> -                search_paths = os.path.dirname(cxx)
> -            clangxx = libcxx.util.which('clang++', search_paths)
> -            if clangxx:
> -                cxx = clangxx
> -                self.lit_config.note(
> -                    "inferred cxx_under_test as: %r" % cxx)
> -            elif self.cxx_is_clang_cl:
> -                self.lit_config.fatal('Failed to find clang++
> substitution for'
> -                                      ' clang-cl')
> -        if not cxx:
> -            self.lit_config.fatal('must specify user parameter
> cxx_under_test '
> -                                  '(e.g., --param=cxx_under_test=clang++
> )')
> -        self.cxx = CXXCompiler(cxx) if not self.cxx_is_clang_cl else \
> -                   self._configure_clang_cl(cxx)
> -        cxx_type = self.cxx.type
> -        if cxx_type is not None:
> -            assert self.cxx.version is not None
> -            maj_v, min_v, _ = self.cxx.version
> -            self.config.available_features.add(cxx_type)
> -            self.config.available_features.add('%s-%s' % (cxx_type,
> maj_v))
> -            self.config.available_features.add('%s-%s.%s' % (
> -                cxx_type, maj_v, min_v))
> -        self.cxx.compile_env = dict(os.environ)
> -        # 'CCACHE_CPP2' prevents ccache from stripping comments while
> -        # preprocessing. This is required to prevent stripping of
> '-verify'
> -        # comments.
> -        self.cxx.compile_env['CCACHE_CPP2'] = '1'
> -
> -    def _configure_clang_cl(self, clang_path):
> -        def _split_env_var(var):
> -            return [p.strip() for p in os.environ.get(var, '').split(';')
> if p.strip()]
> -
> -        def _prefixed_env_list(var, prefix):
> -            from itertools import chain
> -            return list(chain.from_iterable((prefix, path) for path in
> _split_env_var(var)))
> -
> -        assert self.cxx_is_clang_cl
> -        flags = []
> -        compile_flags = _prefixed_env_list('INCLUDE', '-isystem')
> -        link_flags = _prefixed_env_list('LIB', '-L')
> -        for path in _split_env_var('LIB'):
> -            self.add_path(self.exec_env, path)
> -        return CXXCompiler(clang_path, flags=flags,
> -                           compile_flags=compile_flags,
> -                           link_flags=link_flags)
> -
> -
> -    def configure_src_root(self):
> -        self.libcxx_src_root = self.get_lit_conf(
> -            'libcxx_src_root', os.path.dirname(self.config.
> test_source_root))
> -
> -    def configure_obj_root(self):
> -        self.project_obj_root = self.get_lit_conf('project_obj_root')
> -        self.libcxx_obj_root = self.get_lit_conf('libcxx_obj_root')
> -        if not self.libcxx_obj_root and self.project_obj_root is not None:
> -            possible_root = os.path.join(self.project_obj_root,
> 'projects', 'libcxx')
> -            if os.path.isdir(possible_root):
> -                self.libcxx_obj_root = possible_root
> -            else:
> -                self.libcxx_obj_root = self.project_obj_root
> -
> -    def configure_cxx_library_root(self):
> -        self.cxx_library_root = self.get_lit_conf('cxx_library_root',
> -                                                  self.libcxx_obj_root)
> -        self.cxx_runtime_root = self.get_lit_conf('cxx_runtime_root',
> -                                                   self.cxx_library_root)
> -
> -    def configure_use_system_cxx_lib(self):
> -        # This test suite supports testing against either the system
> library or
> -        # the locally built one; the former mode is useful for testing ABI
> -        # compatibility between the current headers and a shipping dynamic
> -        # library.
> -        # Default to testing against the locally built libc++ library.
> -        self.use_system_cxx_lib = self.get_lit_conf('use_system_cxx_lib')
> -        if self.use_system_cxx_lib == 'true':
> -            self.use_system_cxx_lib = True
> -        elif self.use_system_cxx_lib == 'false':
> -            self.use_system_cxx_lib = False
> -        elif self.use_system_cxx_lib:
> -            assert os.path.isdir(self.use_system_cxx_lib)
> -        self.lit_config.note(
> -            "inferred use_system_cxx_lib as: %r" %
> self.use_system_cxx_lib)
> -
> -    def configure_availability(self):
> -        # See http://llvm.org/docs/AvailabilityMarkup.html
> -        self.with_availability = self.get_lit_bool('with_availability',
> False)
> -        self.lit_config.note(
> -            "inferred with_availability as: %r" % self.with_availability)
> -
> -    def configure_cxx_stdlib_under_test(self):
> -        self.cxx_stdlib_under_test = self.get_lit_conf(
> -            'cxx_stdlib_under_test', 'libc++')
> -        if self.cxx_stdlib_under_test not in \
> -                ['libc++', 'libstdc++', 'msvc', 'cxx_default']:
> -            self.lit_config.fatal(
> -                'unsupported value for "cxx_stdlib_under_test": %s'
> -                % self.cxx_stdlib_under_test)
> -        self.config.available_features.add(self.cxx_stdlib_under_test)
> -        if self.cxx_stdlib_under_test == 'libstdc++':
> -            self.config.available_features.add('libstdc++')
> -            # Manually enable the experimental and filesystem tests for
> libstdc++
> -            # if the options aren't present.
> -            # FIXME this is a hack.
> -            if self.get_lit_conf('enable_experimental') is None:
> -                self.config.enable_experimental = 'true'
> -            if self.get_lit_conf('enable_filesystem') is None:
> -                self.config.enable_filesystem = 'true'
> -
> -    def configure_use_clang_verify(self):
> -        '''If set, run clang with -verify on failing tests.'''
> -        if self.with_availability:
> -            self.use_clang_verify = False
> -            return
> -        self.use_clang_verify = self.get_lit_bool('use_clang_verify')
> -        if self.use_clang_verify is None:
> -            # NOTE: We do not test for the -verify flag directly because
> -            #   -verify will always exit with non-zero on an empty file.
> -            self.use_clang_verify = self.cxx.isVerifySupported()
> -            self.lit_config.note(
> -                "inferred use_clang_verify as: %r" %
> self.use_clang_verify)
> -        if self.use_clang_verify:
> -                self.config.available_features.add('verify-support')
> -
> -    def configure_use_thread_safety(self):
> -        '''If set, run clang with -verify on failing tests.'''
> -        has_thread_safety = self.cxx.hasCompileFlag('-
> Werror=thread-safety')
> -        if has_thread_safety:
> -            self.cxx.compile_flags += ['-Werror=thread-safety']
> -            self.config.available_features.add('thread-safety')
> -            self.lit_config.note("enabling thread-safety annotations")
> -
> -    def configure_execute_external(self):
> -        # Choose between lit's internal shell pipeline runner and a real
> shell.
> -        # If LIT_USE_INTERNAL_SHELL is in the environment, we use that as
> the
> -        # default value. Otherwise we ask the target_info.
> -        use_lit_shell_default = os.environ.get('LIT_USE_INTERNAL_SHELL')
> -        if use_lit_shell_default is not None:
> -            use_lit_shell_default = use_lit_shell_default != '0'
> -        else:
> -            use_lit_shell_default = self.target_info.use_lit_
> shell_default()
> -        # Check for the command line parameter using the default value if
> it is
> -        # not present.
> -        use_lit_shell = self.get_lit_bool('use_lit_shell',
> -                                          use_lit_shell_default)
> -        self.execute_external = not use_lit_shell
> -
> -    def configure_ccache(self):
> -        use_ccache_default = os.environ.get('LIBCXX_USE_CCACHE') is not
> None
> -        use_ccache = self.get_lit_bool('use_ccache', use_ccache_default)
> -        if use_ccache:
> -            self.cxx.use_ccache = True
> -            self.lit_config.note('enabling ccache')
> -
> -    def add_deployment_feature(self, feature):
> -        (arch, name, version) = self.config.deployment
> -        self.config.available_features.add('%s=%s-%s' % (feature, arch,
> name))
> -        self.config.available_features.add('%s=%s' % (feature, name))
> -        self.config.available_features.add('%s=%s%s' % (feature, name,
> version))
> -
> -    def configure_features(self):
> -        additional_features = self.get_lit_conf('additional_features')
> -        if additional_features:
> -            for f in additional_features.split(','):
> -                self.config.available_features.add(f.strip())
> -        self.target_info.add_locale_features(self.config.
> available_features)
> -
> -        target_platform = self.target_info.platform()
> -
> -        # Write an "available feature" that combines the triple when
> -        # use_system_cxx_lib is enabled. This is so that we can easily
> write
> -        # XFAIL markers for tests that are known to fail with versions of
> -        # libc++ as were shipped with a particular triple.
> -        if self.use_system_cxx_lib:
> -            self.config.available_features.add('with_system_cxx_lib')
> -            self.config.available_features.add(
> -                'with_system_cxx_lib=%s' % self.config.target_triple)
> -
> -            # Add subcomponents individually.
> -            target_components = self.config.target_triple.split('-')
> -            for component in target_components:
> -                self.config.available_features.add(
> -                    'with_system_cxx_lib=%s' % component)
> -
> -            # Add available features for more generic versions of the
> target
> -            # triple attached to  with_system_cxx_lib.
> -            if self.use_deployment:
> -                self.add_deployment_feature('with_system_cxx_lib')
> -
> -        # Configure the availability markup checks features.
> -        if self.with_availability:
> -            self.config.available_features.add('availability_markup')
> -            self.add_deployment_feature('availability_markup')
> -
> -        if self.use_system_cxx_lib or self.with_availability:
> -            self.config.available_features.add('availability')
> -            self.add_deployment_feature('availability')
> -
> -        if platform.system() == 'Darwin':
> -            self.config.available_features.add('apple-darwin')
> -
> -        # Insert the platform name into the available features as a lower
> case.
> -        self.config.available_features.add(target_platform)
> -
> -        # Simulator testing can take a really long time for some of these
> tests
> -        # so add a feature check so we can REQUIRES: long_tests in them
> -        self.long_tests = self.get_lit_bool('long_tests')
> -        if self.long_tests is None:
> -            # Default to running long tests.
> -            self.long_tests = True
> -            self.lit_config.note(
> -                "inferred long_tests as: %r" % self.long_tests)
> -
> -        if self.long_tests:
> -            self.config.available_features.add('long_tests')
> -
> -        # Run a compile test for the -fsized-deallocation flag. This is
> needed
> -        # in test/std/language.support/support.dynamic/new.delete
> -        if self.cxx.hasCompileFlag('-fsized-deallocation'):
> -            self.config.available_features.add('fsized-deallocation')
> -
> -        if self.cxx.hasCompileFlag('-faligned-allocation'):
> -            self.config.available_features.add('-faligned-allocation')
> -        else:
> -            # FIXME remove this once more than just clang-4.0 support
> -            # C++17 aligned allocation.
> -            self.config.available_features.add('no-aligned-allocation')
> -
> -        if self.get_lit_bool('has_libatomic', False):
> -            self.config.available_features.add('libatomic')
> -
> -        macros = self.cxx.dumpMacros()
> -        if '__cpp_if_constexpr' not in macros:
> -            self.config.available_features.add('libcpp-no-if-constexpr')
> -
> -        if '__cpp_structured_bindings' not in macros:
> -            self.config.available_features.add('libcpp-no-
> structured-bindings')
> -
> -        if '__cpp_deduction_guides' not in macros:
> -            self.config.available_features.add('libcpp-no-
> deduction-guides')
> -
> -        if self.is_windows:
> -            self.config.available_features.add('windows')
> -            if self.cxx_stdlib_under_test == 'libc++':
> -                # LIBCXX-WINDOWS-FIXME is the feature name used to XFAIL
> the
> -                # initial Windows failures until they can be properly
> diagnosed
> -                # and fixed. This allows easier detection of new test
> failures
> -                # and regressions. Note: New failures should not be
> suppressed
> -                # using this feature. (Also see llvm.org/PR32730)
> -                self.config.available_features.add('LIBCXX-WINDOWS-
> FIXME')
> -
> -        # Attempt to detect the glibc version by querying for __GLIBC__
> -        # in 'features.h'.
> -        macros = self.cxx.dumpMacros(flags=['-include', 'features.h'])
> -        if macros is not None and '__GLIBC__' in macros:
> -            maj_v, min_v = (macros['__GLIBC__'],
> macros['__GLIBC_MINOR__'])
> -            self.config.available_features.add('glibc')
> -            self.config.available_features.add('glibc-%s' % maj_v)
> -            self.config.available_features.add('glibc-%s.%s' % (maj_v,
> min_v))
> -
> -    def configure_compile_flags(self):
> -        no_default_flags = self.get_lit_bool('no_default_flags', False)
> -        if not no_default_flags:
> -            self.configure_default_compile_flags()
> -        # This include is always needed so add so add it regardless of
> -        # 'no_default_flags'.
> -        support_path = os.path.join(self.libcxx_src_root, 'test/support')
> -        self.cxx.compile_flags += ['-I' + support_path]
> -        # Configure extra flags
> -        compile_flags_str = self.get_lit_conf('compile_flags', '')
> -        self.cxx.compile_flags += shlex.split(compile_flags_str)
> -        # FIXME: Can we remove this?
> -        if self.is_windows:
> -            self.cxx.compile_flags += ['-D_CRT_SECURE_NO_WARNINGS']
> -
> -    def configure_default_compile_flags(self):
> -        # Try and get the std version from the command line. Fall back to
> -        # default given in lit.site.cfg is not present. If default is not
> -        # present then force c++11.
> -        std = self.get_lit_conf('std')
> -        if not std:
> -            # Choose the newest possible language dialect if none is
> given.
> -            possible_stds = ['c++1z', 'c++14', 'c++11', 'c++03']
> -            if self.cxx.type == 'gcc':
> -                maj_v, _, _ = self.cxx.version
> -                maj_v = int(maj_v)
> -                if maj_v < 7:
> -                    possible_stds.remove('c++1z')
> -                # FIXME: How many C++14 tests actually fail under GCC 5
> and 6?
> -                # Should we XFAIL them individually instead?
> -                if maj_v <= 6:
> -                    possible_stds.remove('c++14')
> -            for s in possible_stds:
> -                if self.cxx.hasCompileFlag('-std=%s' % s):
> -                    std = s
> -                    self.lit_config.note(
> -                        'inferred language dialect as: %s' % std)
> -                    break
> -            if not std:
> -                self.lit_config.fatal(
> -                    'Failed to infer a supported language dialect from
> one of %r'
> -                    % possible_stds)
> -        self.cxx.compile_flags += ['-std={0}'.format(std)]
> -        self.config.available_features.add(std.replace('gnu++', 'c++'))
> -        # Configure include paths
> -        self.configure_compile_flags_header_includes()
> -        self.target_info.add_cxx_compile_flags(self.cxx.compile_flags)
> -        # Configure feature flags.
> -        self.configure_compile_flags_exceptions()
> -        self.configure_compile_flags_rtti()
> -        self.configure_compile_flags_abi_version()
> -        enable_32bit = self.get_lit_bool('enable_32bit', False)
> -        if enable_32bit:
> -            self.cxx.flags += ['-m32']
> -        # Use verbose output for better errors
> -        self.cxx.flags += ['-v']
> -        sysroot = self.get_lit_conf('sysroot')
> -        if sysroot:
> -            self.cxx.flags += ['--sysroot', sysroot]
> -        gcc_toolchain = self.get_lit_conf('gcc_toolchain')
> -        if gcc_toolchain:
> -            self.cxx.flags += ['-gcc-toolchain', gcc_toolchain]
> -        # NOTE: the _DEBUG definition must preceed the triple check
> because for
> -        # the Windows build of libc++, the forced inclusion of a header
> requires
> -        # that _DEBUG is defined.  Incorrect ordering will result in
> -target
> -        # being elided.
> -        if self.is_windows and self.debug_build:
> -            self.cxx.compile_flags += ['-D_DEBUG']
> -        if self.use_target:
> -            if not self.cxx.addFlagIfSupported(
> -                    ['-target', self.config.target_triple]):
> -                self.lit_config.warning('use_target is true but -target
> is '\
> -                        'not supported by the compiler')
> -        if self.use_deployment:
> -            arch, name, version = self.config.deployment
> -            self.cxx.flags += ['-arch', arch]
> -            self.cxx.flags += ['-m' + name + '-version-min=' + version]
> -
> -        # Disable availability unless explicitely requested
> -        if not self.with_availability:
> -            self.cxx.flags += ['-D_LIBCPP_DISABLE_AVAILABILITY']
> -
> -    def configure_compile_flags_header_includes(self):
> -        support_path = os.path.join(self.libcxx_src_root, 'test',
> 'support')
> -        if self.cxx_stdlib_under_test != 'libstdc++' and \
> -           not self.is_windows:
> -            self.cxx.compile_flags += [
> -                '-include', os.path.join(support_path,
> 'nasty_macros.hpp')]
> -        if self.cxx_stdlib_under_test == 'msvc':
> -            self.cxx.compile_flags += [
> -                '-include', os.path.join(support_path,
> -                                         'msvc_stdlib_force_include.
> hpp')]
> -            pass
> -        if self.is_windows and self.debug_build and \
> -                self.cxx_stdlib_under_test != 'msvc':
> -            self.cxx.compile_flags += [
> -                '-include', os.path.join(support_path,
> -                                         'set_windows_crt_report_mode.h')
> -            ]
> -        self.configure_config_site_header()
> -        cxx_headers = self.get_lit_conf('cxx_headers')
> -        if cxx_headers == '' or (cxx_headers is None
> -                                 and self.cxx_stdlib_under_test !=
> 'libc++'):
> -            self.lit_config.note('using the system cxx headers')
> -            return
> -        self.cxx.compile_flags += ['-nostdinc++']
> -        if cxx_headers is None:
> -            cxx_headers = os.path.join(self.libcxx_src_root, 'include')
> -        if not os.path.isdir(cxx_headers):
> -            self.lit_config.fatal("cxx_headers='%s' is not a directory."
> -                                  % cxx_headers)
> -        self.cxx.compile_flags += ['-I' + cxx_headers]
> -        if self.libcxx_obj_root is not None:
> -            cxxabi_headers = os.path.join(self.libcxx_obj_root,
> 'include',
> -                                          'c++build')
> -            if os.path.isdir(cxxabi_headers):
> -                self.cxx.compile_flags += ['-I' + cxxabi_headers]
> -
> -    def configure_config_site_header(self):
> -        # Check for a possible __config_site in the build directory. We
> -        # use this if it exists.
> -        if self.libcxx_obj_root is None:
> -            return
> -        config_site_header = os.path.join(self.libcxx_obj_root,
> '__config_site')
> -        if not os.path.isfile(config_site_header):
> -            return
> -        contained_macros = self.parse_config_site_and_add_features(
> -            config_site_header)
> -        self.lit_config.note('Using __config_site header %s with macros:
> %r'
> -            % (config_site_header, contained_macros))
> -        # FIXME: This must come after the call to
> -        # 'parse_config_site_and_add_features(...)' in order for it to
> work.
> -        self.cxx.compile_flags += ['-include', config_site_header]
> -
> -    def parse_config_site_and_add_features(self, header):
> -        """ parse_config_site_and_add_features - Deduce and add the test
> -            features that that are implied by the #define's in the
> __config_site
> -            header. Return a dictionary containing the macros found in the
> -            '__config_site' header.
> -        """
> -        # Parse the macro contents of __config_site by dumping the macros
> -        # using 'c++ -dM -E' and filtering the predefines.
> -        predefines = self.cxx.dumpMacros()
> -        macros = self.cxx.dumpMacros(header)
> -        feature_macros_keys = set(macros.keys()) - set(predefines.keys())
> -        feature_macros = {}
> -        for k in feature_macros_keys:
> -            feature_macros[k] = macros[k]
> -        # We expect the header guard to be one of the definitions
> -        assert '_LIBCPP_CONFIG_SITE' in feature_macros
> -        del feature_macros['_LIBCPP_CONFIG_SITE']
> -        # The __config_site header should be non-empty. Otherwise it
> should
> -        # have never been emitted by CMake.
> -        assert len(feature_macros) > 0
> -        # Transform each macro name into the feature name used in the
> tests.
> -        # Ex. _LIBCPP_HAS_NO_THREADS -> libcpp-has-no-threads
> -        for m in feature_macros:
> -            if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS':
> -                continue
> -            if m == '_LIBCPP_ABI_VERSION':
> -                self.config.available_features.add('libcpp-abi-
> version-v%s'
> -                    % feature_macros[m])
> -                continue
> -            assert m.startswith('_LIBCPP_HAS_') or m ==
> '_LIBCPP_ABI_UNSTABLE'
> -            m = m.lower()[1:].replace('_', '-')
> -            self.config.available_features.add(m)
> -        return feature_macros
> -
> -
> -
> -    def configure_compile_flags_exceptions(self):
> -        enable_exceptions = self.get_lit_bool('enable_exceptions', True)
> -        if not enable_exceptions:
> -            self.config.available_features.add('libcpp-no-exceptions')
> -            self.cxx.compile_flags += ['-fno-exceptions']
> -
> -    def configure_compile_flags_rtti(self):
> -        enable_rtti = self.get_lit_bool('enable_rtti', True)
> -        if not enable_rtti:
> -            self.config.available_features.add('libcpp-no-rtti')
> -            self.cxx.compile_flags += ['-fno-rtti', '-D_LIBCPP_NO_RTTI']
> -
> -    def configure_compile_flags_abi_version(self):
> -        abi_version = self.get_lit_conf('abi_version', '').strip()
> -        abi_unstable = self.get_lit_bool('abi_unstable')
> -        # Only add the ABI version when it is non-default.
> -        # FIXME(EricWF): Get the ABI version from the "__config_site".
> -        if abi_version and abi_version != '1':
> -          self.cxx.compile_flags += ['-D_LIBCPP_ABI_VERSION=' +
> abi_version]
> -        if abi_unstable:
> -          self.config.available_features.add('libcpp-abi-unstable')
> -          self.cxx.compile_flags += ['-D_LIBCPP_ABI_UNSTABLE']
> -
> -    def configure_filesystem_compile_flags(self):
> -        enable_fs = self.get_lit_bool('enable_filesystem', default=False)
> -        if not enable_fs:
> -            return
> -        enable_experimental = self.get_lit_bool('enable_experimental',
> default=False)
> -        if not enable_experimental:
> -            self.lit_config.fatal(
> -                'filesystem is enabled but libc++experimental.a is not.')
> -        self.config.available_features.add('c++filesystem')
> -        static_env = os.path.join(self.libcxx_src_root, 'test', 'std',
> -                                  'experimental', 'filesystem', 'Inputs',
> 'static_test_env')
> -        static_env = os.path.realpath(static_env)
> -        assert os.path.isdir(static_env)
> -        self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT="%s"'
> % static_env]
> -
> -        dynamic_env = os.path.join(self.config.test_exec_root,
> -                                   'filesystem', 'Output', 'dynamic_env')
> -        dynamic_env = os.path.realpath(dynamic_env)
> -        if not os.path.isdir(dynamic_env):
> -            os.makedirs(dynamic_env)
> -        self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT="%s"'
> % dynamic_env]
> -        self.exec_env['LIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT'] = ("%s" %
> dynamic_env)
> -
> -        dynamic_helper = os.path.join(self.libcxx_src_root, 'test',
> 'support',
> -                                      'filesystem_dynamic_test_
> helper.py')
> -        assert os.path.isfile(dynamic_helper)
> -
> -        self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER="%s
> %s"'
> -                                   % (sys.executable, dynamic_helper)]
> -
> -
> -    def configure_link_flags(self):
> -        no_default_flags = self.get_lit_bool('no_default_flags', False)
> -        if not no_default_flags:
> -            # Configure library path
> -            self.configure_link_flags_cxx_library_path()
> -            self.configure_link_flags_abi_library_path()
> -
> -            # Configure libraries
> -            if self.cxx_stdlib_under_test == 'libc++':
> -                self.cxx.link_flags += ['-nodefaultlibs']
> -                # FIXME: Handle MSVCRT as part of the ABI library
> handling.
> -                if self.is_windows:
> -                    self.cxx.link_flags += ['-nostdlib']
> -                self.configure_link_flags_cxx_library()
> -                self.configure_link_flags_abi_library()
> -                self.configure_extra_library_flags()
> -            elif self.cxx_stdlib_under_test == 'libstdc++':
> -                enable_fs = self.get_lit_bool('enable_filesystem',
> -                                              default=False)
> -                if enable_fs:
> -                    self.config.available_features.add('c++experimental')
> -                    self.cxx.link_flags += ['-lstdc++fs']
> -                self.cxx.link_flags += ['-lm', '-pthread']
> -            elif self.cxx_stdlib_under_test == 'msvc':
> -                # FIXME: Correctly setup debug/release flags here.
> -                pass
> -            elif self.cxx_stdlib_under_test == 'cxx_default':
> -                self.cxx.link_flags += ['-pthread']
> -            else:
> -                self.lit_config.fatal(
> -                    'unsupported value for "use_stdlib_type": %s'
> -                    %  use_stdlib_type)
> -
> -        link_flags_str = self.get_lit_conf('link_flags', '')
> -        self.cxx.link_flags += shlex.split(link_flags_str)
> -
> -    def configure_link_flags_cxx_library_path(self):
> -        if not self.use_system_cxx_lib:
> -            if self.cxx_library_root:
> -                self.cxx.link_flags += ['-L' + self.cxx_library_root]
> -                if self.is_windows and self.link_shared:
> -                    self.add_path(self.cxx.compile_env,
> self.cxx_library_root)
> -            if self.cxx_runtime_root:
> -                if not self.is_windows:
> -                    self.cxx.link_flags += ['-Wl,-rpath,' +
> -                                            self.cxx_runtime_root]
> -                elif self.is_windows and self.link_shared:
> -                    self.add_path(self.exec_env, self.cxx_runtime_root)
> -        elif os.path.isdir(str(self.use_system_cxx_lib)):
> -            self.cxx.link_flags += ['-L' + self.use_system_cxx_lib]
> -            if not self.is_windows:
> -                self.cxx.link_flags += ['-Wl,-rpath,' +
> -                                        self.use_system_cxx_lib]
> -            if self.is_windows and self.link_shared:
> -                self.add_path(self.cxx.compile_env,
> self.use_system_cxx_lib)
> -
> -    def configure_link_flags_abi_library_path(self):
> -        # Configure ABI library paths.
> -        self.abi_library_root = self.get_lit_conf('abi_library_path')
> -        if self.abi_library_root:
> -            self.cxx.link_flags += ['-L' + self.abi_library_root]
> -            if not self.is_windows:
> -                self.cxx.link_flags += ['-Wl,-rpath,' +
> self.abi_library_root]
> -            else:
> -                self.add_path(self.exec_env, self.abi_library_root)
> -
> -    def configure_link_flags_cxx_library(self):
> -        libcxx_experimental = self.get_lit_bool('enable_experimental',
> default=False)
> -        if libcxx_experimental:
> -            self.config.available_features.add('c++experimental')
> -            self.cxx.link_flags += ['-lc++experimental']
> -        if self.link_shared:
> -            self.cxx.link_flags += ['-lc++']
> -        else:
> -            cxx_library_root = self.get_lit_conf('cxx_library_root')
> -            if cxx_library_root:
> -                libname = self.make_static_lib_name('c++')
> -                abs_path = os.path.join(cxx_library_root, libname)
> -                assert os.path.exists(abs_path) and \
> -                       "static libc++ library does not exist"
> -                self.cxx.link_flags += [abs_path]
> -            else:
> -                self.cxx.link_flags += ['-lc++']
> -
> -    def configure_link_flags_abi_library(self):
> -        cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
> -        if cxx_abi == 'libstdc++':
> -            self.cxx.link_flags += ['-lstdc++']
> -        elif cxx_abi == 'libsupc++':
> -            self.cxx.link_flags += ['-lsupc++']
> -        elif cxx_abi == 'libcxxabi':
> -            if self.target_info.allow_cxxabi_link():
> -                libcxxabi_shared = self.get_lit_bool('libcxxabi_shared',
> default=True)
> -                if libcxxabi_shared:
> -                    self.cxx.link_flags += ['-lc++abi']
> -                else:
> -                    cxxabi_library_root = self.get_lit_conf('abi_
> library_path')
> -                    if cxxabi_library_root:
> -                        libname = self.make_static_lib_name('c++abi')
> -                        abs_path = os.path.join(cxxabi_library_root,
> libname)
> -                        self.cxx.link_flags += [abs_path]
> -                    else:
> -                        self.cxx.link_flags += ['-lc++abi']
> -        elif cxx_abi == 'libcxxrt':
> -            self.cxx.link_flags += ['-lcxxrt']
> -        elif cxx_abi == 'vcruntime':
> -            debug_suffix = 'd' if self.debug_build else ''
> -            self.cxx.link_flags += ['-l%s%s' % (lib, debug_suffix) for
> lib in
> -                                    ['vcruntime', 'ucrt', 'msvcrt']]
> -        elif cxx_abi == 'none' or cxx_abi == 'default':
> -            if self.is_windows:
> -                debug_suffix = 'd' if self.debug_build else ''
> -                self.cxx.link_flags += ['-lmsvcrt%s' % debug_suffix]
> -        else:
> -            self.lit_config.fatal(
> -                'C++ ABI setting %s unsupported for tests' % cxx_abi)
> -
> -    def configure_extra_library_flags(self):
> -        if self.get_lit_bool('cxx_ext_threads', default=False):
> -            self.cxx.link_flags += ['-lc++external_threads']
> -        self.target_info.add_cxx_link_flags(self.cxx.link_flags)
> -
> -    def configure_color_diagnostics(self):
> -        use_color = self.get_lit_conf('color_diagnostics')
> -        if use_color is None:
> -            use_color = os.environ.get('LIBCXX_COLOR_DIAGNOSTICS')
> -        if use_color is None:
> -            return
> -        if use_color != '':
> -            self.lit_config.fatal('Invalid value for color_diagnostics
> "%s".'
> -                                  % use_color)
> -        color_flag = '-fdiagnostics-color=always'
> -        # Check if the compiler supports the color diagnostics flag.
> Issue a
> -        # warning if it does not since color diagnostics have been
> requested.
> -        if not self.cxx.hasCompileFlag(color_flag):
> -            self.lit_config.warning(
> -                'color diagnostics have been requested but are not
> supported '
> -                'by the compiler')
> -        else:
> -            self.cxx.flags += [color_flag]
> -
> -    def configure_debug_mode(self):
> -        debug_level = self.get_lit_conf('debug_level', None)
> -        if not debug_level:
> -            return
> -        if debug_level not in ['0', '1']:
> -            self.lit_config.fatal('Invalid value for debug_level "%s".'
> -                                  % debug_level)
> -        self.cxx.compile_flags += ['-D_LIBCPP_DEBUG=%s' % debug_level]
> -
> -    def configure_warnings(self):
> -        # Turn on warnings by default for Clang based compilers when C++
> >= 11
> -        default_enable_warnings = self.cxx.type in ['clang',
> 'apple-clang'] \
> -            and len(self.config.available_features.intersection(
> -                ['c++11', 'c++14', 'c++1z'])) != 0
> -        enable_warnings = self.get_lit_bool('enable_warnings',
> -                                            default_enable_warnings)
> -        self.cxx.useWarnings(enable_warnings)
> -        self.cxx.warning_flags += [
> -            '-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER',
> -            '-Wall', '-Wextra', '-Werror'
> -        ]
> -        if self.cxx.hasWarningFlag('-Wuser-defined-warnings'):
> -            self.cxx.warning_flags += ['-Wuser-defined-warnings']
> -            self.config.available_features.add('diagnose-if-support')
> -        self.cxx.addWarningFlagIfSupported('-Wshadow')
> -        self.cxx.addWarningFlagIfSupported('-Wno-unused-command-line-
> argument')
> -        self.cxx.addWarningFlagIfSupported('-Wno-attributes')
> -        self.cxx.addWarningFlagIfSupported('-Wno-pessimizing-move')
> -        self.cxx.addWarningFlagIfSupported('-Wno-c++11-extensions')
> -        self.cxx.addWarningFlagIfSupported('-Wno-user-defined-literals')
> -        self.cxx.addWarningFlagIfSupported('-Wno-noexcept-type')
> -        # These warnings should be enabled in order to support the MSVC
> -        # team using the test suite; They enable the warnings below and
> -        # expect the test suite to be clean.
> -        self.cxx.addWarningFlagIfSupported('-Wsign-compare')
> -        self.cxx.addWarningFlagIfSupported('-Wunused-variable')
> -        self.cxx.addWarningFlagIfSupported('-Wunused-parameter')
> -        self.cxx.addWarningFlagIfSupported('-Wunreachable-code')
> -        # FIXME: Enable the two warnings below.
> -        self.cxx.addWarningFlagIfSupported('-Wno-conversion')
> -        self.cxx.addWarningFlagIfSupported('-Wno-unused-local-typedef')
> -        std = self.get_lit_conf('std', None)
> -        if std in ['c++98', 'c++03']:
> -            # The '#define static_assert' provided by libc++ in C++03 mode
> -            # causes an unused local typedef whenever it is used.
> -            self.cxx.addWarningFlagIfSupported('-
> Wno-unused-local-typedef')
> -
> -    def configure_sanitizer(self):
> -        san = self.get_lit_conf('use_sanitizer', '').strip()
> -        if san:
> -            self.target_info.add_sanitizer_features(san,
> self.config.available_features)
> -            # Search for llvm-symbolizer along the compiler path first
> -            # and then along the PATH env variable.
> -            symbolizer_search_paths = os.environ.get('PATH', '')
> -            cxx_path = libcxx.util.which(self.cxx.path)
> -            if cxx_path is not None:
> -                symbolizer_search_paths = (
> -                    os.path.dirname(cxx_path) +
> -                    os.pathsep + symbolizer_search_paths)
> -            llvm_symbolizer = libcxx.util.which('llvm-symbolizer',
> -                                                symbolizer_search_paths)
> -
> -            def add_ubsan():
> -                self.cxx.flags += ['-fsanitize=undefined',
> -                                   '-fno-sanitize=vptr,function,
> float-divide-by-zero',
> -                                   '-fno-sanitize-recover=all']
> -                self.exec_env['UBSAN_OPTIONS'] = 'print_stacktrace=1'
> -                self.config.available_features.add('ubsan')
> -
> -            # Setup the sanitizer compile flags
> -            self.cxx.flags += ['-g', '-fno-omit-frame-pointer']
> -            if san == 'Address' or san == 'Address;Undefined' or san ==
> 'Undefined;Address':
> -                self.cxx.flags += ['-fsanitize=address']
> -                if llvm_symbolizer is not None:
> -                    self.exec_env['ASAN_SYMBOLIZER_PATH'] =
> llvm_symbolizer
> -                # FIXME: Turn ODR violation back on after PR28391 is
> resolved
> -                # https://bugs.llvm.org/show_bug.cgi?id=28391
> -                self.exec_env['ASAN_OPTIONS'] = 'detect_odr_violation=0'
> -                self.config.available_features.add('asan')
> -                self.config.available_features.add('sanitizer-new-
> delete')
> -                self.cxx.compile_flags += ['-O1']
> -                if san == 'Address;Undefined' or san ==
> 'Undefined;Address':
> -                    add_ubsan()
> -            elif san == 'Memory' or san == 'MemoryWithOrigins':
> -                self.cxx.flags += ['-fsanitize=memory']
> -                if san == 'MemoryWithOrigins':
> -                    self.cxx.compile_flags += [
> -                        '-fsanitize-memory-track-origins']
> -                if llvm_symbolizer is not None:
> -                    self.exec_env['MSAN_SYMBOLIZER_PATH'] =
> llvm_symbolizer
> -                self.config.available_features.add('msan')
> -                self.config.available_features.add('sanitizer-new-
> delete')
> -                self.cxx.compile_flags += ['-O1']
> -            elif san == 'Undefined':
> -                add_ubsan()
> -                self.cxx.compile_flags += ['-O2']
> -            elif san == 'Thread':
> -                self.cxx.flags += ['-fsanitize=thread']
> -                self.config.available_features.add('tsan')
> -                self.config.available_features.add('sanitizer-new-
> delete')
> -            else:
> -                self.lit_config.fatal('unsupported value for '
> -                                      'use_sanitizer: {0}'.format(san))
> -            san_lib = self.get_lit_conf('sanitizer_library')
> -            if san_lib:
> -                self.cxx.link_flags += [
> -                    san_lib, '-Wl,-rpath,%s' % os.path.dirname(san_lib)]
> -
> -    def configure_coverage(self):
> -        self.generate_coverage = self.get_lit_bool('generate_coverage',
> False)
> -        if self.generate_coverage:
> -            self.cxx.flags += ['-g', '--coverage']
> -            self.cxx.compile_flags += ['-O0']
> -
> -    def configure_modules(self):
> -        modules_flags = ['-fmodules']
> -        if platform.system() != 'Darwin':
> -            modules_flags += ['-Xclang', '-fmodules-local-submodule-
> visibility']
> -        supports_modules = self.cxx.hasCompileFlag(modules_flags)
> -        enable_modules = self.get_lit_bool('enable_modules',
> -                                           default=False,
> -                                           env_var='LIBCXX_ENABLE_
> MODULES')
> -        if enable_modules and not supports_modules:
> -            self.lit_config.fatal(
> -                '-fmodules is enabled but not supported by the compiler')
> -        if not supports_modules:
> -            return
> -        self.config.available_features.add('modules-support')
> -        module_cache = os.path.join(self.config.test_exec_root,
> -                                   'modules.cache')
> -        module_cache = os.path.realpath(module_cache)
> -        if os.path.isdir(module_cache):
> -            shutil.rmtree(module_cache)
> -        os.makedirs(module_cache)
> -        self.cxx.modules_flags = modules_flags + \
> -            ['-fmodules-cache-path=' + module_cache]
> -        if enable_modules:
> -            self.config.available_features.add('-fmodules')
> -            self.cxx.useModules()
> -
> -    def configure_substitutions(self):
> -        sub = self.config.substitutions
> -        cxx_path = pipes.quote(self.cxx.path)
> -        # Configure compiler substitutions
> -        sub.append(('%cxx', cxx_path))
> -        # Configure flags substitutions
> -        flags_str = ' '.join([pipes.quote(f) for f in self.cxx.flags])
> -        compile_flags_str = ' '.join([pipes.quote(f) for f in
> self.cxx.compile_flags])
> -        link_flags_str = ' '.join([pipes.quote(f) for f in
> self.cxx.link_flags])
> -        all_flags = '%s %s %s' % (flags_str, compile_flags_str,
> link_flags_str)
> -        sub.append(('%flags', flags_str))
> -        sub.append(('%compile_flags', compile_flags_str))
> -        sub.append(('%link_flags', link_flags_str))
> -        sub.append(('%all_flags', all_flags))
> -        if self.cxx.isVerifySupported():
> -            verify_str = ' ' + ' '.join(self.cxx.verify_flags) + ' '
> -            sub.append(('%verify', verify_str))
> -        # Add compile and link shortcuts
> -        compile_str = (cxx_path + ' -o %t.o %s -c ' + flags_str
> -                       + ' ' + compile_flags_str)
> -        link_str = (cxx_path + ' -o %t.exe %t.o ' + flags_str + ' '
> -                    + link_flags_str)
> -        assert type(link_str) is str
> -        build_str = cxx_path + ' -o %t.exe %s ' + all_flags
> -        if self.cxx.use_modules:
> -            sub.append(('%compile_module', compile_str))
> -            sub.append(('%build_module', build_str))
> -        elif self.cxx.modules_flags is not None:
> -            modules_str = ' '.join(self.cxx.modules_flags) + ' '
> -            sub.append(('%compile_module', compile_str + ' ' +
> modules_str))
> -            sub.append(('%build_module', build_str + ' ' + modules_str))
> -        sub.append(('%compile', compile_str))
> -        sub.append(('%link', link_str))
> -        sub.append(('%build', build_str))
> -        # Configure exec prefix substitutions.
> -        exec_env_str = ''
> -        if not self.is_windows and len(self.exec_env) != 0:
> -            exec_env_str = 'env '
> -            for k, v in self.exec_env.items():
> -                exec_env_str += ' %s=%s' % (k, v)
> -        # Configure run env substitution.
> -        exec_str = exec_env_str
> -        if self.lit_config.useValgrind:
> -            exec_str = ' '.join(self.lit_config.valgrindArgs) +
> exec_env_str
> -        sub.append(('%exec', exec_str))
> -        # Configure run shortcut
> -        sub.append(('%run', exec_str + ' %t.exe'))
> -        # Configure not program substitutions
> -        not_py = os.path.join(self.libcxx_src_root, 'utils', 'not.py')
> -        not_str = '%s %s ' % (pipes.quote(sys.executable),
> pipes.quote(not_py))
> -        sub.append(('not ', not_str))
> -
> -    def can_use_deployment(self):
> -        # Check if the host is on an Apple platform using clang.
> -        if not self.target_info.platform() == "darwin":
> -            return False
> -        if not self.target_info.is_host_macosx():
> -            return False
> -        if not self.cxx.type.endswith('clang'):
> -            return False
> -        return True
> -
> -    def configure_triple(self):
> -        # Get or infer the target triple.
> -        target_triple = self.get_lit_conf('target_triple')
> -        self.use_target = self.get_lit_bool('use_target', False)
> -        if self.use_target and target_triple:
> -            self.lit_config.warning('use_target is true but no triple is
> specified')
> -
> -        # Use deployment if possible.
> -        self.use_deployment = not self.use_target and
> self.can_use_deployment()
> -        if self.use_deployment:
> -            return
> -
> -        # Save the triple (and warn on Apple platforms).
> -        self.config.target_triple = target_triple
> -        if self.use_target and 'apple' in target_triple:
> -            self.lit_config.warning('consider using arch and platform
> instead'
> -                                    ' of target_triple on Apple
> platforms')
> -
> -        # If no target triple was given, try to infer it from the compiler
> -        # under test.
> -        if not self.config.target_triple:
> -            target_triple = self.cxx.getTriple()
> -            # Drop sub-major version components from the triple, because
> the
> -            # current XFAIL handling expects exact matches for feature
> checks.
> -            # Example: x86_64-apple-darwin14.0.0 -> x86_64-apple-darwin14
> -            # The 5th group handles triples greater than 3 parts
> -            # (ex x86_64-pc-linux-gnu).
> -            target_triple = re.sub(r'([^-]+)-([^-]+)-([^.]+)([^-]*)(.*)',
> -                                   r'\1-\2-\3\5', target_triple)
> -            # linux-gnu is needed in the triple to properly identify
> linuxes
> -            # that use GLIBC. Handle redhat and opensuse triples as
> special
> -            # cases and append the missing `-gnu` portion.
> -            if (target_triple.endswith('redhat-linux') or
> -                target_triple.endswith('suse-linux')):
> -                target_triple += '-gnu'
> -            self.config.target_triple = target_triple
> -            self.lit_config.note(
> -                "inferred target_triple as: %r" %
> self.config.target_triple)
> -
> -    def configure_deployment(self):
> -        assert not self.use_deployment is None
> -        assert not self.use_target is None
> -        if not self.use_deployment:
> -            # Warn about ignored parameters.
> -            if self.get_lit_conf('arch'):
> -                self.lit_config.warning('ignoring arch, using
> target_triple')
> -            if self.get_lit_conf('platform'):
> -                self.lit_config.warning('ignoring platform, using
> target_triple')
> -            return
> -
> -        assert not self.use_target
> -        assert self.target_info.is_host_macosx()
> -
> -        # Always specify deployment explicitly on Apple platforms, since
> -        # otherwise a platform is picked up from the SDK.  If the SDK
> version
> -        # doesn't match the system version, tests that use the system
> library
> -        # may fail spuriously.
> -        arch = self.get_lit_conf('arch')
> -        if not arch:
> -            arch = self.cxx.getTriple().split('-', 1)[0]
> -            self.lit_config.note("inferred arch as: %r" % arch)
> -
> -        inferred_platform, name, version = self.target_info.get_platform(
> )
> -        if inferred_platform:
> -            self.lit_config.note("inferred platform as: %r" % (name +
> version))
> -        self.config.deployment = (arch, name, version)
> -
> -        # Set the target triple for use by lit.
> -        self.config.target_triple = arch + '-apple-' + name + version
> -        self.lit_config.note(
> -            "computed target_triple as: %r" % self.config.target_triple)
> -
> -    def configure_env(self):
> -        self.target_info.configure_env(self.exec_env)
> -
> -    def add_path(self, dest_env, new_path):
> -        if 'PATH' not in dest_env:
> -            dest_env['PATH'] = new_path
> -        else:
> -            split_char = ';' if self.is_windows else ':'
> -            dest_env['PATH'] = '%s%s%s' % (new_path, split_char,
> -                                           dest_env['PATH'])
> +#===-------------------------------------------------------
> ---------------===##
> +#
> +#                     The LLVM Compiler Infrastructure
> +#
> +# This file is dual licensed under the MIT and the University of Illinois
> Open
> +# Source Licenses. See LICENSE.TXT for details.
> +#
> +#===-------------------------------------------------------
> ---------------===##
> +
> +import locale
> +import os
> +import platform
> +import pkgutil
> +import pipes
> +import re
> +import shlex
> +import shutil
> +import sys
> +
> +from libcxx.compiler import CXXCompiler
> +from libcxx.test.target_info import make_target_info
> +from libcxx.test.executor import *
> +from libcxx.test.tracing import *
> +import libcxx.util
> +
> +def loadSiteConfig(lit_config, config, param_name, env_name):
> +    # We haven't loaded the site specific configuration (the user is
> +    # probably trying to run on a test file directly, and either the site
> +    # configuration hasn't been created by the build system, or we are in
> an
> +    # out-of-tree build situation).
> +    site_cfg = lit_config.params.get(param_name,
> +                                     os.environ.get(env_name))
> +    if not site_cfg:
> +        lit_config.warning('No site specific configuration file found!'
> +                           ' Running the tests in the default
> configuration.')
> +    elif not os.path.isfile(site_cfg):
> +        lit_config.fatal(
> +            "Specified site configuration file does not exist: '%s'" %
> +            site_cfg)
> +    else:
> +        lit_config.note('using site specific configuration at %s' %
> site_cfg)
> +        ld_fn = lit_config.load_config
> +
> +        # Null out the load_config function so that lit.site.cfg doesn't
> +        # recursively load a config even if it tries.
> +        # TODO: This is one hell of a hack. Fix it.
> +        def prevent_reload_fn(*args, **kwargs):
> +            pass
> +        lit_config.load_config = prevent_reload_fn
> +        ld_fn(config, site_cfg)
> +        lit_config.load_config = ld_fn
> +
> +class Configuration(object):
> +    # pylint: disable=redefined-outer-name
> +    def __init__(self, lit_config, config):
> +        self.lit_config = lit_config
> +        self.config = config
> +        self.is_windows = platform.system() == 'Windows'
> +        self.cxx = None
> +        self.cxx_is_clang_cl = None
> +        self.cxx_stdlib_under_test = None
> +        self.project_obj_root = None
> +        self.libcxx_src_root = None
> +        self.libcxx_obj_root = None
> +        self.cxx_library_root = None
> +        self.cxx_runtime_root = None
> +        self.abi_library_root = None
> +        self.link_shared = self.get_lit_bool('enable_shared',
> default=True)
> +        self.debug_build = self.get_lit_bool('debug_build',
>  default=False)
> +        self.exec_env = {}
> +        self.use_target = False
> +        self.use_system_cxx_lib = False
> +        self.use_clang_verify = False
> +        self.long_tests = None
> +        self.execute_external = False
> +
> +    def get_lit_conf(self, name, default=None):
> +        val = self.lit_config.params.get(name, None)
> +        if val is None:
> +            val = getattr(self.config, name, None)
> +            if val is None:
> +                val = default
> +        return val
> +
> +    def get_lit_bool(self, name, default=None, env_var=None):
> +        def check_value(value, var_name):
> +            if value is None:
> +                return default
> +            if isinstance(value, bool):
> +                return value
> +            if not isinstance(value, str):
> +                raise TypeError('expected bool or string')
> +            if value.lower() in ('1', 'true'):
> +                return True
> +            if value.lower() in ('', '0', 'false'):
> +                return False
> +            self.lit_config.fatal(
> +                "parameter '{}' should be true or false".format(var_name))
> +
> +        conf_val = self.get_lit_conf(name)
> +        if env_var is not None and env_var in os.environ and \
> +                os.environ[env_var] is not None:
> +            val = os.environ[env_var]
> +            if conf_val is not None:
> +                self.lit_config.warning(
> +                    'Environment variable %s=%s is overriding explicit '
> +                    '--param=%s=%s' % (env_var, val, name, conf_val))
> +            return check_value(val, env_var)
> +        return check_value(conf_val, name)
> +
> +    def make_static_lib_name(self, name):
> +        """Return the full filename for the specified library name"""
> +        if self.is_windows:
> +            assert name == 'c++'  # Only allow libc++ to use this
> function for now.
> +            return 'lib' + name + '.lib'
> +        else:
> +            return 'lib' + name + '.a'
> +
> +    def configure(self):
> +        self.configure_executor()
> +        self.configure_use_system_cxx_lib()
> +        self.configure_target_info()
> +        self.configure_cxx()
> +        self.configure_triple()
> +        self.configure_deployment()
> +        self.configure_availability()
> +        self.configure_src_root()
> +        self.configure_obj_root()
> +        self.configure_cxx_stdlib_under_test()
> +        self.configure_cxx_library_root()
> +        self.configure_use_clang_verify()
> +        self.configure_use_thread_safety()
> +        self.configure_execute_external()
> +        self.configure_ccache()
> +        self.configure_compile_flags()
> +        self.configure_filesystem_compile_flags()
> +        self.configure_link_flags()
> +        self.configure_env()
> +        self.configure_color_diagnostics()
> +        self.configure_debug_mode()
> +        self.configure_warnings()
> +        self.configure_sanitizer()
> +        self.configure_coverage()
> +        self.configure_modules()
> +        self.configure_substitutions()
> +        self.configure_features()
> +
> +    def print_config_info(self):
> +        # Print the final compile and link flags.
> +        self.lit_config.note('Using compiler: %s' % self.cxx.path)
> +        self.lit_config.note('Using flags: %s' % self.cxx.flags)
> +        if self.cxx.use_modules:
> +            self.lit_config.note('Using modules flags: %s' %
> +                                 self.cxx.modules_flags)
> +        self.lit_config.note('Using compile flags: %s'
> +                             % self.cxx.compile_flags)
> +        if len(self.cxx.warning_flags):
> +            self.lit_config.note('Using warnings: %s' %
> self.cxx.warning_flags)
> +        self.lit_config.note('Using link flags: %s' % self.cxx.link_flags)
> +        # Print as list to prevent "set([...])" from being printed.
> +        self.lit_config.note('Using available_features: %s' %
> +                             list(self.config.available_features))
> +        self.lit_config.note('Using environment: %r' % self.exec_env)
> +        sys.stderr.flush()  # Force flushing to avoid broken output on
> Windows
> +
> +    def get_test_format(self):
> +        from libcxx.test.format import LibcxxTestFormat
> +        return LibcxxTestFormat(
> +            self.cxx,
> +            self.use_clang_verify,
> +            self.execute_external,
> +            self.executor,
> +            exec_env=self.exec_env)
> +
> +    def configure_executor(self):
> +        exec_str = self.get_lit_conf('executor', "None")
> +        te = eval(exec_str)
> +        if te:
> +            self.lit_config.note("Using executor: %r" % exec_str)
> +            if self.lit_config.useValgrind:
> +                # We have no way of knowing where in the chain the
> +                # ValgrindExecutor is supposed to go. It is likely
> +                # that the user wants it at the end, but we have no
> +                # way of getting at that easily.
> +                selt.lit_config.fatal("Cannot infer how to create a
> Valgrind "
> +                                      " executor.")
> +        else:
> +            te = LocalExecutor()
> +            if self.lit_config.useValgrind:
> +                te = ValgrindExecutor(self.lit_config.valgrindArgs, te)
> +        self.executor = te
> +
> +    def configure_target_info(self):
> +        self.target_info = make_target_info(self)
> +
> +    def configure_cxx(self):
> +        # Gather various compiler parameters.
> +        cxx = self.get_lit_conf('cxx_under_test')
> +        self.cxx_is_clang_cl = cxx is not None and \
> +                               os.path.basename(cxx) == 'clang-cl.exe'
> +        # If no specific cxx_under_test was given, attempt to infer it as
> +        # clang++.
> +        if cxx is None or self.cxx_is_clang_cl:
> +            search_paths = self.config.environment['PATH']
> +            if cxx is not None and os.path.isabs(cxx):
> +                search_paths = os.path.dirname(cxx)
> +            clangxx = libcxx.util.which('clang++', search_paths)
> +            if clangxx:
> +                cxx = clangxx
> +                self.lit_config.note(
> +                    "inferred cxx_under_test as: %r" % cxx)
> +            elif self.cxx_is_clang_cl:
> +                self.lit_config.fatal('Failed to find clang++
> substitution for'
> +                                      ' clang-cl')
> +        if not cxx:
> +            self.lit_config.fatal('must specify user parameter
> cxx_under_test '
> +                                  '(e.g., --param=cxx_under_test=clang++
> )')
> +        self.cxx = CXXCompiler(cxx) if not self.cxx_is_clang_cl else \
> +                   self._configure_clang_cl(cxx)
> +        cxx_type = self.cxx.type
> +        if cxx_type is not None:
> +            assert self.cxx.version is not None
> +            maj_v, min_v, _ = self.cxx.version
> +            self.config.available_features.add(cxx_type)
> +            self.config.available_features.add('%s-%s' % (cxx_type,
> maj_v))
> +            self.config.available_features.add('%s-%s.%s' % (
> +                cxx_type, maj_v, min_v))
> +        self.cxx.compile_env = dict(os.environ)
> +        # 'CCACHE_CPP2' prevents ccache from stripping comments while
> +        # preprocessing. This is required to prevent stripping of
> '-verify'
> +        # comments.
> +        self.cxx.compile_env['CCACHE_CPP2'] = '1'
> +
> +    def _configure_clang_cl(self, clang_path):
> +        def _split_env_var(var):
> +            return [p.strip() for p in os.environ.get(var, '').split(';')
> if p.strip()]
> +
> +        def _prefixed_env_list(var, prefix):
> +            from itertools import chain
> +            return list(chain.from_iterable((prefix, path) for path in
> _split_env_var(var)))
> +
> +        assert self.cxx_is_clang_cl
> +        flags = []
> +        compile_flags = _prefixed_env_list('INCLUDE', '-isystem')
> +        link_flags = _prefixed_env_list('LIB', '-L')
> +        for path in _split_env_var('LIB'):
> +            self.add_path(self.exec_env, path)
> +        return CXXCompiler(clang_path, flags=flags,
> +                           compile_flags=compile_flags,
> +                           link_flags=link_flags)
> +
> +
> +    def configure_src_root(self):
> +        self.libcxx_src_root = self.get_lit_conf(
> +            'libcxx_src_root', os.path.dirname(self.config.
> test_source_root))
> +
> +    def configure_obj_root(self):
> +        self.project_obj_root = self.get_lit_conf('project_obj_root')
> +        self.libcxx_obj_root = self.get_lit_conf('libcxx_obj_root')
> +        if not self.libcxx_obj_root and self.project_obj_root is not None:
> +            possible_root = os.path.join(self.project_obj_root,
> 'projects', 'libcxx')
> +            if os.path.isdir(possible_root):
> +                self.libcxx_obj_root = possible_root
> +            else:
> +                self.libcxx_obj_root = self.project_obj_root
> +
> +    def configure_cxx_library_root(self):
> +        self.cxx_library_root = self.get_lit_conf('cxx_library_root',
> +                                                  self.libcxx_obj_root)
> +        self.cxx_runtime_root = self.get_lit_conf('cxx_runtime_root',
> +                                                   self.cxx_library_root)
> +
> +    def configure_use_system_cxx_lib(self):
> +        # This test suite supports testing against either the system
> library or
> +        # the locally built one; the former mode is useful for testing ABI
> +        # compatibility between the current headers and a shipping dynamic
> +        # library.
> +        # Default to testing against the locally built libc++ library.
> +        self.use_system_cxx_lib = self.get_lit_conf('use_system_cxx_lib')
> +        if self.use_system_cxx_lib == 'true':
> +            self.use_system_cxx_lib = True
> +        elif self.use_system_cxx_lib == 'false':
> +            self.use_system_cxx_lib = False
> +        elif self.use_system_cxx_lib:
> +            assert os.path.isdir(self.use_system_cxx_lib)
> +        self.lit_config.note(
> +            "inferred use_system_cxx_lib as: %r" %
> self.use_system_cxx_lib)
> +
> +    def configure_availability(self):
> +        # See http://llvm.org/docs/AvailabilityMarkup.html
> +        self.with_availability = self.get_lit_bool('with_availability',
> False)
> +        self.lit_config.note(
> +            "inferred with_availability as: %r" % self.with_availability)
> +
> +    def configure_cxx_stdlib_under_test(self):
> +        self.cxx_stdlib_under_test = self.get_lit_conf(
> +            'cxx_stdlib_under_test', 'libc++')
> +        if self.cxx_stdlib_under_test not in \
> +                ['libc++', 'libstdc++', 'msvc', 'cxx_default']:
> +            self.lit_config.fatal(
> +                'unsupported value for "cxx_stdlib_under_test": %s'
> +                % self.cxx_stdlib_under_test)
> +        self.config.available_features.add(self.cxx_stdlib_under_test)
> +        if self.cxx_stdlib_under_test == 'libstdc++':
> +            self.config.available_features.add('libstdc++')
> +            # Manually enable the experimental and filesystem tests for
> libstdc++
> +            # if the options aren't present.
> +            # FIXME this is a hack.
> +            if self.get_lit_conf('enable_experimental') is None:
> +                self.config.enable_experimental = 'true'
> +            if self.get_lit_conf('enable_filesystem') is None:
> +                self.config.enable_filesystem = 'true'
> +
> +    def configure_use_clang_verify(self):
> +        '''If set, run clang with -verify on failing tests.'''
> +        if self.with_availability:
> +            self.use_clang_verify = False
> +            return
> +        self.use_clang_verify = self.get_lit_bool('use_clang_verify')
> +        if self.use_clang_verify is None:
> +            # NOTE: We do not test for the -verify flag directly because
> +            #   -verify will always exit with non-zero on an empty file.
> +            self.use_clang_verify = self.cxx.isVerifySupported()
> +            self.lit_config.note(
> +                "inferred use_clang_verify as: %r" %
> self.use_clang_verify)
> +        if self.use_clang_verify:
> +                self.config.available_features.add('verify-support')
> +
> +    def configure_use_thread_safety(self):
> +        '''If set, run clang with -verify on failing tests.'''
> +        has_thread_safety = self.cxx.hasCompileFlag('-
> Werror=thread-safety')
> +        if has_thread_safety:
> +            self.cxx.compile_flags += ['-Werror=thread-safety']
> +            self.config.available_features.add('thread-safety')
> +            self.lit_config.note("enabling thread-safety annotations")
> +
> +    def configure_execute_external(self):
> +        # Choose between lit's internal shell pipeline runner and a real
> shell.
> +        # If LIT_USE_INTERNAL_SHELL is in the environment, we use that as
> the
> +        # default value. Otherwise we ask the target_info.
> +        use_lit_shell_default = os.environ.get('LIT_USE_INTERNAL_SHELL')
> +        if use_lit_shell_default is not None:
> +            use_lit_shell_default = use_lit_shell_default != '0'
> +        else:
> +            use_lit_shell_default = self.target_info.use_lit_
> shell_default()
> +        # Check for the command line parameter using the default value if
> it is
> +        # not present.
> +        use_lit_shell = self.get_lit_bool('use_lit_shell',
> +                                          use_lit_shell_default)
> +        self.execute_external = not use_lit_shell
> +
> +    def configure_ccache(self):
> +        use_ccache_default = os.environ.get('LIBCXX_USE_CCACHE') is not
> None
> +        use_ccache = self.get_lit_bool('use_ccache', use_ccache_default)
> +        if use_ccache:
> +            self.cxx.use_ccache = True
> +            self.lit_config.note('enabling ccache')
> +
> +    def add_deployment_feature(self, feature):
> +        (arch, name, version) = self.config.deployment
> +        self.config.available_features.add('%s=%s-%s' % (feature, arch,
> name))
> +        self.config.available_features.add('%s=%s' % (feature, name))
> +        self.config.available_features.add('%s=%s%s' % (feature, name,
> version))
> +
> +    def configure_features(self):
> +        additional_features = self.get_lit_conf('additional_features')
> +        if additional_features:
> +            for f in additional_features.split(','):
> +                self.config.available_features.add(f.strip())
> +        self.target_info.add_locale_features(self.config.
> available_features)
> +
> +        target_platform = self.target_info.platform()
> +
> +        # Write an "available feature" that combines the triple when
> +        # use_system_cxx_lib is enabled. This is so that we can easily
> write
> +        # XFAIL markers for tests that are known to fail with versions of
> +        # libc++ as were shipped with a particular triple.
> +        if self.use_system_cxx_lib:
> +            self.config.available_features.add('with_system_cxx_lib')
> +            self.config.available_features.add(
> +                'with_system_cxx_lib=%s' % self.config.target_triple)
> +
> +            # Add subcomponents individually.
> +            target_components = self.config.target_triple.split('-')
> +            for component in target_components:
> +                self.config.available_features.add(
> +                    'with_system_cxx_lib=%s' % component)
> +
> +            # Add available features for more generic versions of the
> target
> +            # triple attached to  with_system_cxx_lib.
> +            if self.use_deployment:
> +                self.add_deployment_feature('with_system_cxx_lib')
> +
> +        # Configure the availability markup checks features.
> +        if self.with_availability:
> +            self.config.available_features.add('availability_markup')
> +            self.add_deployment_feature('availability_markup')
> +
> +        if self.use_system_cxx_lib or self.with_availability:
> +            self.config.available_features.add('availability')
> +            self.add_deployment_feature('availability')
> +
> +        if platform.system() == 'Darwin':
> +            self.config.available_features.add('apple-darwin')
> +
> +        # Insert the platform name into the available features as a lower
> case.
> +        self.config.available_features.add(target_platform)
> +
> +        # Simulator testing can take a really long time for some of these
> tests
> +        # so add a feature check so we can REQUIRES: long_tests in them
> +        self.long_tests = self.get_lit_bool('long_tests')
> +        if self.long_tests is None:
> +            # Default to running long tests.
> +            self.long_tests = True
> +            self.lit_config.note(
> +                "inferred long_tests as: %r" % self.long_tests)
> +
> +        if self.long_tests:
> +            self.config.available_features.add('long_tests')
> +
> +        # Run a compile test for the -fsized-deallocation flag. This is
> needed
> +        # in test/std/language.support/support.dynamic/new.delete
> +        if self.cxx.hasCompileFlag('-fsized-deallocation'):
> +            self.config.available_features.add('fsized-deallocation')
> +
> +        if self.cxx.hasCompileFlag('-faligned-allocation'):
> +            self.config.available_features.add('-faligned-allocation')
> +        else:
> +            # FIXME remove this once more than just clang-4.0 support
> +            # C++17 aligned allocation.
> +            self.config.available_features.add('no-aligned-allocation')
> +
> +        if self.get_lit_bool('has_libatomic', False):
> +            self.config.available_features.add('libatomic')
> +
> +        macros = self.cxx.dumpMacros()
> +        if '__cpp_if_constexpr' not in macros:
> +            self.config.available_features.add('libcpp-no-if-constexpr')
> +
> +        if '__cpp_structured_bindings' not in macros:
> +            self.config.available_features.add('libcpp-no-
> structured-bindings')
> +
> +        if '__cpp_deduction_guides' not in macros:
> +            self.config.available_features.add('libcpp-no-
> deduction-guides')
> +
> +        if self.is_windows:
> +            self.config.available_features.add('windows')
> +            if self.cxx_stdlib_under_test == 'libc++':
> +                # LIBCXX-WINDOWS-FIXME is the feature name used to XFAIL
> the
> +                # initial Windows failures until they can be properly
> diagnosed
> +                # and fixed. This allows easier detection of new test
> failures
> +                # and regressions. Note: New failures should not be
> suppressed
> +                # using this feature. (Also see llvm.org/PR32730)
> +                self.config.available_features.add('LIBCXX-WINDOWS-
> FIXME')
> +
> +        # Attempt to detect the glibc version by querying for __GLIBC__
> +        # in 'features.h'.
> +        macros = self.cxx.dumpMacros(flags=['-include', 'features.h'])
> +        if macros is not None and '__GLIBC__' in macros:
> +            maj_v, min_v = (macros['__GLIBC__'],
> macros['__GLIBC_MINOR__'])
> +            self.config.available_features.add('glibc')
> +            self.config.available_features.add('glibc-%s' % maj_v)
> +            self.config.available_features.add('glibc-%s.%s' % (maj_v,
> min_v))
> +
> +    def configure_compile_flags(self):
> +        no_default_flags = self.get_lit_bool('no_default_flags', False)
> +        if not no_default_flags:
> +            self.configure_default_compile_flags()
> +        # This include is always needed so add so add it regardless of
> +        # 'no_default_flags'.
> +        support_path = os.path.join(self.libcxx_src_root, 'test/support')
> +        self.cxx.compile_flags += ['-I' + support_path]
> +        # Configure extra flags
> +        compile_flags_str = self.get_lit_conf('compile_flags', '')
> +        self.cxx.compile_flags += shlex.split(compile_flags_str)
> +        # FIXME: Can we remove this?
> +        if self.is_windows:
> +            self.cxx.compile_flags += ['-D_CRT_SECURE_NO_WARNINGS']
> +
> +    def configure_default_compile_flags(self):
> +        # Try and get the std version from the command line. Fall back to
> +        # default given in lit.site.cfg is not present. If default is not
> +        # present then force c++11.
> +        std = self.get_lit_conf('std')
> +        if not std:
> +            # Choose the newest possible language dialect if none is
> given.
> +            possible_stds = ['c++1z', 'c++14', 'c++11', 'c++03']
> +            if self.cxx.type == 'gcc':
> +                maj_v, _, _ = self.cxx.version
> +                maj_v = int(maj_v)
> +                if maj_v < 7:
> +                    possible_stds.remove('c++1z')
> +                # FIXME: How many C++14 tests actually fail under GCC 5
> and 6?
> +                # Should we XFAIL them individually instead?
> +                if maj_v <= 6:
> +                    possible_stds.remove('c++14')
> +            for s in possible_stds:
> +                if self.cxx.hasCompileFlag('-std=%s' % s):
> +                    std = s
> +                    self.lit_config.note(
> +                        'inferred language dialect as: %s' % std)
> +                    break
> +            if not std:
> +                self.lit_config.fatal(
> +                    'Failed to infer a supported language dialect from
> one of %r'
> +                    % possible_stds)
> +        self.cxx.compile_flags += ['-std={0}'.format(std)]
> +        self.config.available_features.add(std.replace('gnu++', 'c++'))
> +        # Configure include paths
> +        self.configure_compile_flags_header_includes()
> +        self.target_info.add_cxx_compile_flags(self.cxx.compile_flags)
> +        # Configure feature flags.
> +        self.configure_compile_flags_exceptions()
> +        self.configure_compile_flags_rtti()
> +        self.configure_compile_flags_abi_version()
> +        enable_32bit = self.get_lit_bool('enable_32bit', False)
> +        if enable_32bit:
> +            self.cxx.flags += ['-m32']
> +        # Use verbose output for better errors
> +        self.cxx.flags += ['-v']
> +        sysroot = self.get_lit_conf('sysroot')
> +        if sysroot:
> +            self.cxx.flags += ['--sysroot', sysroot]
> +        gcc_toolchain = self.get_lit_conf('gcc_toolchain')
> +        if gcc_toolchain:
> +            self.cxx.flags += ['-gcc-toolchain', gcc_toolchain]
> +        # NOTE: the _DEBUG definition must preceed the triple check
> because for
> +        # the Windows build of libc++, the forced inclusion of a header
> requires
> +        # that _DEBUG is defined.  Incorrect ordering will result in
> -target
> +        # being elided.
> +        if self.is_windows and self.debug_build:
> +            self.cxx.compile_flags += ['-D_DEBUG']
> +        if self.use_target:
> +            if not self.cxx.addFlagIfSupported(
> +                    ['-target', self.config.target_triple]):
> +                self.lit_config.warning('use_target is true but -target
> is '\
> +                        'not supported by the compiler')
> +        if self.use_deployment:
> +            arch, name, version = self.config.deployment
> +            self.cxx.flags += ['-arch', arch]
> +            self.cxx.flags += ['-m' + name + '-version-min=' + version]
> +
> +        # Disable availability unless explicitely requested
> +        if not self.with_availability:
> +            self.cxx.flags += ['-D_LIBCPP_DISABLE_AVAILABILITY']
> +
> +    def configure_compile_flags_header_includes(self):
> +        support_path = os.path.join(self.libcxx_src_root, 'test',
> 'support')
> +        self.configure_config_site_header()
> +        if self.cxx_stdlib_under_test != 'libstdc++' and \
> +           not self.is_windows:
> +            self.cxx.compile_flags += [
> +                '-include', os.path.join(support_path,
> 'nasty_macros.hpp')]
> +        if self.cxx_stdlib_under_test == 'msvc':
> +            self.cxx.compile_flags += [
> +                '-include', os.path.join(support_path,
> +                                         'msvc_stdlib_force_include.
> hpp')]
> +            pass
> +        if self.is_windows and self.debug_build and \
> +                self.cxx_stdlib_under_test != 'msvc':
> +            self.cxx.compile_flags += [
> +                '-include', os.path.join(support_path,
> +                                         'set_windows_crt_report_mode.h')
> +            ]
> +        cxx_headers = self.get_lit_conf('cxx_headers')
> +        if cxx_headers == '' or (cxx_headers is None
> +                                 and self.cxx_stdlib_under_test !=
> 'libc++'):
> +            self.lit_config.note('using the system cxx headers')
> +            return
> +        self.cxx.compile_flags += ['-nostdinc++']
> +        if cxx_headers is None:
> +            cxx_headers = os.path.join(self.libcxx_src_root, 'include')
> +        if not os.path.isdir(cxx_headers):
> +            self.lit_config.fatal("cxx_headers='%s' is not a directory."
> +                                  % cxx_headers)
> +        self.cxx.compile_flags += ['-I' + cxx_headers]
> +        if self.libcxx_obj_root is not None:
> +            cxxabi_headers = os.path.join(self.libcxx_obj_root,
> 'include',
> +                                          'c++build')
> +            if os.path.isdir(cxxabi_headers):
> +                self.cxx.compile_flags += ['-I' + cxxabi_headers]
> +
> +    def configure_config_site_header(self):
> +        # Check for a possible __config_site in the build directory. We
> +        # use this if it exists.
> +        if self.libcxx_obj_root is None:
> +            return
> +        config_site_header = os.path.join(self.libcxx_obj_root,
> '__config_site')
> +        if not os.path.isfile(config_site_header):
> +            return
> +        contained_macros = self.parse_config_site_and_add_features(
> +            config_site_header)
> +        self.lit_config.note('Using __config_site header %s with macros:
> %r'
> +            % (config_site_header, contained_macros))
> +        # FIXME: This must come after the call to
> +        # 'parse_config_site_and_add_features(...)' in order for it to
> work.
> +        self.cxx.compile_flags += ['-include', config_site_header]
> +
> +    def parse_config_site_and_add_features(self, header):
> +        """ parse_config_site_and_add_features - Deduce and add the test
> +            features that that are implied by the #define's in the
> __config_site
> +            header. Return a dictionary containing the macros found in the
> +            '__config_site' header.
> +        """
> +        # Parse the macro contents of __config_site by dumping the macros
> +        # using 'c++ -dM -E' and filtering the predefines.
> +        predefines = self.cxx.dumpMacros()
> +        macros = self.cxx.dumpMacros(header)
> +        feature_macros_keys = set(macros.keys()) - set(predefines.keys())
> +        feature_macros = {}
> +        for k in feature_macros_keys:
> +            feature_macros[k] = macros[k]
> +        # We expect the header guard to be one of the definitions
> +        assert '_LIBCPP_CONFIG_SITE' in feature_macros
> +        del feature_macros['_LIBCPP_CONFIG_SITE']
> +        # The __config_site header should be non-empty. Otherwise it
> should
> +        # have never been emitted by CMake.
> +        assert len(feature_macros) > 0
> +        # Transform each macro name into the feature name used in the
> tests.
> +        # Ex. _LIBCPP_HAS_NO_THREADS -> libcpp-has-no-threads
> +        for m in feature_macros:
> +            if m == '_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS':
> +                continue
> +            if m == '_LIBCPP_ABI_VERSION':
> +                self.config.available_features.add('libcpp-abi-
> version-v%s'
> +                    % feature_macros[m])
> +                continue
> +            assert m.startswith('_LIBCPP_HAS_') or m ==
> '_LIBCPP_ABI_UNSTABLE'
> +            m = m.lower()[1:].replace('_', '-')
> +            self.config.available_features.add(m)
> +        return feature_macros
> +
> +
> +
> +    def configure_compile_flags_exceptions(self):
> +        enable_exceptions = self.get_lit_bool('enable_exceptions', True)
> +        if not enable_exceptions:
> +            self.config.available_features.add('libcpp-no-exceptions')
> +            self.cxx.compile_flags += ['-fno-exceptions']
> +
> +    def configure_compile_flags_rtti(self):
> +        enable_rtti = self.get_lit_bool('enable_rtti', True)
> +        if not enable_rtti:
> +            self.config.available_features.add('libcpp-no-rtti')
> +            self.cxx.compile_flags += ['-fno-rtti', '-D_LIBCPP_NO_RTTI']
> +
> +    def configure_compile_flags_abi_version(self):
> +        abi_version = self.get_lit_conf('abi_version', '').strip()
> +        abi_unstable = self.get_lit_bool('abi_unstable')
> +        # Only add the ABI version when it is non-default.
> +        # FIXME(EricWF): Get the ABI version from the "__config_site".
> +        if abi_version and abi_version != '1':
> +          self.cxx.compile_flags += ['-D_LIBCPP_ABI_VERSION=' +
> abi_version]
> +        if abi_unstable:
> +          self.config.available_features.add('libcpp-abi-unstable')
> +          self.cxx.compile_flags += ['-D_LIBCPP_ABI_UNSTABLE']
> +
> +    def configure_filesystem_compile_flags(self):
> +        enable_fs = self.get_lit_bool('enable_filesystem', default=False)
> +        if not enable_fs:
> +            return
> +        enable_experimental = self.get_lit_bool('enable_experimental',
> default=False)
> +        if not enable_experimental:
> +            self.lit_config.fatal(
> +                'filesystem is enabled but libc++experimental.a is not.')
> +        self.config.available_features.add('c++filesystem')
> +        static_env = os.path.join(self.libcxx_src_root, 'test', 'std',
> +                                  'experimental', 'filesystem', 'Inputs',
> 'static_test_env')
> +        static_env = os.path.realpath(static_env)
> +        assert os.path.isdir(static_env)
> +        self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT="%s"'
> % static_env]
> +
> +        dynamic_env = os.path.join(self.config.test_exec_root,
> +                                   'filesystem', 'Output', 'dynamic_env')
> +        dynamic_env = os.path.realpath(dynamic_env)
> +        if not os.path.isdir(dynamic_env):
> +            os.makedirs(dynamic_env)
> +        self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT="%s"'
> % dynamic_env]
> +        self.exec_env['LIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT'] = ("%s" %
> dynamic_env)
> +
> +        dynamic_helper = os.path.join(self.libcxx_src_root, 'test',
> 'support',
> +                                      'filesystem_dynamic_test_
> helper.py')
> +        assert os.path.isfile(dynamic_helper)
> +
> +        self.cxx.compile_flags += ['-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER="%s
> %s"'
> +                                   % (sys.executable, dynamic_helper)]
> +
> +
> +    def configure_link_flags(self):
> +        no_default_flags = self.get_lit_bool('no_default_flags', False)
> +        if not no_default_flags:
> +            # Configure library path
> +            self.configure_link_flags_cxx_library_path()
> +            self.configure_link_flags_abi_library_path()
> +
> +            # Configure libraries
> +            if self.cxx_stdlib_under_test == 'libc++':
> +                self.cxx.link_flags += ['-nodefaultlibs']
> +                # FIXME: Handle MSVCRT as part of the ABI library
> handling.
> +                if self.is_windows:
> +                    self.cxx.link_flags += ['-nostdlib']
> +                self.configure_link_flags_cxx_library()
> +                self.configure_link_flags_abi_library()
> +                self.configure_extra_library_flags()
> +            elif self.cxx_stdlib_under_test == 'libstdc++':
> +                enable_fs = self.get_lit_bool('enable_filesystem',
> +                                              default=False)
> +                if enable_fs:
> +                    self.config.available_features.add('c++experimental')
> +                    self.cxx.link_flags += ['-lstdc++fs']
> +                self.cxx.link_flags += ['-lm', '-pthread']
> +            elif self.cxx_stdlib_under_test == 'msvc':
> +                # FIXME: Correctly setup debug/release flags here.
> +                pass
> +            elif self.cxx_stdlib_under_test == 'cxx_default':
> +                self.cxx.link_flags += ['-pthread']
> +            else:
> +                self.lit_config.fatal(
> +                    'unsupported value for "use_stdlib_type": %s'
> +                    %  use_stdlib_type)
> +
> +        link_flags_str = self.get_lit_conf('link_flags', '')
> +        self.cxx.link_flags += shlex.split(link_flags_str)
> +
> +    def configure_link_flags_cxx_library_path(self):
> +        if not self.use_system_cxx_lib:
> +            if self.cxx_library_root:
> +                self.cxx.link_flags += ['-L' + self.cxx_library_root]
> +                if self.is_windows and self.link_shared:
> +                    self.add_path(self.cxx.compile_env,
> self.cxx_library_root)
> +            if self.cxx_runtime_root:
> +                if not self.is_windows:
> +                    self.cxx.link_flags += ['-Wl,-rpath,' +
> +                                            self.cxx_runtime_root]
> +                elif self.is_windows and self.link_shared:
> +                    self.add_path(self.exec_env, self.cxx_runtime_root)
> +        elif os.path.isdir(str(self.use_system_cxx_lib)):
> +            self.cxx.link_flags += ['-L' + self.use_system_cxx_lib]
> +            if not self.is_windows:
> +                self.cxx.link_flags += ['-Wl,-rpath,' +
> +                                        self.use_system_cxx_lib]
> +            if self.is_windows and self.link_shared:
> +                self.add_path(self.cxx.compile_env,
> self.use_system_cxx_lib)
> +
> +    def configure_link_flags_abi_library_path(self):
> +        # Configure ABI library paths.
> +        self.abi_library_root = self.get_lit_conf('abi_library_path')
> +        if self.abi_library_root:
> +            self.cxx.link_flags += ['-L' + self.abi_library_root]
> +            if not self.is_windows:
> +                self.cxx.link_flags += ['-Wl,-rpath,' +
> self.abi_library_root]
> +            else:
> +                self.add_path(self.exec_env, self.abi_library_root)
> +
> +    def configure_link_flags_cxx_library(self):
> +        libcxx_experimental = self.get_lit_bool('enable_experimental',
> default=False)
> +        if libcxx_experimental:
> +            self.config.available_features.add('c++experimental')
> +            self.cxx.link_flags += ['-lc++experimental']
> +        if self.link_shared:
> +            self.cxx.link_flags += ['-lc++']
> +        else:
> +            cxx_library_root = self.get_lit_conf('cxx_library_root')
> +            if cxx_library_root:
> +                libname = self.make_static_lib_name('c++')
> +                abs_path = os.path.join(cxx_library_root, libname)
> +                assert os.path.exists(abs_path) and \
> +                       "static libc++ library does not exist"
> +                self.cxx.link_flags += [abs_path]
> +            else:
> +                self.cxx.link_flags += ['-lc++']
> +
> +    def configure_link_flags_abi_library(self):
> +        cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
> +        if cxx_abi == 'libstdc++':
> +            self.cxx.link_flags += ['-lstdc++']
> +        elif cxx_abi == 'libsupc++':
> +            self.cxx.link_flags += ['-lsupc++']
> +        elif cxx_abi == 'libcxxabi':
> +            if self.target_info.allow_cxxabi_link():
> +                libcxxabi_shared = self.get_lit_bool('libcxxabi_shared',
> default=True)
> +                if libcxxabi_shared:
> +                    self.cxx.link_flags += ['-lc++abi']
> +                else:
> +                    cxxabi_library_root = self.get_lit_conf('abi_
> library_path')
> +                    if cxxabi_library_root:
> +                        libname = self.make_static_lib_name('c++abi')
> +                        abs_path = os.path.join(cxxabi_library_root,
> libname)
> +                        self.cxx.link_flags += [abs_path]
> +                    else:
> +                        self.cxx.link_flags += ['-lc++abi']
> +        elif cxx_abi == 'libcxxrt':
> +            self.cxx.link_flags += ['-lcxxrt']
> +        elif cxx_abi == 'vcruntime':
> +            debug_suffix = 'd' if self.debug_build else ''
> +            self.cxx.link_flags += ['-l%s%s' % (lib, debug_suffix) for
> lib in
> +                                    ['vcruntime', 'ucrt', 'msvcrt']]
> +        elif cxx_abi == 'none' or cxx_abi == 'default':
> +            if self.is_windows:
> +                debug_suffix = 'd' if self.debug_build else ''
> +                self.cxx.link_flags += ['-lmsvcrt%s' % debug_suffix]
> +        else:
> +            self.lit_config.fatal(
> +                'C++ ABI setting %s unsupported for tests' % cxx_abi)
> +
> +    def configure_extra_library_flags(self):
> +        if self.get_lit_bool('cxx_ext_threads', default=False):
> +            self.cxx.link_flags += ['-lc++external_threads']
> +        self.target_info.add_cxx_link_flags(self.cxx.link_flags)
> +
> +    def configure_color_diagnostics(self):
> +        use_color = self.get_lit_conf('color_diagnostics')
> +        if use_color is None:
> +            use_color = os.environ.get('LIBCXX_COLOR_DIAGNOSTICS')
> +        if use_color is None:
> +            return
> +        if use_color != '':
> +            self.lit_config.fatal('Invalid value for color_diagnostics
> "%s".'
> +                                  % use_color)
> +        color_flag = '-fdiagnostics-color=always'
> +        # Check if the compiler supports the color diagnostics flag.
> Issue a
> +        # warning if it does not since color diagnostics have been
> requested.
> +        if not self.cxx.hasCompileFlag(color_flag):
> +            self.lit_config.warning(
> +                'color diagnostics have been requested but are not
> supported '
> +                'by the compiler')
> +        else:
> +            self.cxx.flags += [color_flag]
> +
> +    def configure_debug_mode(self):
> +        debug_level = self.get_lit_conf('debug_level', None)
> +        if not debug_level:
> +            return
> +        if debug_level not in ['0', '1']:
> +            self.lit_config.fatal('Invalid value for debug_level "%s".'
> +                                  % debug_level)
> +        self.cxx.compile_flags += ['-D_LIBCPP_DEBUG=%s' % debug_level]
> +
> +    def configure_warnings(self):
> +        # Turn on warnings by default for Clang based compilers when C++
> >= 11
> +        default_enable_warnings = self.cxx.type in ['clang',
> 'apple-clang'] \
> +            and len(self.config.available_features.intersection(
> +                ['c++11', 'c++14', 'c++1z'])) != 0
> +        enable_warnings = self.get_lit_bool('enable_warnings',
> +                                            default_enable_warnings)
> +        self.cxx.useWarnings(enable_warnings)
> +        self.cxx.warning_flags += [
> +            '-D_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER',
> +            '-Wall', '-Wextra', '-Werror'
> +        ]
> +        if self.cxx.hasWarningFlag('-Wuser-defined-warnings'):
> +            self.cxx.warning_flags += ['-Wuser-defined-warnings']
> +            self.config.available_features.add('diagnose-if-support')
> +        self.cxx.addWarningFlagIfSupported('-Wshadow')
> +        self.cxx.addWarningFlagIfSupported('-Wno-unused-command-line-
> argument')
> +        self.cxx.addWarningFlagIfSupported('-Wno-attributes')
> +        self.cxx.addWarningFlagIfSupported('-Wno-pessimizing-move')
> +        self.cxx.addWarningFlagIfSupported('-Wno-c++11-extensions')
> +        self.cxx.addWarningFlagIfSupported('-Wno-user-defined-literals')
> +        self.cxx.addWarningFlagIfSupported('-Wno-noexcept-type')
> +        # These warnings should be enabled in order to support the MSVC
> +        # team using the test suite; They enable the warnings below and
> +        # expect the test suite to be clean.
> +        self.cxx.addWarningFlagIfSupported('-Wsign-compare')
> +        self.cxx.addWarningFlagIfSupported('-Wunused-variable')
> +        self.cxx.addWarningFlagIfSupported('-Wunused-parameter')
> +        self.cxx.addWarningFlagIfSupported('-Wunreachable-code')
> +        # FIXME: Enable the two warnings below.
> +        self.cxx.addWarningFlagIfSupported('-Wno-conversion')
> +        self.cxx.addWarningFlagIfSupported('-Wno-unused-local-typedef')
> +        std = self.get_lit_conf('std', None)
> +        if std in ['c++98', 'c++03']:
> +            # The '#define static_assert' provided by libc++ in C++03 mode
> +            # causes an unused local typedef whenever it is used.
> +            self.cxx.addWarningFlagIfSupported('-
> Wno-unused-local-typedef')
> +
> +    def configure_sanitizer(self):
> +        san = self.get_lit_conf('use_sanitizer', '').strip()
> +        if san:
> +            self.target_info.add_sanitizer_features(san,
> self.config.available_features)
> +            # Search for llvm-symbolizer along the compiler path first
> +            # and then along the PATH env variable.
> +            symbolizer_search_paths = os.environ.get('PATH', '')
> +            cxx_path = libcxx.util.which(self.cxx.path)
> +            if cxx_path is not None:
> +                symbolizer_search_paths = (
> +                    os.path.dirname(cxx_path) +
> +                    os.pathsep + symbolizer_search_paths)
> +            llvm_symbolizer = libcxx.util.which('llvm-symbolizer',
> +                                                symbolizer_search_paths)
> +
> +            def add_ubsan():
> +                self.cxx.flags += ['-fsanitize=undefined',
> +                                   '-fno-sanitize=vptr,function,
> float-divide-by-zero',
> +                                   '-fno-sanitize-recover=all']
> +                self.exec_env['UBSAN_OPTIONS'] = 'print_stacktrace=1'
> +                self.config.available_features.add('ubsan')
> +
> +            # Setup the sanitizer compile flags
> +            self.cxx.flags += ['-g', '-fno-omit-frame-pointer']
> +            if san == 'Address' or san == 'Address;Undefined' or san ==
> 'Undefined;Address':
> +                self.cxx.flags += ['-fsanitize=address']
> +                if llvm_symbolizer is not None:
> +                    self.exec_env['ASAN_SYMBOLIZER_PATH'] =
> llvm_symbolizer
> +                # FIXME: Turn ODR violation back on after PR28391 is
> resolved
> +                # https://bugs.llvm.org/show_bug.cgi?id=28391
> +                self.exec_env['ASAN_OPTIONS'] = 'detect_odr_violation=0'
> +                self.config.available_features.add('asan')
> +                self.config.available_features.add('sanitizer-new-
> delete')
> +                self.cxx.compile_flags += ['-O1']
> +                if san == 'Address;Undefined' or san ==
> 'Undefined;Address':
> +                    add_ubsan()
> +            elif san == 'Memory' or san == 'MemoryWithOrigins':
> +                self.cxx.flags += ['-fsanitize=memory']
> +                if san == 'MemoryWithOrigins':
> +                    self.cxx.compile_flags += [
> +                        '-fsanitize-memory-track-origins']
> +                if llvm_symbolizer is not None:
> +                    self.exec_env['MSAN_SYMBOLIZER_PATH'] =
> llvm_symbolizer
> +                self.config.available_features.add('msan')
> +                self.config.available_features.add('sanitizer-new-
> delete')
> +                self.cxx.compile_flags += ['-O1']
> +            elif san == 'Undefined':
> +                add_ubsan()
> +                self.cxx.compile_flags += ['-O2']
> +            elif san == 'Thread':
> +                self.cxx.flags += ['-fsanitize=thread']
> +                self.config.available_features.add('tsan')
> +                self.config.available_features.add('sanitizer-new-
> delete')
> +            else:
> +                self.lit_config.fatal('unsupported value for '
> +                                      'use_sanitizer: {0}'.format(san))
> +            san_lib = self.get_lit_conf('sanitizer_library')
> +            if san_lib:
> +                self.cxx.link_flags += [
> +                    san_lib, '-Wl,-rpath,%s' % os.path.dirname(san_lib)]
> +
> +    def configure_coverage(self):
> +        self.generate_coverage = self.get_lit_bool('generate_coverage',
> False)
> +        if self.generate_coverage:
> +            self.cxx.flags += ['-g', '--coverage']
> +            self.cxx.compile_flags += ['-O0']
> +
> +    def configure_modules(self):
> +        modules_flags = ['-fmodules']
> +        if platform.system() != 'Darwin':
> +            modules_flags += ['-Xclang', '-fmodules-local-submodule-
> visibility']
> +        supports_modules = self.cxx.hasCompileFlag(modules_flags)
> +        enable_modules = self.get_lit_bool('enable_modules',
> +                                           default=False,
> +                                           env_var='LIBCXX_ENABLE_
> MODULES')
> +        if enable_modules and not supports_modules:
> +            self.lit_config.fatal(
> +                '-fmodules is enabled but not supported by the compiler')
> +        if not supports_modules:
> +            return
> +        self.config.available_features.add('modules-support')
> +        module_cache = os.path.join(self.config.test_exec_root,
> +                                   'modules.cache')
> +        module_cache = os.path.realpath(module_cache)
> +        if os.path.isdir(module_cache):
> +            shutil.rmtree(module_cache)
> +        os.makedirs(module_cache)
> +        self.cxx.modules_flags = modules_flags + \
> +            ['-fmodules-cache-path=' + module_cache]
> +        if enable_modules:
> +            self.config.available_features.add('-fmodules')
> +            self.cxx.useModules()
> +
> +    def configure_substitutions(self):
> +        sub = self.config.substitutions
> +        cxx_path = pipes.quote(self.cxx.path)
> +        # Configure compiler substitutions
> +        sub.append(('%cxx', cxx_path))
> +        # Configure flags substitutions
> +        flags_str = ' '.join([pipes.quote(f) for f in self.cxx.flags])
> +        compile_flags_str = ' '.join([pipes.quote(f) for f in
> self.cxx.compile_flags])
> +        link_flags_str = ' '.join([pipes.quote(f) for f in
> self.cxx.link_flags])
> +        all_flags = '%s %s %s' % (flags_str, compile_flags_str,
> link_flags_str)
> +        sub.append(('%flags', flags_str))
> +        sub.append(('%compile_flags', compile_flags_str))
> +        sub.append(('%link_flags', link_flags_str))
> +        sub.append(('%all_flags', all_flags))
> +        if self.cxx.isVerifySupported():
> +            verify_str = ' ' + ' '.join(self.cxx.verify_flags) + ' '
> +            sub.append(('%verify', verify_str))
> +        # Add compile and link shortcuts
> +        compile_str = (cxx_path + ' -o %t.o %s -c ' + flags_str
> +                       + ' ' + compile_flags_str)
> +        link_str = (cxx_path + ' -o %t.exe %t.o ' + flags_str + ' '
> +                    + link_flags_str)
> +        assert type(link_str) is str
> +        build_str = cxx_path + ' -o %t.exe %s ' + all_flags
> +        if self.cxx.use_modules:
> +            sub.append(('%compile_module', compile_str))
> +            sub.append(('%build_module', build_str))
> +        elif self.cxx.modules_flags is not None:
> +            modules_str = ' '.join(self.cxx.modules_flags) + ' '
> +            sub.append(('%compile_module', compile_str + ' ' +
> modules_str))
> +            sub.append(('%build_module', build_str + ' ' + modules_str))
> +        sub.append(('%compile', compile_str))
> +        sub.append(('%link', link_str))
> +        sub.append(('%build', build_str))
> +        # Configure exec prefix substitutions.
> +        exec_env_str = ''
> +        if not self.is_windows and len(self.exec_env) != 0:
> +            exec_env_str = 'env '
> +            for k, v in self.exec_env.items():
> +                exec_env_str += ' %s=%s' % (k, v)
> +        # Configure run env substitution.
> +        exec_str = exec_env_str
> +        if self.lit_config.useValgrind:
> +            exec_str = ' '.join(self.lit_config.valgrindArgs) +
> exec_env_str
> +        sub.append(('%exec', exec_str))
> +        # Configure run shortcut
> +        sub.append(('%run', exec_str + ' %t.exe'))
> +        # Configure not program substitutions
> +        not_py = os.path.join(self.libcxx_src_root, 'utils', 'not.py')
> +        not_str = '%s %s ' % (pipes.quote(sys.executable),
> pipes.quote(not_py))
> +        sub.append(('not ', not_str))
> +
> +    def can_use_deployment(self):
> +        # Check if the host is on an Apple platform using clang.
> +        if not self.target_info.platform() == "darwin":
> +            return False
> +        if not self.target_info.is_host_macosx():
> +            return False
> +        if not self.cxx.type.endswith('clang'):
> +            return False
> +        return True
> +
> +    def configure_triple(self):
> +        # Get or infer the target triple.
> +        target_triple = self.get_lit_conf('target_triple')
> +        self.use_target = self.get_lit_bool('use_target', False)
> +        if self.use_target and target_triple:
> +            self.lit_config.warning('use_target is true but no triple is
> specified')
> +
> +        # Use deployment if possible.
> +        self.use_deployment = not self.use_target and
> self.can_use_deployment()
> +        if self.use_deployment:
> +            return
> +
> +        # Save the triple (and warn on Apple platforms).
> +        self.config.target_triple = target_triple
> +        if self.use_target and 'apple' in target_triple:
> +            self.lit_config.warning('consider using arch and platform
> instead'
> +                                    ' of target_triple on Apple
> platforms')
> +
> +        # If no target triple was given, try to infer it from the compiler
> +        # under test.
> +        if not self.config.target_triple:
> +            target_triple = self.cxx.getTriple()
> +            # Drop sub-major version components from the triple, because
> the
> +            # current XFAIL handling expects exact matches for feature
> checks.
> +            # Example: x86_64-apple-darwin14.0.0 -> x86_64-apple-darwin14
> +            # The 5th group handles triples greater than 3 parts
> +            # (ex x86_64-pc-linux-gnu).
> +            target_triple = re.sub(r'([^-]+)-([^-]+)-([^.]+)([^-]*)(.*)',
> +                                   r'\1-\2-\3\5', target_triple)
> +            # linux-gnu is needed in the triple to properly identify
> linuxes
> +            # that use GLIBC. Handle redhat and opensuse triples as
> special
> +            # cases and append the missing `-gnu` portion.
> +            if (target_triple.endswith('redhat-linux') or
> +                target_triple.endswith('suse-linux')):
> +                target_triple += '-gnu'
> +            self.config.target_triple = target_triple
> +            self.lit_config.note(
> +                "inferred target_triple as: %r" %
> self.config.target_triple)
> +
> +    def configure_deployment(self):
> +        assert not self.use_deployment is None
> +        assert not self.use_target is None
> +        if not self.use_deployment:
> +            # Warn about ignored parameters.
> +            if self.get_lit_conf('arch'):
> +                self.lit_config.warning('ignoring arch, using
> target_triple')
> +            if self.get_lit_conf('platform'):
> +                self.lit_config.warning('ignoring platform, using
> target_triple')
> +            return
> +
> +        assert not self.use_target
> +        assert self.target_info.is_host_macosx()
> +
> +        # Always specify deployment explicitly on Apple platforms, since
> +        # otherwise a platform is picked up from the SDK.  If the SDK
> version
> +        # doesn't match the system version, tests that use the system
> library
> +        # may fail spuriously.
> +        arch = self.get_lit_conf('arch')
> +        if not arch:
> +            arch = self.cxx.getTriple().split('-', 1)[0]
> +            self.lit_config.note("inferred arch as: %r" % arch)
> +
> +        inferred_platform, name, version = self.target_info.get_platform(
> )
> +        if inferred_platform:
> +            self.lit_config.note("inferred platform as: %r" % (name +
> version))
> +        self.config.deployment = (arch, name, version)
> +
> +        # Set the target triple for use by lit.
> +        self.config.target_triple = arch + '-apple-' + name + version
> +        self.lit_config.note(
> +            "computed target_triple as: %r" % self.config.target_triple)
> +
> +    def configure_env(self):
> +        self.target_info.configure_env(self.exec_env)
> +
> +    def add_path(self, dest_env, new_path):
> +        if 'PATH' not in dest_env:
> +            dest_env['PATH'] = new_path
> +        else:
> +            split_char = ';' if self.is_windows else ':'
> +            dest_env['PATH'] = '%s%s%s' % (new_path, split_char,
> +                                           dest_env['PATH'])
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170508/e8758422/attachment-0001.html>


More information about the cfe-commits mailing list