aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2019-12-11 19:06:39 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2019-12-11 19:06:39 +0000
commit368877a11b789a74b1ae5b878e3bd30039118c30 (patch)
tree616fe464613c54fdd3f9145a99dc1e15724d8745
parent34a53788fec49e0a85bd32b51b057cfaae0200c8 (diff)
downloadgcc-368877a11b789a74b1ae5b878e3bd30039118c30.zip
gcc-368877a11b789a74b1ae5b878e3bd30039118c30.tar.gz
gcc-368877a11b789a74b1ae5b878e3bd30039118c30.tar.bz2
Introduce pretty_printer::clone vfunc
This patch provides a way to clone a pretty_printer. This is needed so that we can capture text in a label_text and make layout decisions based on it, using the policy of global_dc's printer, whilst within a call to diagnostic_show_locus. We can't print with the pretty_printer itself within a call to diagnostic_show_locus since it has partly-buffered content. gcc/c-family/ChangeLog: * c-pretty-print.c (c_pretty_printer::clone): New vfunc implementation. * c-pretty-print.h (c_pretty_printer::clone): New vfunc decl. gcc/cp/ChangeLog: * cxx-pretty-print.c (cxx_pretty_printer::clone): New vfunc implementation. * cxx-pretty-print.h (cxx_pretty_printer::clone): New vfunc decl. * error.c (cxx_format_postprocessor::clone): New vfunc. gcc/ChangeLog: * pretty-print.c (pretty_printer::pretty_printer): New copy-ctor. (pretty_printer::clone): New vfunc implementation. * pretty-print.h (format_postprocessor::clone): New pure vfunc decl. (pretty_printer::pretty_printer): New copy-ctor decl. (pretty_printer::clone): New vfunc decl. From-SVN: r279244
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/c-family/ChangeLog6
-rw-r--r--gcc/c-family/c-pretty-print.c7
-rw-r--r--gcc/c-family/c-pretty-print.h1
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cxx-pretty-print.c8
-rw-r--r--gcc/cp/cxx-pretty-print.h2
-rw-r--r--gcc/cp/error.c5
-rw-r--r--gcc/pretty-print.c34
-rw-r--r--gcc/pretty-print.h4
10 files changed, 83 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1603580..747b04d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2019-12-11 David Malcolm <dmalcolm@redhat.com>
+ * pretty-print.c (pretty_printer::pretty_printer): New copy-ctor.
+ (pretty_printer::clone): New vfunc implementation.
+ * pretty-print.h (format_postprocessor::clone): New pure vfunc
+ decl.
+ (pretty_printer::pretty_printer): New copy-ctor decl.
+ (pretty_printer::clone): New vfunc decl.
+
+2019-12-11 David Malcolm <dmalcolm@redhat.com>
+
* function-tests.c (selftest::make_fndecl): Make non-static.
* selftest.h (selftest::make_fndecl): New decl.
diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog
index 9d48855..b264c38 100644
--- a/gcc/c-family/ChangeLog
+++ b/gcc/c-family/ChangeLog
@@ -1,3 +1,9 @@
+2019-12-11 David Malcolm <dmalcolm@redhat.com>
+
+ * c-pretty-print.c (c_pretty_printer::clone): New vfunc
+ implementation.
+ * c-pretty-print.h (c_pretty_printer::clone): New vfunc decl.
+
2019-12-09 David Malcolm <dmalcolm@redhat.com>
* c-format.c (range_label_for_format_type_mismatch::get_text):
diff --git a/gcc/c-family/c-pretty-print.c b/gcc/c-family/c-pretty-print.c
index bc73545..e5e898a 100644
--- a/gcc/c-family/c-pretty-print.c
+++ b/gcc/c-family/c-pretty-print.c
@@ -2372,6 +2372,13 @@ c_pretty_printer::c_pretty_printer ()
parameter_list = pp_c_parameter_type_list;
}
+/* c_pretty_printer's implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+c_pretty_printer::clone () const
+{
+ return new c_pretty_printer (*this);
+}
/* Print the tree T in full, on file FILE. */
diff --git a/gcc/c-family/c-pretty-print.h b/gcc/c-family/c-pretty-print.h
index 8d69620..df21e21 100644
--- a/gcc/c-family/c-pretty-print.h
+++ b/gcc/c-family/c-pretty-print.h
@@ -51,6 +51,7 @@ class c_pretty_printer : public pretty_printer
{
public:
c_pretty_printer ();
+ pretty_printer *clone () const OVERRIDE;
// Format string, possibly translated.
void translate_string (const char *);
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index d8a6ae3..202bb6c 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2019-12-11 David Malcolm <dmalcolm@redhat.com>
+
+ * cxx-pretty-print.c (cxx_pretty_printer::clone): New vfunc
+ implementation.
+ * cxx-pretty-print.h (cxx_pretty_printer::clone): New vfunc decl.
+ * error.c (cxx_format_postprocessor::clone): New vfunc.
+
2019-12-11 Jakub Jelinek <jakub@redhat.com>
PR c++/92869
diff --git a/gcc/cp/cxx-pretty-print.c b/gcc/cp/cxx-pretty-print.c
index 6280544..b14aa96 100644
--- a/gcc/cp/cxx-pretty-print.c
+++ b/gcc/cp/cxx-pretty-print.c
@@ -2968,3 +2968,11 @@ cxx_pretty_printer::cxx_pretty_printer ()
type_specifier_seq = (pp_fun) pp_cxx_type_specifier_seq;
parameter_list = (pp_fun) pp_cxx_parameter_declaration_clause;
}
+
+/* cxx_pretty_printer's implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+cxx_pretty_printer::clone () const
+{
+ return new cxx_pretty_printer (*this);
+}
diff --git a/gcc/cp/cxx-pretty-print.h b/gcc/cp/cxx-pretty-print.h
index 347811f..dd96226 100644
--- a/gcc/cp/cxx-pretty-print.h
+++ b/gcc/cp/cxx-pretty-print.h
@@ -34,6 +34,8 @@ class cxx_pretty_printer : public c_pretty_printer
public:
cxx_pretty_printer ();
+ pretty_printer *clone () const OVERRIDE;
+
void constant (tree);
void id_expression (tree);
void primary_expression (tree);
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 7c46c17..298030b 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -143,6 +143,11 @@ class cxx_format_postprocessor : public format_postprocessor
: m_type_a (), m_type_b ()
{}
+ format_postprocessor *clone() const FINAL OVERRIDE
+ {
+ return new cxx_format_postprocessor ();
+ }
+
void handle (pretty_printer *pp) FINAL OVERRIDE;
deferred_printed_type m_type_a;
diff --git a/gcc/pretty-print.c b/gcc/pretty-print.c
index 511ef0a..084e03c 100644
--- a/gcc/pretty-print.c
+++ b/gcc/pretty-print.c
@@ -1590,6 +1590,32 @@ pretty_printer::pretty_printer (int maximum_length)
pp_set_prefix (this, NULL);
}
+/* Copy constructor for pretty_printer. */
+
+pretty_printer::pretty_printer (const pretty_printer &other)
+: buffer (new (XCNEW (output_buffer)) output_buffer ()),
+ prefix (),
+ padding (other.padding),
+ maximum_length (other.maximum_length),
+ indent_skip (other.indent_skip),
+ wrapping (other.wrapping),
+ format_decoder (other.format_decoder),
+ m_format_postprocessor (NULL),
+ emitted_prefix (other.emitted_prefix),
+ need_newline (other.need_newline),
+ translate_identifiers (other.translate_identifiers),
+ show_color (other.show_color),
+ show_urls (other.show_urls)
+{
+ pp_line_cutoff (this) = maximum_length;
+ /* By default, we emit prefixes once per message. */
+ pp_prefixing_rule (this) = pp_prefixing_rule (&other);
+ pp_set_prefix (this, NULL);
+
+ if (other.m_format_postprocessor)
+ m_format_postprocessor = other.m_format_postprocessor->clone ();
+}
+
pretty_printer::~pretty_printer ()
{
if (m_format_postprocessor)
@@ -1599,6 +1625,14 @@ pretty_printer::~pretty_printer ()
free (prefix);
}
+/* Base class implementation of pretty_printer::clone vfunc. */
+
+pretty_printer *
+pretty_printer::clone () const
+{
+ return new pretty_printer (*this);
+}
+
/* Append a string delimited by START and END to the output area of
PRETTY-PRINTER. No line wrapping is done. However, if beginning a
new line then emit PRETTY-PRINTER's prefix and skip any leading
diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h
index c73fc30..493507d 100644
--- a/gcc/pretty-print.h
+++ b/gcc/pretty-print.h
@@ -192,6 +192,7 @@ class format_postprocessor
{
public:
virtual ~format_postprocessor () {}
+ virtual format_postprocessor *clone() const = 0;
virtual void handle (pretty_printer *) = 0;
};
@@ -221,9 +222,12 @@ public:
/* Default construct a pretty printer with specified
maximum line length cut off limit. */
explicit pretty_printer (int = 0);
+ explicit pretty_printer (const pretty_printer &other);
virtual ~pretty_printer ();
+ virtual pretty_printer *clone () const;
+
/* Where we print external representation of ENTITY. */
output_buffer *buffer;