Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Andrea Pinski <andrew.pinski@oss.qualcomm.com>
To: Pedro Alves <pedro@palves.net>
Cc: gcc-patches@gcc.gnu.org, gdb-patches@sourceware.org
Subject: Re: [PATCH 1/1] dg-extract-results.{sh, py}: Optionally read file list from stdin/file
Date: Thu, 3 Sep 2026 20:08:53 -0700	[thread overview]
Message-ID: <CALvbMcB2ssG3TWpCtOs+9950gyhbhFH+jEE+uXqj9RMv7CyNQQ@mail.gmail.com> (raw)
In-Reply-To: <20260903185528.2542431-2-pedro@palves.net>

On Thu, Sep 3, 2026 at 11:57 AM Pedro Alves <pedro@palves.net> wrote:
>
> 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 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.
>
> The .sh wrapper re-execs the faster Python implementation, forwarding
> the file list, so the overflow can also surface at the re-exec.
>
> E.g.:
>
>  $ 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
>
> 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 host or Python flavor.
>
> Existing callers can continue working as they were, as passing the
> file list as one file per argument is still supported.
>
> contrib/ChangeLog:
>
>         * dg-extract-results.py: Handle new "-f list-file" option.
>         * dg-extract-results.sh: Ditto.

Ok.

>
> Change-Id: Iaced5ba228972ce267f355de65fe5ad8a1e38c68

Note we normally don't have Change-Id in the commit message; I know it
is from gerrit so please remove it before pushing the patch.

> ---
>  contrib/dg-extract-results.py | 30 ++++++++++++++++++++++++++----
>  contrib/dg-extract-results.sh | 17 +++++++++++++++--
>  2 files changed, 41 insertions(+), 6 deletions(-)
>
> diff --git a/contrib/dg-extract-results.py b/contrib/dg-extract-results.py
> index 98b0f4989c96..b5d890f64063 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):
> diff --git a/contrib/dg-extract-results.sh b/contrib/dg-extract-results.sh
> index 6ea897033b57..f3093f94582e 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
>

  reply	other threads:[~2026-09-04  3:09 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-03 18:55 [PATCH 0/1] " Pedro Alves
2026-09-03 18:55 ` [PATCH 1/1] " Pedro Alves
2026-09-04  3:08   ` Andrea Pinski [this message]
2026-09-04 12:18     ` 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=CALvbMcB2ssG3TWpCtOs+9950gyhbhFH+jEE+uXqj9RMv7CyNQQ@mail.gmail.com \
    --to=andrew.pinski@oss.qualcomm.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=pedro@palves.net \
    /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