Index: lldb/CMakeLists.txt =================================================================== --- lldb/CMakeLists.txt +++ lldb/CMakeLists.txt @@ -71,6 +71,7 @@ option(LLDB_INCLUDE_TESTS "Generate build targets for the LLDB unit tests." ${LLVM_INCLUDE_TESTS}) if(LLDB_INCLUDE_TESTS) + set(LLDB_TEST_BUILD_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lldb-test-build.noindex" CACHE PATH "The build root for building tests.") # Set the path to the default lldb test executable. set(LLDB_DEFAULT_TEST_EXECUTABLE "${LLVM_RUNTIME_OUTPUT_INTDIR}/lldb${CMAKE_EXECUTABLE_SUFFIX}") Index: lldb/lit/CMakeLists.txt =================================================================== --- lldb/lit/CMakeLists.txt +++ lldb/lit/CMakeLists.txt @@ -15,6 +15,9 @@ get_property(LLDB_DOTEST_ARGS GLOBAL PROPERTY LLDB_DOTEST_ARGS_PROPERTY) set(dotest_args_replacement ${LLVM_BUILD_MODE}) +set(LLDB_TEST_MODULE_CACHE_LLDB "${LLDB_TEST_BUILD_DIRECTORY}/module-cache-lldb" CACHE PATH "The module cache used by lldb for running tests.") +set(LLDB_TEST_MODULE_CACHE_CLANG "${LLDB_TEST_BUILD_DIRECTORY}/module-cache-clang" CACHE PATH "The module cache used by clang to build inferiors.") + if(LLDB_BUILT_STANDALONE) # In paths to our build-tree, replace CMAKE_CFG_INTDIR with our configuration name placeholder. string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} config_runtime_output_dir ${LLVM_RUNTIME_OUTPUT_INTDIR}) Index: lldb/lit/Settings/TestModuleCacheSanity.test =================================================================== --- /dev/null +++ lldb/lit/Settings/TestModuleCacheSanity.test @@ -0,0 +1,4 @@ +# This is a sanity check that verifies that the module cache path is set +# correctly and points to the default test build directory. +RUN: %lldb -o 'settings show symbols.clang-modules-cache-path' | FileCheck %s +CHECK: lldb-test-build.noindex Index: lldb/lit/Suite/lit.cfg =================================================================== --- lldb/lit/Suite/lit.cfg +++ lldb/lit/Suite/lit.cfg @@ -69,6 +69,12 @@ if config.llvm_libs_dir: dotest_cmd += ['--env', 'LLVM_LIBS_DIR=' + config.llvm_libs_dir] +if config.lldb_build_directory: + dotest_cmd += ['--build-dir', config.lldb_build_directory] + +if config.lldb_module_cache: + dotest_cmd += ['--lldb-module-cache', config.lldb_module_cache] + # Load LLDB test format. sys.path.append(os.path.join(config.lldb_src_root, "lit", "Suite")) import lldbtest Index: lldb/lit/helper/toolchain.py =================================================================== --- lldb/lit/helper/toolchain.py +++ lldb/lit/helper/toolchain.py @@ -104,6 +104,9 @@ flags += ['-L' + config.llvm_libs_dir, '-Wl,-rpath,' + config.llvm_libs_dir] + # The clang module cache is used for building inferiors. + flags = ['-module-cache-path', config.clang_module_cache] + additional_tool_dirs=[] if config.lldb_lit_tools_dir: additional_tool_dirs.append(config.lldb_lit_tools_dir) Index: lldb/lit/lit-lldb-init.in =================================================================== --- lldb/lit/lit-lldb-init.in +++ lldb/lit/lit-lldb-init.in @@ -2,3 +2,4 @@ settings set symbols.enable-external-lookup false settings set plugin.process.gdb-remote.packet-timeout 60 settings set interpreter.echo-comment-commands false +settings set symbols.clang-modules-cache-path "@LLDB_TEST_MODULE_CACHE_LLDB@" Index: lldb/lit/lit.cfg.py =================================================================== --- lldb/lit/lit.cfg.py +++ lldb/lit/lit.cfg.py @@ -64,13 +64,10 @@ ('--targets-built', calculate_arch_features) ]) -# 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 i in ['module-cache-clang', 'module-cache-lldb']: - cachedir = os.path.join(config.lldb_libs_dir, '..', - 'lldb-test-build.noindex', i) +# 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) Index: lldb/lit/lit.site.cfg.py.in =================================================================== --- lldb/lit/lit.site.cfg.py.in +++ lldb/lit/lit.site.cfg.py.in @@ -18,6 +18,9 @@ config.host_triple = "@LLVM_HOST_TRIPLE@" config.lldb_bitness = 64 if @LLDB_IS_64_BITS@ else 32 config.lldb_disable_python = @LLDB_DISABLE_PYTHON@ +config.lldb_build_directory = "@LLDB_TEST_BUILD_DIRECTORY@" +config.lldb_module_cache = "@LLDB_TEST_MODULE_CACHE_LLDB@" +config.clang_module_cache = "@LLDB_TEST_MODULE_CACHE_CLANG@" # Support substitution of the tools and libs dirs with user parameters. This is # used when we can't determine the tool dir at configuration time. Index: lldb/packages/Python/lldbsuite/test/configuration.py =================================================================== --- lldb/packages/Python/lldbsuite/test/configuration.py +++ lldb/packages/Python/lldbsuite/test/configuration.py @@ -106,6 +106,9 @@ # The base directory in which the tests are being built. test_build_dir = None +# The clang module cache directory used by lldb. +module_cache_dir = None + # The only directory to scan for tests. If multiple test directories are # specified, and an exclusive test subdirectory is specified, the latter option # takes precedence. Index: lldb/packages/Python/lldbsuite/test/dotest.py =================================================================== --- lldb/packages/Python/lldbsuite/test/dotest.py +++ lldb/packages/Python/lldbsuite/test/dotest.py @@ -55,7 +55,7 @@ def is_exe(fpath): """Returns true if fpath is an executable.""" if fpath == None: - return False + return False return os.path.isfile(fpath) and os.access(fpath, os.X_OK) @@ -274,10 +274,10 @@ break if args.dsymutil: - os.environ['DSYMUTIL'] = args.dsymutil + os.environ['DSYMUTIL'] = args.dsymutil elif platform_system == 'Darwin': - os.environ['DSYMUTIL'] = seven.get_command_output( - 'xcrun -find -toolchain default dsymutil') + os.environ['DSYMUTIL'] = seven.get_command_output( + 'xcrun -find -toolchain default dsymutil') if args.filecheck: # The lldb-dotest script produced by the CMake build passes in a path @@ -426,6 +426,11 @@ configuration.lldb_platform_working_dir = args.lldb_platform_working_dir if args.test_build_dir: configuration.test_build_dir = args.test_build_dir + if args.module_cache_dir: + configuration.module_cache_dir = args.module_cache_dir + else: + configuration.module_cache_dir = os.path.join(configuration.test_build_dir, + 'module-cache-lldb') # Gather all the dirs passed on the command line. if len(args.args) > 0: @@ -869,16 +874,16 @@ platform = lldbplatformutil.getPlatform() if platform == "netbsd": - if os.geteuid() == 0: - return True, "root can always write dbregs" - try: - output = subprocess.check_output(["/sbin/sysctl", "-n", - "security.models.extensions.user_set_dbregs"]).decode().strip() - if output == "1": - return True, "security.models.extensions.user_set_dbregs enabled" - except subprocess.CalledProcessError: - pass - return False, "security.models.extensions.user_set_dbregs disabled" + if os.geteuid() == 0: + return True, "root can always write dbregs" + try: + output = subprocess.check_output(["/sbin/sysctl", "-n", + "security.models.extensions.user_set_dbregs"]).decode().strip() + if output == "1": + return True, "security.models.extensions.user_set_dbregs enabled" + except subprocess.CalledProcessError: + pass + return False, "security.models.extensions.user_set_dbregs disabled" return True, "watchpoint support available" def checkWatchpointSupport(): Index: lldb/packages/Python/lldbsuite/test/dotest_args.py =================================================================== --- lldb/packages/Python/lldbsuite/test/dotest_args.py +++ lldb/packages/Python/lldbsuite/test/dotest_args.py @@ -147,6 +147,11 @@ metavar='Test build directory', default='lldb-test-build.noindex', help='The root build directory for the tests. It will be removed before running.') + group.add_argument( + '--module-cache-dir', + dest='module_cache_dir', + metavar='The clang module cache directory used by LLDB', + help='The clang module cache directory used by LLDB. This is not the one used by the makefiles. Defaults to /module-cache-lldb.') # Configuration options group = parser.add_argument_group('Remote platform options') Index: lldb/packages/Python/lldbsuite/test/lldbtest.py =================================================================== --- lldb/packages/Python/lldbsuite/test/lldbtest.py +++ lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -1852,9 +1852,9 @@ Base.setUp(self) # Set the clang modules cache path used by LLDB. - mod_cache = os.path.join(os.environ["LLDB_BUILD"], "module-cache-lldb") - self.runCmd('settings set symbols.clang-modules-cache-path "%s"' - % mod_cache) + self.runCmd( + 'settings set symbols.clang-modules-cache-path "{}"'.format( + configuration.module_cache_dir)) for s in self.setUpCommands(): self.runCmd(s) @@ -2058,13 +2058,13 @@ if check: output = "" if self.res.GetOutput(): - output += "\nCommand output:\n" + self.res.GetOutput() + output += "\nCommand output:\n" + self.res.GetOutput() if self.res.GetError(): - output += "\nError output:\n" + self.res.GetError() + output += "\nError output:\n" + self.res.GetError() if msg: - msg += output + msg += output if cmd: - cmd += output + cmd += output self.assertTrue(self.res.Succeeded(), msg if (msg) else CMD_MSG(cmd)) Index: lldb/packages/Python/lldbsuite/test/sanity/TestModuleCacheSanity.py =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/sanity/TestModuleCacheSanity.py @@ -0,0 +1,25 @@ +""" +This is a sanity check that verifies that the module cache path is set +correctly and points to the default test build directory. +""" + +from __future__ import print_function + +import lldb +import lldbsuite.test.lldbutil as lldbutil +from lldbsuite.test.lldbtest import * + + +class ModuleCacheSanityTestCase(TestBase): + + mydir = TestBase.compute_mydir(__file__) + + # If your test case doesn't stress debug info, the + # set this to true. That way it won't be run once for + # each debug info format. + NO_DEBUG_INFO_TESTCASE = True + + def test(self): + self.expect( + 'settings show symbols.clang-modules-cache-path', + substrs=['lldb-test-build.noindex']) Index: lldb/test/CMakeLists.txt =================================================================== --- lldb/test/CMakeLists.txt +++ lldb/test/CMakeLists.txt @@ -39,8 +39,6 @@ --arch=${LLDB_TEST_ARCH} -s ${CMAKE_BINARY_DIR}/lldb-test-traces - --build-dir - ${CMAKE_BINARY_DIR}/lldb-test-build.noindex -S nm -u CXXFLAGS -u CFLAGS Index: lldb/utils/lldb-dotest/lldb-dotest.in =================================================================== --- lldb/utils/lldb-dotest/lldb-dotest.in +++ lldb/utils/lldb-dotest/lldb-dotest.in @@ -3,6 +3,7 @@ import sys dotest_path = '@LLDB_SOURCE_DIR@/test/dotest.py' +build_dir = '@LLDB_TEST_BUILD_DIRECTORY@' dotest_args_str = '@LLDB_DOTEST_ARGS@' if __name__ == '__main__': @@ -11,6 +12,7 @@ # Build dotest.py command. cmd = [sys.executable, dotest_path] cmd.extend(dotest_args) + cmd.extend(['--build-dir', build_dir]) cmd.extend(wrapper_args) # Invoke dotest.py and return exit code. print(' '.join(cmd))