mbox series

[0/7] v3 of libdiagnostics

Message ID 20240815181156.1815075-1-dmalcolm@redhat.com
Headers show
Series v3 of libdiagnostics | expand

Message

David Malcolm Aug. 15, 2024, 6:11 p.m. UTC
Here's v3 of my patch kit for "libdiagnostics", which makes GCC's
diagnostics subsystem available as a shared library; see:
  https://gcc.gnu.org/wiki/libdiagnostics

New in v3:
* it bootstraps and pass regression tests
* I added an opt-in configure flag: --enable-libdiagnostics, which
  must be enabled to build it (along with --enable-host-shared)
* a new "sarif-replay" command-line tool that takes .sarif files
  and replays the diagnostics within them as if they were GCC
  diagnostics, in GCC's textual format (i.e. GCC as a SARIF *consumer*,
  as well as producer).  This is implemented on top of libdiagnostics
  hence I've been "eating my own dogfood"
* support for execution paths in libdiagnostics API
* lots of fixes

Patch 1 has libdiagnostic.h, the public header file
Patch 2 has the implementation
Patch 3 has the C++ wrapper API I added in v2
Patch 4 has a refactoring of gcc-dg.exp I needed for patch 5.
Patch 5 has the testsuite for libdiagnostics itself
Patch 6 implements JSON parsing support
Patch 7 implements the sarif-replay command-line tool, and its
  testsuite, exercising various valid, invalid, and malformed
  input files.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu,
both with and without --enable-libdiagnostics.
With --enable-libdiagnostics the patch kit has this effect:

  # of .sum files: 20->22 (+2)
  FAIL: 110
  PASS: 617481->617679 (+198) 100.03%
  XFAIL: 4512
  XPASS: 13
  UNTESTED: 136
  UNSUPPORTED: 8058

where the two new .sum files are:

  BUILD/gcc/testsuite/libdiagnostics/libdiagnostics.sum: 
    PASS: 132 tests

  BUILD/gcc/testsuite/sarif-replay/sarif-replay.sum:
    PASS: 66 tests

OK for trunk?

David Malcolm (7):
  libdiagnostics v3: header
  libdiagnostics v3: implementation
  libdiagnostics v3: add C++ wrapper API
  testsuite: move dg-test cleanup code from gcc-dg.exp to its own file
  libdiagnostics v3: test suite
  json: add json parsing support
  libdiagnostics: add a "sarif-replay" command-line tool [PR96032]

 configure                                     |   42 +
 configure.ac                                  |   35 +
 contrib/regenerate-sarif-spec-index.py        |   60 +
 gcc/Makefile.in                               |  191 +-
 gcc/configure                                 |   26 +-
 gcc/configure.ac                              |   16 +
 gcc/diagnostic-event-id.h                     |    6 +
 gcc/doc/install.texi                          |   13 +
 gcc/json-parsing.cc                           | 2394 +++++++++++++++++
 gcc/json-parsing.h                            |  113 +
 gcc/json.cc                                   |    2 +-
 gcc/json.h                                    |  122 +-
 gcc/libdiagnostics++.h                        |  595 ++++
 gcc/libdiagnostics.cc                         | 1652 ++++++++++++
 gcc/libdiagnostics.h                          |  691 +++++
 gcc/libdiagnostics.map                        |   72 +
 gcc/libsarifreplay.cc                         | 1747 ++++++++++++
 gcc/libsarifreplay.h                          |   59 +
 gcc/sarif-replay.cc                           |  239 ++
 gcc/sarif-spec-urls.def                       |  496 ++++
 gcc/selftest-run-tests.cc                     |    1 +
 gcc/selftest.h                                |    1 +
 gcc/testsuite/lib/dg-test-cleanup.exp         |  116 +
 gcc/testsuite/lib/gcc-dg.exp                  |  106 +-
 gcc/testsuite/lib/sarif-replay-dg.exp         |   90 +
 gcc/testsuite/lib/sarif-replay.exp            |  204 ++
 .../libdiagnostics.dg/libdiagnostics.exp      |  296 ++
 gcc/testsuite/libdiagnostics.dg/sarif.py      |   23 +
 gcc/testsuite/libdiagnostics.dg/test-dump.c   |   69 +
 .../libdiagnostics.dg/test-error-c.py         |   54 +
 .../test-error-with-note-c.py                 |   50 +
 .../libdiagnostics.dg/test-error-with-note.c  |   74 +
 .../libdiagnostics.dg/test-error-with-note.cc |   55 +
 gcc/testsuite/libdiagnostics.dg/test-error.c  |   59 +
 gcc/testsuite/libdiagnostics.dg/test-error.cc |   47 +
 .../libdiagnostics.dg/test-fix-it-hint-c.py   |   46 +
 .../libdiagnostics.dg/test-fix-it-hint.c      |   81 +
 .../libdiagnostics.dg/test-fix-it-hint.cc     |   74 +
 .../libdiagnostics.dg/test-helpers++.h        |   28 +
 .../libdiagnostics.dg/test-helpers.h          |   72 +
 .../libdiagnostics.dg/test-labelled-ranges.c  |   69 +
 .../libdiagnostics.dg/test-labelled-ranges.cc |   64 +
 .../libdiagnostics.dg/test-labelled-ranges.py |   48 +
 .../test-logical-location-c.py                |   37 +
 .../libdiagnostics.dg/test-logical-location.c |   79 +
 .../libdiagnostics.dg/test-metadata-c.py      |   45 +
 .../libdiagnostics.dg/test-metadata.c         |   61 +
 .../test-multiple-lines-c.py                  |   83 +
 .../libdiagnostics.dg/test-multiple-lines.c   |   76 +
 .../libdiagnostics.dg/test-no-column-c.py     |   35 +
 .../libdiagnostics.dg/test-no-column.c        |   52 +
 .../test-no-diagnostics-c.py                  |   42 +
 .../libdiagnostics.dg/test-no-diagnostics.c   |   25 +
 .../test-note-with-fix-it-hint-c.py           |   54 +
 .../test-note-with-fix-it-hint.c              |   69 +
 .../test-text-sink-options.c                  |   59 +
 .../libdiagnostics.dg/test-warning-c.py       |   54 +
 .../test-warning-with-path-c.py               |  108 +
 .../test-warning-with-path.c                  |  125 +
 .../libdiagnostics.dg/test-warning.c          |   65 +
 .../test-write-sarif-to-file-c.py             |   55 +
 .../test-write-sarif-to-file.c                |   55 +
 .../test-write-text-to-file.c                 |   47 +
 .../2.1.0-invalid/3.1-not-an-object.sarif     |    6 +
 .../3.11.11-malformed-placeholder.sarif       |   15 +
 ...1-missing-arguments-for-placeholders.sarif |   14 +
 ...ot-enough-arguments-for-placeholders.sarif |   14 +
 .../2.1.0-invalid/3.13.2-no-version.sarif     |    6 +
 .../3.13.2-version-not-a-string.sarif         |    6 +
 .../2.1.0-invalid/3.13.4-bad-runs.sarif       |    7 +
 .../2.1.0-invalid/3.13.4-no-runs.sarif        |    6 +
 .../3.13.4-non-object-in-runs.sarif           |    7 +
 .../2.1.0-invalid/3.27.10-bad-level.sarif     |   25 +
 .../2.1.0-unhandled/3.27.10-none-level.sarif  |   25 +
 .../2.1.0-valid/error-with-note.sarif         |   34 +
 .../2.1.0-valid/escaped-braces.sarif          |   17 +
 .../2.1.0-valid/null-runs.sarif               |    2 +
 .../2.1.0-valid/signal-1.c.sarif              |  193 ++
 .../2.1.0-valid/spec-example-1.sarif          |   15 +
 .../2.1.0-valid/spec-example-2.sarif          |   73 +
 .../2.1.0-valid/spec-example-3.sarif          |   65 +
 .../2.1.0-valid/spec-example-4.sarif          |  766 ++++++
 .../2.1.0-valid/tutorial-example.sarif        |  117 +
 gcc/testsuite/sarif-replay.dg/dg.exp          |   46 +
 .../malformed-json/array-missing-comma.sarif  |    6 +
 .../array-with-trailing-comma.sarif           |    6 +
 .../malformed-json/bad-token.sarif            |    6 +
 .../malformed-json/object-missing-comma.sarif |    7 +
 .../object-with-trailing-comma.sarif          |    6 +
 libatomic/testsuite/lib/libatomic.exp         |    1 +
 libgomp/testsuite/lib/libgomp.exp             |    1 +
 libitm/testsuite/lib/libitm.exp               |    1 +
 libphobos/testsuite/lib/libphobos-dg.exp      |    1 +
 libstdc++-v3/testsuite/lib/libstdc++.exp      |    1 +
 libvtv/testsuite/lib/libvtv.exp               |    1 +
 95 files changed, 12912 insertions(+), 108 deletions(-)
 create mode 100644 contrib/regenerate-sarif-spec-index.py
 create mode 100644 gcc/json-parsing.cc
 create mode 100644 gcc/json-parsing.h
 create mode 100644 gcc/libdiagnostics++.h
 create mode 100644 gcc/libdiagnostics.cc
 create mode 100644 gcc/libdiagnostics.h
 create mode 100644 gcc/libdiagnostics.map
 create mode 100644 gcc/libsarifreplay.cc
 create mode 100644 gcc/libsarifreplay.h
 create mode 100644 gcc/sarif-replay.cc
 create mode 100644 gcc/sarif-spec-urls.def
 create mode 100644 gcc/testsuite/lib/dg-test-cleanup.exp
 create mode 100644 gcc/testsuite/lib/sarif-replay-dg.exp
 create mode 100644 gcc/testsuite/lib/sarif-replay.exp
 create mode 100644 gcc/testsuite/libdiagnostics.dg/libdiagnostics.exp
 create mode 100644 gcc/testsuite/libdiagnostics.dg/sarif.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-dump.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-with-note-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-with-note.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-with-note.cc
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.cc
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-hint-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-hint.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-hint.cc
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-helpers++.h
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-helpers.h
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-ranges.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-ranges.cc
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-ranges.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-location-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-location.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-lines-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-lines.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-column-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-column.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-diagnostics-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-diagnostics.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-fix-it-hint-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-fix-it-hint.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-text-sink-options.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-with-path-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-with-path.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-sarif-to-file-c.py
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-sarif-to-file.c
 create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-text-to-file.c
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.1-not-an-object.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-missing-arguments-for-placeholders.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-not-enough-arguments-for-placeholders.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.2-no-version.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.2-version-not-a-string.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.4-bad-runs.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.4-no-runs.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.4-non-object-in-runs.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.27.10-bad-level.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-unhandled/3.27.10-none-level.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/error-with-note.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/escaped-braces.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/null-runs.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-1.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-2.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-3.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-4.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/tutorial-example.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/dg.exp
 create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/array-missing-comma.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/array-with-trailing-comma.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/bad-token.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/object-missing-comma.sarif
 create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/object-with-trailing-comma.sarif

Comments

Richard Biener Aug. 20, 2024, 9:49 a.m. UTC | #1
On Thu, Aug 15, 2024 at 8:13 PM David Malcolm <dmalcolm@redhat.com> wrote:
>
> Here's v3 of my patch kit for "libdiagnostics", which makes GCC's
> diagnostics subsystem available as a shared library; see:
>   https://gcc.gnu.org/wiki/libdiagnostics

So this is to make use of this from gas?  Is the plan to move
sources (and dependences) to the toplevel then, possibly
building a static convenience lib for GCCs use?

Note I'm missing documentation (which is probably there
in the libdiagnostics.h header); an addition to sourcebuild.texi
might be nice at least and documenting --enable-libdiagnostics
in install.texi.

> New in v3:
> * it bootstraps and pass regression tests
> * I added an opt-in configure flag: --enable-libdiagnostics, which
>   must be enabled to build it (along with --enable-host-shared)
> * a new "sarif-replay" command-line tool that takes .sarif files
>   and replays the diagnostics within them as if they were GCC
>   diagnostics, in GCC's textual format (i.e. GCC as a SARIF *consumer*,
>   as well as producer).  This is implemented on top of libdiagnostics
>   hence I've been "eating my own dogfood"
> * support for execution paths in libdiagnostics API
> * lots of fixes
>
> Patch 1 has libdiagnostic.h, the public header file
> Patch 2 has the implementation
> Patch 3 has the C++ wrapper API I added in v2
> Patch 4 has a refactoring of gcc-dg.exp I needed for patch 5.
> Patch 5 has the testsuite for libdiagnostics itself
> Patch 6 implements JSON parsing support
> Patch 7 implements the sarif-replay command-line tool, and its
>   testsuite, exercising various valid, invalid, and malformed
>   input files.
>
> Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu,
> both with and without --enable-libdiagnostics.
> With --enable-libdiagnostics the patch kit has this effect:
>
>   # of .sum files: 20->22 (+2)
>   FAIL: 110
>   PASS: 617481->617679 (+198) 100.03%
>   XFAIL: 4512
>   XPASS: 13
>   UNTESTED: 136
>   UNSUPPORTED: 8058
>
> where the two new .sum files are:
>
>   BUILD/gcc/testsuite/libdiagnostics/libdiagnostics.sum:
>     PASS: 132 tests
>
>   BUILD/gcc/testsuite/sarif-replay/sarif-replay.sum:
>     PASS: 66 tests
>
> OK for trunk?
>
> David Malcolm (7):
>   libdiagnostics v3: header
>   libdiagnostics v3: implementation
>   libdiagnostics v3: add C++ wrapper API
>   testsuite: move dg-test cleanup code from gcc-dg.exp to its own file
>   libdiagnostics v3: test suite
>   json: add json parsing support
>   libdiagnostics: add a "sarif-replay" command-line tool [PR96032]
>
>  configure                                     |   42 +
>  configure.ac                                  |   35 +
>  contrib/regenerate-sarif-spec-index.py        |   60 +
>  gcc/Makefile.in                               |  191 +-
>  gcc/configure                                 |   26 +-
>  gcc/configure.ac                              |   16 +
>  gcc/diagnostic-event-id.h                     |    6 +
>  gcc/doc/install.texi                          |   13 +
>  gcc/json-parsing.cc                           | 2394 +++++++++++++++++
>  gcc/json-parsing.h                            |  113 +
>  gcc/json.cc                                   |    2 +-
>  gcc/json.h                                    |  122 +-
>  gcc/libdiagnostics++.h                        |  595 ++++
>  gcc/libdiagnostics.cc                         | 1652 ++++++++++++
>  gcc/libdiagnostics.h                          |  691 +++++
>  gcc/libdiagnostics.map                        |   72 +
>  gcc/libsarifreplay.cc                         | 1747 ++++++++++++
>  gcc/libsarifreplay.h                          |   59 +
>  gcc/sarif-replay.cc                           |  239 ++
>  gcc/sarif-spec-urls.def                       |  496 ++++
>  gcc/selftest-run-tests.cc                     |    1 +
>  gcc/selftest.h                                |    1 +
>  gcc/testsuite/lib/dg-test-cleanup.exp         |  116 +
>  gcc/testsuite/lib/gcc-dg.exp                  |  106 +-
>  gcc/testsuite/lib/sarif-replay-dg.exp         |   90 +
>  gcc/testsuite/lib/sarif-replay.exp            |  204 ++
>  .../libdiagnostics.dg/libdiagnostics.exp      |  296 ++
>  gcc/testsuite/libdiagnostics.dg/sarif.py      |   23 +
>  gcc/testsuite/libdiagnostics.dg/test-dump.c   |   69 +
>  .../libdiagnostics.dg/test-error-c.py         |   54 +
>  .../test-error-with-note-c.py                 |   50 +
>  .../libdiagnostics.dg/test-error-with-note.c  |   74 +
>  .../libdiagnostics.dg/test-error-with-note.cc |   55 +
>  gcc/testsuite/libdiagnostics.dg/test-error.c  |   59 +
>  gcc/testsuite/libdiagnostics.dg/test-error.cc |   47 +
>  .../libdiagnostics.dg/test-fix-it-hint-c.py   |   46 +
>  .../libdiagnostics.dg/test-fix-it-hint.c      |   81 +
>  .../libdiagnostics.dg/test-fix-it-hint.cc     |   74 +
>  .../libdiagnostics.dg/test-helpers++.h        |   28 +
>  .../libdiagnostics.dg/test-helpers.h          |   72 +
>  .../libdiagnostics.dg/test-labelled-ranges.c  |   69 +
>  .../libdiagnostics.dg/test-labelled-ranges.cc |   64 +
>  .../libdiagnostics.dg/test-labelled-ranges.py |   48 +
>  .../test-logical-location-c.py                |   37 +
>  .../libdiagnostics.dg/test-logical-location.c |   79 +
>  .../libdiagnostics.dg/test-metadata-c.py      |   45 +
>  .../libdiagnostics.dg/test-metadata.c         |   61 +
>  .../test-multiple-lines-c.py                  |   83 +
>  .../libdiagnostics.dg/test-multiple-lines.c   |   76 +
>  .../libdiagnostics.dg/test-no-column-c.py     |   35 +
>  .../libdiagnostics.dg/test-no-column.c        |   52 +
>  .../test-no-diagnostics-c.py                  |   42 +
>  .../libdiagnostics.dg/test-no-diagnostics.c   |   25 +
>  .../test-note-with-fix-it-hint-c.py           |   54 +
>  .../test-note-with-fix-it-hint.c              |   69 +
>  .../test-text-sink-options.c                  |   59 +
>  .../libdiagnostics.dg/test-warning-c.py       |   54 +
>  .../test-warning-with-path-c.py               |  108 +
>  .../test-warning-with-path.c                  |  125 +
>  .../libdiagnostics.dg/test-warning.c          |   65 +
>  .../test-write-sarif-to-file-c.py             |   55 +
>  .../test-write-sarif-to-file.c                |   55 +
>  .../test-write-text-to-file.c                 |   47 +
>  .../2.1.0-invalid/3.1-not-an-object.sarif     |    6 +
>  .../3.11.11-malformed-placeholder.sarif       |   15 +
>  ...1-missing-arguments-for-placeholders.sarif |   14 +
>  ...ot-enough-arguments-for-placeholders.sarif |   14 +
>  .../2.1.0-invalid/3.13.2-no-version.sarif     |    6 +
>  .../3.13.2-version-not-a-string.sarif         |    6 +
>  .../2.1.0-invalid/3.13.4-bad-runs.sarif       |    7 +
>  .../2.1.0-invalid/3.13.4-no-runs.sarif        |    6 +
>  .../3.13.4-non-object-in-runs.sarif           |    7 +
>  .../2.1.0-invalid/3.27.10-bad-level.sarif     |   25 +
>  .../2.1.0-unhandled/3.27.10-none-level.sarif  |   25 +
>  .../2.1.0-valid/error-with-note.sarif         |   34 +
>  .../2.1.0-valid/escaped-braces.sarif          |   17 +
>  .../2.1.0-valid/null-runs.sarif               |    2 +
>  .../2.1.0-valid/signal-1.c.sarif              |  193 ++
>  .../2.1.0-valid/spec-example-1.sarif          |   15 +
>  .../2.1.0-valid/spec-example-2.sarif          |   73 +
>  .../2.1.0-valid/spec-example-3.sarif          |   65 +
>  .../2.1.0-valid/spec-example-4.sarif          |  766 ++++++
>  .../2.1.0-valid/tutorial-example.sarif        |  117 +
>  gcc/testsuite/sarif-replay.dg/dg.exp          |   46 +
>  .../malformed-json/array-missing-comma.sarif  |    6 +
>  .../array-with-trailing-comma.sarif           |    6 +
>  .../malformed-json/bad-token.sarif            |    6 +
>  .../malformed-json/object-missing-comma.sarif |    7 +
>  .../object-with-trailing-comma.sarif          |    6 +
>  libatomic/testsuite/lib/libatomic.exp         |    1 +
>  libgomp/testsuite/lib/libgomp.exp             |    1 +
>  libitm/testsuite/lib/libitm.exp               |    1 +
>  libphobos/testsuite/lib/libphobos-dg.exp      |    1 +
>  libstdc++-v3/testsuite/lib/libstdc++.exp      |    1 +
>  libvtv/testsuite/lib/libvtv.exp               |    1 +
>  95 files changed, 12912 insertions(+), 108 deletions(-)
>  create mode 100644 contrib/regenerate-sarif-spec-index.py
>  create mode 100644 gcc/json-parsing.cc
>  create mode 100644 gcc/json-parsing.h
>  create mode 100644 gcc/libdiagnostics++.h
>  create mode 100644 gcc/libdiagnostics.cc
>  create mode 100644 gcc/libdiagnostics.h
>  create mode 100644 gcc/libdiagnostics.map
>  create mode 100644 gcc/libsarifreplay.cc
>  create mode 100644 gcc/libsarifreplay.h
>  create mode 100644 gcc/sarif-replay.cc
>  create mode 100644 gcc/sarif-spec-urls.def
>  create mode 100644 gcc/testsuite/lib/dg-test-cleanup.exp
>  create mode 100644 gcc/testsuite/lib/sarif-replay-dg.exp
>  create mode 100644 gcc/testsuite/lib/sarif-replay.exp
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/libdiagnostics.exp
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/sarif.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-dump.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-with-note-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-with-note.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-with-note.cc
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.cc
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-hint-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-hint.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-hint.cc
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-helpers++.h
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-helpers.h
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-ranges.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-ranges.cc
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-ranges.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-location-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-location.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-lines-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-lines.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-column-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-column.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-diagnostics-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-diagnostics.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-fix-it-hint-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-fix-it-hint.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-text-sink-options.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-with-path-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-with-path.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-sarif-to-file-c.py
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-sarif-to-file.c
>  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-text-to-file.c
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.1-not-an-object.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-malformed-placeholder.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-missing-arguments-for-placeholders.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.11.11-not-enough-arguments-for-placeholders.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.2-no-version.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.2-version-not-a-string.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.4-bad-runs.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.4-no-runs.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.13.4-non-object-in-runs.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-invalid/3.27.10-bad-level.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-unhandled/3.27.10-none-level.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/error-with-note.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/escaped-braces.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/null-runs.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/signal-1.c.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-1.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-2.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-3.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-example-4.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/tutorial-example.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/dg.exp
>  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/array-missing-comma.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/array-with-trailing-comma.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/bad-token.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/object-missing-comma.sarif
>  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-json/object-with-trailing-comma.sarif
>
> --
> 2.26.3
>
David Malcolm Aug. 21, 2024, 12:01 a.m. UTC | #2
On Tue, 2024-08-20 at 11:49 +0200, Richard Biener wrote:
> On Thu, Aug 15, 2024 at 8:13 PM David Malcolm <dmalcolm@redhat.com>
> wrote:
> > 
> > Here's v3 of my patch kit for "libdiagnostics", which makes GCC's
> > diagnostics subsystem available as a shared library; see:
> >   https://gcc.gnu.org/wiki/libdiagnostics
> 
> So this is to make use of this from gas?  

One of the clients of the library would be gas, yes (although
optionally, to avoid complicating bootstrap of binutils).

However other clients would be possible, including those that are not
under the "GNU toolchain" umbrella (provided that they can be linked
against GPLv3 code).

For example, I've been experimenting with Python bindings, which would
allow Python scripts to reuse GCC's diagnostics code (e.g. for SARIF,
fix-it hints, etc).  I've also been experimenting with IDE integration
(see PR 115970), and it would be nice if users of libdiagnostics got
that "for free".

Another example of client code is the sarif-replay tool in patch 7, as
a sarif consumer (if nothing else, writing this has exposed various
bugs in our existing SARIF-writing code).  The analyzer's integration
test suite generates 10s of thousands of .sarif files, so having
tooling to work with them is "scratching my own itch".

> Is the plan to move
> sources (and dependences) to the toplevel then, possibly
> building a static convenience lib for GCCs use?

The problem with moving things from "gcc" to, say, a new subdirectory
of the top level source directory is that our "gcc" subdirectory has a
lot of support code that would also need refactoring/moving.  Off the
top of my head:
- selftest framework
- DejaGnu .exp stuff below gcc/testsuite/lib
- C++11 support, such as our "make-unique.h"
- libcpp: the big one: diagnostics uses libcpp
- probably some configure/Makefile.in entanglements

Fixing the above would be a major task.

So the patch kit punts on this by adding/moving stuff within "gcc" (and
requiring an opt-in via --enable-libdiagnostics).

> 
> Note I'm missing documentation (which is probably there
> in the libdiagnostics.h header); an addition to sourcebuild.texi
> might be nice at least and documenting --enable-libdiagnostics
> in install.texi.

The libdiagnostics.h header has comments, but, yes, I should probably
add docs similar to that of libgccjit.h (tutorial and API reference). 
I'll do that for the next iteration of the patch.

Patch 2 of the kit documents --enable-libdiagnostics in install.texi. 
I'll add notes to sourcebuild.texi in the next iteration of the patch.


Thanks; hope the above makes sense.
Dave

> 
> > New in v3:
> > * it bootstraps and pass regression tests
> > * I added an opt-in configure flag: --enable-libdiagnostics, which
> >   must be enabled to build it (along with --enable-host-shared)
> > * a new "sarif-replay" command-line tool that takes .sarif files
> >   and replays the diagnostics within them as if they were GCC
> >   diagnostics, in GCC's textual format (i.e. GCC as a SARIF
> > *consumer*,
> >   as well as producer).  This is implemented on top of
> > libdiagnostics
> >   hence I've been "eating my own dogfood"
> > * support for execution paths in libdiagnostics API
> > * lots of fixes
> > 
> > Patch 1 has libdiagnostic.h, the public header file
> > Patch 2 has the implementation
> > Patch 3 has the C++ wrapper API I added in v2
> > Patch 4 has a refactoring of gcc-dg.exp I needed for patch 5.
> > Patch 5 has the testsuite for libdiagnostics itself
> > Patch 6 implements JSON parsing support
> > Patch 7 implements the sarif-replay command-line tool, and its
> >   testsuite, exercising various valid, invalid, and malformed
> >   input files.
> > 
> > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu,
> > both with and without --enable-libdiagnostics.
> > With --enable-libdiagnostics the patch kit has this effect:
> > 
> >   # of .sum files: 20->22 (+2)
> >   FAIL: 110
> >   PASS: 617481->617679 (+198) 100.03%
> >   XFAIL: 4512
> >   XPASS: 13
> >   UNTESTED: 136
> >   UNSUPPORTED: 8058
> > 
> > where the two new .sum files are:
> > 
> >   BUILD/gcc/testsuite/libdiagnostics/libdiagnostics.sum:
> >     PASS: 132 tests
> > 
> >   BUILD/gcc/testsuite/sarif-replay/sarif-replay.sum:
> >     PASS: 66 tests
> > 
> > OK for trunk?
> > 
> > David Malcolm (7):
> >   libdiagnostics v3: header
> >   libdiagnostics v3: implementation
> >   libdiagnostics v3: add C++ wrapper API
> >   testsuite: move dg-test cleanup code from gcc-dg.exp to its own
> > file
> >   libdiagnostics v3: test suite
> >   json: add json parsing support
> >   libdiagnostics: add a "sarif-replay" command-line tool [PR96032]
> > 
> >  configure                                     |   42 +
> >  configure.ac                                  |   35 +
> >  contrib/regenerate-sarif-spec-index.py        |   60 +
> >  gcc/Makefile.in                               |  191 +-
> >  gcc/configure                                 |   26 +-
> >  gcc/configure.ac                              |   16 +
> >  gcc/diagnostic-event-id.h                     |    6 +
> >  gcc/doc/install.texi                          |   13 +
> >  gcc/json-parsing.cc                           | 2394
> > +++++++++++++++++
> >  gcc/json-parsing.h                            |  113 +
> >  gcc/json.cc                                   |    2 +-
> >  gcc/json.h                                    |  122 +-
> >  gcc/libdiagnostics++.h                        |  595 ++++
> >  gcc/libdiagnostics.cc                         | 1652 ++++++++++++
> >  gcc/libdiagnostics.h                          |  691 +++++
> >  gcc/libdiagnostics.map                        |   72 +
> >  gcc/libsarifreplay.cc                         | 1747 ++++++++++++
> >  gcc/libsarifreplay.h                          |   59 +
> >  gcc/sarif-replay.cc                           |  239 ++
> >  gcc/sarif-spec-urls.def                       |  496 ++++
> >  gcc/selftest-run-tests.cc                     |    1 +
> >  gcc/selftest.h                                |    1 +
> >  gcc/testsuite/lib/dg-test-cleanup.exp         |  116 +
> >  gcc/testsuite/lib/gcc-dg.exp                  |  106 +-
> >  gcc/testsuite/lib/sarif-replay-dg.exp         |   90 +
> >  gcc/testsuite/lib/sarif-replay.exp            |  204 ++
> >  .../libdiagnostics.dg/libdiagnostics.exp      |  296 ++
> >  gcc/testsuite/libdiagnostics.dg/sarif.py      |   23 +
> >  gcc/testsuite/libdiagnostics.dg/test-dump.c   |   69 +
> >  .../libdiagnostics.dg/test-error-c.py         |   54 +
> >  .../test-error-with-note-c.py                 |   50 +
> >  .../libdiagnostics.dg/test-error-with-note.c  |   74 +
> >  .../libdiagnostics.dg/test-error-with-note.cc |   55 +
> >  gcc/testsuite/libdiagnostics.dg/test-error.c  |   59 +
> >  gcc/testsuite/libdiagnostics.dg/test-error.cc |   47 +
> >  .../libdiagnostics.dg/test-fix-it-hint-c.py   |   46 +
> >  .../libdiagnostics.dg/test-fix-it-hint.c      |   81 +
> >  .../libdiagnostics.dg/test-fix-it-hint.cc     |   74 +
> >  .../libdiagnostics.dg/test-helpers++.h        |   28 +
> >  .../libdiagnostics.dg/test-helpers.h          |   72 +
> >  .../libdiagnostics.dg/test-labelled-ranges.c  |   69 +
> >  .../libdiagnostics.dg/test-labelled-ranges.cc |   64 +
> >  .../libdiagnostics.dg/test-labelled-ranges.py |   48 +
> >  .../test-logical-location-c.py                |   37 +
> >  .../libdiagnostics.dg/test-logical-location.c |   79 +
> >  .../libdiagnostics.dg/test-metadata-c.py      |   45 +
> >  .../libdiagnostics.dg/test-metadata.c         |   61 +
> >  .../test-multiple-lines-c.py                  |   83 +
> >  .../libdiagnostics.dg/test-multiple-lines.c   |   76 +
> >  .../libdiagnostics.dg/test-no-column-c.py     |   35 +
> >  .../libdiagnostics.dg/test-no-column.c        |   52 +
> >  .../test-no-diagnostics-c.py                  |   42 +
> >  .../libdiagnostics.dg/test-no-diagnostics.c   |   25 +
> >  .../test-note-with-fix-it-hint-c.py           |   54 +
> >  .../test-note-with-fix-it-hint.c              |   69 +
> >  .../test-text-sink-options.c                  |   59 +
> >  .../libdiagnostics.dg/test-warning-c.py       |   54 +
> >  .../test-warning-with-path-c.py               |  108 +
> >  .../test-warning-with-path.c                  |  125 +
> >  .../libdiagnostics.dg/test-warning.c          |   65 +
> >  .../test-write-sarif-to-file-c.py             |   55 +
> >  .../test-write-sarif-to-file.c                |   55 +
> >  .../test-write-text-to-file.c                 |   47 +
> >  .../2.1.0-invalid/3.1-not-an-object.sarif     |    6 +
> >  .../3.11.11-malformed-placeholder.sarif       |   15 +
> >  ...1-missing-arguments-for-placeholders.sarif |   14 +
> >  ...ot-enough-arguments-for-placeholders.sarif |   14 +
> >  .../2.1.0-invalid/3.13.2-no-version.sarif     |    6 +
> >  .../3.13.2-version-not-a-string.sarif         |    6 +
> >  .../2.1.0-invalid/3.13.4-bad-runs.sarif       |    7 +
> >  .../2.1.0-invalid/3.13.4-no-runs.sarif        |    6 +
> >  .../3.13.4-non-object-in-runs.sarif           |    7 +
> >  .../2.1.0-invalid/3.27.10-bad-level.sarif     |   25 +
> >  .../2.1.0-unhandled/3.27.10-none-level.sarif  |   25 +
> >  .../2.1.0-valid/error-with-note.sarif         |   34 +
> >  .../2.1.0-valid/escaped-braces.sarif          |   17 +
> >  .../2.1.0-valid/null-runs.sarif               |    2 +
> >  .../2.1.0-valid/signal-1.c.sarif              |  193 ++
> >  .../2.1.0-valid/spec-example-1.sarif          |   15 +
> >  .../2.1.0-valid/spec-example-2.sarif          |   73 +
> >  .../2.1.0-valid/spec-example-3.sarif          |   65 +
> >  .../2.1.0-valid/spec-example-4.sarif          |  766 ++++++
> >  .../2.1.0-valid/tutorial-example.sarif        |  117 +
> >  gcc/testsuite/sarif-replay.dg/dg.exp          |   46 +
> >  .../malformed-json/array-missing-comma.sarif  |    6 +
> >  .../array-with-trailing-comma.sarif           |    6 +
> >  .../malformed-json/bad-token.sarif            |    6 +
> >  .../malformed-json/object-missing-comma.sarif |    7 +
> >  .../object-with-trailing-comma.sarif          |    6 +
> >  libatomic/testsuite/lib/libatomic.exp         |    1 +
> >  libgomp/testsuite/lib/libgomp.exp             |    1 +
> >  libitm/testsuite/lib/libitm.exp               |    1 +
> >  libphobos/testsuite/lib/libphobos-dg.exp      |    1 +
> >  libstdc++-v3/testsuite/lib/libstdc++.exp      |    1 +
> >  libvtv/testsuite/lib/libvtv.exp               |    1 +
> >  95 files changed, 12912 insertions(+), 108 deletions(-)
> >  create mode 100644 contrib/regenerate-sarif-spec-index.py
> >  create mode 100644 gcc/json-parsing.cc
> >  create mode 100644 gcc/json-parsing.h
> >  create mode 100644 gcc/libdiagnostics++.h
> >  create mode 100644 gcc/libdiagnostics.cc
> >  create mode 100644 gcc/libdiagnostics.h
> >  create mode 100644 gcc/libdiagnostics.map
> >  create mode 100644 gcc/libsarifreplay.cc
> >  create mode 100644 gcc/libsarifreplay.h
> >  create mode 100644 gcc/sarif-replay.cc
> >  create mode 100644 gcc/sarif-spec-urls.def
> >  create mode 100644 gcc/testsuite/lib/dg-test-cleanup.exp
> >  create mode 100644 gcc/testsuite/lib/sarif-replay-dg.exp
> >  create mode 100644 gcc/testsuite/lib/sarif-replay.exp
> >  create mode 100644
> > gcc/testsuite/libdiagnostics.dg/libdiagnostics.exp
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/sarif.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-dump.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-
> > with-note-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-
> > with-note.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-
> > with-note.cc
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.cc
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-
> > hint-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-
> > hint.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-
> > hint.cc
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-
> > helpers++.h
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-helpers.h
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-
> > ranges.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-
> > ranges.cc
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-
> > ranges.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-
> > location-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-
> > location.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata-
> > c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-
> > lines-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-
> > lines.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-column-
> > c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-
> > column.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-
> > diagnostics-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-
> > diagnostics.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-
> > fix-it-hint-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-
> > fix-it-hint.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-text-sink-
> > options.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-
> > c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-
> > with-path-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-
> > with-path.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-
> > sarif-to-file-c.py
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-
> > sarif-to-file.c
> >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-
> > text-to-file.c
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.1-not-an-object.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.11.11-malformed-placeholder.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.11.11-missing-arguments-for-placeholders.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.11.11-not-enough-arguments-for-placeholders.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.13.2-no-version.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.13.2-version-not-a-string.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.13.4-bad-runs.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.13.4-no-runs.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.13.4-non-object-in-runs.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > invalid/3.27.10-bad-level.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > unhandled/3.27.10-none-level.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > valid/error-with-note.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > valid/escaped-braces.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/null-
> > runs.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > valid/signal-1.c.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > example-1.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > example-2.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > example-3.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > example-4.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > valid/tutorial-example.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/dg.exp
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > json/array-missing-comma.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > json/array-with-trailing-comma.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > json/bad-token.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > json/object-missing-comma.sarif
> >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > json/object-with-trailing-comma.sarif
> > 
> > --
> > 2.26.3
> > 
>
Richard Biener Aug. 21, 2024, 8:34 a.m. UTC | #3
On Wed, Aug 21, 2024 at 2:01 AM David Malcolm <dmalcolm@redhat.com> wrote:
>
> On Tue, 2024-08-20 at 11:49 +0200, Richard Biener wrote:
> > On Thu, Aug 15, 2024 at 8:13 PM David Malcolm <dmalcolm@redhat.com>
> > wrote:
> > >
> > > Here's v3 of my patch kit for "libdiagnostics", which makes GCC's
> > > diagnostics subsystem available as a shared library; see:
> > >   https://gcc.gnu.org/wiki/libdiagnostics
> >
> > So this is to make use of this from gas?
>
> One of the clients of the library would be gas, yes (although
> optionally, to avoid complicating bootstrap of binutils).
>
> However other clients would be possible, including those that are not
> under the "GNU toolchain" umbrella (provided that they can be linked
> against GPLv3 code).
>
> For example, I've been experimenting with Python bindings, which would
> allow Python scripts to reuse GCC's diagnostics code (e.g. for SARIF,
> fix-it hints, etc).  I've also been experimenting with IDE integration
> (see PR 115970), and it would be nice if users of libdiagnostics got
> that "for free".
>
> Another example of client code is the sarif-replay tool in patch 7, as
> a sarif consumer (if nothing else, writing this has exposed various
> bugs in our existing SARIF-writing code).  The analyzer's integration
> test suite generates 10s of thousands of .sarif files, so having
> tooling to work with them is "scratching my own itch".
>
> > Is the plan to move
> > sources (and dependences) to the toplevel then, possibly
> > building a static convenience lib for GCCs use?
>
> The problem with moving things from "gcc" to, say, a new subdirectory
> of the top level source directory is that our "gcc" subdirectory has a
> lot of support code that would also need refactoring/moving.  Off the
> top of my head:
> - selftest framework
> - DejaGnu .exp stuff below gcc/testsuite/lib
> - C++11 support, such as our "make-unique.h"
> - libcpp: the big one: diagnostics uses libcpp
> - probably some configure/Makefile.in entanglements
>
> Fixing the above would be a major task.

Yeah - I was wondering about dependences ...

> So the patch kit punts on this by adding/moving stuff within "gcc" (and
> requiring an opt-in via --enable-libdiagnostics).

OK, fair.

> >
> > Note I'm missing documentation (which is probably there
> > in the libdiagnostics.h header); an addition to sourcebuild.texi
> > might be nice at least and documenting --enable-libdiagnostics
> > in install.texi.
>
> The libdiagnostics.h header has comments, but, yes, I should probably
> add docs similar to that of libgccjit.h (tutorial and API reference).
> I'll do that for the next iteration of the patch.
>
> Patch 2 of the kit documents --enable-libdiagnostics in install.texi.
> I'll add notes to sourcebuild.texi in the next iteration of the patch.
>
>
> Thanks; hope the above makes sense.

Sure.  Note I'm not super-happy with adding maintainance burden
on the GCC side for external users when the component is so
deeply interwinded with GCC internals.  But I won't object ;)

Richard.

> Dave
>
> >
> > > New in v3:
> > > * it bootstraps and pass regression tests
> > > * I added an opt-in configure flag: --enable-libdiagnostics, which
> > >   must be enabled to build it (along with --enable-host-shared)
> > > * a new "sarif-replay" command-line tool that takes .sarif files
> > >   and replays the diagnostics within them as if they were GCC
> > >   diagnostics, in GCC's textual format (i.e. GCC as a SARIF
> > > *consumer*,
> > >   as well as producer).  This is implemented on top of
> > > libdiagnostics
> > >   hence I've been "eating my own dogfood"
> > > * support for execution paths in libdiagnostics API
> > > * lots of fixes
> > >
> > > Patch 1 has libdiagnostic.h, the public header file
> > > Patch 2 has the implementation
> > > Patch 3 has the C++ wrapper API I added in v2
> > > Patch 4 has a refactoring of gcc-dg.exp I needed for patch 5.
> > > Patch 5 has the testsuite for libdiagnostics itself
> > > Patch 6 implements JSON parsing support
> > > Patch 7 implements the sarif-replay command-line tool, and its
> > >   testsuite, exercising various valid, invalid, and malformed
> > >   input files.
> > >
> > > Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu,
> > > both with and without --enable-libdiagnostics.
> > > With --enable-libdiagnostics the patch kit has this effect:
> > >
> > >   # of .sum files: 20->22 (+2)
> > >   FAIL: 110
> > >   PASS: 617481->617679 (+198) 100.03%
> > >   XFAIL: 4512
> > >   XPASS: 13
> > >   UNTESTED: 136
> > >   UNSUPPORTED: 8058
> > >
> > > where the two new .sum files are:
> > >
> > >   BUILD/gcc/testsuite/libdiagnostics/libdiagnostics.sum:
> > >     PASS: 132 tests
> > >
> > >   BUILD/gcc/testsuite/sarif-replay/sarif-replay.sum:
> > >     PASS: 66 tests
> > >
> > > OK for trunk?
> > >
> > > David Malcolm (7):
> > >   libdiagnostics v3: header
> > >   libdiagnostics v3: implementation
> > >   libdiagnostics v3: add C++ wrapper API
> > >   testsuite: move dg-test cleanup code from gcc-dg.exp to its own
> > > file
> > >   libdiagnostics v3: test suite
> > >   json: add json parsing support
> > >   libdiagnostics: add a "sarif-replay" command-line tool [PR96032]
> > >
> > >  configure                                     |   42 +
> > >  configure.ac                                  |   35 +
> > >  contrib/regenerate-sarif-spec-index.py        |   60 +
> > >  gcc/Makefile.in                               |  191 +-
> > >  gcc/configure                                 |   26 +-
> > >  gcc/configure.ac                              |   16 +
> > >  gcc/diagnostic-event-id.h                     |    6 +
> > >  gcc/doc/install.texi                          |   13 +
> > >  gcc/json-parsing.cc                           | 2394
> > > +++++++++++++++++
> > >  gcc/json-parsing.h                            |  113 +
> > >  gcc/json.cc                                   |    2 +-
> > >  gcc/json.h                                    |  122 +-
> > >  gcc/libdiagnostics++.h                        |  595 ++++
> > >  gcc/libdiagnostics.cc                         | 1652 ++++++++++++
> > >  gcc/libdiagnostics.h                          |  691 +++++
> > >  gcc/libdiagnostics.map                        |   72 +
> > >  gcc/libsarifreplay.cc                         | 1747 ++++++++++++
> > >  gcc/libsarifreplay.h                          |   59 +
> > >  gcc/sarif-replay.cc                           |  239 ++
> > >  gcc/sarif-spec-urls.def                       |  496 ++++
> > >  gcc/selftest-run-tests.cc                     |    1 +
> > >  gcc/selftest.h                                |    1 +
> > >  gcc/testsuite/lib/dg-test-cleanup.exp         |  116 +
> > >  gcc/testsuite/lib/gcc-dg.exp                  |  106 +-
> > >  gcc/testsuite/lib/sarif-replay-dg.exp         |   90 +
> > >  gcc/testsuite/lib/sarif-replay.exp            |  204 ++
> > >  .../libdiagnostics.dg/libdiagnostics.exp      |  296 ++
> > >  gcc/testsuite/libdiagnostics.dg/sarif.py      |   23 +
> > >  gcc/testsuite/libdiagnostics.dg/test-dump.c   |   69 +
> > >  .../libdiagnostics.dg/test-error-c.py         |   54 +
> > >  .../test-error-with-note-c.py                 |   50 +
> > >  .../libdiagnostics.dg/test-error-with-note.c  |   74 +
> > >  .../libdiagnostics.dg/test-error-with-note.cc |   55 +
> > >  gcc/testsuite/libdiagnostics.dg/test-error.c  |   59 +
> > >  gcc/testsuite/libdiagnostics.dg/test-error.cc |   47 +
> > >  .../libdiagnostics.dg/test-fix-it-hint-c.py   |   46 +
> > >  .../libdiagnostics.dg/test-fix-it-hint.c      |   81 +
> > >  .../libdiagnostics.dg/test-fix-it-hint.cc     |   74 +
> > >  .../libdiagnostics.dg/test-helpers++.h        |   28 +
> > >  .../libdiagnostics.dg/test-helpers.h          |   72 +
> > >  .../libdiagnostics.dg/test-labelled-ranges.c  |   69 +
> > >  .../libdiagnostics.dg/test-labelled-ranges.cc |   64 +
> > >  .../libdiagnostics.dg/test-labelled-ranges.py |   48 +
> > >  .../test-logical-location-c.py                |   37 +
> > >  .../libdiagnostics.dg/test-logical-location.c |   79 +
> > >  .../libdiagnostics.dg/test-metadata-c.py      |   45 +
> > >  .../libdiagnostics.dg/test-metadata.c         |   61 +
> > >  .../test-multiple-lines-c.py                  |   83 +
> > >  .../libdiagnostics.dg/test-multiple-lines.c   |   76 +
> > >  .../libdiagnostics.dg/test-no-column-c.py     |   35 +
> > >  .../libdiagnostics.dg/test-no-column.c        |   52 +
> > >  .../test-no-diagnostics-c.py                  |   42 +
> > >  .../libdiagnostics.dg/test-no-diagnostics.c   |   25 +
> > >  .../test-note-with-fix-it-hint-c.py           |   54 +
> > >  .../test-note-with-fix-it-hint.c              |   69 +
> > >  .../test-text-sink-options.c                  |   59 +
> > >  .../libdiagnostics.dg/test-warning-c.py       |   54 +
> > >  .../test-warning-with-path-c.py               |  108 +
> > >  .../test-warning-with-path.c                  |  125 +
> > >  .../libdiagnostics.dg/test-warning.c          |   65 +
> > >  .../test-write-sarif-to-file-c.py             |   55 +
> > >  .../test-write-sarif-to-file.c                |   55 +
> > >  .../test-write-text-to-file.c                 |   47 +
> > >  .../2.1.0-invalid/3.1-not-an-object.sarif     |    6 +
> > >  .../3.11.11-malformed-placeholder.sarif       |   15 +
> > >  ...1-missing-arguments-for-placeholders.sarif |   14 +
> > >  ...ot-enough-arguments-for-placeholders.sarif |   14 +
> > >  .../2.1.0-invalid/3.13.2-no-version.sarif     |    6 +
> > >  .../3.13.2-version-not-a-string.sarif         |    6 +
> > >  .../2.1.0-invalid/3.13.4-bad-runs.sarif       |    7 +
> > >  .../2.1.0-invalid/3.13.4-no-runs.sarif        |    6 +
> > >  .../3.13.4-non-object-in-runs.sarif           |    7 +
> > >  .../2.1.0-invalid/3.27.10-bad-level.sarif     |   25 +
> > >  .../2.1.0-unhandled/3.27.10-none-level.sarif  |   25 +
> > >  .../2.1.0-valid/error-with-note.sarif         |   34 +
> > >  .../2.1.0-valid/escaped-braces.sarif          |   17 +
> > >  .../2.1.0-valid/null-runs.sarif               |    2 +
> > >  .../2.1.0-valid/signal-1.c.sarif              |  193 ++
> > >  .../2.1.0-valid/spec-example-1.sarif          |   15 +
> > >  .../2.1.0-valid/spec-example-2.sarif          |   73 +
> > >  .../2.1.0-valid/spec-example-3.sarif          |   65 +
> > >  .../2.1.0-valid/spec-example-4.sarif          |  766 ++++++
> > >  .../2.1.0-valid/tutorial-example.sarif        |  117 +
> > >  gcc/testsuite/sarif-replay.dg/dg.exp          |   46 +
> > >  .../malformed-json/array-missing-comma.sarif  |    6 +
> > >  .../array-with-trailing-comma.sarif           |    6 +
> > >  .../malformed-json/bad-token.sarif            |    6 +
> > >  .../malformed-json/object-missing-comma.sarif |    7 +
> > >  .../object-with-trailing-comma.sarif          |    6 +
> > >  libatomic/testsuite/lib/libatomic.exp         |    1 +
> > >  libgomp/testsuite/lib/libgomp.exp             |    1 +
> > >  libitm/testsuite/lib/libitm.exp               |    1 +
> > >  libphobos/testsuite/lib/libphobos-dg.exp      |    1 +
> > >  libstdc++-v3/testsuite/lib/libstdc++.exp      |    1 +
> > >  libvtv/testsuite/lib/libvtv.exp               |    1 +
> > >  95 files changed, 12912 insertions(+), 108 deletions(-)
> > >  create mode 100644 contrib/regenerate-sarif-spec-index.py
> > >  create mode 100644 gcc/json-parsing.cc
> > >  create mode 100644 gcc/json-parsing.h
> > >  create mode 100644 gcc/libdiagnostics++.h
> > >  create mode 100644 gcc/libdiagnostics.cc
> > >  create mode 100644 gcc/libdiagnostics.h
> > >  create mode 100644 gcc/libdiagnostics.map
> > >  create mode 100644 gcc/libsarifreplay.cc
> > >  create mode 100644 gcc/libsarifreplay.h
> > >  create mode 100644 gcc/sarif-replay.cc
> > >  create mode 100644 gcc/sarif-spec-urls.def
> > >  create mode 100644 gcc/testsuite/lib/dg-test-cleanup.exp
> > >  create mode 100644 gcc/testsuite/lib/sarif-replay-dg.exp
> > >  create mode 100644 gcc/testsuite/lib/sarif-replay.exp
> > >  create mode 100644
> > > gcc/testsuite/libdiagnostics.dg/libdiagnostics.exp
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/sarif.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-dump.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-
> > > with-note-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-
> > > with-note.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error-
> > > with-note.cc
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-error.cc
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-
> > > hint-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-
> > > hint.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-fix-it-
> > > hint.cc
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-
> > > helpers++.h
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-helpers.h
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-
> > > ranges.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-
> > > ranges.cc
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-labelled-
> > > ranges.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-
> > > location-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-logical-
> > > location.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata-
> > > c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-metadata.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-
> > > lines-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-multiple-
> > > lines.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-column-
> > > c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-
> > > column.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-
> > > diagnostics-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-no-
> > > diagnostics.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-
> > > fix-it-hint-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-note-with-
> > > fix-it-hint.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-text-sink-
> > > options.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-
> > > c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-
> > > with-path-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning-
> > > with-path.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-warning.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-
> > > sarif-to-file-c.py
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-
> > > sarif-to-file.c
> > >  create mode 100644 gcc/testsuite/libdiagnostics.dg/test-write-
> > > text-to-file.c
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.1-not-an-object.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.11.11-malformed-placeholder.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.11.11-missing-arguments-for-placeholders.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.11.11-not-enough-arguments-for-placeholders.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.13.2-no-version.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.13.2-version-not-a-string.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.13.4-bad-runs.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.13.4-no-runs.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.13.4-non-object-in-runs.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > invalid/3.27.10-bad-level.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > unhandled/3.27.10-none-level.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > valid/error-with-note.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > valid/escaped-braces.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/null-
> > > runs.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > valid/signal-1.c.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > > example-1.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > > example-2.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > > example-3.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-valid/spec-
> > > example-4.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/2.1.0-
> > > valid/tutorial-example.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/dg.exp
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > > json/array-missing-comma.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > > json/array-with-trailing-comma.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > > json/bad-token.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > > json/object-missing-comma.sarif
> > >  create mode 100644 gcc/testsuite/sarif-replay.dg/malformed-
> > > json/object-with-trailing-comma.sarif
> > >
> > > --
> > > 2.26.3
> > >
> >
>