Files
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

451 lines
15 KiB
CMake

# Copyright (c) 2025-2026 Advanced Micro Devices, Inc.
# SPDX-License-Identifier: MIT
cmake_minimum_required(VERSION 3.22)
set(_RJ_ROCM_PATH_EXPLICIT OFF)
if(DEFINED ROCM_PATH AND NOT "${ROCM_PATH}" STREQUAL "")
set(_RJ_ROCM_PATH_EXPLICIT ON)
elseif(DEFINED ENV{ROCM_PATH} AND NOT "$ENV{ROCM_PATH}" STREQUAL "")
set(_RJ_ROCM_PATH_EXPLICIT ON)
set(ROCM_PATH "$ENV{ROCM_PATH}" CACHE PATH "Path to the ROCm installation")
elseif(IS_DIRECTORY "/opt/rocm")
set(ROCM_PATH "/opt/rocm" CACHE PATH "Path to the ROCm installation")
endif()
if(_RJ_ROCM_PATH_EXPLICIT AND NOT IS_DIRECTORY "${ROCM_PATH}")
message(FATAL_ERROR "ROCM_PATH must be set to a valid directory")
endif()
unset(_RJ_ROCM_PATH_EXPLICIT)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
include(rj_default_compiler)
project(rocm_jit_suite VERSION 0.3.0)
include(rj_version)
# Generate compile_commands.json for clangd, clang-tidy, and other tooling that
# needs the exact compiler invocations from the configured build tree.
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Default install prefix to /opt/rocm, matching other ROCm projects.
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND ROCM_PATH)
set(CMAKE_INSTALL_PREFIX "${ROCM_PATH}" CACHE PATH "" FORCE)
endif()
include(CTest)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Hide symbols by default so the shared library (librocjitsu.so) exports only its
# intended ABI.
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
find_package(Threads REQUIRED)
# GCC 14+ emits false-positive -Wuninitialized on reinterpret_cast<uint32_t*>
# member access in the autogenerated ISA encoding constructors. The pointer is
# always initialized from a constructor argument, but GCC's alias analysis
# misattributes the access to an uninitialized offset within `this`.
if(
CMAKE_CXX_COMPILER_ID STREQUAL "GNU"
AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "14"
)
add_compile_options(-Wno-uninitialized)
endif()
# HSA/KFD headers (local copies from rocr-runtime).
set(HSA_INCLUDE_DIR
"${PROJECT_SOURCE_DIR}/lib/rocjitsu/external_headers/hsa_headers"
)
# DRM/amdgpu UAPI headers (vendored kernel ABI, MIT-licensed). Lets the
# interposer service the amdgpu DRM ioctl surface using the real kernel structs
# instead of hand-mirrored copies, without depending on libdrm library types.
set(DRM_INCLUDE_DIR
"${PROJECT_SOURCE_DIR}/lib/rocjitsu/external_headers/drm_headers/linux/uapi/drm"
)
include(rj_log)
# Install directory variables are used by subdirectories that add install rules.
include(GNUInstallDirs)
include(rj_sanitizers)
# Sanitizer and static analysis options.
option(RJ_ENABLE_ASAN "Enable AddressSanitizer" OFF)
option(RJ_ENABLE_UBSAN "Enable UndefinedBehaviorSanitizer" OFF)
option(RJ_ENABLE_TSAN "Enable ThreadSanitizer" OFF)
option(RJ_ENABLE_MSAN "Enable MemorySanitizer" OFF)
set(RJ_SANITIZER_RUNTIME
"AUTO"
CACHE STRING
"Sanitizer runtime linkage policy (AUTO, SHARED, or STATIC)"
)
set_property(CACHE RJ_SANITIZER_RUNTIME PROPERTY STRINGS AUTO SHARED STATIC)
string(TOUPPER "${RJ_SANITIZER_RUNTIME}" RJ_SANITIZER_RUNTIME)
set(_rj_sanitizer_runtime_values AUTO SHARED STATIC)
if(NOT RJ_SANITIZER_RUNTIME IN_LIST _rj_sanitizer_runtime_values)
message(
FATAL_ERROR
"RJ_SANITIZER_RUNTIME must be AUTO, SHARED, or STATIC; got "
"'${RJ_SANITIZER_RUNTIME}'."
)
endif()
unset(_rj_sanitizer_runtime_values)
option(RJ_CLANG_TIDY "Enable clang-tidy static analysis" OFF)
option(
RJ_ENABLE_EXPENSIVE_CHECKS
"Enable expensive exhaustive test suites (MFMA/WMMA SIMD bit-exactness)"
OFF
)
option(RJ_INSTALL_TESTS "Install rocjitsu test binaries" OFF)
option(
LTO
"Enable link-time optimization (IPO) for Release / RelWithDebInfo"
OFF
)
set(_rj_sanitizer_kinds)
if(RJ_ENABLE_ASAN)
list(APPEND _rj_sanitizer_kinds address)
endif()
if(RJ_ENABLE_UBSAN)
list(APPEND _rj_sanitizer_kinds undefined)
endif()
if(RJ_ENABLE_TSAN)
list(APPEND _rj_sanitizer_kinds thread)
endif()
if(RJ_ENABLE_MSAN)
list(APPEND _rj_sanitizer_kinds memory)
endif()
list(LENGTH _rj_sanitizer_kinds _rj_sanitizer_count)
set(RJ_SANITIZER_USE_SHARED OFF)
if(LTO)
if(_rj_sanitizer_count GREATER 0)
message(FATAL_ERROR "LTO is incompatible with sanitizers. Disable one.")
endif()
include(CheckIPOSupported)
check_ipo_supported(RESULT _rj_ipo_ok OUTPUT _rj_ipo_err)
if(_rj_ipo_ok)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON)
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELWITHDEBINFO ON)
# Force parallel LTO. CMake's default IPO flag is a bare `-flto`, which
# makes GCC serialize LTRANS (warns: "using serial compilation of N
# LTRANS jobs"). Override per compiler:
# GCC : -flto=auto — partition across all host cores.
# Clang : -flto=thin — ThinLTO is parallel by design.
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(_rj_lto_flag "-flto=auto")
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(_rj_lto_flag "-flto=thin")
else()
set(_rj_lto_flag "")
endif()
if(_rj_lto_flag)
add_compile_options(
$<$<CONFIG:Release>:${_rj_lto_flag}>
$<$<CONFIG:RelWithDebInfo>:${_rj_lto_flag}>
)
add_link_options(
$<$<CONFIG:Release>:${_rj_lto_flag}>
$<$<CONFIG:RelWithDebInfo>:${_rj_lto_flag}>
)
endif()
message(
STATUS
"LTO enabled for Release and RelWithDebInfo (flag: ${_rj_lto_flag})"
)
else()
message(WARNING "LTO requested but IPO not supported: ${_rj_ipo_err}")
endif()
endif()
if(_rj_sanitizer_count GREATER 0)
if(
thread IN_LIST _rj_sanitizer_kinds
AND (
address IN_LIST _rj_sanitizer_kinds
OR memory IN_LIST _rj_sanitizer_kinds
)
)
message(
FATAL_ERROR
"ThreadSanitizer can not be combined with address or memory sanitizers"
)
endif()
if(memory IN_LIST _rj_sanitizer_kinds AND _rj_sanitizer_count GREATER 1)
message(
FATAL_ERROR
"MemorySanitizer cannot be combined with other sanitizers"
)
endif()
list(JOIN _rj_sanitizer_kinds "," _rj_sanitizer_arg)
set(RJ_SANITIZER_COMPILE_OPTIONS)
set(RJ_SANITIZER_LINK_OPTIONS)
set(RJ_SANITIZER_SHARED_LIBRARIES)
set(RJ_ASAN_SHARED_LIBRARY "")
set(RJ_TSAN_SHARED_LIBRARY "")
message(STATUS "Sanitizer enabled: ${_rj_sanitizer_arg}")
if(MSVC)
# MSVC only supports AddressSanitizer; ubsan/tsan/msan are GCC/Clang-only.
if(_rj_sanitizer_arg STREQUAL "address")
list(APPEND RJ_SANITIZER_COMPILE_OPTIONS /fsanitize=address)
add_compile_options(${RJ_SANITIZER_COMPILE_OPTIONS})
# /INCREMENTAL:NO is required when using MSVC ASAN.
add_link_options(/INCREMENTAL:NO)
else()
message(FATAL_ERROR "Only RJ_ENABLE_ASAN is supported by MSVC.")
endif()
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|AppleClang")
if(
memory IN_LIST _rj_sanitizer_kinds
AND NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang"
)
message(FATAL_ERROR "MemorySanitizer requires Clang.")
endif()
if(RJ_SANITIZER_RUNTIME STREQUAL "SHARED")
if(memory IN_LIST _rj_sanitizer_kinds)
message(
FATAL_ERROR
"MemorySanitizer has no supported shared runtime; use "
"RJ_SANITIZER_RUNTIME=AUTO or STATIC."
)
endif()
set(RJ_SANITIZER_USE_SHARED ON)
elseif(
RJ_SANITIZER_RUNTIME STREQUAL "AUTO"
AND NOT memory IN_LIST _rj_sanitizer_kinds
)
set(RJ_SANITIZER_USE_SHARED ON)
endif()
if(RJ_SANITIZER_USE_SHARED)
message(STATUS "Sanitizer runtime linkage: shared")
else()
message(STATUS "Sanitizer runtime linkage: static")
endif()
list(APPEND RJ_SANITIZER_COMPILE_OPTIONS "-fno-sanitize-recover=all")
list(
APPEND RJ_SANITIZER_COMPILE_OPTIONS
-fsanitize=${_rj_sanitizer_arg}
)
list(APPEND RJ_SANITIZER_LINK_OPTIONS -fsanitize=${_rj_sanitizer_arg})
if(
address IN_LIST _rj_sanitizer_kinds
OR undefined IN_LIST _rj_sanitizer_kinds
OR memory IN_LIST _rj_sanitizer_kinds
)
list(APPEND RJ_SANITIZER_COMPILE_OPTIONS -fno-omit-frame-pointer)
endif()
if(address IN_LIST _rj_sanitizer_kinds)
# GCC 13+ emits false-positive -Wmaybe-uninitialized in std_function.h
# when ASAN is enabled. Suppress to avoid -Werror failures.
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options(-Wno-maybe-uninitialized)
endif()
endif()
if(RJ_SANITIZER_USE_SHARED)
rj_find_sanitizer_shared_libraries(
RJ_SANITIZER_SHARED_LIBRARIES
RJ_ASAN_SHARED_LIBRARY
RJ_TSAN_SHARED_LIBRARY
COMPILER ${CMAKE_CXX_COMPILER}
COMPILER_ARG1 "${CMAKE_CXX_COMPILER_ARG1}"
COMPILER_ID "${CMAKE_CXX_COMPILER_ID}"
SYSTEM_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}"
SANITIZERS ${_rj_sanitizer_kinds}
)
foreach(
_rj_sanitizer_shared_library
IN
LISTS RJ_SANITIZER_SHARED_LIBRARIES
)
message(
STATUS
"Sanitizer shared runtime: ${_rj_sanitizer_shared_library}"
)
endforeach()
endif()
rj_sanitizer_runtime_link_options(
_rj_sanitizer_runtime_link_options
COMPILER_ID "${CMAKE_CXX_COMPILER_ID}"
SHARED "${RJ_SANITIZER_USE_SHARED}"
SHARED_LIBRARIES ${RJ_SANITIZER_SHARED_LIBRARIES}
SANITIZERS ${_rj_sanitizer_kinds}
)
list(
APPEND RJ_SANITIZER_LINK_OPTIONS
${_rj_sanitizer_runtime_link_options}
)
add_compile_options(${RJ_SANITIZER_COMPILE_OPTIONS})
add_link_options(${RJ_SANITIZER_LINK_OPTIONS})
unset(_rj_sanitizer_shared_library)
unset(_rj_sanitizer_runtime_link_options)
else()
message(
FATAL_ERROR
"Sanitizers are not supported for compiler '${CMAKE_CXX_COMPILER_ID}'."
)
endif()
unset(_rj_sanitizer_arg)
endif()
unset(_rj_sanitizer_count)
unset(_rj_sanitizer_kinds)
if(RJ_CLANG_TIDY)
find_program(CLANG_TIDY_EXE NAMES clang-tidy)
if(CLANG_TIDY_EXE)
message(STATUS "clang-tidy found: ${CLANG_TIDY_EXE}")
set(CMAKE_CXX_CLANG_TIDY "${CLANG_TIDY_EXE}")
else()
message(WARNING "clang-tidy not found, RJ_CLANG_TIDY ignored")
endif()
endif()
# Third-party dependencies (fetched into third_party/).
# Third-party dependencies (fetched into third_party/).
# Third-party dependencies (fetched into third_party/ by default).
# Override with -DFETCHCONTENT_BASE_DIR=/path for container builds.
if(NOT FETCHCONTENT_BASE_DIR)
set(FETCHCONTENT_BASE_DIR ${PROJECT_SOURCE_DIR}/third_party)
endif()
include(FetchContent)
# Google Test
FetchContent_Declare(
googletest
GIT_REPOSITORY https://github.com/google/googletest.git
GIT_TAG v1.15.2
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
# FlatBuffers - serialization for config, checkpoint, and wire format.
FetchContent_Declare(
flatbuffers
GIT_REPOSITORY https://github.com/google/flatbuffers.git
GIT_TAG v24.3.25
)
set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(FLATBUFFERS_INSTALL OFF CACHE BOOL "" FORCE)
set(FLATBUFFERS_BUILD_FLATLIB ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest flatbuffers)
include(rj_flatbuffers)
# Set include paths before adding subdirectories so all targets can find them.
set(ROCJITSU_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/lib/rocjitsu/include)
set(ROCJITSU_SRC_DIR ${PROJECT_SOURCE_DIR}/lib/rocjitsu/src)
# Libraries
add_subdirectory(lib/util)
add_subdirectory(lib/simdojo)
add_subdirectory(lib/rocjitsu)
add_subdirectory(lib/rocjitsu/src/rocjitsu/vm/plugins)
# Main shared library - assembles all object libraries.
add_library(rocjitsu_shared SHARED)
set_target_properties(rocjitsu_shared PROPERTIES OUTPUT_NAME rocjitsu)
target_link_libraries(
rocjitsu_shared
PRIVATE
rocjitsu_analysis
rocjitsu_code
rocjitsu_isa
rocjitsu_isa_registry
simdojo
rocjitsu_kmd
rocjitsu_vm
rocjitsu_vm_amdgpu
# Host-side plugin loader. The logging/race plugins are no longer
# linked in statically; they are separate librocjitsu_plugin_<name>.so
# modules discovered and dlopen()ed at runtime.
rocjitsu_plugin_loader
rocjitsu_vm_risc_v
rocjitsu_config
rocjitsu_dbt_config
util
flatbuffers
Threads::Threads
)
target_include_directories(
rocjitsu_shared
PRIVATE ${ROCJITSU_INCLUDE_DIR} ${ROCJITSU_SRC_DIR} ${GENERATED_DIR}
)
target_include_directories(rocjitsu_shared SYSTEM PRIVATE ${HSA_INCLUDE_DIR})
# Linux-only: KMD interposer (LD_PRELOAD shim) and its dependencies.
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_sources(
rocjitsu_shared
PRIVATE ${ROCJITSU_SRC_DIR}/rocjitsu/kmd/linux/interposer.cpp
)
target_include_directories(rocjitsu_shared PRIVATE ${DRM_INCLUDE_DIR})
target_compile_definitions(rocjitsu_shared PRIVATE _GNU_SOURCE)
target_link_libraries(rocjitsu_shared PRIVATE dl)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
target_link_options(rocjitsu_shared PRIVATE "LINKER:--exclude-libs,ALL")
endif()
add_dependencies(rocjitsu_shared flatbuffers_schemas)
# Developer and test workflow tools.
add_subdirectory(tools)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
add_subdirectory(tools/rocjitsu)
endif()
# Tests and scaling tools.
if(BUILD_TESTING)
add_subdirectory(tests)
endif()
# ---------------------------------------------------------------------------
# Install rules.
# ---------------------------------------------------------------------------
# Public headers: include/rocjitsu/
install(
DIRECTORY lib/rocjitsu/include/rocjitsu
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
FILES_MATCHING
PATTERN "*.h"
)
# Libraries: lib/
install(
TARGETS rocjitsu_shared rocjitsu_hooks
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
install(
TARGETS hsa_hotswap_rocjitsu
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
install(TARGETS rocjitsu_bin RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
# Config files and schemas: share/rocjitsu/
install(
DIRECTORY configs/
DESTINATION ${CMAKE_INSTALL_DATADIR}/rocjitsu/configs
)
install(
DIRECTORY schemas/
DESTINATION ${CMAKE_INSTALL_DATADIR}/rocjitsu/schemas
FILES_MATCHING
PATTERN "*.fbs"
)