On Wed, Apr 29, 2020 at 3:44 PM Jakub Jelinek via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Hi! > > 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. > > 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. > > Ok for trunk if this passes bootstrap/regtest? > > 2020-04-29 Jakub Jelinek <ja...@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 (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 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 %{GCC 10.1%} instead of > just 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. > * configure: Regenerated. > > * c-format.c (PP_FORMAT_CHAR_TABLE): Add %{ and %}. > > --- gcc/configure.ac.jj 2020-04-29 10:21:25.061999873 +0200 > +++ gcc/configure.ac 2020-04-29 13:26:51.515516959 +0200 > @@ -986,6 +986,20 @@ AC_ARG_WITH(documentation-root-url, > ) > AC_SUBST(DOCUMENTATION_ROOT_URL) > > +# Allow overriding the default URL for GCC changes > +AC_ARG_WITH(changes-root-url, > + AS_HELP_STRING([--with-changes-root-url=URL], > + [Root for GCC changes URLs]), > + [case "$withval" in > + yes) AC_MSG_ERROR([changes root URL not specified]) ;; > + no) AC_MSG_ERROR([changes root URL not specified]) ;; > + *) CHANGES_ROOT_URL="$withval" > + ;; > + esac], > + CHANGES_ROOT_URL="https://gcc.gnu.org/" > +) > +AC_SUBST(CHANGES_ROOT_URL) > + > # Sanity check enable_languages in case someone does not run the toplevel > # configure # script. > AC_ARG_ENABLE(languages, > --- gcc/Makefile.in.jj 2020-02-27 09:28:46.129960135 +0100 > +++ gcc/Makefile.in 2020-04-29 13:38:42.455008718 +0200 > @@ -2187,6 +2187,7 @@ lto-wrapper$(exeext): $(LTO_WRAPPER_OBJS > mv -f T$@ $@ > > CFLAGS-opts.o += -DDOCUMENTATION_ROOT_URL=\"@DOCUMENTATION_ROOT_URL@\" > +CFLAGS-opts.o += -DCHANGES_ROOT_URL=\"@CHANGES_ROOT_URL@\" > > # Files used by all variants of C or by the stand-alone pre-processor. > > --- gcc/pretty-print.c.jj 2020-04-25 00:08:33.359759328 +0200 > +++ gcc/pretty-print.c 2020-04-29 14:30:46.791792554 +0200 > @@ -1020,6 +1020,8 @@ pp_indent (pretty_printer *pp) > pp_space (pp); > } > > +static const char *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. > + %}: URL end. > %': 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 > /* 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 > p++; > continue; > > + case '}': > + { > + const char *endurlstr = 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 > } > 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 * > +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 > 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, end_url_string (pp)); > } > > #if CHECKING_P > --- gcc/opts.h.jj 2020-02-24 09:02:27.332710905 +0100 > +++ gcc/opts.h 2020-04-29 13:56:55.621826605 +0200 > @@ -464,6 +464,7 @@ extern void parse_options_from_collect_g > int *); > > extern void prepend_xassembler_to_collect_as_options (const char *, obstack > *); > +extern char *get_changes_url (const char *); > > /* Set OPTION in OPTS to VALUE if the option is not set in OPTS_SET. */ > > --- gcc/opts.c.jj 2020-04-27 23:28:18.865609469 +0200 > +++ gcc/opts.c 2020-04-29 13:42:13.033891253 +0200 > @@ -3190,6 +3190,15 @@ get_option_url (diagnostic_context *, in > return NULL; > } > > +/* Given "gcc-10/changes.html#foobar", return that URL under > + CHANGES_ROOT_URL (see --with-changes-root-url). */ > + > +char * > +get_changes_url (const char *str) > +{ > + return concat (CHANGES_ROOT_URL, str, NULL); > +} > + > #if CHECKING_P > > namespace selftest { > --- gcc/config/arm/arm.c.jj 2020-04-29 13:12:46.736007298 +0200 > +++ gcc/config/arm/arm.c 2020-04-29 14:34:04.878864236 +0200 > @@ -6416,6 +6416,8 @@ aapcs_vfp_is_call_or_return_candidate (e > && ((alt = aapcs_vfp_sub_candidate (type, &new_mode, NULL)) > != ag_count)) > { > + const char *url > + = get_changes_url ("gcc-10/changes.html#empty_base");
This is called even when !warn_psabi_flags and I wonder if we could instead use a macro at uses, like > gcc_assert (alt == -1); > last_reported_type_uid = uid; > /* Use TYPE_MAIN_VARIANT to strip any redundant const > @@ -6423,11 +6425,14 @@ aapcs_vfp_is_call_or_return_candidate (e > if (warn_psabi_flags & WARN_PSABI_NO_UNIQUE_ADDRESS) > inform (input_location, "parameter passing for argument of " > "type %qT with %<[[no_unique_address]]%> members " > - "changed in GCC 10.1", TYPE_MAIN_VARIANT (type)); > + "changed in %{GCC 10.1%}", > + TYPE_MAIN_VARIANT (type), url); , CHANGES_URL ("gcc-10/changes.html#empty_base"); where the macro would just use preprocessor string concatenation? Alternatively 'url' could be static I guess (and never freed) > else if (warn_psabi_flags & WARN_PSABI_EMPTY_CXX17_BASE) > inform (input_location, "parameter passing for argument of " > "type %qT when C++17 is enabled changed to match " > - "C++14 in GCC 10.1", TYPE_MAIN_VARIANT (type)); > + "C++14 in %{GCC 10.1%}", > + TYPE_MAIN_VARIANT (type), url); > + free (url); > } > *count = ag_count; > } > --- gcc/config/aarch64/aarch64.c.jj 2020-04-29 13:12:46.715007609 +0200 > +++ gcc/config/aarch64/aarch64.c 2020-04-29 14:35:06.712950146 +0200 > @@ -16883,6 +16883,8 @@ aarch64_vfp_is_call_or_return_candidate > && ((alt = aapcs_vfp_sub_candidate (type, &new_mode, NULL)) > != ag_count)) > { > + const char *url > + = get_changes_url ("gcc-10/changes.html#empty_base"); > gcc_assert (alt == -1); > last_reported_type_uid = uid; > /* Use TYPE_MAIN_VARIANT to strip any redundant const > @@ -16890,11 +16892,14 @@ aarch64_vfp_is_call_or_return_candidate > if (warn_psabi_flags & WARN_PSABI_NO_UNIQUE_ADDRESS) > inform (input_location, "parameter passing for argument of " > "type %qT with %<[[no_unique_address]]%> members " > - "changed in GCC 10.1", TYPE_MAIN_VARIANT (type)); > + "changed in %{GCC 10.1%}", > + TYPE_MAIN_VARIANT (type), url); > else if (warn_psabi_flags & WARN_PSABI_EMPTY_CXX17_BASE) > inform (input_location, "parameter passing for argument of " > "type %qT when C++17 is enabled changed to match " > - "C++14 in GCC 10.1", TYPE_MAIN_VARIANT (type)); > + "C++14 in %{GCC 10.1%}", > + TYPE_MAIN_VARIANT (type), url); > + free (url); > } > > if (is_ha != NULL) *is_ha = true; > --- gcc/config/rs6000/rs6000-call.c.jj 2020-04-29 09:00:46.642524337 +0200 > +++ gcc/config/rs6000/rs6000-call.c 2020-04-29 13:50:45.873299042 +0200 > @@ -68,6 +68,7 @@ > #include "tree-vrp.h" > #include "tree-ssanames.h" > #include "targhooks.h" > +#include "opts.h" > > #include "rs6000-internal.h" > > @@ -5747,16 +5748,18 @@ rs6000_discover_homogeneous_aggregate (m > unsigned uid = TYPE_UID (TYPE_MAIN_VARIANT (type)); > if (uid != last_reported_type_uid) > { > + const char *url > + = get_changes_url ("gcc-10/changes.html#empty_base"); > if (empty_base_seen & 1) > inform (input_location, > "parameter passing for argument of type %qT " > "when C++17 is enabled changed to match C++14 > " > - "in GCC 10.1", type); > + "in %{GCC 10.1%}", type, url); > else > inform (input_location, > "parameter passing for argument of type %qT " > "with %<[[no_unique_address]]%> members " > - "changed in GCC 10.1", type); > + "changed in %{GCC 10.1%}", type, url); > last_reported_type_uid = uid; > } > } > --- gcc/c-family/c-format.c.jj 2020-02-10 15:49:50.821300965 +0100 > +++ gcc/c-family/c-format.c 2020-04-29 13:56:26.926250904 +0200 > @@ -757,6 +757,8 @@ static const format_char_info asm_fprint > { "<", 0, STD_C89, NOARGUMENTS, "", "<", NULL }, \ > { ">", 0, STD_C89, NOARGUMENTS, "", ">", NULL }, \ > { "'" , 0, STD_C89, NOARGUMENTS, "", "", NULL }, \ > + { "{", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, > BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "cR", > NULL }, \ > + { "}", 0, STD_C89, NOARGUMENTS, "", "", NULL }, \ > { "R", 0, STD_C89, NOARGUMENTS, "", "\\", NULL }, \ > { "m", 0, STD_C89, NOARGUMENTS, "q", "", NULL }, \ > { "Z", 1, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, > BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "", > &gcc_diag_char_table[0] } > --- gcc/configure.jj 2020-04-29 10:21:25.060999888 +0200 > +++ gcc/configure 2020-04-29 13:28:07.423395043 +0200 > @@ -819,6 +819,7 @@ accel_dir_suffix > real_target_noncanonical > enable_as_accelerator > gnat_install_lib > +CHANGES_ROOT_URL > DOCUMENTATION_ROOT_URL > REPORT_BUGS_TEXI > REPORT_BUGS_TO > @@ -967,6 +968,7 @@ with_specs > with_pkgversion > with_bugurl > with_documentation_root_url > +with_changes_root_url > enable_languages > with_multilib_list > with_zstd > @@ -1803,6 +1805,8 @@ Optional Packages: > --with-bugurl=URL Direct users to URL to report a bug > --with-documentation-root-url=URL > Root for documentation URLs > + --with-changes-root-url=URL > + Root for GCC changes URLs > --with-multilib-list select multilibs (AArch64, SH and x86-64 only) > --with-zstd=PATH specify prefix directory for installed zstd > library. > Equivalent to --with-zstd-include=PATH/include plus > @@ -7857,6 +7861,23 @@ fi > > > > +# Allow overriding the default URL for GCC changes > + > +# Check whether --with-changes-root-url was given. > +if test "${with_changes_root_url+set}" = set; then : > + withval=$with_changes_root_url; case "$withval" in > + yes) as_fn_error $? "changes root URL not specified" "$LINENO" 5 ;; > + no) as_fn_error $? "changes root URL not specified" "$LINENO" 5 ;; > + *) CHANGES_ROOT_URL="$withval" > + ;; > + esac > +else > + CHANGES_ROOT_URL="https://gcc.gnu.org/" > + > +fi > + > + > + > # Sanity check enable_languages in case someone does not run the toplevel > # configure # script. > # Check whether --enable-languages was given. > @@ -18988,7 +19009,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 18991 "configure" > +#line 19012 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -19094,7 +19115,7 @@ else > lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 > lt_status=$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 19097 "configure" > +#line 19118 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > > Jakub >