[glibc] Makefile: Do not force elf last for the others and tests passes

Adhemerval Zanella via Glibc-cvs <[email protected]> Fri, 3 Jul 2026 23:34:04 +0000 (GMT)
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=ef1cb97f69429ded911bdebdce417357af0b2484

commit ef1cb97f69429ded911bdebdce417357af0b2484
Author: Adhemerval Zanella <[email protected]>
Date:   Wed Jun 10 16:56:44 2026 -0300

    Makefile: Do not force elf last for the others and tests passes
    
    The requirement that the elf subdirectory comes last in the
    subdirectory ordering stems from its lib pass: the rtld link consumes
    $(common-objpfx)libc_pic.a, which aggregates every other
    subdirectory's objects.
    
    The others, tests, and xtests classes have no such dependency: everything
    they consume from other subdirectories is provided by the pass barriers
    (others after lib, tests after others).  Keep elf last only for the
    object-building classes and let its others and tests sub-makes run
    concurrently with the other subdirectories.
    
    With elf no longer forced last for those classes, the Depend edges
    pointing to elf (e.g. support/Depend) no longer create a cycle there,
    so honor them instead of dropping them.
    
    This improves the make check with run-built-tests=no, specially on
    machine with many cores.  Results on a x86_64 machine [1] it improves
    from 190s to 181s, while on a aarch64 machine [2] it improves from
    298.726s to 243.098s.
    
    Build results remain bit-identical and the tests.sum failure sets are
    unchanged.
    
    [1] Ryzen 5900x, 12c/24t, gcc 16.1.1, binutils 2.26, and GNU make 4.3
    [2] N1, 80c, gcc 15.1.1, binutils 2.25, GNU make 4.3
    
    Reviewed-by: Sam James <[email protected]>

Diff:
---
 Makefile | 34 +++++++++++++++++++++++-----------
 1 file changed, 23 insertions(+), 11 deletions(-)

diff --git a/Makefile b/Makefile
index e998ce77c3..7d46e8387d 100644
--- a/Makefile
+++ b/Makefile
@@ -508,21 +508,28 @@ endef
 #  * The edges requested by the Depend files (emitted by gen-sorted.awk
 #    as subdir-deps-*) are preserved.
 #
-#  * elf stays last, as in the sorted list.  Its rtld build recurses into
-#    the other subdirectories' object directories via elf/rtld-Rules.
+#  * elf stays last for the object-building classes, as in the sorted
+#    list: its rtld link consumes $(common-objpfx)libc_pic.a, which
+#    aggregates every other subdirectory's objects, and its rtld-Rules
+#    recursion compiles into the other subdirectories' object
+#    directories.  The others/tests/xtests classes have no such
+#    dependency (the pass barriers below provide everything they need),
+#    so elf is unordered there.
 #
 #  * Only target classes without cross-directory file conflicts use this
 #    sparse ordering; everything else (install, clean, abi, stubs) keeps
 #    the previous total order via a serial chain.
 
-+parallel_subdir_targets := \
-  subdir_lib \
-  objects \
++elf_last_subdir_targets := \
+  subdir_lib objects \
   objs \
+  subdir_objs \
+  # +elf_last_subdir_targets
++parallel_subdir_targets := \
+  $(+elf_last_subdir_targets) \
   others \
   tests \
   xtests \
-  subdir_objs \
   # +parallel_subdir_targets
 +serial_subdir_targets := $(filter-out $(+parallel_subdir_targets),\
 				       $(+subdir_targets))
@@ -552,14 +559,19 @@ $(foreach t,$(+ordered_parallel_subdir_targets),$(eval \
 $(foreach d,$(+subdir-pregen),$(foreach t,$(+ordered_parallel_subdir_targets),$(eval \
   $(d)/$(t): $(addsuffix /$(t),$(+subdir-pregen-prev))))\
   $(eval +subdir-pregen-prev := $(d)))
-# Edges pointing to elf are dropped; the sorted list always forces elf
-# last, overriding any Depend request, and the elf-last edges below would
-# otherwise create a cycle.
-$(foreach t,$(+ordered_parallel_subdir_targets),$(foreach d,$(+subdir-rest),$(eval \
+# For the classes where elf is forced last, edges pointing to elf are
+# dropped: the sorted list always overrides such Depend requests today
+# (e.g. support/Depend), and the elf-last edges below would otherwise
+# create a cycle.  The remaining classes honor them.
+$(foreach t,$(+elf_last_subdir_targets),$(foreach d,$(+subdir-rest),$(eval \
   $(d)/$(t): $(addsuffix /$(t),\
 	      $(filter-out elf,$(filter $(subdirs),$(subdir-deps-$(d))))))))
+$(foreach t,$(filter-out $(+elf_last_subdir_targets),\
+		         $(+ordered_parallel_subdir_targets)),\
+  $(foreach d,$(+subdir-rest),$(eval \
+  $(d)/$(t): $(addsuffix /$(t),$(filter $(subdirs),$(subdir-deps-$(d)))))))
 ifneq (,$(filter elf,$(subdirs)))
-$(foreach t,$(+ordered_parallel_subdir_targets),$(eval \
+$(foreach t,$(+elf_last_subdir_targets),$(eval \
   elf/$(t): $(addsuffix /$(t),$(filter-out elf,$(subdirs)))))
 endif