Hi David,

> On Fri, 2020-01-10 at 08:38 -0700, Jeff Law wrote:
>> On Wed, 2020-01-08 at 04:02 -0500, David Malcolm wrote:
>> > I believe I can self-approve this with my "diagnostic messages"
>> > maintainer hat on.  It has dependencies on the auto_delete_vec
>> > and the -fdiagnostics-nn-line-numbers patches.
>> > 
>> > Changed in v5:
>> > - updated copyright years to include 2020
>> > 
>> > Changed in v4:
>> > - Add support for paths for signal-handlers:
>> >   https://gcc.gnu.org/ml/gcc-patches/2019-12/msg00215.html
>> > - Fix comment
>> > 
>> > Changed in v3:
>> > - Fixup for rebase (r278634): c-format.c: get_pointer_to_named_type
>> > -> get_named_type
>> >     https://gcc.gnu.org/ml/gcc-patches/2019-12/msg00530.html
>> > 
>> > Changed in v2:
>> > - Fixup for rebase (r277284) for json::number ->
>> > json::integer_number
>> >     https://gcc.gnu.org/ml/gcc-patches/2019-11/msg02035.html
>> > 
>> > This patch adds support for associating a "diagnostic_path" with a
>> > diagnostic: a sequence of events predicted by the compiler that
>> > leads to
>> > the problem occurring, with their locations in the user's source,
>> > text descriptions, and stack information (for handling
>> > interprocedural
>> > paths).
>> > 
>> > For example, the following (hypothetical) error has a 3-event
>> > intraprocedural path:
>> > 
>> > test.c: In function 'demo':
>> > test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append'
>> > which
>> >   requires a non-NULL parameter
>> >    29 |     PyList_Append(list, item);
>> >       |     ^~~~~~~~~~~~~~~~~~~~~~~~~
>> >   'demo': events 1-3
>> >      |
>> >      |   25 |   list = PyList_New(0);
>> >      |      |          ^~~~~~~~~~~~~
>> >      |      |          |
>> >      |      |          (1) when 'PyList_New' fails, returning NULL
>> >      |   26 |
>> >      |   27 |   for (i = 0; i < count; i++) {
>> >      |      |   ~~~
>> >      |      |   |
>> >      |      |   (2) when 'i < count'
>> >      |   28 |     item = PyLong_FromLong(random());
>> >      |   29 |     PyList_Append(list, item);
>> >      |      |     ~~~~~~~~~~~~~~~~~~~~~~~~~
>> >      |      |     |
>> >      |      |     (3) when calling 'PyList_Append', passing NULL
>> > from (1) as argument 1
>> >      |
>> > 
>> > The patch adds a new "%@" format code for printing event IDs, so
>> > that
>> > in the above, the description of event (3) mentions event (1),
>> > showing
>> > the user where the bogus NULL value comes from (the event IDs are
>> > colorized to draw the user's attention to them).
>> > 
>> > There is a separation between data vs presentation: the above shows
>> > how
>> > the diagnostic-printing code has consolidated the path into a
>> > single run
>> > of events, since all the events are near each other and within the
>> > same
>> > function; more complicated examples (such as interprocedural paths)
>> > might be printed as multiple runs of events.
>> > 
>> > Examples of how interprocedural paths are printed can be seen in
>> > the
>> > test suite (which uses a plugin to exercise the code without
>> > relying
>> > on specific warnings using this functionality).
>> > 
>> > Other output formats include
>> > - JSON,
>> > - printing each event as a separate "note", and
>> > - to not emit paths.
>> > 
>> > (I have a separate script that can generate HTML from the JSON, but
>> > HTML
>> > is not my speciality; help from a web front-end expert to make it
>> > look
>> > good would be appreciated).
>> > 
>> > gcc/ChangeLog:
>> >    * Makefile.in (OBJS): Add tree-diagnostic-path.o.
>> >    * common.opt (fdiagnostics-path-format=): New option.
>> >    (diagnostic_path_format): New enum.
>> >    (fdiagnostics-show-path-depths): New option.
>> >    * coretypes.h (diagnostic_event_id_t): New forward decl.
>> >    * diagnostic-color.c (color_dict): Add "path".
>> >    * diagnostic-event-id.h: New file.
>> >    * diagnostic-format-json.cc (json_from_expanded_location): Make
>> >    non-static.
>> >    (json_end_diagnostic): Call context->make_json_for_path if it
>> >    exists and the diagnostic has a path.
>> >    (diagnostic_output_format_init): Clear context->print_path.
>> >    * diagnostic-path.h: New file.
>> >    * diagnostic-show-locus.c (colorizer::set_range): Special-case
>> >    when printing a run of events in a diagnostic_path so that they
>> >    all get the same color.
>> >    (layout::m_diagnostic_path_p): New field.
>> >    (layout::layout): Initialize it.
>> >    (layout::print_any_labels): Don't colorize the label text for
>> > an
>> >    event in a diagnostic_path.
>> >    (gcc_rich_location::add_location_if_nearby): Add
>> >    "restrict_to_current_line_spans" and "label" params.  Pass the
>> >    former to layout.maybe_add_location_range; pass the latter
>> >    when calling add_range.
>> >    * diagnostic.c: Include "diagnostic-path.h".
>> >    (diagnostic_initialize): Initialize context->path_format and
>> >    context->show_path_depths.
>> >    (diagnostic_show_any_path): New function.
>> >    (diagnostic_path::interprocedural_p): New function.
>> >    (diagnostic_report_diagnostic): Call diagnostic_show_any_path.
>> >    (simple_diagnostic_path::num_events): New function.
>> >    (simple_diagnostic_path::get_event): New function.
>> >    (simple_diagnostic_path::add_event): New function.
>> >    (simple_diagnostic_event::simple_diagnostic_event): New ctor.
>> >    (simple_diagnostic_event::~simple_diagnostic_event): New dtor.
>> >    (debug): New overload taking a diagnostic_path *.
>> >    * diagnostic.def (DK_DIAGNOSTIC_PATH): New.
>> >    * diagnostic.h (enum diagnostic_path_format): New enum.
>> >    (json::value): New forward decl.
>> >    (diagnostic_context::path_format): New field.
>> >    (diagnostic_context::show_path_depths): New field.
>> >    (diagnostic_context::print_path): New callback field.
>> >    (diagnostic_context::make_json_for_path): New callback field.
>> >    (diagnostic_show_any_path): New decl.
>> >    (json_from_expanded_location): New decl.
>> >    * doc/invoke.texi (-fdiagnostics-path-format=): New option.
>> >    (-fdiagnostics-show-path-depths): New option.
>> >    (-fdiagnostics-color): Add "path" to description of default
>> >    GCC_COLORS; describe it.
>> >    (-fdiagnostics-format=json): Document how diagnostic paths are
>> >    represented in the JSON output format.
>> >    * gcc-rich-location.h
>> > (gcc_rich_location::add_location_if_nearby):
>> >    Add optional params "restrict_to_current_line_spans" and
>> > "label".
>> >    * opts.c (common_handle_option): Handle
>> >    OPT_fdiagnostics_path_format_ and
>> >    OPT_fdiagnostics_show_path_depths.
>> >    * pretty-print.c: Include "diagnostic-event-id.h".
>> >    (pp_format): Implement "%@" format code for printing
>> >    diagnostic_event_id_t *.
>> >    (selftest::test_pp_format): Add tests for "%@".
>> >    * selftest-run-tests.c (selftest::run_tests): Call
>> >    selftest::tree_diagnostic_path_cc_tests.
>> >    * selftest.h (selftest::tree_diagnostic_path_cc_tests): New
>> > decl.
>> >    * toplev.c (general_init): Initialize global_dc->path_format
>> > and
>> >    global_dc->show_path_depths.
>> >    * tree-diagnostic-path.cc: New file.
>> >    * tree-diagnostic.c (maybe_unwind_expanded_macro_loc): Make
>> >    non-static.  Drop "diagnostic" param in favor of storing the
>> >    original value of "where" and re-using it.
>> >    (virt_loc_aware_diagnostic_finalizer): Update for dropped param
>> > of
>> >    maybe_unwind_expanded_macro_loc.
>> >    (tree_diagnostics_defaults): Initialize context->print_path and
>> >    context->make_json_for_path.
>> >    * tree-diagnostic.h (default_tree_diagnostic_path_printer): New
>> >    decl.
>> >    (default_tree_make_json_for_path): New decl.
>> >    (maybe_unwind_expanded_macro_loc): New decl.
>> > 
>> > gcc/c-family/ChangeLog:
>> >    * c-format.c (local_event_ptr_node): New.
>> >    (PP_FORMAT_CHAR_TABLE): Add entry for "%@".
>> >    (init_dynamic_diag_info): Initialize local_event_ptr_node.
>> >    * c-format.h (T_EVENT_PTR): New define.
>> > 
>> > gcc/testsuite/ChangeLog:
>> >    * gcc.dg/format/gcc_diag-10.c (diagnostic_event_id_t): New
>> >    typedef.
>> >    (test_diag): Add coverage of "%@".
>> >    * gcc.dg/plugin/diagnostic-path-format-default.c: New test.
>> >    * gcc.dg/plugin/diagnostic-path-format-inline-events-1.c: New
>> > test.
>> >    * gcc.dg/plugin/diagnostic-path-format-inline-events-2.c: New
>> > test.
>> >    * gcc.dg/plugin/diagnostic-path-format-inline-events-3.c: New
>> > test.
>> >    * gcc.dg/plugin/diagnostic-path-format-none.c: New test.
>> >    * gcc.dg/plugin/diagnostic-test-paths-1.c: New test.
>> >    * gcc.dg/plugin/diagnostic-test-paths-2.c: New test.
>> >    * gcc.dg/plugin/diagnostic-test-paths-3.c: New test.
>> >    * gcc.dg/plugin/diagnostic-test-paths-4.c: New test.
>> >    * gcc.dg/plugin/diagnostic_plugin_test_paths.c: New.
>> >    * gcc.dg/plugin/plugin.exp: Add the new plugin and test cases.
>> > 
>> > libcpp/ChangeLog:
>> >    * include/line-map.h (class diagnostic_path): New forward decl.
>> >    (rich_location::get_path): New accessor.
>> >    (rich_location::set_path): New function.
>> >    (rich_location::m_path): New field.
>> >    * line-map.c (rich_location::rich_location): Initialize m_path.
>> Given this is primarily in the diagnostic machinery, I'm leaving it
>> to
>> your discretion when and precisely what to commit. 
>> 
>> jeff
>
> Thanks.
>
> I've gone ahead and committed this to trunk (r280142) after testing it
> separately from the rest of the kit, given that it's theoretically of
> use to plugin authors even without the analyzer.

this patch (gcc.dg/plugin/diagnostic-test-paths-2.c in particular)
caused DejaGnu to complain:

WARNING: dg-line var PyList_New defined, but not used

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to