forked from OSchip/llvm-project
[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:
parent
b56e65d318
commit
cb0eb9d8dd
|
@ -122,8 +122,12 @@ class Builder:
|
|||
|
||||
def getLibCxxArgs(self):
|
||||
if configuration.libcxx_include_dir and configuration.libcxx_library_dir:
|
||||
return ["LIBCPP_INCLUDE_DIR={}".format(configuration.libcxx_include_dir),
|
||||
"LIBCPP_LIBRARY_DIR={}".format(configuration.libcxx_library_dir)]
|
||||
libcpp_args = ["LIBCPP_INCLUDE_DIR={}".format(configuration.libcxx_include_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 []
|
||||
|
||||
def _getDebugInfoArgs(self, debug_info):
|
||||
|
|
|
@ -124,6 +124,7 @@ all_tests = set()
|
|||
lldb_libs_dir = None
|
||||
|
||||
libcxx_include_dir = None
|
||||
libcxx_include_target_dir = None
|
||||
libcxx_library_dir = None
|
||||
|
||||
# A plugin whose tests will be enabled, like intel-pt.
|
||||
|
|
|
@ -280,17 +280,15 @@ def parseOptionsAndInitTestdirs():
|
|||
logging.warning('No valid FileCheck executable; some tests may fail...')
|
||||
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.lldb_platform_name:
|
||||
logging.warning('Custom libc++ is not supported for remote runs: ignoring --libcxx arguments')
|
||||
elif 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:
|
||||
elif not (args.libcxx_include_dir and args.libcxx_library_dir):
|
||||
logging.error('Custom libc++ requires both --libcxx-include-dir and --libcxx-library-dir')
|
||||
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:
|
||||
lldbtest_config.channels = args.channels
|
||||
|
|
|
@ -43,8 +43,12 @@ def create_parser():
|
|||
if sys.platform == 'darwin':
|
||||
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.'''))
|
||||
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-library-dir', help=textwrap.dedent('Specify the path to a custom libc++ library directory. Must be used in conjunction with --libcxx-include-dir.'))
|
||||
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-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.
|
||||
group.add_argument(
|
||||
'-E',
|
||||
|
|
|
@ -408,7 +408,10 @@ endif
|
|||
ifeq (1,$(USE_LIBCPP))
|
||||
ifneq ($(and $(LIBCPP_INCLUDE_DIR), $(LIBCPP_LIBRARY_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
|
||||
ifeq "$(OS)" "Android"
|
||||
# Nothing to do, this is already handled in
|
||||
|
@ -430,7 +433,10 @@ endif
|
|||
ifeq ($(or $(USE_LIBSTDCPP), $(USE_LIBCPP), $(USE_SYSTEM_STDLIB)),)
|
||||
ifneq ($(and $(LIBCPP_INCLUDE_DIR), $(LIBCPP_LIBRARY_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
|
||||
|
||||
|
|
|
@ -173,9 +173,11 @@ if is_configured('llvm_tools_dir'):
|
|||
# If we have a just-built libcxx, prefer it over the system one.
|
||||
if is_configured('has_libcxx') and config.has_libcxx:
|
||||
if platform.system() != 'Windows':
|
||||
if is_configured('llvm_include_dir') and is_configured('llvm_libs_dir'):
|
||||
dotest_cmd += ['--libcxx-include-dir', os.path.join(config.llvm_include_dir, 'c++', 'v1')]
|
||||
dotest_cmd += ['--libcxx-library-dir', config.llvm_libs_dir]
|
||||
if is_configured('libcxx_include_dir') and is_configured('libcxx_libs_dir'):
|
||||
dotest_cmd += ['--libcxx-include-dir', config.libcxx_include_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
|
||||
# ASan-ified dylib.
|
||||
|
|
|
@ -32,6 +32,9 @@ config.test_arch = '@LLDB_TEST_ARCH@'
|
|||
config.test_compiler = lit_config.substitute('@LLDB_TEST_COMPILER@')
|
||||
config.dsymutil = lit_config.substitute('@LLDB_TEST_DSYMUTIL@')
|
||||
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.
|
||||
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")
|
||||
|
|
|
@ -97,6 +97,14 @@ if(TARGET clang)
|
|||
|
||||
if (TARGET libcxx OR ("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()
|
||||
add_lldb_test_dependency(cxx)
|
||||
endif()
|
||||
|
||||
|
|
|
@ -9,8 +9,21 @@ set(LLDB_LIBS_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}")
|
|||
|
||||
llvm_canonicalize_cmake_booleans(
|
||||
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(vars
|
||||
LLDB_TEST_COMMON_ARGS
|
||||
|
@ -23,8 +36,13 @@ set(vars
|
|||
LLDB_TEST_DSYMUTIL
|
||||
LLDB_LIBS_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.
|
||||
if(LLDB_BUILT_STANDALONE)
|
||||
set(config_types ".")
|
||||
|
|
|
@ -13,6 +13,10 @@ lldb_build_intel_pt = "@LLDB_BUILD_INTEL_PT@"
|
|||
lldb_framework_dir = "@LLDB_FRAMEWORK_DIR_CONFIGURED@"
|
||||
lldb_libs_dir = "@LLDB_LIBS_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__':
|
||||
wrapper_args = sys.argv[1:]
|
||||
|
@ -31,6 +35,11 @@ if __name__ == '__main__':
|
|||
cmd.extend(['--dsymutil', dsymutil])
|
||||
cmd.extend(['--lldb-libs-dir', lldb_libs_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:
|
||||
cmd.extend(['--framework', lldb_framework_dir])
|
||||
if lldb_build_intel_pt == "1":
|
||||
|
|
Loading…
Reference in New Issue