Reapply "[lldb/test] Automatically find debug servers to test"

This reapplies 7df4eaaa93/D96202, which was reverted due to issues on
windows. These were caused by problems in the computation of the liblldb
directory, which was fixed by D96779.

The original commit message was:
Our test configuration logic assumes that the tests can be run either
with debugserver or with lldb-server. This is not entirely correct,
since lldb server has two "personalities" (platform server and debug
server) and debugserver is only a replacement for the latter.

A consequence of this is that it's not possible to test the platform
behavior of lldb-server on macos, as it is not possible to get a hold of
the lldb-server binary.

One solution to that would be to duplicate the server configuration
logic to be able to specify both executables. However, that seems
excessively redundant.

A well-behaved lldb should be able to find the debug server on its own,
and testing lldb with a different (lldb-|debug)server does not seem very
useful (even in the out-of-tree debugserver setup, we copy the server
into the build tree to make it appear "real").

Therefore, this patch deletes the configuration altogether and changes
the low-level server retrieval functions to be able to both lldb-server
and debugserver paths. They do this by consulting the "support
executable" directory of the lldb under test.

Differential Revision: https://reviews.llvm.org/D96202
This commit is contained in:
Pavel Labath 2021-02-04 20:53:15 +01:00
parent 1a6c1ac686
commit 3ca7b2d03c
8 changed files with 10 additions and 86 deletions

View File

@ -366,12 +366,6 @@ def parseOptionsAndInitTestdirs():
args.executable) args.executable)
sys.exit(-1) sys.exit(-1)
if args.server and args.out_of_tree_debugserver:
logging.warning('Both --server and --out-of-tree-debugserver are set')
if args.server and not args.out_of_tree_debugserver:
os.environ['LLDB_DEBUGSERVER_PATH'] = args.server
if args.excluded: if args.excluded:
for excl_file in args.excluded: for excl_file in args.excluded:
parseExclusion(excl_file) parseExclusion(excl_file)

View File

@ -100,10 +100,6 @@ def create_parser():
'--executable', '--executable',
metavar='executable-path', metavar='executable-path',
help='The path to the lldb executable') help='The path to the lldb executable')
group.add_argument(
'--server',
metavar='server-path',
help='The path to the debug server executable to use')
group.add_argument( group.add_argument(
'--out-of-tree-debugserver', '--out-of-tree-debugserver',
dest='out_of_tree_debugserver', dest='out_of_tree_debugserver',

View File

@ -15,54 +15,12 @@ from lldbsuite.support import seven
from lldbsuite.test.lldbtest import * from lldbsuite.test.lldbtest import *
from lldbsuite.test import configuration from lldbsuite.test import configuration
from textwrap import dedent from textwrap import dedent
import shutil
def _get_debug_monitor_from_lldb(lldb_exe, debug_monitor_basename): def _get_support_exe(basename):
"""Return the debug monitor exe path given the lldb exe path. support_dir = lldb.SBHostOS.GetLLDBPath(lldb.ePathTypeSupportExecutableDir)
This method attempts to construct a valid debug monitor exe name return shutil.which(basename, path=support_dir.GetDirectory())
from a given lldb exe name. It will return None if the synthesized
debug monitor name is not found to exist.
The debug monitor exe path is synthesized by taking the directory
of the lldb exe, and replacing the portion of the base name that
matches "lldb" (case insensitive) and replacing with the value of
debug_monitor_basename.
Args:
lldb_exe: the path to an lldb executable.
debug_monitor_basename: the base name portion of the debug monitor
that will replace 'lldb'.
Returns:
A path to the debug monitor exe if it is found to exist; otherwise,
returns None.
"""
if not lldb_exe:
return None
exe_dir = os.path.dirname(lldb_exe)
exe_base = os.path.basename(lldb_exe)
# we'll rebuild the filename by replacing lldb with
# the debug monitor basename, keeping any prefix or suffix in place.
regex = re.compile(r"lldb", re.IGNORECASE)
new_base = regex.sub(debug_monitor_basename, exe_base)
debug_monitor_exe = os.path.join(exe_dir, new_base)
if os.path.exists(debug_monitor_exe):
return debug_monitor_exe
new_base = regex.sub(
'LLDB.framework/Versions/A/Resources/' +
debug_monitor_basename,
exe_base)
debug_monitor_exe = os.path.join(exe_dir, new_base)
if os.path.exists(debug_monitor_exe):
return debug_monitor_exe
return None
def get_lldb_server_exe(): def get_lldb_server_exe():
@ -72,11 +30,8 @@ def get_lldb_server_exe():
A path to the lldb-server exe if it is found to exist; otherwise, A path to the lldb-server exe if it is found to exist; otherwise,
returns None. returns None.
""" """
if "LLDB_DEBUGSERVER_PATH" in os.environ:
return os.environ["LLDB_DEBUGSERVER_PATH"]
return _get_debug_monitor_from_lldb( return _get_support_exe("lldb-server")
lldbtest_config.lldbExec, "lldb-server")
def get_debugserver_exe(): def get_debugserver_exe():
@ -86,15 +41,11 @@ def get_debugserver_exe():
A path to the debugserver exe if it is found to exist; otherwise, A path to the debugserver exe if it is found to exist; otherwise,
returns None. returns None.
""" """
if "LLDB_DEBUGSERVER_PATH" in os.environ:
return os.environ["LLDB_DEBUGSERVER_PATH"]
if configuration.arch and configuration.arch == "x86_64" and \ if configuration.arch and configuration.arch == "x86_64" and \
platform.machine().startswith("arm64"): platform.machine().startswith("arm64"):
return '/Library/Apple/usr/libexec/oah/debugserver' return '/Library/Apple/usr/libexec/oah/debugserver'
return _get_debug_monitor_from_lldb( return _get_support_exe("debugserver")
lldbtest_config.lldbExec, "debugserver")
_LOG_LINE_REGEX = re.compile(r'^(lldb-server|debugserver)\s+<\s*(\d+)>' + _LOG_LINE_REGEX = re.compile(r'^(lldb-server|debugserver)\s+<\s*(\d+)>' +
'\s+(read|send)\s+packet:\s+(.+)$') '\s+(read|send)\s+packet:\s+(.+)$')

View File

@ -108,18 +108,8 @@ if(CMAKE_HOST_APPLE)
message(STATUS "LLDB tests use out-of-tree debugserver: ${system_debugserver_path}") message(STATUS "LLDB tests use out-of-tree debugserver: ${system_debugserver_path}")
list(APPEND LLDB_TEST_COMMON_ARGS --out-of-tree-debugserver) list(APPEND LLDB_TEST_COMMON_ARGS --out-of-tree-debugserver)
add_lldb_test_dependency(debugserver) add_lldb_test_dependency(debugserver)
elseif(TARGET debugserver)
set(debugserver_path ${LLVM_RUNTIME_OUTPUT_INTDIR}/debugserver)
message(STATUS "LLDB Tests use just-built debugserver: ${debugserver_path}")
set(LLDB_TEST_SERVER ${debugserver_path})
add_lldb_test_dependency(debugserver)
elseif(TARGET lldb-server)
set(lldb_server_path ${LLVM_RUNTIME_OUTPUT_INTDIR}/lldb-server)
message(STATUS "LLDB Tests use just-built lldb-server: ${lldb_server_path}")
set(LLDB_TEST_SERVER ${lldb_server_path})
add_lldb_test_dependency(lldb-server)
else() else()
message(WARNING "LLDB Tests enabled, but no server available") message(STATUS "LLDB Tests use just-built debug server")
endif() endif()
endif() endif()
@ -136,7 +126,6 @@ if(LLDB_BUILT_STANDALONE)
string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_EXECUTABLE "${LLDB_TEST_EXECUTABLE}") string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_EXECUTABLE "${LLDB_TEST_EXECUTABLE}")
string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_COMPILER "${LLDB_TEST_COMPILER}") string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_COMPILER "${LLDB_TEST_COMPILER}")
string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_DSYMUTIL "${LLDB_TEST_DSYMUTIL}") string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_DSYMUTIL "${LLDB_TEST_DSYMUTIL}")
string(REPLACE ${LLVM_RUNTIME_OUTPUT_INTDIR} ${config_runtime_output_dir} LLDB_TEST_SERVER "${LLDB_TEST_SERVER}")
# Remaining ones must be paths to the provided LLVM build-tree. # Remaining ones must be paths to the provided LLVM build-tree.
if(LLVM_CONFIGURATION_TYPES) if(LLVM_CONFIGURATION_TYPES)
@ -163,7 +152,6 @@ string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_BUILD_DI
string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_EXECUTABLE "${LLDB_TEST_EXECUTABLE}") string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_EXECUTABLE "${LLDB_TEST_EXECUTABLE}")
string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_COMPILER "${LLDB_TEST_COMPILER}") string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_COMPILER "${LLDB_TEST_COMPILER}")
string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_DSYMUTIL "${LLDB_TEST_DSYMUTIL}") string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_DSYMUTIL "${LLDB_TEST_DSYMUTIL}")
string(REPLACE ${CMAKE_CFG_INTDIR} ${dotest_args_replacement} LLDB_TEST_SERVER "${LLDB_TEST_SERVER}")
# Configure the API test suite. # Configure the API test suite.
configure_lit_site_cfg( configure_lit_site_cfg(

View File

@ -3,6 +3,7 @@ import lldb
from lldbsuite.test.decorators import * from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import * from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil from lldbsuite.test import lldbutil
from lldbgdbserverutils import get_debugserver_exe
import os import os
import platform import platform
@ -28,7 +29,7 @@ class PlatformSDKTestCase(TestBase):
TIMEOUT = 2 TIMEOUT = 2
def no_debugserver(self): def no_debugserver(self):
if os.getenv('LLDB_DEBUGSERVER_PATH') is None: if get_debugserver_exe() is None:
return 'no debugserver' return 'no debugserver'
return None return None
@ -88,7 +89,7 @@ class PlatformSDKTestCase(TestBase):
shutil.move(exe, exe_sdk_path) shutil.move(exe, exe_sdk_path)
# Attach to it with debugserver. # Attach to it with debugserver.
debugserver = os.getenv('LLDB_DEBUGSERVER_PATH') debugserver = get_debugserver_exe()
debugserver_args = [ debugserver_args = [
'localhost:{}'.format(self.PORT), '--attach={}'.format(pid) 'localhost:{}'.format(self.PORT), '--attach={}'.format(pid)
] ]

View File

@ -29,7 +29,6 @@ config.lldb_executable = '@LLDB_TEST_EXECUTABLE@'
config.test_arch = '@LLDB_TEST_ARCH@' config.test_arch = '@LLDB_TEST_ARCH@'
config.test_compiler = '@LLDB_TEST_COMPILER@' config.test_compiler = '@LLDB_TEST_COMPILER@'
config.dsymutil = '@LLDB_TEST_DSYMUTIL@' config.dsymutil = '@LLDB_TEST_DSYMUTIL@'
config.server = '@LLDB_TEST_SERVER@'
# The API tests use their own module caches. # The API tests use their own module caches.
config.lldb_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_LLDB@", "lldb-api") config.lldb_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_LLDB@", "lldb-api")
config.clang_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_CLANG@", "lldb-api") config.clang_module_cache = os.path.join("@LLDB_TEST_MODULE_CACHE_CLANG@", "lldb-api")
@ -56,7 +55,6 @@ try:
config.lldb_libs_dir = config.lldb_libs_dir % lit_config.params config.lldb_libs_dir = config.lldb_libs_dir % lit_config.params
config.test_compiler = config.test_compiler % lit_config.params config.test_compiler = config.test_compiler % lit_config.params
config.dsymutil = config.dsymutil % lit_config.params config.dsymutil = config.dsymutil % lit_config.params
config.server = config.server % lit_config.params
config.lldb_framework_dir = config.lldb_framework_dir % lit_config.params config.lldb_framework_dir = config.lldb_framework_dir % lit_config.params
config.dotest_args_str = config.dotest_args_str % lit_config.params config.dotest_args_str = config.dotest_args_str % lit_config.params
except KeyError as e: except KeyError as e:

View File

@ -19,7 +19,6 @@ set(vars
LLDB_TEST_EXECUTABLE LLDB_TEST_EXECUTABLE
LLDB_TEST_COMPILER LLDB_TEST_COMPILER
LLDB_TEST_DSYMUTIL LLDB_TEST_DSYMUTIL
LLDB_TEST_SERVER
LLDB_LIBS_DIR LLDB_LIBS_DIR
LLVM_TOOLS_DIR LLVM_TOOLS_DIR
) )

View File

@ -8,7 +8,6 @@ arch = '@LLDB_TEST_ARCH@'
executable = '@LLDB_TEST_EXECUTABLE_CONFIGURED@' executable = '@LLDB_TEST_EXECUTABLE_CONFIGURED@'
compiler = '@LLDB_TEST_COMPILER_CONFIGURED@' compiler = '@LLDB_TEST_COMPILER_CONFIGURED@'
dsymutil = '@LLDB_TEST_DSYMUTIL_CONFIGURED@' dsymutil = '@LLDB_TEST_DSYMUTIL_CONFIGURED@'
server = '@LLDB_TEST_SERVER_CONFIGURED@'
lldb_build_dir = '@LLDB_TEST_BUILD_DIRECTORY_CONFIGURED@' lldb_build_dir = '@LLDB_TEST_BUILD_DIRECTORY_CONFIGURED@'
lldb_build_intel_pt = "@LLDB_BUILD_INTEL_PT@" lldb_build_intel_pt = "@LLDB_BUILD_INTEL_PT@"
lldb_framework_dir = "@LLDB_FRAMEWORK_DIR_CONFIGURED@" lldb_framework_dir = "@LLDB_FRAMEWORK_DIR_CONFIGURED@"
@ -28,8 +27,6 @@ if __name__ == '__main__':
cmd.extend(['--dsymutil', dsymutil]) cmd.extend(['--dsymutil', dsymutil])
cmd.extend(['--lldb-libs-dir', lldb_libs_dir]) cmd.extend(['--lldb-libs-dir', lldb_libs_dir])
cmd.extend(['--llvm-tools-dir', llvm_tools_dir]) cmd.extend(['--llvm-tools-dir', llvm_tools_dir])
if server:
cmd.extend(['--server', server])
if lldb_framework_dir: if lldb_framework_dir:
cmd.extend(['--framework', lldb_framework_dir]) cmd.extend(['--framework', lldb_framework_dir])
if lldb_build_intel_pt == "1": if lldb_build_intel_pt == "1":