Skip to content

Commit f80885e

Browse files
committed
[DeviceSanitizer] Fix libstdc++ and libc++ mismatch problem
UR will force link with libstdc++, but in in-tree build, if LLVM is built with libc++, this will cause mismatch problem. So, in such case, we need to build symbolizer.cpp with libc++ abi and link libc++ in.
1 parent 40a790f commit f80885e

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

source/loader/CMakeLists.txt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,26 @@ if(UR_ENABLE_SANITIZER)
167167
)
168168
target_include_directories(ur_loader PRIVATE ${LLVM_INCLUDE_DIRS})
169169
target_link_libraries(ur_loader PRIVATE LLVMSupport LLVMSymbolize)
170+
# In in-tree build, if LLVM is built with libc++, we also need to build
171+
# symbolizer.cpp with libc++ abi and link libc++ in.
172+
if(NOT CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR AND LLVM_LIBCXX_USED)
173+
execute_process(
174+
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name=libc++.a
175+
OUTPUT_VARIABLE LIBCXX_PATH
176+
OUTPUT_STRIP_TRAILING_WHITESPACE)
177+
execute_process(
178+
COMMAND ${CMAKE_CXX_COMPILER} --print-file-name=libc++abi.a
179+
OUTPUT_VARIABLE LIBCXX_ABI_PATH
180+
OUTPUT_STRIP_TRAILING_WHITESPACE)
181+
set_property(SOURCE
182+
${CMAKE_CURRENT_SOURCE_DIR}/layers/sanitizer/linux/symbolizer.cpp
183+
APPEND_STRING PROPERTY COMPILE_FLAGS
184+
" -stdlib=libc++ ")
185+
if(NOT EXISTS ${LIBCXX_PATH} OR NOT EXISTS ${LIBCXX_ABI_PATH})
186+
message(FATAL_ERROR "libc++ is required but can't find the libraries")
187+
endif()
188+
target_link_libraries(ur_loader PRIVATE ${LIBCXX_PATH} ${LIBCXX_ABI_PATH})
189+
endif()
170190
endif()
171191

172192
target_include_directories(ur_loader PRIVATE

0 commit comments

Comments
 (0)