This patch provides a way for plugins to add extra information
to a diagnostic sink, potentially capturing more information via
a "finalizer" hook.
Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r16-4330-g0558c6028e47eb.
gcc/c-family/ChangeLog:
* c-opts.cc: Define INCLUDE_VECTOR.
gcc/cp/ChangeLog:
* error.cc: Define INCLUDE_VECTOR.
gcc/ChangeLog:
* diagnostic-global-context.cc: Define INCLUDE_VECTOR.
* diagnostics/buffering.cc: Likewise.
* diagnostics/context.cc (context::finish): Call
finalize_extensions on each sink.
(sink::dump): Dump any extensions.
(sink::finalize_extensions): New.
* diagnostics/macro-unwinding.cc: Define INCLUDE_VECTOR.
* diagnostics/selftest-context.cc: Likewise.
* diagnostics/sink.h (class sink::extension): New.
(sink::add_extension): New.
(sink::finalize_extensions): New decl.
(sink::m_extensions): New member.
* gcc.cc: Define INCLUDE_VECTOR.
* langhooks.cc: Likewise.
* opts.cc: Likewise.
* tree-diagnostic-client-data-hooks.cc: Likewise.
* tree-diagnostic.cc: Likewise.
gcc/fortran/ChangeLog:
* error.cc: Define INCLUDE_VECTOR.
gcc/testsuite/ChangeLog:
* gcc.dg/plugin/diagnostic_group_plugin.cc: Define INCLUDE_VECTOR.
* gcc.dg/plugin/diagnostic_plugin_test_show_locus.cc: Likewise.
* gcc.dg/plugin/location_overflow_plugin.cc: Likewise.
libcc1/ChangeLog:
* context.cc: Define INCLUDE_VECTOR.
---
gcc/c-family/c-opts.cc | 1 +
gcc/cp/error.cc | 1 +
gcc/diagnostic-global-context.cc | 1 +
gcc/diagnostics/buffering.cc | 1 +
gcc/diagnostics/context.cc | 17 ++++++++++
gcc/diagnostics/macro-unwinding.cc | 1 +
gcc/diagnostics/selftest-context.cc | 1 +
gcc/diagnostics/sink.h | 33 +++++++++++++++++++
gcc/fortran/error.cc | 1 +
gcc/gcc.cc | 1 +
gcc/langhooks.cc | 1 +
gcc/opts.cc | 1 +
.../gcc.dg/plugin/diagnostic_group_plugin.cc | 1 +
.../diagnostic_plugin_test_show_locus.cc | 1 +
.../gcc.dg/plugin/location_overflow_plugin.cc | 1 +
gcc/tree-diagnostic-client-data-hooks.cc | 1 +
gcc/tree-diagnostic.cc | 1 +
libcc1/context.cc | 1 +
18 files changed, 66 insertions(+)
diff --git a/gcc/c-family/c-opts.cc b/gcc/c-family/c-opts.cc
index 54e397cda9a4..7bec3f105997 100644
--- a/gcc/c-family/c-opts.cc
+++ b/gcc/c-family/c-opts.cc
@@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/cp/error.cc b/gcc/cp/error.cc
index 16dfeafc07a0..ae899ec9f770 100644
--- a/gcc/cp/error.cc
+++ b/gcc/cp/error.cc
@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
/* For use with name_hint. */
#include "system.h"
diff --git a/gcc/diagnostic-global-context.cc b/gcc/diagnostic-global-context.cc
index 30fc1906790c..94be0fed81e3 100644
--- a/gcc/diagnostic-global-context.cc
+++ b/gcc/diagnostic-global-context.cc
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see
/* This file implements the parts of the language independent aspect
of diagnostic messages that implicitly use global_dc. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/diagnostics/buffering.cc b/gcc/diagnostics/buffering.cc
index 019c9927c6d2..420a9cfbeea3 100644
--- a/gcc/diagnostics/buffering.cc
+++ b/gcc/diagnostics/buffering.cc
@@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/diagnostics/context.cc b/gcc/diagnostics/context.cc
index cd14977d5425..dd6bbdb29cd7 100644
--- a/gcc/diagnostics/context.cc
+++ b/gcc/diagnostics/context.cc
@@ -361,6 +361,9 @@ context::finish ()
dump (m_logger->get_stream (), m_logger->get_indent ());
}
+ for (auto iter : m_sinks)
+ iter->finalize_extensions ();
+
/* We might be handling a fatal error.
Close any active diagnostic groups, which may trigger flushing
sinks. */
@@ -1860,6 +1863,20 @@ sink::dump (FILE *out, int indent) const
{
dumping::emit_heading (out, indent, "printer");
m_printer->dump (out, indent + 2);
+
+ dumping::emit_heading (out, indent, "extensions");
+ if (m_extensions.empty ())
+ dumping::emit_none (out, indent + 2);
+ else
+ for (auto &ext : m_extensions)
+ ext->dump (out, indent + 2);
+}
+
+void
+sink::finalize_extensions ()
+{
+ for (auto &ext : m_extensions)
+ ext->finalize ();
}
void
diff --git a/gcc/diagnostics/macro-unwinding.cc
b/gcc/diagnostics/macro-unwinding.cc
index fb4ee65f4244..4d7133963ad9 100644
--- a/gcc/diagnostics/macro-unwinding.cc
+++ b/gcc/diagnostics/macro-unwinding.cc
@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/diagnostics/selftest-context.cc
b/gcc/diagnostics/selftest-context.cc
index 2eced4d3cd85..aafa90ac457d 100644
--- a/gcc/diagnostics/selftest-context.cc
+++ b/gcc/diagnostics/selftest-context.cc
@@ -17,6 +17,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/diagnostics/sink.h b/gcc/diagnostics/sink.h
index aaa6c50ab214..a2094e9f5a56 100644
--- a/gcc/diagnostics/sink.h
+++ b/gcc/diagnostics/sink.h
@@ -34,6 +34,27 @@ class per_sink_buffer;
class sink
{
public:
+ /* Abstract base class for adding additional functionality to a sink
+ (e.g. via a plugin). */
+ class extension
+ {
+ public:
+ virtual ~extension () {}
+ virtual void dump (FILE *out, int indent) const = 0;
+ virtual void finalize () {}
+
+ sink &get_sink () const { return m_sink; }
+
+ protected:
+ extension (sink &sink_)
+ : m_sink (sink_)
+ {
+ }
+
+ private:
+ sink &m_sink;
+ };
+
virtual ~sink () {}
virtual text_sink *dyn_cast_text_sink () { return nullptr; }
@@ -92,6 +113,15 @@ public:
logging::logger *get_logger () { return m_context.get_logger (); }
+ void
+ add_extension (std::unique_ptr<extension> sink_ext)
+ {
+ m_extensions.push_back (std::move (sink_ext));
+ }
+
+ void
+ finalize_extensions ();
+
protected:
sink (context &dc)
: m_context (dc),
@@ -101,6 +131,9 @@ protected:
protected:
context &m_context;
std::unique_ptr<pretty_printer> m_printer;
+
+private:
+ std::vector<std::unique_ptr<extension>> m_extensions;
};
extern void
diff --git a/gcc/fortran/error.cc b/gcc/fortran/error.cc
index ebf9e6197d22..8fde46ed6afc 100644
--- a/gcc/fortran/error.cc
+++ b/gcc/fortran/error.cc
@@ -24,6 +24,7 @@ along with GCC; see the file COPYING3. If not see
for possible use later. If a line does not match a legal
construction, then the saved error message is reported. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/gcc.cc b/gcc/gcc.cc
index 8da821e92ac4..0a9adc35b82a 100644
--- a/gcc/gcc.cc
+++ b/gcc/gcc.cc
@@ -28,6 +28,7 @@ Once it knows which kind of compilation to perform, the
procedure for
compilation is specified by a string called a "spec". */
#define INCLUDE_STRING
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#ifdef HOST_HAS_PERSONALITY_ADDR_NO_RANDOMIZE
diff --git a/gcc/langhooks.cc b/gcc/langhooks.cc
index 20d27a6d7fd0..6431d40af048 100644
--- a/gcc/langhooks.cc
+++ b/gcc/langhooks.cc
@@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/opts.cc b/gcc/opts.cc
index 10ce2c3de336..21ac6b566e0b 100644
--- a/gcc/opts.cc
+++ b/gcc/opts.cc
@@ -18,6 +18,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "intl.h"
diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
b/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
index 48f832579add..2bead63eede8 100644
--- a/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
+++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_group_plugin.cc
@@ -1,5 +1,6 @@
/* { dg-options "-O" } */
+#define INCLUDE_VECTOR
#include "gcc-plugin.h"
#include "config.h"
#include "system.h"
diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.cc
b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.cc
index 92839cd35b7f..9ee3219370cb 100644
--- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.cc
+++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_show_locus.cc
@@ -32,6 +32,7 @@
to ensure that further very long lines don't start a new linemap.
This also means that we can't use macros in the test files. */
+#define INCLUDE_VECTOR
#include "gcc-plugin.h"
#include "config.h"
#include "system.h"
diff --git a/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.cc
b/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.cc
index 00ad8704477a..2c40b311165e 100644
--- a/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.cc
+++ b/gcc/testsuite/gcc.dg/plugin/location_overflow_plugin.cc
@@ -1,6 +1,7 @@
/* Plugin for testing how gracefully we degrade in the face of very
large source files. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "gcc-plugin.h"
#include "system.h"
diff --git a/gcc/tree-diagnostic-client-data-hooks.cc
b/gcc/tree-diagnostic-client-data-hooks.cc
index 77eb292f787d..9ad608d17e09 100644
--- a/gcc/tree-diagnostic-client-data-hooks.cc
+++ b/gcc/tree-diagnostic-client-data-hooks.cc
@@ -19,6 +19,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/gcc/tree-diagnostic.cc b/gcc/tree-diagnostic.cc
index 20183c8bceda..4cf742d047d9 100644
--- a/gcc/tree-diagnostic.cc
+++ b/gcc/tree-diagnostic.cc
@@ -19,6 +19,7 @@ You should have received a copy of the GNU General Public
License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#define INCLUDE_VECTOR
#include "config.h"
#include "system.h"
#include "coretypes.h"
diff --git a/libcc1/context.cc b/libcc1/context.cc
index 38343a7c29eb..b392f774c723 100644
--- a/libcc1/context.cc
+++ b/libcc1/context.cc
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3. If not see
#undef PACKAGE_TARNAME
#undef PACKAGE_VERSION
+#define INCLUDE_VECTOR
#include "gcc-plugin.h"
#include "system.h"
#include "coretypes.h"
--
2.26.3