Index: llvm/test/CMakeLists.txt =================================================================== --- llvm/test/CMakeLists.txt +++ 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} Index: llvm/tools/llvm-shlib/CMakeLists.txt =================================================================== --- llvm/tools/llvm-shlib/CMakeLists.txt +++ llvm/tools/llvm-shlib/CMakeLists.txt @@ -72,6 +72,21 @@ if(TARGET libLLVMExports) add_dependencies(LLVM libLLVMExports) endif() + + set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) + set(LIB_NAME ${LIB_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}LLVM) + + 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_NAME}-${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) @@ -88,8 +103,6 @@ set(LLVM_EXPORTED_SYMBOL_FILE ${CMAKE_BINARY_DIR}/libllvm-c.exports) - set(LIB_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) - set(LIB_NAME ${LIB_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}LLVM) set(LIB_PATH ${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}) set(LIB_EXPORTS_PATH ${LIB_NAME}.exports) list(APPEND LLVM_DYLIB_REQUIRED_EXPORTS ${LIB_EXPORTS_PATH})