[libc-commits] [libc] 545f4d9 - [libc] Remove recursion in get_object_files_for_test to improve build time. (#72351)

via libc-commits libc-commits at lists.llvm.org
Thu Nov 16 05:55:55 PST 2023


Author: lntue
Date: 2023-11-16T08:55:51-05:00
New Revision: 545f4d985514d52dcdc0622a4b6ecc5c71b345aa

URL: https://github.com/llvm/llvm-project/commit/545f4d985514d52dcdc0622a4b6ecc5c71b345aa
DIFF: https://github.com/llvm/llvm-project/commit/545f4d985514d52dcdc0622a4b6ecc5c71b345aa.diff

LOG: [libc] Remove recursion in get_object_files_for_test to improve build time. (#72351)

Added: 
    

Modified: 
    libc/cmake/modules/LLVMLibCTestRules.cmake

Removed: 
    


################################################################################
diff  --git a/libc/cmake/modules/LLVMLibCTestRules.cmake b/libc/cmake/modules/LLVMLibCTestRules.cmake
index f7ca6a2e7021141..6cae0859149d54c 100644
--- a/libc/cmake/modules/LLVMLibCTestRules.cmake
+++ b/libc/cmake/modules/LLVMLibCTestRules.cmake
@@ -15,48 +15,59 @@
 function(get_object_files_for_test result skipped_entrypoints_list)
   set(object_files "")
   set(skipped_list "")
-  foreach(dep IN LISTS ARGN)
-    if (NOT TARGET ${dep})
-      # Skip any tests whose dependencies have not been defined.
-      list(APPEND skipped_list ${dep})
-      continue()
-    endif()
-    get_target_property(dep_type ${dep} "TARGET_TYPE")
-    if(NOT dep_type)
-      # Target for which TARGET_TYPE property is not set do not
-      # provide any object files.
-      continue()
-    endif()
+  set(checked_list "")
+  set(unchecked_list "${ARGN}")
+  list(REMOVE_DUPLICATES unchecked_list)
+  list(LENGTH unchecked_list length)
 
-    if(${dep_type} STREQUAL ${OBJECT_LIBRARY_TARGET_TYPE})
-      get_target_property(dep_object_files ${dep} "OBJECT_FILES")
-      if(dep_object_files)
-        list(APPEND object_files ${dep_object_files})
-      endif()
-    elseif(${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE})
-      get_target_property(is_skipped ${dep} "SKIPPED")
-      if(is_skipped)
+  while(length)
+    set(indirect_list "")
+
+    foreach(dep IN LISTS unchecked_list)
+      if (NOT TARGET ${dep})
+        # Skip tests with undefined dependencies.
         list(APPEND skipped_list ${dep})
         continue()
       endif()
-      get_target_property(object_file_raw ${dep} "OBJECT_FILE_RAW")
-      if(object_file_raw)
-        list(APPEND object_files ${object_file_raw})
+      get_target_property(dep_type ${dep} "TARGET_TYPE")
+      if(NOT dep_type)
+        # Skip tests with no object dependencies.
+        continue()
       endif()
-    elseif(${dep_type} STREQUAL ${ENTRYPOINT_OBJ_VENDOR_TARGET_TYPE})
-      # We skip tests for all externally implemented entrypoints.
-      list(APPEND skipped_list ${dep})
-      continue()
-    endif()
 
-    get_target_property(indirect_deps ${dep} "DEPS")
-    get_object_files_for_test(
-        indirect_objfiles indirect_skipped_list ${indirect_deps})
-    list(APPEND object_files ${indirect_objfiles})
-    if(indirect_skipped_list)
-      list(APPEND skipped_list ${indirect_skipped_list})
-    endif()
-  endforeach(dep)
+      if(${dep_type} STREQUAL ${OBJECT_LIBRARY_TARGET_TYPE})
+        get_target_property(dep_object_files ${dep} "OBJECT_FILES")
+        if(dep_object_files)
+          list(APPEND object_files ${dep_object_files})
+        endif()
+      elseif(${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE})
+        get_target_property(is_skipped ${dep} "SKIPPED")
+        if(is_skipped)
+          list(APPEND skipped_list ${dep})
+          continue()
+        endif()
+        get_target_property(object_file_raw ${dep} "OBJECT_FILE_RAW")
+        if(object_file_raw)
+          list(APPEND object_files ${object_file_raw})
+        endif()
+      elseif(${dep_type} STREQUAL ${ENTRYPOINT_OBJ_VENDOR_TARGET_TYPE})
+        # Skip tests for externally implemented entrypoints.
+        list(APPEND skipped_list ${dep})
+        continue()
+      endif()
+
+      get_target_property(indirect_deps ${dep} "DEPS")
+      list(APPEND indirect_list "${indirect_deps}")
+    endforeach(dep)
+
+    # Only add new indirect dependencies to check.
+    list(APPEND checked_list "${unchecked_list}")
+    list(REMOVE_DUPLICATES indirect_list)
+    list(REMOVE_ITEM indirect_list checked_list)
+    set(unchecked_list "${indirect_list}")
+    list(LENGTH unchecked_list length)
+  endwhile()
+
   list(REMOVE_DUPLICATES object_files)
   set(${result} ${object_files} PARENT_SCOPE)
   list(REMOVE_DUPLICATES skipped_list)


        


More information about the libc-commits mailing list