This patch adds code generation for RISCV64 instrumentation.The work
involved includes the following three points:
a) Implements support for instrumenting direct function call and jump
on RISC-V which relies on , Atomic instructions
(used to increment counters) are only available on RISC-V when the A
extension is used.
b) Implements support for instrumenting direct function inderect call
by implementing the createInstrumentedIndCallHandlerEntryBB and
createInstrumentedIndCallHandlerExitBB interfaces. In this process, we
need to accurately record the target address and IndCallID to ensure
the correct recording of the indirect call counters.
c)Implemented the RISCV64 Bolt runtime library, implemented some system
call interfaces through embedded assembly. Get the difference between
runtime addrress of .text section andstatic address in section header
table, which in turn can be used to search for indirect call
description.
However, the community code currently has problems with relocation in
some scenarios, but this has nothing to do with instrumentation. We
may continue to submit patches to fix the related bugs.
82 lines
3.0 KiB
CMake
82 lines
3.0 KiB
CMake
cmake_minimum_required(VERSION 3.20.0)
|
|
include(CheckCXXCompilerFlag)
|
|
include(CheckIncludeFiles)
|
|
include(GNUInstallDirs)
|
|
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
set(CMAKE_CXX_STANDARD 17)
|
|
|
|
project(libbolt_rt_project)
|
|
|
|
check_include_files(elf.h HAVE_ELF_H)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h)
|
|
|
|
add_library(bolt_rt_instr STATIC
|
|
instr.cpp
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h
|
|
)
|
|
set_target_properties(bolt_rt_instr PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "lib${LLVM_LIBDIR_SUFFIX}")
|
|
add_library(bolt_rt_hugify STATIC
|
|
hugify.cpp
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h
|
|
)
|
|
set_target_properties(bolt_rt_hugify PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "lib${LLVM_LIBDIR_SUFFIX}")
|
|
|
|
if(NOT BOLT_BUILT_STANDALONE)
|
|
add_custom_command(TARGET bolt_rt_instr POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/libbolt_rt_instr.a" "${LLVM_LIBRARY_DIR}")
|
|
add_custom_command(TARGET bolt_rt_hugify POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/libbolt_rt_hugify.a" "${LLVM_LIBRARY_DIR}")
|
|
endif()
|
|
|
|
set(BOLT_RT_FLAGS
|
|
-ffreestanding
|
|
-fno-exceptions
|
|
-fno-rtti
|
|
-fno-stack-protector
|
|
-fPIC)
|
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
|
|
set(BOLT_RT_FLAGS ${BOLT_RT_FLAGS}
|
|
-mno-sse
|
|
-mgeneral-regs-only)
|
|
endif()
|
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64")
|
|
set(BOLT_RT_FLAGS ${BOLT_RT_FLAGS})
|
|
endif()
|
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
|
|
check_cxx_compiler_flag("-mno-outline-atomics" CXX_SUPPORTS_OUTLINE_ATOMICS)
|
|
if (CXX_SUPPORTS_OUTLINE_ATOMICS)
|
|
set(BOLT_RT_FLAGS ${BOLT_RT_FLAGS}
|
|
-mno-outline-atomics
|
|
-mgeneral-regs-only)
|
|
endif()
|
|
endif()
|
|
|
|
# Don't let the compiler think it can create calls to standard libs
|
|
target_compile_options(bolt_rt_instr PRIVATE ${BOLT_RT_FLAGS})
|
|
target_include_directories(bolt_rt_instr PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
target_compile_options(bolt_rt_hugify PRIVATE ${BOLT_RT_FLAGS})
|
|
target_include_directories(bolt_rt_hugify PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
|
|
install(TARGETS bolt_rt_instr DESTINATION "lib${LLVM_LIBDIR_SUFFIX}")
|
|
install(TARGETS bolt_rt_hugify DESTINATION "lib${LLVM_LIBDIR_SUFFIX}")
|
|
|
|
if (CMAKE_CXX_COMPILER_ID MATCHES ".*Clang.*" AND CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
add_library(bolt_rt_instr_osx STATIC
|
|
instr.cpp
|
|
${CMAKE_CURRENT_BINARY_DIR}/config.h
|
|
)
|
|
set_target_properties(bolt_rt_instr_osx PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "lib${LLVM_LIBDIR_SUFFIX}")
|
|
target_include_directories(bolt_rt_instr_osx PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
|
|
target_compile_options(bolt_rt_instr_osx PRIVATE
|
|
-target x86_64-apple-darwin19.6.0
|
|
${BOLT_RT_FLAGS})
|
|
install(TARGETS bolt_rt_instr_osx DESTINATION "lib${LLVM_LIBDIR_SUFFIX}")
|
|
|
|
if(NOT BOLT_BUILT_STANDALONE)
|
|
add_custom_command(TARGET bolt_rt_instr_osx POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/libbolt_rt_instr_osx.a" "${LLVM_LIBRARY_DIR}")
|
|
endif()
|
|
endif()
|