# Cross project tests, for tests that require access to multiple projects across
# LLVM (e.g. clang, lld and lldb).
# The subset inside debuginfo-tests invoke clang to generate programs with
# various types of debug info, and then run those programs under a debugger
# such as GDB or LLDB to verify the results.

find_package(Python3 COMPONENTS Interpreter)

add_llvm_executable(check-gdb-llvm-support
        debuginfo-tests/llvm-prettyprinters/gdb/llvm-support.cpp
)
target_link_libraries(check-gdb-llvm-support PRIVATE LLVMSupport)

set(CROSS_PROJECT_TESTS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(CROSS_PROJECT_TESTS_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})

set(CROSS_PROJECT_TEST_DEPS
  FileCheck
  check-gdb-llvm-support
  count
  llvm-dwarfdump
  llvm-config
  llvm-objdump
  split-file
  not
  )

if ("clang" IN_LIST LLVM_ENABLE_PROJECTS)
  list(APPEND CROSS_PROJECT_TEST_DEPS clang)
endif()

if ("mlir" IN_LIST LLVM_ENABLE_PROJECTS)
  add_llvm_executable(check-gdb-mlir-support
        debuginfo-tests/llvm-prettyprinters/gdb/mlir-support.cpp
  )
  target_include_directories(check-gdb-mlir-support PRIVATE
                               ${LLVM_EXTERNAL_MLIR_SOURCE_DIR}/include
                               ${LLVM_BINARY_DIR}/tools/mlir/include)
  target_link_libraries(check-gdb-mlir-support PRIVATE MLIRIR)
  list(APPEND CROSS_PROJECT_TEST_DEPS check-gdb-mlir-support)
  set(MLIR_SOURCE_DIR  ${LLVM_EXTERNAL_MLIR_SOURCE_DIR})
endif()

if("compiler-rt" IN_LIST LLVM_ENABLE_PROJECTS)
  # llgdb-tests/asan.c and other asan* files.
  if(TARGET asan)
    list(APPEND CROSS_PROJECT_TEST_DEPS asan)
  endif()
  # llgdb-tests/safestack.c
  if(TARGET safestack)
    list(APPEND CROSS_PROJECT_TEST_DEPS safestack)
  endif()
endif()
# Many dexter tests depend on lldb.
if("lldb" IN_LIST LLVM_ENABLE_PROJECTS)
  list(APPEND CROSS_PROJECT_TEST_DEPS lldb lldb-server)
endif()

if ("lld" IN_LIST LLVM_ENABLE_PROJECTS)
  list(APPEND CROSS_PROJECT_TEST_DEPS lld)
endif()

configure_lit_site_cfg(
  ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in
  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py
  MAIN_CONFIG
  ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py
  )

add_lit_testsuite(check-cross-project "Running cross-project tests"
  ${CMAKE_CURRENT_BINARY_DIR}
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

# Add alias for debuginfo test subset.
add_lit_testsuite(check-debuginfo "Running debuginfo tests"
  ${CMAKE_CURRENT_BINARY_DIR}/debuginfo-tests
  EXCLUDE_FROM_CHECK_ALL
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

# Add alias for intrinsic header test subset.
add_lit_testsuite(check-intrinsic-headers "Running intrinsic header tests"
  ${CMAKE_CURRENT_BINARY_DIR}/intrinsic-header-tests
  EXCLUDE_FROM_CHECK_ALL
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

# AMDGPU tests.
add_lit_testsuite(check-cross-amdgpu "Running AMDGPU cross-project tests"
  ${CMAKE_CURRENT_BINARY_DIR}/amdgpu
  EXCLUDE_FROM_CHECK_ALL
  DEPENDS clang
  )

# Add check-cross-project-* targets.
add_lit_testsuites(CROSS_PROJECT ${CMAKE_CURRENT_SOURCE_DIR}
  DEPENDS ${CROSS_PROJECT_TEST_DEPS}
  )

set_target_properties(check-cross-project PROPERTIES FOLDER "Tests")
set_target_properties(check-debuginfo PROPERTIES FOLDER "Tests")
set_target_properties(check-intrinsic-headers PROPERTIES FOLDER "Tests")
set_target_properties(check-cross-amdgpu PROPERTIES FOLDER "Tests")
