forked from OSchip/llvm-project
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:
parent
1a6c1ac686
commit
3ca7b2d03c
|
@ -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)
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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+(.+)$')
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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)
|
||||||
]
|
]
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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":
|
||||||
|
|
Loading…
Reference in New Issue