[llvm] r313467 - Resubmit "Add a shared llvm.lit module that all test suites can use."

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 17 19:05:06 PDT 2017


Hi Zachary,

Your commit seems to have completely broken the lit test framework on both the linux and windows hosted PS4 bots and as a result no tests are currently being run on new commits. Can you look into this ASAP?

http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/builds/17437

llvm-lit: /home/buildslave/buildslave1a/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/utils/lit/lit/TestingConfig.py:101: fatal: unable to parse config file '/home/buildslave/buildslave1a/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/test/lit.site.cfg', traceback: Traceback (most recent call last):
  File "/home/buildslave/buildslave1a/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/utils/lit/lit/TestingConfig.py", line 88, in load_from_path
    exec(compile(data, path, 'exec'), cfg_globals, None)
  File "/home/buildslave/buildslave1a/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.obj/test/lit.site.cfg", line 57, in <module>
    lit.llvm.initialize(lit_config, config)
  File "/home/buildslave/buildslave1a/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/utils/lit/lit/llvm/__init__.py", line 8, in initialize
  File "/home/buildslave/buildslave1a/llvm-clang-lld-x86_64-scei-ps4-ubuntu-fast/llvm.src/utils/lit/lit/llvm/config.py", line 36, in __init__
AttributeError: 'LLVMConfig' object has no attribute 'litsh'

http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/12163

llvm-lit.py: C:/ps4-buildslave2/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/llvm.src\utils\lit\lit\TestingConfig.py:101: fatal: unable to parse config file 'c:\\ps4-buildslave2\\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\\llvm.obj\\test\\lit.site.cfg', traceback: Traceback (most recent call last):
  File "C:/ps4-buildslave2/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/llvm.src\utils\lit\lit\TestingConfig.py", line 88, in load_from_path
    exec(compile(data, path, 'exec'), cfg_globals, None)
  File "c:\ps4-buildslave2\llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast\llvm.obj\test\lit.site.cfg", line 57, in <module>
    lit.llvm.initialize(lit_config, config)
  File "C:/ps4-buildslave2/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/llvm.src\utils\lit\lit\llvm\__init__.py", line 8, in initialize
  File "C:/ps4-buildslave2/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/llvm.src\utils\lit\lit\llvm\config.py", line 35, in __init__
NameError: global name 'use_lit_shell' is not defined

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of
> Zachary Turner via llvm-commits
> Sent: Saturday, September 16, 2017 11:46
> To: llvm-commits at lists.llvm.org
> Subject: [llvm] r313467 - Resubmit "Add a shared llvm.lit module that all test
> suites can use."
> 
> Author: zturner
> Date: Sat Sep 16 11:46:21 2017
> New Revision: 313467
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=313467&view=rev
> Log:
> Resubmit "Add a shared llvm.lit module that all test suites can use."
> 
> There were some issues surrounding Py2 / Py3 compatibility, but I've now
> tested with both Py2 and Py3 and everything seems to work.
> 
> Added:
>     llvm/trunk/utils/lit/lit/llvm/
>     llvm/trunk/utils/lit/lit/llvm/__init__.py
>     llvm/trunk/utils/lit/lit/llvm/config.py
> Modified:
>     llvm/trunk/cmake/modules/AddLLVM.cmake
>     llvm/trunk/test/lit.cfg
>     llvm/trunk/test/lit.site.cfg.in
>     llvm/trunk/utils/lit/lit/util.py
> 
> Modified: llvm/trunk/cmake/modules/AddLLVM.cmake
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/cmake/modules/AddLLVM.cmake?rev=313467&r1=313466&r2=313467&
> view=diff
> ==============================================================================
> --- llvm/trunk/cmake/modules/AddLLVM.cmake (original)
> +++ llvm/trunk/cmake/modules/AddLLVM.cmake Sat Sep 16 11:46:21 2017
> @@ -1173,6 +1173,10 @@ function(configure_lit_site_cfg input ou
>      set(TARGET_TRIPLE "\"+config.target_triple+\"")
>    endif()
> 
> +  string(CONCAT LIT_SITE_CFG_IN_FOOTER
> +     "import lit.llvm\n"
> +     "lit.llvm.initialize(lit_config, config)\n")
> +
>    configure_file(${input} ${output} @ONLY)
>    get_filename_component(INPUT_DIR ${input} DIRECTORY)
>    if (EXISTS "${INPUT_DIR}/lit.cfg")
> 
> Modified: llvm/trunk/test/lit.cfg
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/lit.cfg?rev=313467&r1=313466&r2=313467&view=diff
> ==============================================================================
> --- llvm/trunk/test/lit.cfg (original)
> +++ llvm/trunk/test/lit.cfg Sat Sep 16 11:46:21 2017
> @@ -10,35 +10,13 @@ import subprocess
> 
>  import lit.util
>  import lit.formats
> +from lit.llvm import llvm_config
> 
>  # name: The name of this test suite.
>  config.name = 'LLVM'
> 
> -# Tweak PATH for Win32 to decide to use bash.exe or not.
> -if sys.platform in ['win32']:
> -    # Seek sane tools in directories and set to $PATH.
> -    path = getattr(config, 'lit_tools_dir', None)
> -    path = lit_config.getToolsPath(path,
> -                                   config.environment['PATH'],
> -                                   ['cmp.exe', 'grep.exe', 'sed.exe'])
> -    if path is not None:
> -        path = os.path.pathsep.join((path,
> -                                     config.environment['PATH']))
> -        config.environment['PATH'] = path
> -
> -# 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 an override.
> -use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL")
> -if use_lit_shell:
> -    # 0 is external, "" is default, and everything else is internal.
> -    execute_external = (use_lit_shell == "0")
> -else:
> -    # Otherwise we default to internal on Windows and external elsewhere, as
> -    # bash on Windows is usually very slow.
> -    execute_external = (not sys.platform in ['win32'])
> -
>  # testFormat: The test format to use to interpret tests.
> -config.test_format = lit.formats.ShTest(execute_external)
> +config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell)
> 
>  # suffixes: A list of file extensions to treat as test files. This is
> overriden  # by individual lit.local.cfg files in the test subdirectories.
> @@ -56,57 +34,27 @@ config.test_source_root = os.path.dirnam
> config.test_exec_root = os.path.join(config.llvm_obj_root, 'test')
> 
>  # Tweak the PATH to include the tools dir.
> -path = os.path.pathsep.join((config.llvm_tools_dir,
> config.environment['PATH'])) -config.environment['PATH'] = path
> +llvm_config.with_environment('PATH', config.llvm_tools_dir,
> +append_path=True)
> 
> -# Propagate 'HOME' through the environment.
> -if 'HOME' in os.environ:
> -    config.environment['HOME'] = os.environ['HOME']
> -
> -# Propagate 'INCLUDE' through the environment.
> -if 'INCLUDE' in os.environ:
> -    config.environment['INCLUDE'] = os.environ['INCLUDE']
> -
> -# Propagate 'LIB' through the environment.
> -if 'LIB' in os.environ:
> -    config.environment['LIB'] = os.environ['LIB']
> -
> -# Propagate the temp directory. Windows requires this because it uses
> \Windows\ -# if none of these are present.
> -if 'TMP' in os.environ:
> -    config.environment['TMP'] = os.environ['TMP']
> -if 'TEMP' in os.environ:
> -    config.environment['TEMP'] = os.environ['TEMP']
> +# Propagate some variables from the host environment.
> +llvm_config.with_system_environment(['HOME', 'INCLUDE', 'LIB', 'TMP',
> +'TEMP', 'ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH'])
> 
>  # Propagate LLVM_SRC_ROOT into the environment.
>  config.environment['LLVM_SRC_ROOT'] = config.llvm_src_root
> 
> -# Propagate PYTHON_EXECUTABLE into the environment -
> config.environment['PYTHON_EXECUTABLE'] = getattr(config, 'python_executable',
> -                                                  '')
> -
> -# Propagate path to symbolizer for ASan/MSan.
> -for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']:
> -    if symbolizer in os.environ:
> -        config.environment[symbolizer] = os.environ[symbolizer]
> -
>  # Set up OCAMLPATH to include newly built OCaml libraries.
>  top_ocaml_lib = os.path.join(config.llvm_lib_dir, 'ocaml')  llvm_ocaml_lib =
> os.path.join(top_ocaml_lib, 'llvm') -ocamlpath =
> os.path.pathsep.join((llvm_ocaml_lib, top_ocaml_lib)) -if 'OCAMLPATH' in
> os.environ:
> -    ocamlpath = os.path.pathsep.join((ocamlpath, os.environ['OCAMLPATH']))
> -config.environment['OCAMLPATH'] = ocamlpath
> -
> -if 'CAML_LD_LIBRARY_PATH' in os.environ:
> -    caml_ld_library_path = os.path.pathsep.join((llvm_ocaml_lib,
> -                                os.environ['CAML_LD_LIBRARY_PATH']))
> -    config.environment['CAML_LD_LIBRARY_PATH'] = caml_ld_library_path
> -else:
> -    config.environment['CAML_LD_LIBRARY_PATH'] = llvm_ocaml_lib
> +
> +llvm_config.with_system_environment('OCAMLPATH')
> +llvm_config.with_environment('OCAMLPATH', top_ocaml_lib,
> +append_path=True) llvm_config.with_environment('OCAMLPATH',
> +llvm_ocaml_lib, append_path=True)
> +
> +llvm_config.with_system_environment('CAML_LD_LIBRARY_PATH')
> +llvm_config.with_environment('CAML_LD_LIBRARY_PATH', llvm_ocaml_lib,
> +append_path=True)
> 
>  # Set up OCAMLRUNPARAM to enable backtraces in OCaml tests.
> -config.environment['OCAMLRUNPARAM'] = 'b'
> +llvm_config.with_environment('OCAMLRUNPARAM', 'b')
> 
>  # Provide the path to asan runtime lib 'libclang_rt.asan_osx_dynamic.dylib'
> if  # available. This is darwin specific since it's currently only needed on
> darwin.
> @@ -300,10 +248,6 @@ for arch in config.targets_to_build.spli
> 
>  ### Features
> 
> -# Shell execution
> -if execute_external:
> -    config.available_features.add('shell')
> -
>  # Others/can-execute.txt
>  if sys.platform not in ['win32']:
>      config.available_features.add('can-execute')
> @@ -323,45 +267,14 @@ if loadable_module:
>  if not config.build_shared_libs:
>      config.available_features.add("static-libs")
> 
> -# Sanitizers.
> -if 'Address' in config.llvm_use_sanitizer:
> -    config.available_features.add("asan")
> -else:
> -    config.available_features.add("not_asan")
> -if 'Memory' in config.llvm_use_sanitizer:
> -    config.available_features.add("msan")
> -else:
> -    config.available_features.add("not_msan")
> -if 'Undefined' in config.llvm_use_sanitizer:
> -    config.available_features.add("ubsan")
> -else:
> -    config.available_features.add("not_ubsan")
> -
> -# Check if we should run long running tests.
> -if lit_config.params.get("run_long_tests", None) == "true":
> -    config.available_features.add("long_tests")
> -
>  # Direct object generation
>  if not 'hexagon' in config.target_triple:
>      config.available_features.add("object-emission")
> 
> -if config.have_zlib:
> -    config.available_features.add("zlib")
> -else:
> -    config.available_features.add("nozlib")
> -
>  # LLVM can be configured with an empty default triple  # Some tests are
> "generic" and require a valid default triple  if config.target_triple:
>      config.available_features.add("default_triple")
> -    if re.match(r'^x86_64.*-linux', config.target_triple):
> -      config.available_features.add("x86_64-linux")
> -
> -# Native compilation: host arch == default triple arch -# FIXME: Consider
> cases that target can be executed -# even if host_triple were different from
> target_triple.
> -if config.host_triple == config.target_triple:
> -    config.available_features.add("native")
> 
>  import subprocess
> 
> @@ -416,19 +329,9 @@ def have_ld64_plugin_support():
>  if have_ld64_plugin_support():
>      config.available_features.add('ld64_plugin')
> 
> -# Ask llvm-config about assertion mode.
> -try:
> -    llvm_config_cmd = subprocess.Popen(
> -        [os.path.join(config.llvm_tools_dir, 'llvm-config'), '--assertion-
> mode'],
> -        stdout = subprocess.PIPE,
> -        env=config.environment)
> -except OSError:
> -    print("Could not find llvm-config in " + config.llvm_tools_dir)
> -    exit(42)
> -
> -if re.search(r'ON', llvm_config_cmd.stdout.read().decode('ascii')):
> -    config.available_features.add('asserts')
> -llvm_config_cmd.wait()
> +# Ask llvm-config about asserts and global-isel.
> +llvm_config.feature_config('--assertion-mode', 'asserts')
> +llvm_config.feature_config('--has-global-isel', 'global-isel')
> 
>  if 'darwin' == sys.platform:
>      try:
> @@ -441,56 +344,12 @@ if 'darwin' == sys.platform:
>          config.available_features.add('fma3')
>      sysctl_cmd.wait()
> 
> -if platform.system() in ['Windows']:
> -    if re.match(r'.*-win32$', config.target_triple):
> -        config.available_features.add('target-windows')
> -    # For tests that require Windows to run.
> -    config.available_features.add('system-windows')
> -
>  # .debug_frame is not emitted for targeting Windows x64.
>  if not re.match(r'^x86_64.*-(mingw32|windows-gnu|win32)',
> config.target_triple):
>      config.available_features.add('debug_frame')
> 
> -# Check if we should use gmalloc.
> -use_gmalloc_str = lit_config.params.get('use_gmalloc', None) -if
> use_gmalloc_str is not None:
> -    if use_gmalloc_str.lower() in ('1', 'true'):
> -        use_gmalloc = True
> -    elif use_gmalloc_str.lower() in ('', '0', 'false'):
> -        use_gmalloc = False
> -    else:
> -        lit_config.fatal('user parameter use_gmalloc should be 0 or 1')
> -else:
> -    # Default to not using gmalloc
> -    use_gmalloc = False
> -
> -# Allow use of an explicit path for gmalloc library.
> -# Will default to '/usr/lib/libgmalloc.dylib' if not set.
> -gmalloc_path_str = lit_config.params.get('gmalloc_path',
> -                                         '/usr/lib/libgmalloc.dylib')
> -
> -if use_gmalloc:
> -     config.environment.update({'DYLD_INSERT_LIBRARIES' : gmalloc_path_str})
> -
> -# Ask llvm-config about global-isel.
> -try:
> -    llvm_config_cmd = subprocess.Popen(
> -        [os.path.join(config.llvm_tools_dir, 'llvm-config'), '--has-global-
> isel'],
> -        stdout = subprocess.PIPE,
> -        env=config.environment)
> -except OSError:
> -    print("Could not find llvm-config in " + config.llvm_tools_dir)
> -    exit(42)
> -
> -if re.search(r'ON', llvm_config_cmd.stdout.read().decode('ascii')):
> -    config.available_features.add('global-isel')
> -llvm_config_cmd.wait()
> -
>  if config.have_libxar:
>      config.available_features.add('xar')
> 
> -if config.enable_abi_breaking_checks == "1":
> -    config.available_features.add('abi-breaking-checks')
> -
>  if config.llvm_libxml2_enabled == "1":
>      config.available_features.add('libxml2')
> 
> Modified: llvm/trunk/test/lit.site.cfg.in
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/lit.site.cfg.in?rev=313467&r1=313466&r2=313467&view=di
> ff
> ==============================================================================
> --- llvm/trunk/test/lit.site.cfg.in (original)
> +++ llvm/trunk/test/lit.site.cfg.in Sat Sep 16 11:46:21 2017
> @@ -52,5 +52,7 @@ except KeyError:
>      key, = e.args
>      lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" %
> (key,key))
> 
> + at LIT_SITE_CFG_IN_FOOTER@
> +
>  # Let the main config do the real work.
>  lit_config.load_config(config, "@LLVM_SOURCE_DIR@/test/lit.cfg")
> 
> Added: llvm/trunk/utils/lit/lit/llvm/__init__.py
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/utils/lit/lit/llvm/__init__.py?rev=313467&view=auto
> ==============================================================================
> --- llvm/trunk/utils/lit/lit/llvm/__init__.py (added)
> +++ llvm/trunk/utils/lit/lit/llvm/__init__.py Sat Sep 16 11:46:21 2017
> @@ -0,0 +1,9 @@
> +
> +from lit.llvm import config
> +
> +llvm_config = None
> +
> +def initialize(lit_config, test_config):
> +    global llvm_config
> +    llvm_config = config.LLVMConfig(lit_config, test_config)
> +
> 
> Added: llvm/trunk/utils/lit/lit/llvm/config.py
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/utils/lit/lit/llvm/config.py?rev=313467&view=auto
> ==============================================================================
> --- llvm/trunk/utils/lit/lit/llvm/config.py (added)
> +++ llvm/trunk/utils/lit/lit/llvm/config.py Sat Sep 16 11:46:21 2017
> @@ -0,0 +1,117 @@
> +import os
> +import re
> +import subprocess
> +import sys
> +
> +import lit.util
> +
> +# 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 an
> override.
> +litshenv = os.environ.get("LIT_USE_INTERNAL_SHELL")
> +litsh = lit.util.pythonize_bool(litshenv) if litshenv else
> +(sys.platform == 'win32')
> +
> +def binary_feature(on, feature, off_prefix):
> +    return feature if on else off_prefix + feature
> +
> +class LLVMConfig(object):
> +
> +    def __init__(self, lit_config, config):
> +        self.lit_config = lit_config
> +        self.config = config
> +
> +        features = config.available_features
> +
> +        # Tweak PATH for Win32 to decide to use bash.exe or not.
> +        if sys.platform == 'win32':
> +            # For tests that require Windows to run.
> +            features.add('system-windows')
> +
> +            # Seek sane tools in directories and set to $PATH.
> +            path = self.lit_config.getToolsPath(config.lit_tools_dir,
> +                                           config.environment['PATH'],
> +                                           ['cmp.exe', 'grep.exe',
> 'sed.exe'])
> +            self.with_environment('PATH', path, append_path=True)
> +
> +        self.use_lit_shell = litsh
> +        if not self.use_lit_shell:
> +            features.add('shell')
> +
> +        # Native compilation: host arch == default triple arch
> +        # FIXME: Consider cases that target can be executed
> +        # even if host_triple were different from target_triple.
> +        if config.host_triple == config.target_triple:
> +            features.add("native")
> +
> +        # Sanitizers.
> +        sanitizers = frozenset(x.lower() for x in getattr(config,
> 'llvm_use_sanitizer', []).split(';'))
> +        features.add(binary_feature('address' in sanitizers, 'asan', 'not_'))
> +        features.add(binary_feature('memory' in sanitizers, 'msan', 'not_'))
> +        features.add(binary_feature('undefined' in sanitizers, 'ubsan',
> + 'not_'))
> +
> +        have_zlib = getattr(config, 'have_zlib', None)
> +        features.add(binary_feature(have_zlib, 'zlib', 'no'))
> +
> +        # Check if we should run long running tests.
> +        long_tests = lit_config.params.get("run_long_tests", None)
> +        if lit.util.pythonize_bool(long_tests):
> +            features.add("long_tests")
> +
> +        target_triple = getattr(config, 'target_triple', None)
> +        if target_triple:
> +            if re.match(r'^x86_64.*-linux', target_triple):
> +                features.add("x86_64-linux")
> +            if re.match(r'.*-win32$', target_triple):
> +                features.add('target-windows')
> +
> +        use_gmalloc = lit_config.params.get('use_gmalloc', None)
> +        if lit.util.pythonize_bool(use_gmalloc):
> +            # Allow use of an explicit path for gmalloc library.
> +            # Will default to '/usr/lib/libgmalloc.dylib' if not set.
> +            gmalloc_path_str = lit_config.params.get('gmalloc_path',
> +
> '/usr/lib/libgmalloc.dylib')
> +            if gmalloc_path_str is not None:
> +                self.with_environment('DYLD_INSERT_LIBRARIES',
> + gmalloc_path_str)
> +
> +        breaking_checks = getattr(config, 'enable_abi_breaking_checks', None)
> +        if lit.util.pythonize_bool(breaking_checks):
> +            features.add('abi-breaking-checks')
> +
> +    def with_environment(self, variable, value, append_path = False):
> +        if append_path and variable in self.config.environment:
> +            def norm(x):
> +                return os.path.normcase(os.path.normpath(x))
> +
> +            # Move it to the front if it already exists, otherwise insert it
> at the
> +            # beginning.
> +            value = norm(value)
> +            current_value = self.config.environment[variable]
> +            items = [norm(x) for x in current_value.split(os.path.pathsep)]
> +            try:
> +                items.remove(value)
> +            except ValueError:
> +                pass
> +            value = os.path.pathsep.join([value] + items)
> +        self.config.environment[variable] = value
> +
> +
> +    def with_system_environment(self, variables, append_path = False):
> +        if lit.util.is_string(variables):
> +            variables = [variables]
> +        for v in variables:
> +            value = os.environ.get(v)
> +            if value:
> +                self.with_environment(v, value, append_path)
> +
> +    def feature_config(self, flag, feature):
> +        # Ask llvm-config about assertion mode.
> +        try:
> +            llvm_config_cmd = subprocess.Popen(
> +                [os.path.join(self.config.llvm_tools_dir, 'llvm-config'),
> flag],
> +                stdout = subprocess.PIPE,
> +                env=self.config.environment)
> +        except OSError:
> +            self.lit_config.fatal("Could not find llvm-config in " +
> + self.config.llvm_tools_dir)
> +
> +        output, _ = llvm_config_cmd.communicate()
> +        if re.search(r'ON', output.decode('ascii')):
> +            self.config.available_features.add(feature)
> 
> Modified: llvm/trunk/utils/lit/lit/util.py
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/utils/lit/lit/util.py?rev=313467&r1=313466&r2=313467&view=d
> iff
> ==============================================================================
> --- llvm/trunk/utils/lit/lit/util.py (original)
> +++ llvm/trunk/utils/lit/lit/util.py Sat Sep 16 11:46:21 2017
> @@ -1,6 +1,7 @@
>  import errno
>  import itertools
>  import math
> +import numbers
>  import os
>  import platform
>  import signal
> @@ -8,6 +9,28 @@ import subprocess
>  import sys
>  import threading
> 
> +def is_string(value):
> +    try:
> +        # Python 2 and Python 3 are different here.
> +        return isinstance(value, basestring)
> +    except NameError:
> +        return isinstance(value, str)
> +
> +def pythonize_bool(value):
> +    if value is None:
> +        return False
> +    if type(value) is bool:
> +        return value
> +    if isinstance(value, numbers.Number):
> +        return value != 0
> +    if is_string(value):
> +        if value.lower() in ('1', 'true', 'on', 'yes'):
> +            return True
> +        if value.lower() in ('', '0', 'false', 'off', 'no'):
> +            return False
> +    raise ValueError('"{}" is not a valid boolean'.format(value))
> +
> +
>  def to_bytes(s):
>      """Return the parameter as type 'bytes', possibly encoding it.
> 
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list