[PATCH] D84127: Make LLVM_ENABLE_LTO function with multi-arch values for CMAKE_OSX_ARCHITECTURES

Daniel Sanders via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 24 17:49:15 PDT 2020


dsanders updated this revision to Diff 280639.
dsanders added a comment.

- Comment on the emit+move too


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84127/new/

https://reviews.llvm.org/D84127

Files:
  llvm/cmake/modules/AddLLVM.cmake


Index: llvm/cmake/modules/AddLLVM.cmake
===================================================================
--- llvm/cmake/modules/AddLLVM.cmake
+++ llvm/cmake/modules/AddLLVM.cmake
@@ -1970,27 +1970,39 @@
       set(file_ext dSYM)
     endif()
 
-    set(output_name "$<TARGET_FILE_NAME:${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 "$<TARGET_FILE_NAME:${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 "$<TARGET_FILE:${name}>.${file_ext}"
+                                           "${output_path}"
+      )
     endif()
     add_custom_command(TARGET ${name} POST_BUILD
-      COMMAND ${CMAKE_DSYMUTIL} ${output_path} $<TARGET_FILE:${name}>
-      ${strip_command}
+      COMMAND ${strip_command}
       )
   else()
     add_custom_command(TARGET ${name} POST_BUILD


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84127.280639.patch
Type: text/x-patch
Size: 2627 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200725/792ee987/attachment.bin>


More information about the llvm-commits mailing list