diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1970,27 +1970,39 @@ set(file_ext dSYM) endif() - set(output_name "$.${file_ext}") - - if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR) - set(output_path "-o=${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}") - else() - set(output_path "-o=${output_name}") - endif() if(CMAKE_CXX_FLAGS MATCHES "-flto" OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto") - set(lto_object ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}-lto.o) + # As long as we compile at least one file from source code, clang will + # invoke dsymutil on the temporary objects after lipo'ing all the slices + # together. + # This is a workaround to a clang bug where dsymutil is not invoked for + # every case where debug info is present and temporary objects are being + # linked. See https://bugs.llvm.org/show_bug.cgi?id=46841 for more + # information. + set(lto_src ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}-lto.cpp) + file(WRITE "${lto_src}" "extern int dummy;\n") set_property(TARGET ${name} APPEND_STRING PROPERTY - LINK_FLAGS " -Wl,-object_path_lto,${lto_object}") + LINK_FLAGS " ${lto_src}") endif() - if(NOT CMAKE_DSYMUTIL) - set(CMAKE_DSYMUTIL xcrun dsymutil) + if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR) + # clang can currently only emit dSYM's to the same directory as the output + # binary. Workaround this by moving it after the build. + set(output_name "$.${file_ext}") + set(output_path "${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}") + add_custom_command(TARGET ${name} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}" + # Remove any old versions if present + COMMAND ${CMAKE_COMMAND} -E rm "-rf" "${output_path}" + # Move the dSYM clang emitted next to the output binary where we want it + # to be. + COMMAND ${CMAKE_COMMAND} -E rename "$.${file_ext}" + "${output_path}" + ) endif() add_custom_command(TARGET ${name} POST_BUILD - COMMAND ${CMAKE_DSYMUTIL} ${output_path} $ - ${strip_command} + COMMAND ${strip_command} ) else() add_custom_command(TARGET ${name} POST_BUILD