[test] Fix LLDB tests with just-built libcxx when using a target directory.

In certain configurations, libc++ headers all exist in the same directory, and libc++ binaries exist in the same directory as lldb libs. When `LLVM_ENABLE_PER_TARGET_RUNTIME_DIR` is enabled (*and* the host is not Apple, which is why I assume this wasn't caught by others?), this is not the case: most headers will exist in the usual `include/c++/v1` directory, but `__config_site` exists in `include/$TRIPLE/c++/v1`. Likewise, the libc++.so binary exists in `lib/$TRIPLE/`, not `lib/` (where LLDB libraries reside).

This also adds the just-built-libcxx functionality to the lldb-dotest tool.

The `LIBCXX_` cmake config is borrowed from `libcxx/CMakeLists.txt`. I could not figure out a way to share the cmake config; ideally we would reuse the same config instead of copy/paste.

Reviewed By: JDevlieghere, fdeazeve

Differential Revision: https://reviews.llvm.org/D133973
This commit is contained in:
Jordan Rupprecht 2022-10-26 12:07:22 -07:00
parent b56e65d318
commit cb0eb9d8dd
10 changed files with 68 additions and 15 deletions

View File

@ -122,8 +122,12 @@ class Builder:
def getLibCxxArgs(self): def getLibCxxArgs(self):
if configuration.libcxx_include_dir and configuration.libcxx_library_dir: if configuration.libcxx_include_dir and configuration.libcxx_library_dir:
return ["LIBCPP_INCLUDE_DIR={}".format(configuration.libcxx_include_dir), libcpp_args = ["LIBCPP_INCLUDE_DIR={}".format(configuration.libcxx_include_dir),
"LIBCPP_LIBRARY_DIR={}".format(configuration.libcxx_library_dir)] "LIBCPP_LIBRARY_DIR={}".format(configuration.libcxx_library_dir)]
if configuration.libcxx_include_target_dir:
libcpp_args.append("LIBCPP_INCLUDE_TARGET_DIR={}".format(
configuration.libcxx_include_target_dir))
return libcpp_args
return [] return []
def _getDebugInfoArgs(self, debug_info): def _getDebugInfoArgs(self, debug_info):

View File

@ -124,6 +124,7 @@ all_tests = set()
lldb_libs_dir = None lldb_libs_dir = None
libcxx_include_dir = None libcxx_include_dir = None
libcxx_include_target_dir = None
libcxx_library_dir = None libcxx_library_dir = None
# A plugin whose tests will be enabled, like intel-pt. # A plugin whose tests will be enabled, like intel-pt.

View File

@ -280,17 +280,15 @@ def parseOptionsAndInitTestdirs():
logging.warning('No valid FileCheck executable; some tests may fail...') logging.warning('No valid FileCheck executable; some tests may fail...')
logging.warning('(Double-check the --llvm-tools-dir argument to dotest.py)') logging.warning('(Double-check the --llvm-tools-dir argument to dotest.py)')
configuration.libcxx_include_dir = args.libcxx_include_dir
configuration.libcxx_library_dir = args.libcxx_library_dir
if args.libcxx_include_dir or args.libcxx_library_dir: if args.libcxx_include_dir or args.libcxx_library_dir:
if args.lldb_platform_name: if args.lldb_platform_name:
logging.warning('Custom libc++ is not supported for remote runs: ignoring --libcxx arguments') logging.warning('Custom libc++ is not supported for remote runs: ignoring --libcxx arguments')
elif args.libcxx_include_dir and args.libcxx_library_dir: elif not (args.libcxx_include_dir and args.libcxx_library_dir):
configuration.libcxx_include_dir = args.libcxx_include_dir
configuration.libcxx_library_dir = args.libcxx_library_dir
else:
logging.error('Custom libc++ requires both --libcxx-include-dir and --libcxx-library-dir') logging.error('Custom libc++ requires both --libcxx-include-dir and --libcxx-library-dir')
sys.exit(-1) sys.exit(-1)
configuration.libcxx_include_dir = args.libcxx_include_dir
configuration.libcxx_include_target_dir = args.libcxx_include_target_dir
configuration.libcxx_library_dir = args.libcxx_library_dir
if args.channels: if args.channels:
lldbtest_config.channels = args.channels lldbtest_config.channels = args.channels

View File

@ -43,8 +43,12 @@ def create_parser():
if sys.platform == 'darwin': if sys.platform == 'darwin':
group.add_argument('--apple-sdk', metavar='apple_sdk', dest='apple_sdk', default="", help=textwrap.dedent( group.add_argument('--apple-sdk', metavar='apple_sdk', dest='apple_sdk', default="", help=textwrap.dedent(
'''Specify the name of the Apple SDK (macosx, macosx.internal, iphoneos, iphoneos.internal, or path to SDK) and use the appropriate tools from that SDK's toolchain.''')) '''Specify the name of the Apple SDK (macosx, macosx.internal, iphoneos, iphoneos.internal, or path to SDK) and use the appropriate tools from that SDK's toolchain.'''))
group.add_argument('--libcxx-include-dir', help=textwrap.dedent('Specify the path to a custom libc++ include directory. Must be used in conjunction with --libcxx-library-dir.')) group.add_argument('--libcxx-include-dir', help=textwrap.dedent(
group.add_argument('--libcxx-library-dir', help=textwrap.dedent('Specify the path to a custom libc++ library directory. Must be used in conjunction with --libcxx-include-dir.')) 'Specify the path to a custom libc++ include directory. Must be used in conjunction with --libcxx-library-dir.'))
group.add_argument('--libcxx-include-target-dir', help=textwrap.dedent(
'Specify the path to a custom libc++ include target directory to use in addition to --libcxx-include-dir. Optional.'))
group.add_argument('--libcxx-library-dir', help=textwrap.dedent(
'Specify the path to a custom libc++ library directory. Must be used in conjunction with --libcxx-include-dir.'))
# FIXME? This won't work for different extra flags according to each arch. # FIXME? This won't work for different extra flags according to each arch.
group.add_argument( group.add_argument(
'-E', '-E',

View File

@ -408,7 +408,10 @@ endif
ifeq (1,$(USE_LIBCPP)) ifeq (1,$(USE_LIBCPP))
ifneq ($(and $(LIBCPP_INCLUDE_DIR), $(LIBCPP_LIBRARY_DIR)),) ifneq ($(and $(LIBCPP_INCLUDE_DIR), $(LIBCPP_LIBRARY_DIR)),)
CXXFLAGS += -nostdlib++ -nostdinc++ -cxx-isystem $(LIBCPP_INCLUDE_DIR) CXXFLAGS += -nostdlib++ -nostdinc++ -cxx-isystem $(LIBCPP_INCLUDE_DIR)
LDFLAGS += -L$(LLVM_LIBS_DIR) -Wl,-rpath,$(LIBCPP_LIBRARY_DIR) -lc++ ifneq "$(LIBCPP_INCLUDE_TARGET_DIR)" ""
CXXFLAGS += -cxx-isystem $(LIBCPP_INCLUDE_TARGET_DIR)
endif
LDFLAGS += -L$(LIBCPP_LIBRARY_DIR) -Wl,-rpath,$(LIBCPP_LIBRARY_DIR) -lc++
else else
ifeq "$(OS)" "Android" ifeq "$(OS)" "Android"
# Nothing to do, this is already handled in # Nothing to do, this is already handled in
@ -430,7 +433,10 @@ endif
ifeq ($(or $(USE_LIBSTDCPP), $(USE_LIBCPP), $(USE_SYSTEM_STDLIB)),) ifeq ($(or $(USE_LIBSTDCPP), $(USE_LIBCPP), $(USE_SYSTEM_STDLIB)),)
ifneq ($(and $(LIBCPP_INCLUDE_DIR), $(LIBCPP_LIBRARY_DIR)),) ifneq ($(and $(LIBCPP_INCLUDE_DIR), $(LIBCPP_LIBRARY_DIR)),)
CXXFLAGS += -nostdlib++ -nostdinc++ -cxx-isystem $(LIBCPP_INCLUDE_DIR) CXXFLAGS += -nostdlib++ -nostdinc++ -cxx-isystem $(LIBCPP_INCLUDE_DIR)
LDFLAGS += -L$(LLVM_LIBS_DIR) -Wl,-rpath,$(LIBCPP_LIBRARY_DIR) -lc++ ifneq "$(LIBCPP_INCLUDE_TARGET_DIR)" ""
CXXFLAGS += -cxx-isystem $(LIBCPP_INCLUDE_TARGET_DIR)
endif
LDFLAGS += -L$(LIBCPP_LIBRARY_DIR) -Wl,-rpath,$(LIBCPP_LIBRARY_DIR) -lc++
endif endif
endif endif

View File

@ -173,9 +173,11 @@ if is_configured('llvm_tools_dir'):
# If we have a just-built libcxx, prefer it over the system one. # If we have a just-built libcxx, prefer it over the system one.
if is_configured('has_libcxx') and config.has_libcxx: if is_configured('has_libcxx') and config.has_libcxx:
if platform.system() != 'Windows': if platform.system() != 'Windows':
if is_configured('llvm_include_dir') and is_configured('llvm_libs_dir'): if is_configured('libcxx_include_dir') and is_configured('libcxx_libs_dir'):
dotest_cmd += ['--libcxx-include-dir', os.path.join(config.llvm_include_dir, 'c++', 'v1')] dotest_cmd += ['--libcxx-include-dir', config.libcxx_include_dir]
dotest_cmd += ['--libcxx-library-dir', config.llvm_libs_dir] if is_configured('libcxx_include_target_dir'):
dotest_cmd += ['--libcxx-include-target-dir', config.libcxx_include_target_dir]
dotest_cmd += ['--libcxx-library-dir', config.libcxx_libs_dir]
# Forward ASan-specific environment variables to tests, as a test may load an # Forward ASan-specific environment variables to tests, as a test may load an
# ASan-ified dylib. # ASan-ified dylib.

View File

@ -32,6 +32,9 @@ config.test_arch = '@LLDB_TEST_ARCH@'
config.test_compiler = lit_config.substitute('@LLDB_TEST_COMPILER@') config.test_compiler = lit_config.substitute('@LLDB_TEST_COMPILER@')
config.dsymutil = lit_config.substitute('@LLDB_TEST_DSYMUTIL@') config.dsymutil = lit_config.substitute('@LLDB_TEST_DSYMUTIL@')
config.has_libcxx = @LLDB_HAS_LIBCXX@ config.has_libcxx = @LLDB_HAS_LIBCXX@
config.libcxx_libs_dir = "@LIBCXX_LIBRARY_DIR@"
config.libcxx_include_dir = "@LIBCXX_GENERATED_INCLUDE_DIR@"
config.libcxx_include_target_dir = "@LIBCXX_GENERATED_INCLUDE_TARGET_DIR@"
# 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")

View File

@ -97,6 +97,14 @@ if(TARGET clang)
if (TARGET libcxx OR ("libcxx" IN_LIST LLVM_ENABLE_RUNTIMES)) if (TARGET libcxx OR ("libcxx" IN_LIST LLVM_ENABLE_RUNTIMES))
set(LLDB_HAS_LIBCXX ON) set(LLDB_HAS_LIBCXX ON)
if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
else()
set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
endif()
add_lldb_test_dependency(cxx) add_lldb_test_dependency(cxx)
endif() endif()

View File

@ -9,8 +9,21 @@ set(LLDB_LIBS_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
llvm_canonicalize_cmake_booleans( llvm_canonicalize_cmake_booleans(
LLDB_BUILD_INTEL_PT LLDB_BUILD_INTEL_PT
LLDB_HAS_LIBCXX
) )
if ("libcxx" IN_LIST LLVM_ENABLE_RUNTIMES)
set(LLDB_HAS_LIBCXX ON)
if(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE)
set(LIBCXX_LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/${LLVM_DEFAULT_TARGET_TRIPLE})
set(LIBCXX_GENERATED_INCLUDE_DIR "${LLVM_BINARY_DIR}/include/c++/v1")
set(LIBCXX_GENERATED_INCLUDE_TARGET_DIR "${LLVM_BINARY_DIR}/include/${LLVM_DEFAULT_TARGET_TRIPLE}/c++/v1")
else()
set(LIBCXX_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXX_LIBDIR_SUFFIX})
set(LIBCXX_GENERATED_INCLUDE_DIR "${CMAKE_BINARY_DIR}/include/c++/v1")
endif()
endif()
set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}") set(LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}")
set(vars set(vars
LLDB_TEST_COMMON_ARGS LLDB_TEST_COMMON_ARGS
@ -23,8 +36,13 @@ set(vars
LLDB_TEST_DSYMUTIL LLDB_TEST_DSYMUTIL
LLDB_LIBS_DIR LLDB_LIBS_DIR
LLVM_TOOLS_DIR LLVM_TOOLS_DIR
LIBCXX_LIBRARY_DIR
LIBCXX_GENERATED_INCLUDE_DIR
LIBCXX_GENERATED_INCLUDE_TARGET_DIR
) )
llvm_canonicalize_cmake_booleans(LLDB_HAS_LIBCXX)
# Generate lldb-dotest Python driver script for each build mode. # Generate lldb-dotest Python driver script for each build mode.
if(LLDB_BUILT_STANDALONE) if(LLDB_BUILT_STANDALONE)
set(config_types ".") set(config_types ".")

View File

@ -13,6 +13,10 @@ lldb_build_intel_pt = "@LLDB_BUILD_INTEL_PT@"
lldb_framework_dir = "@LLDB_FRAMEWORK_DIR_CONFIGURED@" lldb_framework_dir = "@LLDB_FRAMEWORK_DIR_CONFIGURED@"
lldb_libs_dir = "@LLDB_LIBS_DIR_CONFIGURED@" lldb_libs_dir = "@LLDB_LIBS_DIR_CONFIGURED@"
llvm_tools_dir = "@LLVM_TOOLS_DIR_CONFIGURED@" llvm_tools_dir = "@LLVM_TOOLS_DIR_CONFIGURED@"
has_libcxx = @LLDB_HAS_LIBCXX@
libcxx_libs_dir = "@LIBCXX_LIBRARY_DIR@"
libcxx_include_dir = "@LIBCXX_GENERATED_INCLUDE_DIR@"
libcxx_include_target_dir = "@LIBCXX_GENERATED_INCLUDE_TARGET_DIR@"
if __name__ == '__main__': if __name__ == '__main__':
wrapper_args = sys.argv[1:] wrapper_args = sys.argv[1:]
@ -31,6 +35,11 @@ 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 has_libcxx:
cmd.extend(['--libcxx-include-dir', libcxx_include_dir])
if libcxx_include_target_dir:
cmd.extend(['--libcxx-include-target-dir', libcxx_include_target_dir])
cmd.extend(['--libcxx-library-dir', libcxx_libs_dir])
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":