https://github.com/dzhidzhoev created https://github.com/llvm/llvm-project/pull/95986
1. This commit adds LLDB_PLATFORM_URL, LLDB_TEST_SYSROOT, LLDB_PLATFORM_WORKING_DIR cmake flags to pass arguments for cross-compilation and remote running of both Shell&API tests. 2. To run Shell tests remotely, It adds 'platform select' and 'platform connect' commands to %lldb substitution. 3. 'remote-linux' feature added to lit to disable tests failing with remote execution. 4. A separate working directory is assigned to each test to avoid conflicts during parallel test execution. It has been tested on Ubuntu AArch64 with libcxx enabled for tests. >From 817caef33c32200720006a21e4d27ad717085e1a Mon Sep 17 00:00:00 2001 From: Vladislav Dzhidzhoev <vdzhidzh...@accesssoftek.com> Date: Fri, 31 May 2024 21:39:56 +0000 Subject: [PATCH] [lldb][test] Support remote run of Shell tests 1. This commit adds LLDB_PLATFORM_URL, LLDB_TEST_SYSROOT, LLDB_PLATFORM_WORKING_DIR cmake flags to pass arguments for cross-compilation and remote running of both Shell&API tests. 2. To run Shell tests remotely, It adds 'platform select' and 'platform connect' commands to %lldb substitution. 3. 'remote-linux' feature added to lit to disable tests failing with remote execution. 4. A separate working directory is assigned to each test to avoid conflicts during parallel test execution. --- lldb/test/API/lit.cfg.py | 7 ++ lldb/test/API/lit.site.cfg.py.in | 3 + .../test/Shell/Settings/TestEchoCommands.test | 2 + lldb/test/Shell/Target/target-label.test | 20 +++--- lldb/test/Shell/helper/toolchain.py | 67 ++++++++++++++++++- lldb/test/Shell/lit.cfg.py | 6 +- lldb/test/Shell/lit.site.cfg.py.in | 6 +- 7 files changed, 96 insertions(+), 15 deletions(-) diff --git a/lldb/test/API/lit.cfg.py b/lldb/test/API/lit.cfg.py index 96520c7c82624..6a0a1b0a76675 100644 --- a/lldb/test/API/lit.cfg.py +++ b/lldb/test/API/lit.cfg.py @@ -303,6 +303,13 @@ def delete_module_cache(path): # In particular, (1) is visited at the top of the file, since the script # derives other information from it. +if is_configured("lldb_platform_url"): + dotest_cmd += ["--platform-url", config.lldb_platform_url] +if is_configured("lldb_platform_working_dir"): + dotest_cmd += ["--platform-working-dir", config.lldb_platform_working_dir] +if is_configured("cmake_sysroot"): + dotest_cmd += ["--sysroot", config.cmake_sysroot] + if is_configured("dotest_user_args_str"): dotest_cmd.extend(config.dotest_user_args_str.split(";")) diff --git a/lldb/test/API/lit.site.cfg.py.in b/lldb/test/API/lit.site.cfg.py.in index 8b2d09ae41cd2..ec388297e91eb 100644 --- a/lldb/test/API/lit.site.cfg.py.in +++ b/lldb/test/API/lit.site.cfg.py.in @@ -24,6 +24,9 @@ config.lua_executable = "@Lua_EXECUTABLE@" config.lua_test_entry = "TestLuaAPI.py" config.dotest_common_args_str = lit_config.substitute("@LLDB_TEST_COMMON_ARGS@") config.dotest_user_args_str = lit_config.substitute("@LLDB_TEST_USER_ARGS@") +config.lldb_platform_url = lit_config.substitute("@LLDB_PLATFORM_URL@") +config.lldb_platform_working_dir = lit_config.substitute("@LLDB_PLATFORM_WORKING_DIR@") +config.cmake_sysroot = lit_config.substitute("@LLDB_TEST_SYSROOT@" or "@DEFAULT_SYSROOT@") config.lldb_enable_python = @LLDB_ENABLE_PYTHON@ config.dotest_lit_args_str = None config.enabled_plugins = [] diff --git a/lldb/test/Shell/Settings/TestEchoCommands.test b/lldb/test/Shell/Settings/TestEchoCommands.test index 234b9742bfa2a..ce78f91e1cbd4 100644 --- a/lldb/test/Shell/Settings/TestEchoCommands.test +++ b/lldb/test/Shell/Settings/TestEchoCommands.test @@ -2,6 +2,8 @@ # RUN: %lldb -x -b -o 'settings set interpreter.echo-comment-commands false' -s %S/Inputs/EchoCommandsTest.in | FileCheck %S/Inputs/EchoCommandsNoComments.out # RUN: %lldb -x -b -o 'settings set interpreter.echo-commands false' -s %S/Inputs/EchoCommandsTest.in | FileCheck %S/Inputs/EchoCommandsNone.out +XFAIL: remote{{.*}} + RUN: echo start >%t.file RUN: %lldb -x -b --source-quietly -s %S/Inputs/EchoCommandsTest.in >>%t.file RUN: echo done >>%t.file diff --git a/lldb/test/Shell/Target/target-label.test b/lldb/test/Shell/Target/target-label.test index 5ac430601e29a..7f4f31e09fa16 100644 --- a/lldb/test/Shell/Target/target-label.test +++ b/lldb/test/Shell/Target/target-label.test @@ -4,16 +4,16 @@ target create -l "ls" /bin/ls target list -# CHECK: * target #0 (ls): /bin/ls +# CHECK: * target #0 (ls): [[LS_PATH:.*]] script lldb.target.SetLabel("") target list -# CHECK: * target #0: /bin/ls +# CHECK: * target #0: [[LS_PATH]] target create -l "cat" /bin/cat target list -# CHECK: target #0: /bin/ls -# CHECK-NEXT: * target #1 (cat): /bin/cat +# CHECK: target #0: [[LS_PATH]] +# CHECK-NEXT: * target #1 (cat): [[CAT_PATH:.*]] target create -l "cat" /bin/cat # CHECK: Cannot use label 'cat' since it's set in target #1. @@ -22,12 +22,12 @@ target create -l 42 /bin/cat # CHECK: error: Cannot use integer as target label. target select 0 -# CHECK: * target #0: /bin/ls -# CHECK-NEXT: target #1 (cat): /bin/cat +# CHECK: * target #0: [[LS_PATH]] +# CHECK-NEXT: target #1 (cat): [[CAT_PATH]] target select cat -# CHECK: target #0: /bin/ls -# CHECK-NEXT: * target #1 (cat): /bin/cat +# CHECK: target #0: [[LS_PATH]] +# CHECK-NEXT: * target #1 (cat): [[CAT_PATH]] script lldb.target.GetLabel() # CHECK: 'cat' @@ -36,5 +36,5 @@ script lldb.debugger.GetTargetAtIndex(0).SetLabel('Not cat') # CHECK: success target list -# CHECK: target #0 (Not cat): /bin/ls -# CHECK-NEXT: * target #1 (cat): /bin/cat +# CHECK: target #0 (Not cat): [[LS_PATH]] +# CHECK-NEXT: * target #1 (cat): [[CAT_PATH]] diff --git a/lldb/test/Shell/helper/toolchain.py b/lldb/test/Shell/helper/toolchain.py index 255955fc70d8c..32c37536ec8bd 100644 --- a/lldb/test/Shell/helper/toolchain.py +++ b/lldb/test/Shell/helper/toolchain.py @@ -1,10 +1,12 @@ import os import itertools import platform +import re import subprocess import sys import lit.util +from lit.formats import ShTest from lit.llvm import llvm_config from lit.llvm.subst import FindTool from lit.llvm.subst import ToolSubst @@ -22,6 +24,55 @@ def _disallow(config, execName): config.substitutions.append((" {0} ".format(execName), warning.format(execName))) +def get_lldb_args(config, suffix=None): + lldb_args = [] + if "remote-linux" in config.available_features: + lldb_args += [ + "-O", + '"platform select remote-linux"', + "-O", + f'"platform connect {config.lldb_platform_url}"', + ] + if config.lldb_platform_working_dir: + dir = f"{config.lldb_platform_working_dir}/shell" + if suffix: + dir += f"/{suffix}" + lldb_args += [ + "-O", + f'"platform shell mkdir -p {dir}"', + "-O", + f'"platform settings -w {dir}"', + ] + lldb_args += ["--no-lldbinit", "-S", _get_lldb_init_path(config)] + return lldb_args + + +class ShTestLldb(ShTest): + def __init__( + self, execute_external=False, extra_substitutions=[], preamble_commands=[] + ): + super().__init__(execute_external, extra_substitutions, preamble_commands) + + def execute(self, test, litConfig): + for i, t in enumerate(test.config.substitutions): + try: + if re.match(t[0], "%lldb"): + cmd = t[1] + if '-O "platform settings -w ' in cmd: + args_def = " ".join(get_lldb_args(test.config)) + args_unique = " ".join( + get_lldb_args(test.config, "/".join(test.path_in_suite)) + ) + test.config.substitutions[i] = ( + t[0], + cmd.replace(args_def, args_unique), + ) + break + except: + pass + return super().execute(test, litConfig) + + def use_lldb_substitutions(config): # Set up substitutions for primary tools. These tools must come from config.lldb_tools_dir # which is basically the build output directory. We do not want to find these in path or @@ -34,7 +85,9 @@ def use_lldb_substitutions(config): build_script = os.path.join(build_script, "build.py") build_script_args = [ build_script, - "--compiler=any", # Default to best compiler + ( + "--compiler=clang" if config.lldb_platform_url else "--compiler=any" + ), # Default to best compiler "--arch=" + str(config.lldb_bitness), ] if config.lldb_lit_tools_dir: @@ -56,7 +109,7 @@ def use_lldb_substitutions(config): ToolSubst( "%lldb", command=FindTool("lldb"), - extra_args=["--no-lldbinit", "-S", lldb_init], + extra_args=get_lldb_args(config), unresolved="fatal", ), ToolSubst( @@ -138,7 +191,7 @@ def use_support_substitutions(config): # Set up substitutions for support tools. These tools can be overridden at the CMake # level (by specifying -DLLDB_LIT_TOOLS_DIR), installed, or as a last resort, we can use # the just-built version. - host_flags = ["--target=" + config.host_triple] + host_flags = ["--target=" + config.target_triple] if platform.system() in ["Darwin"]: try: out = subprocess.check_output(["xcrun", "--show-sdk-path"]).strip() @@ -165,6 +218,14 @@ def use_support_substitutions(config): if config.cmake_sysroot: host_flags += ["--sysroot={}".format(config.cmake_sysroot)] + if config.lldb_platform_url and config.has_libcxx: + host_flags += [ + "-L{}".format(config.libcxx_libs_dir), + "-Wl,-rpath,{}".format(config.libcxx_libs_dir), + "-lc++", + "-lc++abi", + ] + host_flags = " ".join(host_flags) config.substitutions.append(("%clang_host", "%clang " + host_flags)) config.substitutions.append(("%clangxx_host", "%clangxx " + host_flags)) diff --git a/lldb/test/Shell/lit.cfg.py b/lldb/test/Shell/lit.cfg.py index e24f3fbb4d931..7f832eb3bff4c 100644 --- a/lldb/test/Shell/lit.cfg.py +++ b/lldb/test/Shell/lit.cfg.py @@ -21,7 +21,7 @@ config.name = "lldb-shell" # testFormat: The test format to use to interpret tests. -config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) +config.test_format = toolchain.ShTestLldb(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. @@ -68,6 +68,10 @@ lit_config.note("Running Shell tests in {} mode.".format(lldb_repro_mode)) toolchain.use_lldb_repro_substitutions(config, lldb_repro_mode) +if config.lldb_platform_url: + if re.match(r".*-linux.*", config.target_triple): + config.available_features.add("remote-linux") + llvm_config.use_default_substitutions() toolchain.use_lldb_substitutions(config) toolchain.use_support_substitutions(config) diff --git a/lldb/test/Shell/lit.site.cfg.py.in b/lldb/test/Shell/lit.site.cfg.py.in index b69e7bce1bc0b..dde705f1918cb 100644 --- a/lldb/test/Shell/lit.site.cfg.py.in +++ b/lldb/test/Shell/lit.site.cfg.py.in @@ -10,10 +10,14 @@ config.lldb_src_root = "@LLDB_SOURCE_DIR@" config.lldb_obj_root = "@LLDB_BINARY_DIR@" config.lldb_libs_dir = lit_config.substitute("@LLDB_LIBS_DIR@") config.lldb_tools_dir = lit_config.substitute("@LLDB_TOOLS_DIR@") +config.lldb_platform_url = lit_config.substitute("@LLDB_PLATFORM_URL@") +config.lldb_platform_working_dir = lit_config.substitute("@LLDB_PLATFORM_WORKING_DIR@") # Since it comes from the command line, it may have backslashes which # should not need to be escaped. config.lldb_lit_tools_dir = lit_config.substitute(r"@LLDB_LIT_TOOLS_DIR@") -config.cmake_sysroot = lit_config.substitute("@CMAKE_SYSROOT@") +config.cmake_sysroot = lit_config.substitute("@LLDB_TEST_SYSROOT@" or "@DEFAULT_SYSROOT@") +config.has_libcxx = @LLDB_HAS_LIBCXX@ +config.libcxx_libs_dir = "@LIBCXX_LIBRARY_DIR@" config.target_triple = "@LLVM_TARGET_TRIPLE@" config.python_executable = "@Python3_EXECUTABLE@" config.have_zlib = @LLVM_ENABLE_ZLIB@ _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits