Patchwork Reduce command length in regen-ulps [committed]

login
register
mail settings
Submitter Joseph Myers
Date Jan. 2, 2018, 6:34 p.m.
Message ID <alpine.DEB.2.20.1801021833390.11292@digraph.polyomino.org.uk>
Download mbox | patch
Permalink /patch/25184/
State Committed
Headers show

Comments

Joseph Myers - Jan. 2, 2018, 6:34 p.m.
I found that "make regen-ulps" failed when building with unmodified
GNU make 4.1, and an objdir /some/where/math/ longer than about 37
characters, because the list of tests in the "for run in $^" loop
exceeded the Linux kernel's MAX_ARG_STRLEN limit (131072 bytes) on the
length of a single argument passed to a command.

Some GNU/Linux distributions have a patch to make to work around this
limit (see e.g. Debian bug 688601), but clearly this ought to work
without needing such a patch.  This patch arranges for the shell loop
to be over the test names without a $(objdir) prefix, which reduces
the space used to less than half MAX_ARG_STRLEN.

(I think we ought to aim to get rid of bits/mathinline.h completely -
filing GCC bugs for any optimizations GCC can't currently do with
-ffast-math - which would mean we could halve the number of libm tests
run because separate inline function tests would no longer be needed.
However, with a long directory name even half the number of tests
could make this command exceed MAX_ARG_STRLEN without my patch.)

Tested regen-ulps on a system where it failed before this patch.  
Committed.

2018-01-02  Joseph Myers  <joseph@codesourcery.com>

	* math/Makefile (run-regen-ulps): Add $(objpfx) to test name here.
	(regen-ulps): Use $(libm-tests) not $^ in shell loop.

Patch

diff --git a/math/Makefile b/math/Makefile
index e966c98..4c8703c 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -521,12 +521,12 @@  include $(o-iterator)
 
 run-regen-ulps = $(test-wrapper-env) \
 	    $(run-program-env) \
-	    $($*-ENV) $(rtld-prefix) $${run}
+	    $($*-ENV) $(rtld-prefix) $(objpfx)$${run}
 
 regen-ulps: $(addprefix $(objpfx),$(libm-tests))
 	rm -f $(objpfx)ULPs; rm -f $(objpfx)NewUlps; \
 	cp $(ulps-file) $(objpfx)libm-test-ulps; \
-	for run in $^; do \
+	for run in $(libm-tests); do \
 	  echo "Regenerating ULPs for $${run}"; \
 	  $(run-regen-ulps) -u -o $(objpfx); \
 	  cat $(objpfx)ULPs >> $(objpfx)libm-test-ulps; \