From: Pedro Alves <pedro@palves.net>
To: gdb-patches@sourceware.org
Subject: [PATCH 1/4] dg-extract-results.{sh, py}: Optionally read file list from stdin/file
Date: Thu, 23 Jul 2026 18:51:28 +0100 [thread overview]
Message-ID: <20260723175131.266112-2-pedro@palves.net> (raw)
In-Reply-To: <20260723175131.266112-1-pedro@palves.net>
dg-extract-results.sh and dg-extract-results.py take the summary/log
files to combine as command-line arguments, one argument per file.
That is fine for GCC, whose parallel harness produces one .sum per
target variant -- a handful of files.
GDB uses these scripts too, but its parallel harness writes one .sum
(and one .log) per test script, of which there are 2657 at the moment.
On Windows, with native Windows python, passing that many sum or log
files to dg-extract-results overflows the command-line length limit
(~32 KB), and the combine step dies:
$ make check -j$(nproc)
...
make[1]: Leaving directory '/c/msys2/home/alves/gdb/build-testsuite-windows'
/c/gdb/src/gdb/testsuite/../../contrib/dg-extract-results.sh: line 39: /ucrt64/bin/python3: Argument list too long
/c/gdb/src/gdb/testsuite/../../contrib/dg-extract-results.sh: line 39: /ucrt64/bin/python3: Argument list too long
make: *** [Makefile:274: check-parallel] Error 2
...
$ find outputs/ -name gdb.sum | wc -l
2657
The .sh wrapper re-execs the faster Python implementation, forwarding
the file list, so the overflow can also surface at the re-exec.
Fix it by teaching both dg-extract-results.sh and
dg-extract-results.py a new -f option that reads the list of files to
process, one per line, from a named file, or from standard input when
the argument is "-". The option may be given more than once and mixed
with file arguments.
A caller can then pipe the file list straight in via "-f -" instead of
expanding it onto the command line, so the length limit no longer
applies regardless of the host or Python flavor.
Existing callers can continue working as they were if they want, as
passing the file list as one file per argument is still supported.
Change-Id: Iaced5ba228972ce267f355de65fe5ad8a1e38c68
---
| 30 ++++++++++++++++++++++++++----
| 17 +++++++++++++++--
2 files changed, 41 insertions(+), 6 deletions(-)
--git a/contrib/dg-extract-results.py b/contrib/dg-extract-results.py
index 98b0f4989c9..b5d890f6406 100644
--- a/contrib/dg-extract-results.py
+++ b/contrib/dg-extract-results.py
@@ -164,7 +164,7 @@ class Prog:
def usage (self):
name = sys.argv[0]
sys.stderr.write ('Usage: ' + name
- + ''' [-t tool] [-l variant-list] [-L] log-or-sum-file ...
+ + ''' [-t tool] [-l variant-list] [-L] [-f list-file] log-or-sum-file ...
tool The tool (e.g. g++, libffi) for which to create a
new test summary file. If not specified then output
@@ -174,6 +174,12 @@ class Prog:
variants in the files for <tool>.
sum-file A test summary file with the format of those
created by runtest from DejaGnu.
+ list-file A file listing the log-or-sum files to process, one
+ per line. Use "-" to read the list from standard
+ input. This avoids the command-line length limit
+ when combining very many files. May be given more
+ than once, and may be mixed with log-or-sum-file
+ arguments.
If -L is used, merge *.log files instead of *.sum. In this
mode the exact order of lines may not be preserved, just different
Running *.exp chunks should be in correct order.
@@ -189,19 +195,35 @@ class Prog:
# Parse the command-line arguments.
def parse_cmdline (self):
try:
- (options, self.files) = getopt.getopt (sys.argv[1:], 'l:t:L')
- if len (self.files) == 0:
- self.usage()
+ (options, self.files) = getopt.getopt (sys.argv[1:], 'l:t:Lf:')
for (option, value) in options:
if option == '-l':
self.variations.append (value)
elif option == '-t':
self.tools.append (value)
+ elif option == '-f':
+ self.read_file_list (value)
else:
self.do_sum = False
+ if len (self.files) == 0:
+ self.usage()
except getopt.GetoptError as e:
self.fatal (None, e.msg)
+ # Append the files listed in FILENAME, one per line, to self.files.
+ # FILENAME of "-" means read the list from standard input. Blank
+ # lines are ignored.
+ def read_file_list (self, filename):
+ f = sys.stdin if filename == '-' else open (filename, 'r')
+ try:
+ for line in f:
+ line = line.strip()
+ if line:
+ self.files.append (line)
+ finally:
+ if f is not sys.stdin:
+ f.close()
+
# Try to parse time string TIME, returning an arbitrary time on failure.
# Getting this right is just a nice-to-have so failures should be silent.
def parse_time (self, time):
--git a/contrib/dg-extract-results.sh b/contrib/dg-extract-results.sh
index d64ba255838..d03e1a9b4e1 100755
--- a/contrib/dg-extract-results.sh
+++ b/contrib/dg-extract-results.sh
@@ -42,7 +42,7 @@ done
usage() {
cat <<EOF >&2
-Usage: $PROGNAME [-t tool] [-l variant-list] [-L] sum-file ...
+Usage: $PROGNAME [-t tool] [-l variant-list] [-L] [-f list-file] sum-file ...
tool The tool (e.g. g++, libffi) for which to create a
new test summary file. If not specified then all
@@ -52,6 +52,11 @@ Usage: $PROGNAME [-t tool] [-l variant-list] [-L] sum-file ...
variants in the files for <tool>.
sum-file A test summary file with the format of those
created by runtest from DejaGnu.
+ list-file A file listing the sum-files to process, one per line.
+ Use "-" to read the list from standard input. This
+ avoids the command-line length limit when combining
+ very many files. May be given more than once, and
+ may be mixed with sum-file arguments.
If -L is used, merge *.log files instead of *.sum. In this
mode the exact order of lines may not be preserved, just different
Running *.exp chunks should be in correct order.
@@ -69,18 +74,26 @@ msg() {
VARIANTS=""
TOOL=""
MODE="sum"
+LIST_FILES=""
-while getopts "l:t:L" ARG; do
+while getopts "l:t:Lf:" ARG; do
case $ARG in
l) VARIANTS="${VARIANTS} ${OPTARG}";;
t) test -z "$TOOL" || (msg "${PROGNAME}: only one tool can be specified"; exit 1);
TOOL="${OPTARG}";;
L) MODE="log";;
+ f) if test "${OPTARG}" = "-" ; then
+ LIST_FILES="${LIST_FILES} `cat`"
+ else
+ LIST_FILES="${LIST_FILES} `cat "${OPTARG}"`"
+ fi;;
\?) usage; exit 0;;
esac
done
shift `expr ${OPTIND} - 1`
+set -- ${LIST_FILES} "$@"
+
if test $# -lt 1 ; then
usage
exit 1
--
2.54.0
next prev parent reply other threads:[~2026-07-23 17:52 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-23 17:51 [PATCH 0/4] Avoid command-line length limit combining test results Pedro Alves
2026-07-23 17:51 ` Pedro Alves [this message]
2026-07-23 17:51 ` [PATCH 2/4] gdb/testsuite: Factor out dg-extract-results.sh calls Pedro Alves
2026-07-23 17:51 ` [PATCH 3/4] gdb/testsuite: Add extract-results make target Pedro Alves
2026-07-23 17:51 ` [PATCH 4/4] gdb/testsuite: Pipe the dg-extract-results file list via stdin Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260723175131.266112-2-pedro@palves.net \
--to=pedro@palves.net \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox