Files
TheRock/rocm-libraries/shared/stinkytofu/tests/CMakeLists.txt
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

353 lines
14 KiB
CMake

# Copyright Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
find_package(Threads REQUIRED)
find_package(GTest REQUIRED)
include(GoogleTest)
# Common test main entry point
set(TEST_MAIN
StinkyTofuTestMain.cpp
)
list(TRANSFORM TEST_MAIN PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/")
# Common include directories for all tests
set(TEST_INCLUDE_DIRS
${CMAKE_CURRENT_SOURCE_DIR}/../../../projects/hipblaslt/tensilelite/rocisa/rocisa/include
${CMAKE_CURRENT_SOURCE_DIR}/../include
${CMAKE_CURRENT_SOURCE_DIR}/../src # For private headers (IRLexer.hpp, etc.)
${CMAKE_CURRENT_SOURCE_DIR}/../src/serialization/asm # For IRLexer.hpp and parser/lexer private headers
${CMAKE_CURRENT_SOURCE_DIR}/../hardware/include
${CMAKE_CURRENT_SOURCE_DIR}/unit # For TestHelpers.hpp
${TABLEGEN_OUTPUT_DIR}
)
# Common link libraries for all tests.
# unit_tests links the static lib so all symbols (including non-exported ones)
# are accessible for white-box coverage testing. When BUILD_SHARED_LIBS=OFF,
# stinkytofu itself is already static so no separate target is needed.
if(BUILD_SHARED_LIBS)
set(_stinkytofu_test_lib stinkytofu_static)
else()
set(_stinkytofu_test_lib stinkytofu)
endif()
set(TEST_LINK_LIBS
GTest::gtest
Threads::Threads
${_stinkytofu_test_lib}
)
# =============================================================================
# Unit Tests
# =============================================================================
# Assembly IR Tests
set(UNIT_ASM_TEST_FILES
unit/asm/WaitCntInsertionTest.cpp
unit/asm/DAGSchedulerPassTest.cpp
unit/asm/ExecMaskGroupingTest.cpp
unit/asm/DeadCodeEliminationPassTest.cpp
unit/asm/DefUseChainTest.cpp
unit/asm/InsertPhiTest.cpp
unit/asm/EstimateAsmCyclesTest.cpp
unit/asm/RedundantMovEliminationPassTest.cpp
unit/asm/OptimizationPipelineTest.cpp
unit/asm/ScopeAdaptorTest.cpp
unit/asm/PeepholeOptimizationPassTest.cpp
unit/asm/AccumulateInstructionSizePassTest.cpp
unit/asm/SwPrefetchInsertionPassTest.cpp
unit/asm/StinkyAsmEmitterTest.cpp
unit/asm/StinkyModifiersTest.cpp
unit/asm/LegalizationUtilsTest.cpp
unit/asm/VirtualRegisterTest.cpp
# Parser/Lexer Tests (added for critical testing gaps)
unit/asm/IRLexerTest.cpp
unit/asm/IRParserTest.cpp
unit/asm/PatternParserTest.cpp
unit/asm/FuzzTest.cpp
unit/asm/HwInstDescTest.cpp
unit/asm/ReadWriteOperandTest.cpp
unit/asm/BarrierTest.cpp
unit/asm/LoopRegionRemarkPassTest.cpp
unit/asm/BranchHelpersTest.cpp
unit/asm/SetpcSwappcCfgTest.cpp
unit/asm/LongBranchLoweringTest.cpp
unit/asm/MemTokenConsistencyCheckPassTest.cpp
unit/asm/VerifyInstrumentationTest.cpp
unit/asm/DebugPrintInstrumentation_test.cpp
unit/asm/AccumulateInstructionSizePassRunTest.cpp
unit/asm/StinkyRemoveWaitCntPassTest.cpp
unit/asm/StinkyWmmaVgprReorderPassTest.cpp
unit/asm/RemoveInstructionPassTest.cpp
unit/asm/FlattenCalleesPassTest.cpp
unit/asm/BasicBlockTest.cpp
unit/asm/DumpStinkyModulePassTest.cpp
unit/asm/StinkySignatureTest.cpp
unit/asm/RederiveExpertScopePassTest.cpp
)
# High-Level IR Tests
set(UNIT_LOGICAL_TEST_FILES
unit/logical/LogicalCommutativeTest.cpp
unit/logical/LogicalHexLiteralTest.cpp
unit/logical/LogicalPeepholePassTest.cpp
unit/logical/LogicalBuilderTest.cpp
unit/logical/LogicalModuleTest.cpp
unit/logical/LogicalModuleOwnershipTest.cpp
unit/logical/LogicalOpcodeTest.cpp
unit/logical/LogicalToAsmPipelineTest.cpp
unit/logical/LogicalToAsmMultiArchTest.cpp
unit/logical/LogicalIntrinsicFlowTest.cpp
unit/logical/LogicalIRVerifierPassTest.cpp
)
# Core Infrastructure Tests
set(UNIT_CORE_TEST_FILES
unit/core/AnalysisManagerTest.cpp
unit/core/BackendRegistryTest.cpp
unit/core/ComgrProbeTest.cpp
unit/core/PassBuilderTest.cpp
unit/core/BackendTest.cpp
)
# Common/Shared Tests
set(UNIT_COMMON_TEST_FILES
unit/ErrorHandlingTest.cpp
unit/FunctionDestructionTest.cpp
unit/IntrusiveListTest.cpp
unit/ir/IntrinsicExpansionPassTest.cpp
unit/ir/RegisterWidthValidationTest.cpp
)
# Combine all unit tests
set(UNIT_TEST_FILES
${UNIT_CORE_TEST_FILES}
${UNIT_ASM_TEST_FILES}
${UNIT_LOGICAL_TEST_FILES}
${UNIT_COMMON_TEST_FILES}
)
list(TRANSFORM UNIT_TEST_FILES PREPEND "${CMAKE_CURRENT_SOURCE_DIR}/")
add_executable(unit_tests ${TEST_MAIN} ${UNIT_TEST_FILES})
target_link_libraries(unit_tests PRIVATE stinkytofu-warnings)
target_link_libraries(unit_tests PUBLIC ${TEST_LINK_LIBS})
target_include_directories(unit_tests PRIVATE ${TEST_INCLUDE_DIRS})
add_dependencies(unit_tests tablegen_generated)
# Example-plugin tests are gated by STINKYTOFU_BUILD_EXAMPLES: the plugin target
# only exists when examples are built, so the integration test compiles only then.
# Future example tests slot in under this same flag.
#
# Static build: plugin is an OBJECT lib linked directly into unit_tests.
# Shared build: plugin is a MODULE loaded at runtime via loadPlugin(). Because
# the plugin links stinkytofu.dll, the test binary must also use the shared lib
# so both share the same registry instance. Plugin tests therefore live in
# api_tests (which links stinkytofu shared), not unit_tests (which links
# stinkytofu_static). Only the STINKYTOFU_BUILD_EXAMPLES compile definition is
# added to unit_tests so non-plugin tests in the same file still compile.
if(STINKYTOFU_BUILD_EXAMPLES)
if(BUILD_SHARED_LIBS)
# Shared build: plugin links stinkytofu.dll so the plugin test must run
# inside api_tests (which also links stinkytofu.dll). unit_tests links
# stinkytofu_static — two separate registry instances — so the plugin test
# would not see its registered passes. Leave STINKYTOFU_BUILD_EXAMPLES
# undefined here; PassBuilderTest.cpp's plugin section is compiled out.
else()
target_compile_definitions(unit_tests PRIVATE STINKYTOFU_BUILD_EXAMPLES)
target_include_directories(unit_tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../examples/plugins
)
target_link_libraries(unit_tests PRIVATE stinkytofu-plugin-helloworld)
endif()
endif()
gtest_discover_tests(unit_tests
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
TIMEOUT 60
PROPERTIES LABELS "unit_tests"
)
# Static link-level guard for #8342: assert libstinkytofu has no DT_NEEDED on a
# plugin. This is an ELF property that a runtime gtest cannot observe (a broken
# libstinkytofu would fail to load before any test starts), so it is checked by
# inspecting the built .so directly. Linux/ELF only and only meaningful for a
# shared libstinkytofu.
if(UNIX AND NOT APPLE AND BUILD_SHARED_LIBS AND CMAKE_READELF)
add_test(
NAME LibStinkytofuHasNoPluginDependency
COMMAND ${CMAKE_COMMAND}
-DLIB=$<TARGET_FILE:stinkytofu>
-DREADELF=${CMAKE_READELF}
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/CheckNoPluginDependency.cmake
)
set_tests_properties(LibStinkytofuHasNoPluginDependency
PROPERTIES LABELS "unit_tests")
endif()
# =============================================================================
# API Export Tests
# Links stinkytofu as a SHARED library (or static when BUILD_SHARED_LIBS=OFF).
# Purpose: verify that every symbol used by real consumers (rocisa,
# stinkytofu-opt) is properly exported. A linker failure here means a symbol
# was accidentally un-exported.
# Only meaningful when BUILD_SHARED_LIBS=ON; skipped otherwise since all
# symbols are always visible in a static build.
# =============================================================================
if(BUILD_SHARED_LIBS)
add_executable(api_tests
${TEST_MAIN}
${CMAKE_CURRENT_SOURCE_DIR}/api/ApiExportTest.cpp
)
target_link_libraries(api_tests PRIVATE stinkytofu-warnings)
target_link_libraries(api_tests PUBLIC
GTest::gtest
Threads::Threads
stinkytofu # shared lib — only exported symbols visible
)
target_include_directories(api_tests PRIVATE ${TEST_INCLUDE_DIRS})
add_dependencies(api_tests tablegen_generated)
# Plugin integration tests require the shared lib so the plugin and the test
# binary share the same stinkytofu registry instance at runtime.
if(STINKYTOFU_BUILD_EXAMPLES)
target_sources(api_tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/unit/core/PassBuilderTest.cpp
)
target_compile_definitions(api_tests PRIVATE
STINKYTOFU_BUILD_EXAMPLES
STINKYTOFU_PLUGIN_HELLOWORLD_PATH="$<TARGET_FILE:stinkytofu-plugin-helloworld>"
)
target_include_directories(api_tests PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../examples/plugins
)
add_dependencies(api_tests stinkytofu-plugin-helloworld)
endif()
gtest_discover_tests(api_tests
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
TIMEOUT 60
PROPERTIES LABELS "api_tests"
)
endif()
# =============================================================================
# All Tests Target (convenience target to build all test executables)
# =============================================================================
add_custom_target(tests COMMENT "Build all test executables")
add_dependencies(tests unit_tests)
if(BUILD_SHARED_LIBS)
add_dependencies(tests api_tests)
endif()
# Note: Future test executables can be added here, e.g.:
# add_executable(integration_tests ...)
# add_dependencies(tests integration_tests)
# =============================================================================
# Tablegen Instruction Generation Test (Proof-of-Concept)
# =============================================================================
add_executable(test_gen_instructions
${CMAKE_CURRENT_SOURCE_DIR}/../tools/tablegen/test_gen_instructions.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../tools/tablegen/GenInstructions.cpp
)
target_link_libraries(test_gen_instructions PRIVATE stinkytofu-warnings)
target_link_libraries(test_gen_instructions PRIVATE gfxisa)
target_include_directories(test_gen_instructions PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../hardware/include
${CMAKE_CURRENT_SOURCE_DIR}/../include
)
add_test(NAME GenInstructionsTest
COMMAND $<TARGET_FILE:test_gen_instructions> ${CMAKE_CURRENT_SOURCE_DIR}/..
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
set_tests_properties(GenInstructionsTest PROPERTIES
LABELS "unit_tests"
TIMEOUT 30
)
add_dependencies(tests test_gen_instructions)
# =============================================================================
# Python Tests (pytest)
# =============================================================================
# Only register Python tests if the Python module is being built
if(STINKYTOFU_BUILD_PYTHON)
# Find Python (also done in python_module, but tests are configured first)
find_package(Python COMPONENTS Interpreter QUIET)
if(Python_FOUND)
# Check if pytest is available
execute_process(
COMMAND ${Python_EXECUTABLE} -m pytest --version
RESULT_VARIABLE PYTEST_NOT_FOUND
OUTPUT_QUIET
ERROR_QUIET
)
if(NOT PYTEST_NOT_FOUND)
message(STATUS "pytest found - adding Python tests to CTest")
# Discover all test files in python_module/tests/
file(GLOB PYTEST_FILES "${CMAKE_SOURCE_DIR}/python_module/tests/test_*.py")
# Register each test file as a separate CTest entry
foreach(PYTEST_FILE ${PYTEST_FILES})
# Extract test file name without path and extension
get_filename_component(TEST_NAME ${PYTEST_FILE} NAME_WE)
# Add test (CTest suppresses output by default, shows on failure)
add_test(
NAME python.${TEST_NAME}
COMMAND ${Python_EXECUTABLE} -m pytest
${PYTEST_FILE}
-v
--tb=short
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)
# Set PYTHONPATH so pytest can find the module
set_tests_properties(python.${TEST_NAME} PROPERTIES
ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/lib"
LABELS "python;unit_tests"
)
endforeach()
list(LENGTH PYTEST_FILES PYTEST_FILE_COUNT)
message(STATUS " - Registered ${PYTEST_FILE_COUNT} Python test files")
message(STATUS " - Run all: ctest -L python")
message(STATUS " - Run one: ctest -R python.test_ir_basic")
message(STATUS " - Debug: pytest python_module/tests/test_ir_basic.py::TestClass::test_func -v")
else()
message(WARNING "pytest not found - Python tests will not be added to CTest")
message(STATUS " - Install pytest with: pip3 install pytest")
endif()
else()
message(WARNING "Python interpreter not found - Python tests will not be added to CTest")
endif()
else()
message(STATUS "Python module build disabled (STINKYTOFU_BUILD_PYTHON=OFF) - skipping Python tests")
endif()
##===----------------------------------------------------------------------===##
# FileCheck tests (LLVM-style .stir pattern tests)
##===----------------------------------------------------------------------===##
file(GLOB FILECHECK_TESTS
"${CMAKE_CURRENT_SOURCE_DIR}/filecheck/*.stir"
"${CMAKE_CURRENT_SOURCE_DIR}/filecheck/*.s"
)
foreach(test_file ${FILECHECK_TESTS})
get_filename_component(test_name ${test_file} NAME_WE)
add_test(
NAME FileCheck.${test_name}
COMMAND $<TARGET_FILE:stinkytofu-check>
${test_file}
--stinkytofu-opt $<TARGET_FILE:stinkytofu-opt>
)
endforeach()
list(LENGTH FILECHECK_TESTS FILECHECK_COUNT)
message(STATUS " - Registered ${FILECHECK_COUNT} FileCheck tests")