Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions sycl/cmake/modules/BuildUnifiedRuntime.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,15 @@ if(TARGET UnifiedRuntimeLoader)
ARCHIVE DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT unified-runtime-loader
RUNTIME DESTINATION "bin" COMPONENT unified-runtime-loader
)

# The loader dlopen()s its shared layers from its own directory, so they have
# to be installed alongside it.
if(TARGET ur_sanitizer_layer)
install(TARGETS ur_sanitizer_layer
LIBRARY DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" COMPONENT unified-runtime-loader
RUNTIME DESTINATION "bin" COMPONENT unified-runtime-loader
)
endif()
endif()

add_custom_target(UnifiedRuntimeAdapters)
Expand Down
92 changes: 4 additions & 88 deletions unified-runtime/source/loader/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -163,98 +163,14 @@ if(UR_ENABLE_TRACING)
endif()

if(UR_ENABLE_SANITIZER)
# The sanitizer layer is a shared library of its own that the loader loads on
# demand through a proxy - see layers/ur_shared_layer.hpp.
target_sources(ur_loader
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../ur/ur.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_allocator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_allocator.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_buffer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_buffer.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_ddi.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_ddi.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_interceptor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_interceptor.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_libdevice.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_quarantine.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_quarantine.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_report.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_report.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_shadow.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_shadow.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_statistics.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_statistics.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_validator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/asan/asan_validator.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_allocator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_allocator.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_buffer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_buffer.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_ddi.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_ddi.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_interceptor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_interceptor.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_libdevice.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_origin.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_report.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_report.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_shadow.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/msan/msan_shadow.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_buffer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_buffer.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_ddi.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_ddi.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_interceptor.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_interceptor.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_libdevice.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_report.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_report.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_shadow.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/tsan/tsan_shadow.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/linux/backtrace.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/linux/sanitizer_utils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_allocator.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_allocator.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_common.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_libdevice.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_options.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_options.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_stackdepot.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_stackdepot.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_stacktrace.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_stacktrace.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_utils.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/sanitizer_utils.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/ur_sanddi.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/ur_sanitizer_layer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/ur_sanitizer_layer.hpp
${CMAKE_CURRENT_SOURCE_DIR}/layers/ur_shared_layer.cpp
)

if(UR_ENABLE_SYMBOLIZER)
set(symbolizer_sources
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/sanitizer_common/linux/symbolizer.cpp
)
target_sources(ur_loader
PRIVATE ${symbolizer_sources}
)
target_include_directories(ur_loader PRIVATE ${LLVM_INCLUDE_DIRS})
target_link_libraries(ur_loader PRIVATE LLVMSupport LLVMSymbolize)
target_compile_definitions(ur_loader PRIVATE UR_HAVE_SYMBOLIZER)
# In in-tree build, if LLVM is built with libc++, we also need to build
# symbolizer.cpp with libc++ abi and link libc++ in.
if(NOT UR_STANDALONE_BUILD AND LLVM_LIBCXX_USED)
set_property(SOURCE
${symbolizer_sources}
APPEND_STRING PROPERTY COMPILE_FLAGS
" -stdlib=libc++ ")
# Link with gcc_s fisrt to avoid some symbols resolve to libc++/libc++abi/libunwind's one
target_link_libraries(ur_loader PRIVATE gcc_s ${LIBCXX_PATH} ${LIBCXX_ABI_PATH})
endif()
endif()

target_include_directories(ur_loader PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer"
"${CMAKE_CURRENT_SOURCE_DIR}/../"
)
add_subdirectory(layers/sanitizer)
endif()

if(WIN32)
Expand Down
119 changes: 119 additions & 0 deletions unified-runtime/source/loader/layers/sanitizer/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# A shared library rather than a part of the loader, so that all loader
# instances of a process share one instance of it - see ur_shared_layer.hpp.
# Loaded on demand from the same locations an adapter is, and exports nothing
# but urLoaderLayerGetInterface, which keeps the LLVM symbolizer private too.

add_ur_library(ur_sanitizer_layer SHARED
${PROJECT_SOURCE_DIR}/source/ur/ur.cpp
asan/asan_allocator.cpp
asan/asan_buffer.cpp
asan/asan_ddi.cpp
asan/asan_interceptor.cpp
asan/asan_quarantine.cpp
asan/asan_report.cpp
asan/asan_shadow.cpp
asan/asan_statistics.cpp
asan/asan_validator.cpp
msan/msan_allocator.cpp
msan/msan_buffer.cpp
msan/msan_ddi.cpp
msan/msan_interceptor.cpp
msan/msan_report.cpp
msan/msan_shadow.cpp
tsan/tsan_buffer.cpp
tsan/tsan_ddi.cpp
tsan/tsan_interceptor.cpp
tsan/tsan_report.cpp
tsan/tsan_shadow.cpp
sanitizer_common/linux/backtrace.cpp
sanitizer_common/linux/sanitizer_utils.cpp
sanitizer_common/sanitizer_allocator.cpp
sanitizer_common/sanitizer_options.cpp
sanitizer_common/sanitizer_stackdepot.cpp
sanitizer_common/sanitizer_stacktrace.cpp
sanitizer_common/sanitizer_utils.cpp
ur_sanddi.cpp
ur_sanitizer_layer.cpp
ur_sanitizer_layer_entry.cpp
)
install_ur_library(ur_sanitizer_layer)

target_include_directories(ur_sanitizer_layer PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/source
${PROJECT_SOURCE_DIR}/source/loader
${PROJECT_SOURCE_DIR}/source/loader/layers
)

target_link_libraries(ur_sanitizer_layer PRIVATE
${PROJECT_NAME}::common
${PROJECT_NAME}::headers
)

set_target_properties(ur_sanitizer_layer PROPERTIES
VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
SOVERSION "${PROJECT_VERSION_MAJOR}"
# BUILD_WITH_INSTALL_RPATH is intentionally not set, see
# source/adapters/CMakeLists.txt.
INSTALL_RPATH "\$ORIGIN"
)

target_link_options(ur_sanitizer_layer PRIVATE
"-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/sanitizer_layer.map"
)

if(UR_ENABLE_SYMBOLIZER)
target_sources(ur_sanitizer_layer PRIVATE
sanitizer_common/linux/symbolizer.cpp
)
target_compile_definitions(ur_sanitizer_layer PRIVATE UR_HAVE_SYMBOLIZER)
target_include_directories(ur_sanitizer_layer PRIVATE ${LLVM_INCLUDE_DIRS})
target_link_libraries(ur_sanitizer_layer PRIVATE LLVMSupport LLVMSymbolize)

# The symbolizer dependencies may emit calls to
# _intel_fast_memcpy/_intel_fast_memset, normally provided by libirc, which
# this library doesn't link. The stubs forward to plain memcpy/memset.
if(CMAKE_C_COMPILER_ID STREQUAL "IntelLLVM")
if(MSVC)
set(_no_intel_lib_flag -Qno-intel-lib=libirc)
else()
set(_no_intel_lib_flag -no-intel-lib=libirc)
endif()
set_source_files_properties(
${PROJECT_SOURCE_DIR}/source/loader/intel_fast_mem_stub.c
PROPERTIES COMPILE_OPTIONS "${_no_intel_lib_flag}")
target_sources(ur_sanitizer_layer PRIVATE
${PROJECT_SOURCE_DIR}/source/loader/intel_fast_mem_stub.c
)
endif()

# In an in-tree build, if LLVM is built with libc++, symbolizer.cpp has to
# be built against libc++ as well and libc++ linked in.
if(NOT UR_STANDALONE_BUILD AND LLVM_LIBCXX_USED)
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name=libc++.a
OUTPUT_VARIABLE LIBCXX_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name=libc++abi.a
OUTPUT_VARIABLE LIBCXX_ABI_PATH
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT EXISTS ${LIBCXX_PATH} OR NOT EXISTS ${LIBCXX_ABI_PATH})
message(FATAL_ERROR "libc++ is required but can't find the libraries")
endif()
set_property(SOURCE
${CMAKE_CURRENT_SOURCE_DIR}/sanitizer_common/linux/symbolizer.cpp
APPEND_STRING PROPERTY COMPILE_FLAGS " -stdlib=libc++ ")
# Link with gcc_s first to avoid some symbols resolving to
# libc++/libc++abi/libunwind's one
target_link_libraries(ur_sanitizer_layer PRIVATE
gcc_s ${LIBCXX_PATH} ${LIBCXX_ABI_PATH})
endif()
endif()

# Loaded at runtime, so there is no link time dependency to pull it in.
add_dependencies(ur_loader ur_sanitizer_layer)
Original file line number Diff line number Diff line change
Expand Up @@ -2108,9 +2108,6 @@ ur_result_t urCheckVersion(ur_api_version_t version) {
} // namespace asan

ur_result_t initAsanDDITable(ur_dditable_t *dditable) {

UR_LOG_L(getContext()->logger, QUIET, "==== DeviceSanitizer: ASAN");

ur_result_t result =
ur_sanitizer_layer::asan::urCheckVersion(UR_API_VERSION_CURRENT);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2085,8 +2085,6 @@ ur_result_t urCheckVersion(ur_api_version_t version) {
ur_result_t initMsanDDITable(ur_dditable_t *dditable) {
ur_result_t result = UR_RESULT_SUCCESS;

UR_LOG_L(getContext()->logger, QUIET, "==== DeviceSanitizer: MSAN");

if (UR_RESULT_SUCCESS == result) {
result = ur_sanitizer_layer::msan::urCheckVersion(UR_API_VERSION_CURRENT);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
global:
urLoaderLayerGetInterface;
local:
*;
};
Original file line number Diff line number Diff line change
Expand Up @@ -1704,8 +1704,6 @@ ur_result_t urGetIPCExpProcAddrTable(
ur_result_t initTsanDDITable(ur_dditable_t *dditable) {
ur_result_t result = UR_RESULT_SUCCESS;

UR_LOG_L(getContext()->logger, QUIET, "==== DeviceSanitizer: TSAN");

if (UR_RESULT_SUCCESS == result) {
result = ur_sanitizer_layer::tsan::urCheckVersion(UR_API_VERSION_CURRENT);
}
Expand Down
15 changes: 15 additions & 0 deletions unified-runtime/source/loader/layers/sanitizer/ur_sanddi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,4 +60,19 @@ ur_result_t context_t::init(ur_dditable_t *dditable,
return UR_RESULT_SUCCESS;
}

ur_result_t context_t::interceptDdiTable(ur_dditable_t *dditable) {
switch (enabledType) {
case SanitizerType::AddressSanitizer:
return initAsanDDITable(dditable);
case SanitizerType::MemorySanitizer:
return initMsanDDITable(dditable);
case SanitizerType::ThreadSanitizer:
return initTsanDDITable(dditable);
default:
break;
}

return UR_RESULT_SUCCESS;
}

} // namespace ur_sanitizer_layer
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ class __urdlllocal context_t : public proxy_layer_context_t,
const std::set<std::string> &enabledLayerNames,
codeloc_data codelocData) override;

/// @brief Hook up one more ddi table to the already initialized sanitizer.
ur_result_t interceptDdiTable(ur_dditable_t *dditable);

ur_result_t tearDown() override;
};

Expand Down
Loading
Loading