diff --git a/lldb/test/API/lit.cfg.py b/lldb/test/API/lit.cfg.py --- a/lldb/test/API/lit.cfg.py +++ b/lldb/test/API/lit.cfg.py @@ -23,14 +23,14 @@ def mkdir_p(path): - import errno - try: - os.makedirs(path) - except OSError as e: - if e.errno != errno.EEXIST: - raise - if not os.path.isdir(path): - raise OSError(errno.ENOTDIR, "%s is not a directory"%path) + import errno + try: + os.makedirs(path) + except OSError as e: + if e.errno != errno.EEXIST: + raise + if not os.path.isdir(path): + raise OSError(errno.ENOTDIR, "%s is not a directory"%path) def find_sanitizer_runtime(name): @@ -85,22 +85,39 @@ return copied_python -if 'Address' in config.llvm_use_sanitizer: - config.environment['ASAN_OPTIONS'] = 'detect_stack_use_after_return=1' - if 'Darwin' in config.host_os and 'x86' in config.host_triple: - config.environment['DYLD_INSERT_LIBRARIES'] = find_sanitizer_runtime( - 'libclang_rt.asan_osx_dynamic.dylib') +def is_configured(attr): + """Return the configuration attribute if it exists and None otherwise. + + This allows us to check if the attribute exists before trying to access it.""" + return getattr(config, attr, None) + + +def delete_module_cache(path): + """Clean the module caches in the test build directory. + + This is necessary in an incremental build whenever clang changes underneath, + so doing it once per lit.py invocation is close enough. """ + if os.path.isdir(path): + print("Deleting module cache at %s." % path) + shutil.rmtree(path) -if 'Thread' in config.llvm_use_sanitizer: - if 'Darwin' in config.host_os and 'x86' in config.host_triple: - config.environment['DYLD_INSERT_LIBRARIES'] = find_sanitizer_runtime( - 'libclang_rt.tsan_osx_dynamic.dylib') +if is_configured('llvm_use_sanitizer'): + if 'Address' in config.llvm_use_sanitizer: + config.environment['ASAN_OPTIONS'] = 'detect_stack_use_after_return=1' + if 'Darwin' in config.host_os and 'x86' in config.host_triple: + config.environment['DYLD_INSERT_LIBRARIES'] = find_sanitizer_runtime( + 'libclang_rt.asan_osx_dynamic.dylib') + + if 'Thread' in config.llvm_use_sanitizer: + if 'Darwin' in config.host_os and 'x86' in config.host_triple: + config.environment['DYLD_INSERT_LIBRARIES'] = find_sanitizer_runtime( + 'libclang_rt.tsan_osx_dynamic.dylib') if 'DYLD_INSERT_LIBRARIES' in config.environment and platform.system() == 'Darwin': config.python_executable = find_python_interpreter() # Shared library build of LLVM may require LD_LIBRARY_PATH or equivalent. -if config.shared_libs: +if is_configured('shared_libs'): for shlibpath_var in find_shlibpath_var(): # In stand-alone build llvm_shlib_dir specifies LLDB's lib directory while # llvm_libs_dir specifies LLVM's lib directory. @@ -129,14 +146,6 @@ elif lldb_repro_mode == 'replay': config.available_features.add('lldb-repro-replay') -# Clean the module caches in the test build directory. This is necessary in an -# incremental build whenever clang changes underneath, so doing it once per -# lit.py invocation is close enough. -for cachedir in [config.clang_module_cache, config.lldb_module_cache]: - if os.path.isdir(cachedir): - print("Deleting module cache at %s." % cachedir) - shutil.rmtree(cachedir) - # Set a default per-test timeout of 10 minutes. Setting a timeout per test # requires that killProcessAndChildren() is supported on the platform and # lit complains if the value is set but it is not supported. @@ -148,11 +157,12 @@ # Build dotest command. dotest_cmd = [os.path.join(config.lldb_src_root, 'test', 'API', 'dotest.py')] -dotest_cmd += ['--arch', config.test_arch] -dotest_cmd.extend(config.dotest_args_str.split(';')) + +if is_configured('dotest_args_str'): + dotest_cmd.extend(config.dotest_args_str.split(';')) # Library path may be needed to locate just-built clang. -if config.llvm_libs_dir: +if is_configured('llvm_libs_dir'): dotest_cmd += ['--env', 'LLVM_LIBS_DIR=' + config.llvm_libs_dir] # Forward ASan-specific environment variables to tests, as a test may load an @@ -161,49 +171,53 @@ if env_var in config.environment: dotest_cmd += ['--inferior-env', env_var + '=' + config.environment[env_var]] -if config.lldb_build_directory: +if is_configured('test_arch'): + dotest_cmd += ['--arch', config.test_arch] + +if is_configured('lldb_build_directory'): dotest_cmd += ['--build-dir', config.lldb_build_directory] -if config.lldb_module_cache: +if is_configured('lldb_module_cache'): + delete_module_cache(config.lldb_module_cache) dotest_cmd += ['--lldb-module-cache-dir', config.lldb_module_cache] -if config.clang_module_cache: +if is_configured('clang_module_cache'): + delete_module_cache(config.clang_module_cache) dotest_cmd += ['--clang-module-cache-dir', config.clang_module_cache] -if config.lldb_executable: +if is_configured('lldb_executable'): dotest_cmd += ['--executable', config.lldb_executable] -if config.test_compiler: +if is_configured('test_compiler'): dotest_cmd += ['--compiler', config.test_compiler] -if config.dsymutil: +if is_configured('dsymutil'): dotest_cmd += ['--dsymutil', config.dsymutil] -if config.filecheck: +if is_configured('filecheck'): dotest_cmd += ['--filecheck', config.filecheck] -if config.yaml2obj: +if is_configured('yaml2obj'): dotest_cmd += ['--yaml2obj', config.yaml2obj] -if config.lldb_libs_dir: +if is_configured('lldb_libs_dir'): dotest_cmd += ['--lldb-libs-dir', config.lldb_libs_dir] if 'lldb-repro-capture' in config.available_features or \ 'lldb-repro-replay' in config.available_features: dotest_cmd += ['--skip-category=lldb-vscode', '--skip-category=std-module'] -if config.enabled_plugins: +if is_configured('enabled_plugins'): for plugin in config.enabled_plugins: dotest_cmd += ['--enable-plugin', plugin] -# We don't want to force users passing arguments to lit to use `;` as a -# separator. We use Python's simple lexical analyzer to turn the args into a -# list. Pass there arguments last so they can override anything that was -# already configured. -if config.dotest_lit_args_str: +if is_configured('dotest_lit_args_str'): + # We don't want to force users passing arguments to lit to use `;` as a + # separator. We use Python's simple lexical analyzer to turn the args into a + # list. Pass there arguments last so they can override anything that was + # already configured. dotest_cmd.extend(shlex.split(config.dotest_lit_args_str)) - # Load LLDB test format. sys.path.append(os.path.join(config.lldb_src_root, "test", "API")) import lldbtest diff --git a/lldb/test/API/lldbtest.py b/lldb/test/API/lldbtest.py --- a/lldb/test/API/lldbtest.py +++ b/lldb/test/API/lldbtest.py @@ -38,7 +38,7 @@ if litConfig.noExecute: return lit.Test.PASS, '' - if not test.config.lldb_enable_python: + if not getattr(test.config, 'lldb_enable_python', False): return (lit.Test.UNSUPPORTED, 'Python module disabled') if test.config.unsupported: