################################################################################ ## Copyright (c) 2022 Advanced Micro Devices, Inc. ## ## Permission is hereby granted, free of charge, to any person obtaining a copy ## of this software and associated documentation files (the "Software"), to ## deal in the Software without restriction, including without limitation the ## rights to use, copy, modify, merge, publish, distribute, sublicense, and/or ## sell copies of the Software, and to permit persons to whom the Software is ## furnished to do so, subject to the following conditions: ## ## The above copyright notice and this permission notice shall be included in ## all copies or substantial portions of the Software. ## ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ## FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ## IN THE SOFTWARE. ################################################################################ # Plugin shared object. add_library(ctf_plugin SHARED ctf.cpp plugin.cpp barectf.c "${CMAKE_CURRENT_BINARY_DIR}/barectf.h" ${PROJECT_SOURCE_DIR}/src/utils/helper.cpp hsa_begin.cpp.i hsa_end.cpp.i hip_begin.cpp.i hip_end.cpp.i) set_target_properties(ctf_plugin PROPERTIES CXX_VISIBILITY_PRESET hidden LINK_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/../exportmap" LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}") set(METADATA_STREAM_FILE_DIR "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/plugin/ctf") target_compile_definitions(ctf_plugin PUBLIC AMD_INTERNAL_BUILD PRIVATE HIP_PROF_HIP_API_STRING=1 __HIP_PLATFORM_HCC__=1 CTF_PLUGIN_METADATA_FILE_PATH="${CMAKE_INSTALL_PREFIX}/${METADATA_STREAM_FILE_DIR}/metadata") target_include_directories(ctf_plugin PRIVATE "${PROJECT_SOURCE_DIR}" "${CMAKE_BINARY_DIR}/src/api" "${CMAKE_CURRENT_BINARY_DIR}") target_link_options(ctf_plugin PRIVATE "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/../exportmap" -Wl,--no-undefined) target_link_libraries(ctf_plugin PRIVATE rocprofiler-v2 hsa-runtime64::hsa-runtime64 stdc++fs dl) install(TARGETS ctf_plugin LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}/${PROJECT_NAME}" COMPONENT plugins) # `gen_api_files.py` and `gen_env_yaml.py` require Python 3, # CppHeaderParser, PyYAML, and barectf. find_package(Python3 COMPONENTS Interpreter REQUIRED) message("Python: ${Python3_EXECUTABLE})") execute_process(COMMAND Python3::Interpreter -c "print('hello')") function(check_py3_pkg pkg_name) execute_process(COMMAND "${Python3_EXECUTABLE}" -c "import ${pkg_name}" RESULT_VARIABLE PY3_IMPORT_RES OUTPUT_QUIET) if(NOT (${PY3_IMPORT_RES} EQUAL 0)) message(FATAL_ERROR "Cannot find Python 3 package `${pkg_name}`") endif() message(STATUS "Found Python 3 package `${pkg_name}`") endfunction() check_py3_pkg(CppHeaderParser) check_py3_pkg(yaml) find_program(BARECTF_RES barectf REQUIRED HINTS "$ENV{HOME}/.local/bin") # Generate barectf YAML and C++ files for HSA API. get_property(HSA_RUNTIME_INCLUDE_DIRS TARGET hsa-runtime64::hsa-runtime64 PROPERTY INTERFACE_INCLUDE_DIRECTORIES) find_file(HSA_H hsa.h PATHS ${HSA_RUNTIME_INCLUDE_DIRS} PATH_SUFFIXES hsa NO_DEFAULT_PATH REQUIRED) get_filename_component(HSA_RUNTIME_INC_PATH "${HSA_H}" DIRECTORY) add_custom_command( OUTPUT hsa_erts.yaml hsa_begin.cpp.i hsa_end.cpp.i COMMAND ${CMAKE_C_COMPILER} -E "${HSA_RUNTIME_INC_PATH}/hsa.h" -o hsa.h.i COMMAND ${CMAKE_C_COMPILER} -E "${HSA_RUNTIME_INC_PATH}/hsa_ext_amd.h" -o hsa_ext_amd.h.i COMMAND ${CMAKE_COMMAND} -E cat hsa.h.i hsa_ext_amd.h.i "${CMAKE_BINARY_DIR}/src/api/hsa_prof_str.h" > hsa_input.h COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/gen_api_files.py" hsa hsa_input.h BYPRODUCTS hsa.h.i hsa_ext_amd.h.i hsa_input.h DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/gen_api_files.py" "${HSA_RUNTIME_INC_PATH}/hsa.h" "${HSA_RUNTIME_INC_PATH}/hsa_ext_amd.h" "${CMAKE_BINARY_DIR}/src/api/hsa_prof_str.h" COMMENT "Generating HSA API files for the `ctf` plugin...") # Generate barectf YAML and C++ files for HIP API. get_property(HIP_INCLUDE_DIRS TARGET hip::amdhip64 PROPERTY INTERFACE_INCLUDE_DIRECTORIES) find_file(HIP_RUNTIME_API_H hip_runtime_api.h PATHS ${HIP_INCLUDE_DIRS} PATH_SUFFIXES hip NO_DEFAULT_PATH REQUIRED) find_file(HIP_PROF_STR_H hip_prof_str.h PATHS ${HIP_INCLUDE_DIRS} PATH_SUFFIXES hip hip/amd_detail NO_DEFAULT_PATH REQUIRED) list(TRANSFORM HIP_INCLUDE_DIRS PREPEND -I) add_custom_command( OUTPUT hip_erts.yaml hip_begin.cpp.i hip_end.cpp.i COMMAND ${CMAKE_C_COMPILER} ${HIP_INCLUDE_DIRS} -E "${HIP_RUNTIME_API_H}" -D__HIP_PLATFORM_HCC__=1 -D__HIP_ROCclr__=1 -o hip_runtime_api.h.i COMMAND cat hip_runtime_api.h.i "${HIP_PROF_STR_H}" > hip_input.h BYPRODUCTS hip_runtime_api.h.i hip_input.h COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/gen_api_files.py" hip hip_input.h DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/gen_api_files.py" "${HIP_RUNTIME_API_H}" "${HIP_PROF_STR_H}" COMMENT "Generating HIP API files for the `ctf` plugin...") # Generate `env.yaml` (trace environment for barectf). add_custom_command( OUTPUT env.yaml COMMAND "${Python3_EXECUTABLE}" "${CMAKE_CURRENT_SOURCE_DIR}/gen_env_yaml.py" ${PROJECT_VERSION} DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/gen_env_yaml.py" COMMENT "Generating `env.yaml`...") # Generate raw CTF tracer with barectf. add_custom_command( OUTPUT barectf.c barectf.h barectf-bitfield.h metadata COMMAND "${BARECTF_RES}" gen "-I${CMAKE_CURRENT_BINARY_DIR}" "-I${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/config.yaml" DEPENDS hsa_erts.yaml hip_erts.yaml env.yaml "${CMAKE_CURRENT_SOURCE_DIR}/config.yaml" "${CMAKE_CURRENT_SOURCE_DIR}/dst_base.yaml" COMMENT "Generating raw CTF tracer with barectf...") install(FILES "${CMAKE_CURRENT_BINARY_DIR}/metadata" DESTINATION "${METADATA_STREAM_FILE_DIR}" COMPONENT plugins)