diff --git a/llvm/test/CMakeLists.txt b/llvm/test/CMakeLists.txt --- a/llvm/test/CMakeLists.txt +++ b/llvm/test/CMakeLists.txt @@ -221,6 +221,11 @@ ) set_target_properties(check-llvm PROPERTIES FOLDER "Tests") +if(TARGET check-typeid-visibility) + add_dependencies(check-llvm check-typeid-visibility) +endif() + + add_lit_testsuites(LLVM ${CMAKE_CURRENT_SOURCE_DIR} ${exclude_from_check_all} DEPENDS ${LLVM_TEST_DEPENDS} diff --git a/llvm/tools/llvm-shlib/CMakeLists.txt b/llvm/tools/llvm-shlib/CMakeLists.txt --- a/llvm/tools/llvm-shlib/CMakeLists.txt +++ b/llvm/tools/llvm-shlib/CMakeLists.txt @@ -72,6 +72,18 @@ if(TARGET libLLVMExports) add_dependencies(LLVM libLLVMExports) endif() + set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) + + if(UNIX) + # This checks that no instanciation of llvm::Any::TypeId ends up with + # hidden visibility. This happens if llvm::Any is used with hidden types. + add_custom_target(check-typeid-visibility + COMMAND nm -C ${LIB_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}LLVM-${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}${CMAKE_SHARED_LIBRARY_SUFFIX} | ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/not grep -E '[wW] llvm::Any::TypeId' + DEPENDS LLVM not + WORKING_DIRECTORY ${LIB_DIR} + COMMENT "Checking llvm::Any::TypeId visibility") + endif() + endif() if(LLVM_BUILD_LLVM_C_DYLIB AND NOT MSVC)