aboutsummaryrefslogtreecommitdiff
path: root/gcc/pretty-print.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-04-29 22:41:47 +0200
committerJakub Jelinek <jakub@redhat.com>2020-04-29 22:41:47 +0200
commit691eeb65a01dab3084b6ce381737adf097bd2e65 (patch)
tree0d1b729fa533287e181c110c95c7543f9571e358 /gcc/pretty-print.c
parent48e54fea7ba4a7cb7b3d1505951383120220e394 (diff)
downloadgcc-691eeb65a01dab3084b6ce381737adf097bd2e65.zip
gcc-691eeb65a01dab3084b6ce381737adf097bd2e65.tar.gz
gcc-691eeb65a01dab3084b6ce381737adf097bd2e65.tar.bz2
diagnostics: Add %{...%} pretty-format support for URLs and use it in -Wpsabi diagnostics
The following patch attempts to use the diagnostics URL support if available to provide more information about the C++17 empty base and C++20 [[no_unique_address]] empty class ABI changes in -Wpsabi diagnostics. in GCC 10.1 at the end of the diagnostics is then in some terminals underlined with a dotted line and points to a (to be written) anchor in gcc-10/changes.html which we need to write anyway. 2020-04-29 Jakub Jelinek <jakub@redhat.com> * configure.ac (-with-changes-root-url): New configure option, defaulting to https://gcc.gnu.org/. * Makefile.in (CFLAGS-opts.o): Define CHANGES_ROOT_URL for opts.c. * pretty-print.c (get_end_url_string): New function. (pp_format): Handle %{ and %} for URLs. (pp_begin_url): Use pp_string instead of pp_printf. (pp_end_url): Use get_end_url_string. * opts.h (get_changes_url): Declare. * opts.c (get_changes_url): New function. * config/rs6000/rs6000-call.c: Include opts.h. (rs6000_discover_homogeneous_aggregate): Use %{in GCC 10.1%} instead of just in GCC 10.1 in diagnostics and add URL. * config/arm/arm.c (aapcs_vfp_is_call_or_return_candidate): Likewise. * config/aarch64/aarch64.c (aarch64_vfp_is_call_or_return_candidate): Likewise. * config/s390/s390.c (s390_function_arg_vector, s390_function_arg_float): Likewise. * configure: Regenerated. * c-format.c (PP_FORMAT_CHAR_TABLE): Add %{ and %}.
Diffstat (limited to 'gcc/pretty-print.c')
-rw-r--r--gcc/pretty-print.c83
1 files changed, 56 insertions, 27 deletions
diff --git a/gcc/pretty-print.c b/gcc/pretty-print.c
index dde138b..d0dd9cb 100644
--- a/gcc/pretty-print.c
+++ b/gcc/pretty-print.c
@@ -1020,6 +1020,8 @@ pp_indent (pretty_printer *pp)
pp_space (pp);
}
+static const char *get_end_url_string (pretty_printer *);
+
/* The following format specifiers are recognized as being client independent:
%d, %i: (signed) integer in base ten.
%u: unsigned integer in base ten.
@@ -1038,6 +1040,8 @@ pp_indent (pretty_printer *pp)
%%: '%'.
%<: opening quote.
%>: closing quote.
+ %{: URL start. Consumes a const char * argument for the URL.
+ %}: URL end. Does not consume any arguments.
%': apostrophe (should only be used in untranslated messages;
translations should use appropriate punctuation directly).
%@: diagnostic_event_id_ptr, for which event_id->known_p () must be true.
@@ -1051,7 +1055,7 @@ pp_indent (pretty_printer *pp)
Arguments can be used sequentially, or through %N$ resp. *N$
notation Nth argument after the format string. If %N$ / *N$
notation is used, it must be used for all arguments, except %m, %%,
- %<, %> and %', which may not have a number, as they do not consume
+ %<, %>, %} and %', which may not have a number, as they do not consume
an argument. When %M$.*N$s is used, M must be N + 1. (This may
also be written %M$.*s, provided N is not otherwise used.) The
format string must have conversion specifiers with argument numbers
@@ -1084,7 +1088,7 @@ pp_format (pretty_printer *pp, text_info *text)
/* Formatting phase 1: split up TEXT->format_spec into chunks in
pp_buffer (PP)->args[]. Even-numbered chunks are to be output
verbatim, odd-numbered chunks are format specifiers.
- %m, %%, %<, %>, and %' are replaced with the appropriate text at
+ %m, %%, %<, %>, %} and %' are replaced with the appropriate text at
this point. */
memset (formatters, 0, sizeof formatters);
@@ -1133,6 +1137,15 @@ pp_format (pretty_printer *pp, text_info *text)
p++;
continue;
+ case '}':
+ {
+ const char *endurlstr = get_end_url_string (pp);
+ obstack_grow (&buffer->chunk_obstack, endurlstr,
+ strlen (endurlstr));
+ }
+ p++;
+ continue;
+
case 'R':
{
const char *colorstr = colorize_stop (pp_show_color (pp));
@@ -1445,6 +1458,10 @@ pp_format (pretty_printer *pp, text_info *text)
}
break;
+ case '{':
+ pp_begin_url (pp, va_arg (*text->args_ptr, const char *));
+ break;
+
default:
{
bool ok;
@@ -2172,18 +2189,41 @@ void
pp_begin_url (pretty_printer *pp, const char *url)
{
switch (pp->url_format)
- {
- case URL_FORMAT_NONE:
- break;
- case URL_FORMAT_ST:
- pp_printf (pp, "\33]8;;%s\33\\", url);
- break;
- case URL_FORMAT_BEL:
- pp_printf (pp, "\33]8;;%s\a", url);
- break;
- default:
- gcc_unreachable ();
- }
+ {
+ case URL_FORMAT_NONE:
+ break;
+ case URL_FORMAT_ST:
+ pp_string (pp, "\33]8;;");
+ pp_string (pp, url);
+ pp_string (pp, "\33\\");
+ break;
+ case URL_FORMAT_BEL:
+ pp_string (pp, "\33]8;;");
+ pp_string (pp, url);
+ pp_string (pp, "\a");
+ break;
+ default:
+ gcc_unreachable ();
+ }
+}
+
+/* Helper function for pp_end_url and pp_format, return the "close URL" escape
+ sequence string. */
+
+static const char *
+get_end_url_string (pretty_printer *pp)
+{
+ switch (pp->url_format)
+ {
+ case URL_FORMAT_NONE:
+ return "";
+ case URL_FORMAT_ST:
+ return "\33]8;;\33\\";
+ case URL_FORMAT_BEL:
+ return "\33]8;;\a";
+ default:
+ gcc_unreachable ();
+ }
}
/* If URL-printing is enabled, write a "close URL" escape sequence to PP. */
@@ -2191,19 +2231,8 @@ pp_begin_url (pretty_printer *pp, const char *url)
void
pp_end_url (pretty_printer *pp)
{
- switch (pp->url_format)
- {
- case URL_FORMAT_NONE:
- break;
- case URL_FORMAT_ST:
- pp_string (pp, "\33]8;;\33\\");
- break;
- case URL_FORMAT_BEL:
- pp_string (pp, "\33]8;;\a");
- break;
- default:
- gcc_unreachable ();
- }
+ if (pp->url_format != URL_FORMAT_NONE)
+ pp_string (pp, get_end_url_string (pp));
}
#if CHECKING_P