This patch kit introduces a publish/subscribe mechanism to GCC's
codebase, allowing for loosely-coupled senders and receivers, with
strongly-typed messages passing between them.

For example, a GCC subsystem could publish messages about events,
and plugins or diagnostic sinks could subscribe to them.

This is a little like the plugin subsystem, but unlike the plugin
subsystem where callbacks receive "void *", the messages are
strongly-typed.  Also, I want to have diagnostic sinks subscribe to
some messages, and these are not plugins.  It seems to me that the
notification mechanism should be orthogonal to whether or not the
sender or receiver components are built in the main executable or are
in a plugin.

Patch 1 adds generic publish/subscribe classes, and selftests.

Patch 2 adds:
* a new gcc/topics/ source subdirectory to hold the types for
publish/subscribe topics relating to the compiler
* a new struct compiler_channels to the global gcc::context
* a pass_events_channel which issues notifications when passes
stop and start on particular functions
* a toy plugin using the above to implement a progress notification UI

Patch 3 uses the pass_events_channel to extend the diagnostics subsystem
so that sinks gain a key/value pair "cfg={yes,no}" which allows capturing
the state of GCC's internal representation in SARIF files.

Patch 4 is an example of eliminating a plugin event
(PLUGIN_ANALYZER_INIT)in favor of a pub/sub channel, which plugins can
subscribe to instead.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.

OK for trunk?

I have various followups planned that add other kinds of channel, and
allow other kinds of information to be (optionally) captured in SARIF
dumps:
• callgraph
• inheritance hierarchy
• #include graph of a TU (what includes what)
* etc
but those patches aren't yet ready [1]

Dave

[1] see slides 33-38 of my Cauldron talk:
https://gcc.gnu.org/wiki/cauldron2025#What.27s_new_with_diagnostics_in_GCC_16


David Malcolm (4):
  Add pub-sub.{h,cc}
  Add publish/subscribe topics and channel: pass_events
  diagnostics: add optional CFG dumps to SARIF/HTML output sinks
  analyzer: replace PLUGIN_ANALYZER_INIT with a pub/sub channel

 gcc/Makefile.in                               |   5 +
 gcc/analyzer/common.h                         |  47 ++-
 gcc/analyzer/engine.cc                        |  36 +-
 gcc/cfghooks.cc                               |  30 ++
 gcc/cfghooks.h                                |  10 +
 gcc/cfgrtl.cc                                 |   2 +
 gcc/channels.h                                |  45 ++
 gcc/context.cc                                |   7 +-
 gcc/context.h                                 |  12 +
 gcc/custom-sarif-properties/cfg.cc            |  69 ++++
 gcc/custom-sarif-properties/cfg.h             |  64 +++
 gcc/diagnostics/digraphs-to-dot-from-cfg.cc   | 323 +++++++++++++++
 gcc/diagnostics/digraphs-to-dot.cc            | 202 +++++++++
 gcc/diagnostics/digraphs-to-dot.h             |  84 ++++
 gcc/diagnostics/digraphs.cc                   | 137 +-----
 gcc/diagnostics/digraphs.h                    |   6 +
 gcc/diagnostics/html-sink.cc                  |  30 ++
 gcc/diagnostics/sarif-sink.cc                 |  40 ++
 gcc/diagnostics/sink.h                        |   5 +
 gcc/diagnostics/text-sink.h                   |   7 +
 gcc/doc/invoke.texi                           |  23 +-
 gcc/doc/plugins.texi                          |   4 -
 gcc/gimple-pretty-print.cc                    |  84 ++++
 gcc/gimple-pretty-print.h                     |   7 +
 gcc/graphviz.cc                               |  52 +++
 gcc/graphviz.h                                |   3 +
 gcc/libsarifreplay.cc                         |   5 +-
 gcc/opts-common.cc                            |   1 +
 gcc/opts-diagnostic.cc                        |  93 ++++-
 gcc/opts-diagnostic.h                         |  14 +
 gcc/opts.cc                                   |   1 +
 gcc/passes.cc                                 |  12 +
 gcc/plugin.cc                                 |   2 -
 gcc/plugin.def                                |   4 -
 gcc/print-rtl.cc                              |  25 ++
 gcc/print-rtl.h                               |   7 +
 gcc/pub-sub.cc                                | 138 +++++++
 gcc/pub-sub.h                                 |  68 +++
 gcc/selftest-run-tests.cc                     |   1 +
 gcc/selftest.h                                |   1 +
 gcc/testsuite/gcc.dg/diagnostic-cfgs-html.py  |  21 +
 gcc/testsuite/gcc.dg/diagnostic-cfgs-sarif.py |  84 ++++
 gcc/testsuite/gcc.dg/diagnostic-cfgs.c        |  18 +
 .../gcc.dg/plugin/analyzer_cpython_plugin.cc  |  53 +--
 .../gcc.dg/plugin/analyzer_gil_plugin.cc      |  30 +-
 .../gcc.dg/plugin/analyzer_kernel_plugin.cc   |  43 +-
 .../plugin/analyzer_known_fns_plugin.cc       |  37 +-
 gcc/testsuite/gcc.dg/plugin/plugin.exp        |   1 +
 .../plugin/progress_notifications_plugin.cc   |  51 +++
 gcc/topics/pass-events.h                      |  59 +++
 gcc/tree-cfg.cc                               |   1 +
 gcc/tree-diagnostic-cfg.cc                    | 390 ++++++++++++++++++
 gcc/tree-diagnostic-sink-extensions.h         |  32 ++
 gcc/tree-diagnostic.cc                        |   5 +
 54 files changed, 2256 insertions(+), 275 deletions(-)
 create mode 100644 gcc/channels.h
 create mode 100644 gcc/custom-sarif-properties/cfg.cc
 create mode 100644 gcc/custom-sarif-properties/cfg.h
 create mode 100644 gcc/diagnostics/digraphs-to-dot-from-cfg.cc
 create mode 100644 gcc/diagnostics/digraphs-to-dot.cc
 create mode 100644 gcc/diagnostics/digraphs-to-dot.h
 create mode 100644 gcc/pub-sub.cc
 create mode 100644 gcc/pub-sub.h
 create mode 100644 gcc/testsuite/gcc.dg/diagnostic-cfgs-html.py
 create mode 100644 gcc/testsuite/gcc.dg/diagnostic-cfgs-sarif.py
 create mode 100644 gcc/testsuite/gcc.dg/diagnostic-cfgs.c
 create mode 100644 gcc/testsuite/gcc.dg/plugin/progress_notifications_plugin.cc
 create mode 100644 gcc/topics/pass-events.h
 create mode 100644 gcc/tree-diagnostic-cfg.cc
 create mode 100644 gcc/tree-diagnostic-sink-extensions.h

-- 
2.26.3

Reply via email to