Move more diagnostic-specific code from gcc/ to gcc/diagnostics/ No functional change intended.
contrib/ChangeLog: * filter-clang-warnings.py: Update for move of diagnostic-path-output.cc to diagnostics/paths-output.cc. gcc/ChangeLog: * Makefile.in (OBJS): Replace lazy-diagnostic-path.o with diagnostics/lazy-paths.o. (OBJS-libcommon): Replace diagnostic-path.o with diagnostics/paths.o, diagnostic-path-output.o with diagnostics/paths-output.o, and selftest-diagnostic-path.o with diagnostics/selftest-paths.o. (EXTRA_BACKEND_OBJS): Replace lazy-diagnostic-path.o with diagnostics/lazy-paths.o. * diagnostic-format-html.cc: Update #include for "diagnostic-path.h" moving to "diagnostics/paths.h", diagnostic_thread_id_t to diagnostics::paths::thread_id_t, diagnostic_event_id_t to diagnostics::paths::event_id_t, diagnostic_path to diagnostics::paths::path, and diagnostic_thread to diagnostics::paths::thread, and diagnostic_event to diagnostics::paths::event. * diagnostic-format-html.h: Likewise. * diagnostic-format-sarif.cc: Likewise. Update PROPERTY_PREFIX for threadFlowLocations from "gcc/diagnostic_event/" to "gcc/diagnostics/paths/event/". * diagnostic-format-text.cc: Likewise. * diagnostic-format-text.h: Likewise. * diagnostic.cc: Likewise. * diagnostic.h: Likewise. * diagnostic-event-id.h: Move to... * diagnostics/event-id.h: ...here, updating header guard. (diagnostics:paths:event_id_t): New typedef. (diagnostic_thread_id_t): Replace with... (diagnostics:paths:thread_id_t): New typedef. * lazy-diagnostic-path.cc: Move to... * diagnostics/lazy-paths.cc: ...here. Update for above changes, lazy_diagnostic_path becomes diagnostics::paths::lazy_path. (lazy_diagnostic_path_cc_tests): Rename to... (diagnostics_lazy_paths_cc_tests): ...this. * lazy-diagnostic-path.h: Move to... * diagnostics/lazy-paths.h: ...here, updating header guard. Update for above changes. * diagnostic-path-output.cc: Move to... * diagnostics/paths-output.cc: ...here. Update for above changes. (diagnostic_path_output_cc_tests): Rename to... (diagnostics_paths_output_cc_tests): ...this. * diagnostic-path.cc: Move to... * diagnostics/paths.cc: ...here. Update for above changes. * diagnostic-path.h: Move to... * diagnostics/paths.h: ...here, updating header guard. Update #include for moving "diagnostic-event-id.h" to "diagnostics/event-id.h". (class diagnostic_event): Convert to... (class diagnostics::paths::event): ...this. (class diagnostic_thread): Convert to... (class diagnostics::paths::thread): ...this. (class diagnostic_path): Convert to... (class diagnostics::paths::path): ...this. * diagnostic-show-locus.cc: Update for above changes. * doc/analyzer.texi: Likewise. * selftest-diagnostic-path.cc: Move to... * diagnostics/selftest-paths.cc: ...here. Update for above changes, and for "selftest-diagnostic-path.h" moving to "diagnostics/selftest-paths.h". * selftest-diagnostic-path.h: Move to... * diagnostics/selftest-paths.h: ...here, updating header guard. Update for above changes. * libgdiagnostics.cc: Update for above changes. * libsarifreplay.cc: Update property prefix for threadFlowLocations from "gcc/diagnostic_event/" to "gcc/diagnostics/paths/event/". * pretty-print-format-impl.h: Update for above changes. * pretty-print.cc: Likewise. * selftest-run-tests.cc (selftest::run_tests): Update for renaming of lazy_diagnostic_path_cc_tests to diagnostics_lazy_paths_cc_tests, and of diagnostic_path_output_cc_tests to diagnostics_paths_output_cc_tests. * selftest.h (lazy_diagnostic_path_cc_tests): Replace decl with... (diagnostics_lazy_paths_cc_tests): ...this. (diagnostic_path_output_cc_tests): Replace decl with... (diagnostics_paths_output_cc_tests): ...this. * simple-diagnostic-path.cc: Clarify that this relates to "tree" and thus shouldn't be in "diagnostics". Update for above changes. * simple-diagnostic-path.h: Likewise. gcc/analyzer/ChangeLog: * access-diagram.cc: Update for changes to diagnostic paths: "diagnostic-path.h" moving to "diagnostics/paths.h", "diagnostic-event-id.h" moving to "diagnostics/event-id.h", diagnostic_event_id_t to diagnostics::paths::event_id_t, diagnostic_path to diagnostics::paths::path, and diagnostic_event to diagnostics::paths::event. * access-diagram.h: Likewise. * analyzer.cc: Likewise. * bounds-checking.cc: Likewise. * call-info.cc: Likewise. * checker-event.cc: Likewise. * checker-event.h: Likewise. * checker-path.cc: Likewise. * checker-path.h: Likewise. * common.h: Likewise. * diagnostic-manager.cc: Likewise. * pending-diagnostic.cc: Likewise. * pending-diagnostic.h: Likewise. * program-point.cc: Likewise. * program-state.cc: Likewise. * region-model.cc: Likewise. * sm-fd.cc: Likewise. * sm-file.cc: Likewise. * sm-malloc.cc: Likewise. * sm-pattern-test.cc: Likewise. * sm-sensitive.cc: Likewise. * sm-signal.cc: Likewise. * sm-taint.cc: Likewise. * varargs.cc: Likewise. gcc/testsuite/ChangeLog: * gcc.dg/plugin/analyzer_gil_plugin.cc: Update #include for "diagnostic-path.h" moving to "diagnostics/paths.h", diagnostic_thread_id_t to diagnostics::paths::thread_id_t, diagnostic_event_id_t to diagnostics::paths::event_id_t, diagnostic_path to diagnostics::paths::path, and diagnostic_thread to diagnostics::paths::thread, and diagnostic_event to diagnostics::paths::event. * gcc.dg/plugin/diagnostic_plugin_test_paths.cc: Likewise. * lib/sarif.py (get_state_graph): Update property prefix for threadFlowLocations from "gcc/diagnostic_event/" to "gcc/diagnostics/paths/event/". * gcc.dg/sarif-output/include-chain-2.h: Update comment. libcpp/ChangeLog: * include/rich-location.h: Replace diagnostic_path with diagnostics::paths::path. Signed-off-by: David Malcolm <dmalc...@redhat.com> --- contrib/filter-clang-warnings.py | 2 +- gcc/Makefile.in | 10 +- gcc/analyzer/access-diagram.cc | 10 +- gcc/analyzer/access-diagram.h | 2 +- gcc/analyzer/analyzer.cc | 4 +- gcc/analyzer/bounds-checking.cc | 4 +- gcc/analyzer/call-info.cc | 2 +- gcc/analyzer/checker-event.cc | 78 ++++---- gcc/analyzer/checker-event.h | 26 +-- gcc/analyzer/checker-path.cc | 2 +- gcc/analyzer/checker-path.h | 30 ++-- gcc/analyzer/common.h | 4 +- gcc/analyzer/diagnostic-manager.cc | 2 +- gcc/analyzer/pending-diagnostic.cc | 2 +- gcc/analyzer/pending-diagnostic.h | 23 ++- gcc/analyzer/program-point.cc | 2 +- gcc/analyzer/program-state.cc | 2 +- gcc/analyzer/region-model.cc | 2 +- gcc/analyzer/sm-fd.cc | 23 +-- gcc/analyzer/sm-file.cc | 20 ++- gcc/analyzer/sm-malloc.cc | 26 +-- gcc/analyzer/sm-pattern-test.cc | 2 +- gcc/analyzer/sm-sensitive.cc | 13 +- gcc/analyzer/sm-signal.cc | 2 +- gcc/analyzer/sm-taint.cc | 9 +- gcc/analyzer/varargs.cc | 16 +- gcc/diagnostic-format-html.cc | 16 +- gcc/diagnostic-format-html.h | 2 +- gcc/diagnostic-format-sarif.cc | 73 ++++---- gcc/diagnostic-format-text.cc | 6 +- gcc/diagnostic-format-text.h | 2 +- gcc/diagnostic-show-locus.cc | 2 +- gcc/diagnostic.cc | 2 +- gcc/diagnostic.h | 10 +- .../event-id.h} | 35 ++-- .../lazy-paths.cc} | 34 ++-- .../lazy-paths.h} | 36 ++-- .../paths-output.cc} | 168 +++++++++--------- .../paths.cc} | 39 ++-- .../paths.h} | 67 +++---- .../selftest-paths.cc} | 36 ++-- .../selftest-paths.h} | 52 +++--- gcc/doc/analyzer.texi | 4 +- gcc/libgdiagnostics.cc | 50 +++--- gcc/libsarifreplay.cc | 2 +- gcc/pretty-print-format-impl.h | 6 +- gcc/pretty-print.cc | 6 +- gcc/selftest-run-tests.cc | 4 +- gcc/selftest.h | 4 +- gcc/simple-diagnostic-path.cc | 30 ++-- gcc/simple-diagnostic-path.h | 44 +++-- .../gcc.dg/plugin/analyzer_gil_plugin.cc | 16 +- .../plugin/diagnostic_plugin_test_paths.cc | 11 +- .../gcc.dg/sarif-output/include-chain-2.h | 2 +- gcc/testsuite/lib/sarif.py | 2 +- libcpp/include/rich-location.h | 8 +- 56 files changed, 573 insertions(+), 514 deletions(-) rename gcc/{diagnostic-event-id.h => diagnostics/event-id.h} (74%) rename gcc/{lazy-diagnostic-path.cc => diagnostics/lazy-paths.cc} (88%) rename gcc/{lazy-diagnostic-path.h => diagnostics/lazy-paths.h} (65%) rename gcc/{diagnostic-path-output.cc => diagnostics/paths-output.cc} (95%) rename gcc/{diagnostic-path.cc => diagnostics/paths.cc} (83%) rename gcc/{diagnostic-path.h => diagnostics/paths.h} (82%) rename gcc/{selftest-diagnostic-path.cc => diagnostics/selftest-paths.cc} (87%) rename gcc/{selftest-diagnostic-path.h => diagnostics/selftest-paths.h} (74%) diff --git a/contrib/filter-clang-warnings.py b/contrib/filter-clang-warnings.py index b1b881eec3e2..20705b2905cd 100755 --- a/contrib/filter-clang-warnings.py +++ b/contrib/filter-clang-warnings.py @@ -46,7 +46,7 @@ def skip_warning(filename, message): '-Wunused-function', '-Wunneeded-internal-declaration', '-Wvla-cxx-extension', '-Wunused-command-line-argument'], - 'diagnostic-path-output.cc': ['m_logical_loc_mgr'], + 'diagnostics/paths-output.cc': ['m_logical_loc_mgr'], 'fold-const-call.cc': ['-Wreturn-type'], 'gimple-match': ['-Wunused-', '-Wtautological-compare'], 'generic-match': ['-Wunused-', '-Wtautological-compare'], diff --git a/gcc/Makefile.in b/gcc/Makefile.in index f263f905f951..d501e235cb7f 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1454,6 +1454,7 @@ OBJS = \ df-problems.o \ df-scan.o \ dfp.o \ + diagnostics/lazy-paths.o \ digraph.o \ dojump.o \ dominance.o \ @@ -1595,7 +1596,6 @@ OBJS = \ jump.o \ langhooks.o \ late-combine.o \ - lazy-diagnostic-path.o \ lcm.o \ lists.o \ loop-doloop.o \ @@ -1858,15 +1858,16 @@ OBJS-libcommon = diagnostic-spec.o diagnostic.o diagnostic-color.o \ diagnostic-format-text.o \ diagnostic-global-context.o \ diagnostic-macro-unwinding.o \ - diagnostic-path.o \ - diagnostic-path-output.o \ diagnostic-show-locus.o \ diagnostics/digraphs.o \ diagnostics/edit-context.o \ diagnostics/output-spec.o \ + diagnostics/paths.o \ + diagnostics/paths-output.o \ diagnostics/state-graphs.o \ diagnostics/state-graphs-to-dot.o \ diagnostics/selftest-logical-locations.o \ + diagnostics/selftest-paths.o \ graphviz.o pex.o \ pretty-print.o intl.o \ json.o json-parsing.o \ @@ -1874,7 +1875,6 @@ OBJS-libcommon = diagnostic-spec.o diagnostic.o diagnostic-color.o \ sbitmap.o \ vec.o input.o hash-table.o ggc-none.o memory-block.o \ selftest.o selftest-diagnostic.o sort.o \ - selftest-diagnostic-path.o \ selftest-json.o \ text-art/box-drawing.o \ text-art/canvas.o \ @@ -1922,7 +1922,7 @@ endif # libbackend.a objs that might not be in some cases linked into the compiler, # yet they are supposed to be part of the plugin ABI. See PR116143. -EXTRA_BACKEND_OBJS = simple-diagnostic-path.o lazy-diagnostic-path.o +EXTRA_BACKEND_OBJS = simple-diagnostic-path.o diagnostics/lazy-paths.o BACKEND = $(EXTRA_BACKEND_OBJS) libbackend.a main.o libcommon-target.a \ libcommon.a $(CPPLIB) $(LIBDECNUMBER) diff --git a/gcc/analyzer/access-diagram.cc b/gcc/analyzer/access-diagram.cc index 90b396c0864f..166be08f1c28 100644 --- a/gcc/analyzer/access-diagram.cc +++ b/gcc/analyzer/access-diagram.cc @@ -1300,7 +1300,7 @@ class valid_region_spatial_item : public spatial_item { public: valid_region_spatial_item (const access_operation &op, - diagnostic_event_id_t region_creation_event_id, + diagnostics::paths::event_id_t region_creation_event_id, const theme &theme) : m_op (op), m_region_creation_event_id (region_creation_event_id), @@ -1523,7 +1523,7 @@ public: private: const access_operation &m_op; - diagnostic_event_id_t m_region_creation_event_id; + diagnostics::paths::event_id_t m_region_creation_event_id; mutable const boundaries *m_boundaries; const svalue *m_existing_sval; std::unique_ptr<spatial_item> m_existing_sval_spatial_item; @@ -2012,7 +2012,7 @@ class access_diagram_impl : public vbox_widget { public: access_diagram_impl (const access_operation &op, - diagnostic_event_id_t region_creation_event_id, + diagnostics::paths::event_id_t region_creation_event_id, style_manager &sm, const theme &theme, logger *logger) @@ -2564,7 +2564,7 @@ private: } const access_operation &m_op; - diagnostic_event_id_t m_region_creation_event_id; + diagnostics::paths::event_id_t m_region_creation_event_id; style_manager &m_sm; const theme &m_theme; logger *m_logger; @@ -2662,7 +2662,7 @@ direction_widget::paint_to_canvas (canvas &canvas) an access_diagram_impl. */ access_diagram::access_diagram (const access_operation &op, - diagnostic_event_id_t region_creation_event_id, + diagnostics::paths::event_id_t region_creation_event_id, style_manager &sm, const theme &theme, logger *logger) diff --git a/gcc/analyzer/access-diagram.h b/gcc/analyzer/access-diagram.h index e31dd28a4371..d558f534ba19 100644 --- a/gcc/analyzer/access-diagram.h +++ b/gcc/analyzer/access-diagram.h @@ -152,7 +152,7 @@ class access_diagram : public text_art::wrapper_widget { public: access_diagram (const access_operation &op, - diagnostic_event_id_t region_creation_event_id, + diagnostics::paths::event_id_t region_creation_event_id, text_art::style_manager &sm, const text_art::theme &theme, logger *logger); diff --git a/gcc/analyzer/analyzer.cc b/gcc/analyzer/analyzer.cc index 938ad6de89e4..9f6f7b44224a 100644 --- a/gcc/analyzer/analyzer.cc +++ b/gcc/analyzer/analyzer.cc @@ -21,7 +21,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" #include "tree-pretty-print.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "tree-dfa.h" #include "intl.h" @@ -232,7 +232,7 @@ tree_to_json (tree node) for unknown). */ std::unique_ptr<json::value> -diagnostic_event_id_to_json (const diagnostic_event_id_t &event_id) +diagnostic_event_id_to_json (const diagnostics::paths::event_id_t &event_id) { if (event_id.known_p ()) { diff --git a/gcc/analyzer/bounds-checking.cc b/gcc/analyzer/bounds-checking.cc index 732c05ddb25b..ca53607c4046 100644 --- a/gcc/analyzer/bounds-checking.cc +++ b/gcc/analyzer/bounds-checking.cc @@ -51,7 +51,7 @@ public: } void prepare_for_emission (checker_path *path, pending_diagnostic *pd, - diagnostic_event_id_t emission_id) override + diagnostics::paths::event_id_t emission_id) override { region_creation_event_capacity::prepare_for_emission (path, pd, @@ -203,7 +203,7 @@ protected: const region *m_reg; tree m_diag_arg; const svalue *m_sval_hint; - diagnostic_event_id_t m_region_creation_event_id; + diagnostics::paths::event_id_t m_region_creation_event_id; }; /* Abstract base class for all out-of-bounds warnings where the diff --git a/gcc/analyzer/call-info.cc b/gcc/analyzer/call-info.cc index 9a698efdcafd..f43114344cf2 100644 --- a/gcc/analyzer/call-info.cc +++ b/gcc/analyzer/call-info.cc @@ -24,7 +24,7 @@ along with GCC; see the file COPYING3. If not see #include "cfg.h" #include "digraph.h" #include "sbitmap.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "analyzer/analyzer-logging.h" #include "analyzer/supergraph.h" diff --git a/gcc/analyzer/checker-event.cc b/gcc/analyzer/checker-event.cc index 665bb0d509ed..e0af97fca048 100644 --- a/gcc/analyzer/checker-event.cc +++ b/gcc/analyzer/checker-event.cc @@ -1,4 +1,4 @@ -/* Subclasses of diagnostic_event for analyzer diagnostics. +/* Subclasses of diagnostics::paths::event for analyzer diagnostics. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com>. @@ -101,7 +101,7 @@ event_kind_to_string (enum event_kind ek) } } -/* class checker_event : public diagnostic_event. */ +/* class checker_event : public diagnostics::paths::event. */ /* checker_event's ctor. */ @@ -131,16 +131,16 @@ checker_event::checker_event (enum event_kind kind, } } -/* No-op implementation of diagnostic_event::get_meaning vfunc for +/* No-op implementation of diagnostics::paths::event::get_meaning vfunc for checker_event: checker events have no meaning by default. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning checker_event::get_meaning () const { - return meaning (); + return diagnostics::paths::event::meaning (); } -/* Implementation of diagnostic_event::maybe_add_sarif_properties +/* Implementation of diagnostics::paths::event::maybe_add_sarif_properties for checker_event. */ void @@ -215,7 +215,7 @@ checker_event::debug () const void checker_event::prepare_for_emission (checker_path *path, pending_diagnostic *pd, - diagnostic_event_id_t emission_id) + diagnostics::paths::event_id_t emission_id) { m_path = path; m_pending_diagnostic = pd; @@ -252,7 +252,7 @@ checker_event::maybe_make_diagnostic_state_graph (bool debug) const /* class debug_event : public checker_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for debug_event. Use the saved string as the event's description. */ @@ -264,7 +264,7 @@ debug_event::print_desc (pretty_printer &pp) const /* class precanned_custom_event : public custom_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for precanned_custom_event. Use the saved string as the event's description. */ @@ -287,7 +287,7 @@ statement_event::statement_event (const gimple *stmt, tree fndecl, int depth, { } -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for statement_event. Use the statement's dump form as the event's description. */ @@ -383,7 +383,7 @@ function_entry_event::function_entry_event (const program_point &dst_point, { } -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for function_entry_event. Use a string such as "entry to 'foo'" as the event's description. */ @@ -394,10 +394,10 @@ function_entry_event::print_desc (pretty_printer &pp) const pp_printf (&pp, "entry to %qE", m_effective_fndecl); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for function entry. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning function_entry_event::get_meaning () const { return meaning (verb::enter, noun::function); @@ -429,7 +429,7 @@ state_change_event::state_change_event (const supernode *node, { } -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for state_change_event. Attempt to generate a nicer human-readable description. @@ -471,7 +471,7 @@ state_change_event::print_desc (pretty_printer &pp) const pp_string (&pp, "NULL origin"); /* Get any "meaning" of event. */ - diagnostic_event::meaning meaning = get_meaning (); + diagnostics::paths::event::meaning meaning = get_meaning (); pp_string (&pp, ", meaning: "); meaning.dump_to_pp (&pp); pp_string (&pp, ")"); @@ -508,11 +508,11 @@ state_change_event::print_desc (pretty_printer &pp) const } } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for state change events: delegate to the pending_diagnostic to get any meaning. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning state_change_event::get_meaning () const { if (m_pending_diagnostic) @@ -530,7 +530,7 @@ state_change_event::get_meaning () const /* class superedge_event : public checker_event. */ -/* Implementation of diagnostic_event::maybe_add_sarif_properties +/* Implementation of diagnostics::paths::event::maybe_add_sarif_properties for superedge_event. */ void @@ -626,10 +626,10 @@ cfg_edge_event::cfg_edge_event (enum event_kind kind, gcc_assert (eedge.m_sedge->m_kind == SUPEREDGE_CFG_EDGE); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for CFG edge events. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning cfg_edge_event::get_meaning () const { const cfg_superedge& cfg_sedge = get_cfg_superedge (); @@ -643,7 +643,7 @@ cfg_edge_event::get_meaning () const /* class start_cfg_edge_event : public cfg_edge_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for start_cfg_edge_event. If -fanalyzer-verbose-edges, then generate low-level descriptions, such @@ -844,7 +844,7 @@ call_event::call_event (const exploded_edge &eedge, m_dest_snode = eedge.m_dest->get_supernode (); } -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for call_event. If this call event passes critical state for an sm-based warning, @@ -876,10 +876,10 @@ call_event::print_desc (pretty_printer &pp) const get_caller_fndecl ()); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for function call events. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning call_event::get_meaning () const { return meaning (verb::call, noun::function); @@ -928,7 +928,7 @@ return_event::return_event (const exploded_edge &eedge, m_dest_snode = eedge.m_dest->get_supernode (); } -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for return_event. If this return event returns critical state for an sm-based warning, @@ -960,10 +960,10 @@ return_event::print_desc (pretty_printer &pp) const m_src_snode->m_fun->decl); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for function return events. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning return_event::get_meaning () const { return meaning (verb::return_, noun::function); @@ -987,10 +987,10 @@ start_consolidated_cfg_edges_event::print_desc (pretty_printer &pp) const m_edge_sense ? "true" : "false"); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for start_consolidated_cfg_edges_event. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning start_consolidated_cfg_edges_event::get_meaning () const { return meaning (verb::branch, @@ -1008,10 +1008,10 @@ inlined_call_event::print_desc (pretty_printer &pp) const m_apparent_caller_fndecl); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for reconstructed inlined function calls. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning inlined_call_event::get_meaning () const { return meaning (verb::call, noun::function); @@ -1019,7 +1019,7 @@ inlined_call_event::get_meaning () const /* class setjmp_event : public checker_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for setjmp_event. */ void @@ -1038,7 +1038,7 @@ setjmp_event::print_desc (pretty_printer &pp) const void setjmp_event::prepare_for_emission (checker_path *path, pending_diagnostic *pd, - diagnostic_event_id_t emission_id) + diagnostics::paths::event_id_t emission_id) { checker_event::prepare_for_emission (path, pd, emission_id); path->record_setjmp_event (m_enode, emission_id); @@ -1077,7 +1077,7 @@ rewind_event::rewind_event (const exploded_edge *eedge, /* class rewind_from_longjmp_event : public rewind_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for rewind_from_longjmp_event. */ void @@ -1101,7 +1101,7 @@ rewind_from_longjmp_event::print_desc (pretty_printer &pp) const /* class rewind_to_setjmp_event : public rewind_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for rewind_to_setjmp_event. */ void @@ -1150,7 +1150,7 @@ rewind_to_setjmp_event::print_desc (pretty_printer &pp) const void rewind_to_setjmp_event::prepare_for_emission (checker_path *path, pending_diagnostic *pd, - diagnostic_event_id_t emission_id) + diagnostics::paths::event_id_t emission_id) { checker_event::prepare_for_emission (path, pd, emission_id); path->get_setjmp_event (m_rewind_info->get_enode_origin (), @@ -1203,7 +1203,7 @@ unwind_event::print_desc (pretty_printer &pp) const /* class warning_event : public checker_event. */ -/* Implementation of diagnostic_event::print_desc vfunc for +/* Implementation of diagnostics::paths::event::print_desc vfunc for warning_event. If the pending diagnostic implements describe_final_event, use it, @@ -1248,10 +1248,10 @@ warning_event::print_desc (pretty_printer &pp) const pp_string (&pp, "here"); } -/* Implementation of diagnostic_event::get_meaning vfunc for +/* Implementation of diagnostics::paths::event::get_meaning vfunc for warning_event. */ -diagnostic_event::meaning +diagnostics::paths::event::meaning warning_event::get_meaning () const { return meaning (verb::danger, noun::unknown); diff --git a/gcc/analyzer/checker-event.h b/gcc/analyzer/checker-event.h index c513742ef9ec..41d8dee76dbc 100644 --- a/gcc/analyzer/checker-event.h +++ b/gcc/analyzer/checker-event.h @@ -1,4 +1,4 @@ -/* Subclasses of diagnostic_event for analyzer diagnostics. +/* Subclasses of diagnostics::paths::event for analyzer diagnostics. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com>. @@ -62,7 +62,7 @@ extern const char *event_kind_to_string (enum event_kind ek); The class hierarchy looks like this (using indentation to show inheritance, and with event_kinds shown for the concrete subclasses): - diagnostic_event + diagnostics::paths::event checker_event debug_event (event_kind::debug) custom_event (event_kind::custom) @@ -91,13 +91,13 @@ extern const char *event_kind_to_string (enum event_kind ek); unwind_event (event_kind::unwind) warning_event (event_kind::warning). */ -/* Abstract subclass of diagnostic_event; the base class for use in - checker_path (the analyzer's diagnostic_path subclass). */ +/* Abstract subclass of diagnostics::paths::event; the base class for use in + checker_path (the analyzer's diagnostics::paths::path subclass). */ -class checker_event : public diagnostic_event +class checker_event : public diagnostics::paths::event { public: - /* Implementation of diagnostic_event. */ + /* Implementation of diagnostics::paths::event. */ location_t get_location () const final override { return m_loc; } int get_stack_depth () const final override { return m_effective_depth; } @@ -108,7 +108,7 @@ public: } meaning get_meaning () const override; bool connect_to_next_event_p () const override { return false; } - diagnostic_thread_id_t get_thread_id () const final override + diagnostics::paths::thread_id_t get_thread_id () const final override { return 0; } @@ -125,7 +125,7 @@ public: virtual void prepare_for_emission (checker_path *, pending_diagnostic *pd, - diagnostic_event_id_t emission_id); + diagnostics::paths::event_id_t emission_id); virtual bool is_call_p () const { return false; } virtual bool is_function_entry_p () const { return false; } virtual bool is_return_p () const { return false; } @@ -137,7 +137,7 @@ public: get_program_state () const { return nullptr; } /* For use with %@. */ - const diagnostic_event_id_t *get_id_ptr () const + const diagnostics::paths::event_id_t *get_id_ptr () const { return &m_emission_id; } @@ -161,7 +161,7 @@ protected: int m_original_depth; int m_effective_depth; pending_diagnostic *m_pending_diagnostic; - diagnostic_event_id_t m_emission_id; // only set once all pruning has occurred + diagnostics::paths::event_id_t m_emission_id; // only set once all pruning has occurred diagnostics::logical_locations::key m_logical_loc; }; @@ -666,7 +666,7 @@ public: void prepare_for_emission (checker_path *path, pending_diagnostic *pd, - diagnostic_event_id_t emission_id) final override; + diagnostics::paths::event_id_t emission_id) final override; private: const exploded_node *m_enode; @@ -732,10 +732,10 @@ public: void prepare_for_emission (checker_path *path, pending_diagnostic *pd, - diagnostic_event_id_t emission_id) final override; + diagnostics::paths::event_id_t emission_id) final override; private: - diagnostic_event_id_t m_original_setjmp_event_id; + diagnostics::paths::event_id_t m_original_setjmp_event_id; }; /* An abstract subclass for throwing/rethrowing an exception. */ diff --git a/gcc/analyzer/checker-path.cc b/gcc/analyzer/checker-path.cc index 45593e0abe37..646d72c2861b 100644 --- a/gcc/analyzer/checker-path.cc +++ b/gcc/analyzer/checker-path.cc @@ -1,4 +1,4 @@ -/* Subclass of diagnostic_path for analyzer diagnostics. +/* Subclass of diagnostics::paths::path for analyzer diagnostics. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com>. diff --git a/gcc/analyzer/checker-path.h b/gcc/analyzer/checker-path.h index 3c174bf8dd18..490d21bc84d9 100644 --- a/gcc/analyzer/checker-path.h +++ b/gcc/analyzer/checker-path.h @@ -1,4 +1,4 @@ -/* Subclass of diagnostic_path for analyzer diagnostics. +/* Subclass of diagnostics::paths::path for analyzer diagnostics. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com>. @@ -26,28 +26,29 @@ along with GCC; see the file COPYING3. If not see namespace ana { -/* Subclass of diagnostic_path for analyzer diagnostics. */ +/* Subclass of diagnostic path for analyzer diagnostics. */ -class checker_path : public diagnostic_path +class checker_path : public diagnostics::paths::path { public: - checker_path (const logical_location_manager &logical_loc_mgr, + checker_path (const diagnostics::logical_locations::manager &logical_loc_mgr, const extrinsic_state &ext_state, logger *logger) - : diagnostic_path (logical_loc_mgr), + : diagnostics::paths::path (logical_loc_mgr), m_ext_state (ext_state), m_thread ("main"), m_logger (logger) {} - /* Implementation of diagnostic_path vfuncs. */ + /* Implementation of diagnostics::paths::path vfuncs. */ unsigned num_events () const final override { return m_events.length (); } - const diagnostic_event & get_event (int idx) const final override + const diagnostics::paths::event & + get_event (int idx) const final override { return *m_events[idx]; } @@ -55,8 +56,8 @@ public: { return 1; } - const diagnostic_thread & - get_thread (diagnostic_thread_id_t) const final override + const diagnostics::paths::thread & + get_thread (diagnostics::paths::thread_id_t) const final override { return m_thread; } @@ -115,21 +116,22 @@ public: checker_event *e; int i; FOR_EACH_VEC_ELT (m_events, i, e) - e->prepare_for_emission (this, pd, diagnostic_event_id_t (i)); + e->prepare_for_emission (this, pd, diagnostics::paths::event_id_t (i)); } void fixup_locations (pending_diagnostic *pd); void record_setjmp_event (const exploded_node *enode, - diagnostic_event_id_t setjmp_emission_id) + diagnostics::paths::event_id_t setjmp_emission_id) { m_setjmp_event_ids.put (enode, setjmp_emission_id); } bool get_setjmp_event (const exploded_node *enode, - diagnostic_event_id_t *out_emission_id) + diagnostics::paths::event_id_t *out_emission_id) { - if (diagnostic_event_id_t *emission_id = m_setjmp_event_ids.get (enode)) + if (diagnostics::paths::event_id_t *emission_id + = m_setjmp_event_ids.get (enode)) { *out_emission_id = *emission_id; return true; @@ -154,7 +156,7 @@ private: /* During prepare_for_emission (and after), the setjmp_event for each exploded_node *, so that rewind events can refer to them in their descriptions. */ - hash_map <const exploded_node *, diagnostic_event_id_t> m_setjmp_event_ids; + hash_map <const exploded_node *, diagnostics::paths::event_id_t> m_setjmp_event_ids; logger *m_logger; }; diff --git a/gcc/analyzer/common.h b/gcc/analyzer/common.h index 148bfddb7114..ac3048c796e3 100644 --- a/gcc/analyzer/common.h +++ b/gcc/analyzer/common.h @@ -34,7 +34,7 @@ along with GCC; see the file COPYING3. If not see #include "options.h" #include "bitmap.h" #include "diagnostic-core.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "rich-location.h" #include "function.h" #include "json.h" @@ -443,7 +443,7 @@ extern std::unique_ptr<json::value> tree_to_json (tree node); extern std::unique_ptr<json::value> -diagnostic_event_id_to_json (const diagnostic_event_id_t &); +diagnostic_event_id_to_json (const diagnostics::paths::event_id_t &); extern std::unique_ptr<json::value> bit_offset_to_json (const bit_offset_t &offset); diff --git a/gcc/analyzer/diagnostic-manager.cc b/gcc/analyzer/diagnostic-manager.cc index 9258ffa2bcc0..220a30b78ee0 100644 --- a/gcc/analyzer/diagnostic-manager.cc +++ b/gcc/analyzer/diagnostic-manager.cc @@ -1583,7 +1583,7 @@ diagnostic_manager::emit_saved_diagnostic (const exploded_graph &eg, /* Precompute all enodes from which the diagnostic is reachable. */ path_builder pb (eg, *epath, sd.get_feasibility_problem (), sd); - /* This is the diagnostic_path subclass that will be built for + /* This is the diagnostics::paths::path subclass that will be built for the diagnostic. */ checker_path emission_path (get_logical_location_manager (), eg.get_ext_state (), diff --git a/gcc/analyzer/pending-diagnostic.cc b/gcc/analyzer/pending-diagnostic.cc index 5e95edd689be..20312d4d21d6 100644 --- a/gcc/analyzer/pending-diagnostic.cc +++ b/gcc/analyzer/pending-diagnostic.cc @@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "cpplib.h" #include "digraph.h" #include "ordered-hash-map.h" diff --git a/gcc/analyzer/pending-diagnostic.h b/gcc/analyzer/pending-diagnostic.h index e703e80fdfbc..d911f562db67 100644 --- a/gcc/analyzer/pending-diagnostic.h +++ b/gcc/analyzer/pending-diagnostic.h @@ -22,7 +22,6 @@ along with GCC; see the file COPYING3. If not see #define GCC_ANALYZER_PENDING_DIAGNOSTIC_H #include "diagnostics/metadata.h" -#include "diagnostic-path.h" #include "analyzer/sm.h" namespace ana { @@ -44,7 +43,7 @@ struct interesting_t }; /* Various bundles of information used for generating more precise - messages for events within a diagnostic_path, for passing to the + messages for events within a diagnostic path, for passing to the various "describe_*" vfuncs of pending_diagnostic. See those for more information. */ @@ -58,7 +57,7 @@ struct state_change tree origin, state_machine::state_t old_state, state_machine::state_t new_state, - diagnostic_event_id_t event_id, + diagnostics::paths::event_id_t event_id, const state_change_event &event) : m_expr (expr), m_origin (origin), m_old_state (old_state), m_new_state (new_state), @@ -71,7 +70,7 @@ struct state_change tree m_origin; state_machine::state_t m_old_state; state_machine::state_t m_new_state; - diagnostic_event_id_t m_event_id; + diagnostics::paths::event_id_t m_event_id; const state_change_event &m_event; }; @@ -131,7 +130,7 @@ struct final_event pending_diagnostic::emit vfunc. The rich_location will have already been populated with a - diagnostic_path. */ + diagnostics::paths::path. */ class diagnostic_emission_context { @@ -182,7 +181,7 @@ private: As well as emitting a diagnostic, the class has various "precision of wording" virtual functions, for generating descriptions for events - within a diagnostic_path. These are optional, but implementing these + within a diagnostic path. These are optional, but implementing these allows for more precise wordings than the more generic implementation. */ @@ -238,7 +237,7 @@ class pending_diagnostic virtual location_t fixup_location (location_t loc, bool primary) const; /* Precision-of-wording vfunc for describing a critical state change - within the diagnostic_path. + within the diagnostic path. For example, a double-free diagnostic might use the descriptions: - "first 'free' happens here" @@ -260,13 +259,13 @@ class pending_diagnostic return false; } - /* Vfunc for implementing diagnostic_event::get_meaning for + /* Vfunc for implementing event::get_meaning for state_change_event. */ - virtual diagnostic_event::meaning + virtual diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &) const { /* Default no-op implementation. */ - return diagnostic_event::meaning (); + return diagnostics::paths::event::meaning (); } /* Precision-of-wording vfunc for describing an interprocedural call @@ -285,7 +284,7 @@ class pending_diagnostic } /* Precision-of-wording vfunc for describing an interprocedural return - within the diagnostic_path that carries critial state for the + within the diagnostic path that carries critial state for the diagnostic, from callee back to caller. For example, a deref-of-unchecked-malloc diagnostic might use: @@ -301,7 +300,7 @@ class pending_diagnostic } /* Precision-of-wording vfunc for describing the final event within a - diagnostic_path. + diagnostic path. For example a double-free diagnostic might use: - "second 'free' here; first 'free' was at (3)" diff --git a/gcc/analyzer/program-point.cc b/gcc/analyzer/program-point.cc index 1f82559a9a7e..30468d768b09 100644 --- a/gcc/analyzer/program-point.cc +++ b/gcc/analyzer/program-point.cc @@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "gcc-rich-location.h" #include "gimple-pretty-print.h" #include "sbitmap.h" diff --git a/gcc/analyzer/program-state.cc b/gcc/analyzer/program-state.cc index ea64bdd9ffb7..e16a50f78c78 100644 --- a/gcc/analyzer/program-state.cc +++ b/gcc/analyzer/program-state.cc @@ -27,7 +27,7 @@ along with GCC; see the file COPYING3. If not see #include "gimple-iterator.h" #include "cgraph.h" #include "digraph.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "diagnostics/state-graphs.h" #include "graphviz.h" diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc index 6df38429313f..412f1c4a5523 100644 --- a/gcc/analyzer/region-model.cc +++ b/gcc/analyzer/region-model.cc @@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see #include "cgraph.h" #include "cfg.h" #include "sbitmap.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "stor-layout.h" #include "stringpool.h" #include "attribs.h" diff --git a/gcc/analyzer/sm-fd.cc b/gcc/analyzer/sm-fd.cc index 370d7a00ba4b..b8ae0a1747eb 100644 --- a/gcc/analyzer/sm-fd.cc +++ b/gcc/analyzer/sm-fd.cc @@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "stringpool.h" #include "attribs.h" @@ -392,21 +392,22 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change ( const evdesc::state_change &change) const final override { + using event = diagnostics::paths::event; if (change.m_old_state == m_sm.get_start_state () && (m_sm.is_unchecked_fd_p (change.m_new_state) || change.m_new_state == m_sm.m_new_datagram_socket || change.m_new_state == m_sm.m_new_stream_socket || change.m_new_state == m_sm.m_new_unknown_socket)) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::resource); + return event::meaning (event::verb::acquire, + event::noun::resource); if (change.m_new_state == m_sm.m_closed) - return diagnostic_event::meaning (diagnostic_event::verb::release, - diagnostic_event::noun::resource); - return diagnostic_event::meaning (); + return event::meaning (event::verb::release, + event::noun::resource); + return event::meaning (); } protected: @@ -561,7 +562,7 @@ public: } private: - diagnostic_event_id_t m_open_event; + diagnostics::paths::event_id_t m_open_event; std::unique_ptr<program_state> m_final_state; }; @@ -705,7 +706,7 @@ public: } private: - diagnostic_event_id_t m_first_close_event; + diagnostics::paths::event_id_t m_first_close_event; }; class fd_use_after_close : public fd_param_diagnostic @@ -784,7 +785,7 @@ public: } private: - diagnostic_event_id_t m_first_close_event; + diagnostics::paths::event_id_t m_first_close_event; }; class fd_use_without_check : public fd_param_diagnostic @@ -854,7 +855,7 @@ public: } private: - diagnostic_event_id_t m_first_open_event; + diagnostics::paths::event_id_t m_first_open_event; }; /* Concrete pending_diagnostic subclass for -Wanalyzer-fd-phase-mismatch. */ diff --git a/gcc/analyzer/sm-file.cc b/gcc/analyzer/sm-file.cc index 4b1fc7788763..c852c02804b1 100644 --- a/gcc/analyzer/sm-file.cc +++ b/gcc/analyzer/sm-file.cc @@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "selftest.h" #include "analyzer/analyzer-logging.h" @@ -155,18 +155,20 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &change) const final override { + using event = diagnostics::paths::event; + if (change.m_old_state == m_sm.get_start_state () && change.m_new_state == m_sm.m_unchecked) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::resource); + return event::meaning (event::verb::acquire, + event::noun::resource); if (change.m_new_state == m_sm.m_closed) - return diagnostic_event::meaning (diagnostic_event::verb::release, - diagnostic_event::noun::resource); - return diagnostic_event::meaning (); + return event::meaning (event::verb::release, + event::noun::resource); + return event::meaning (); } protected: @@ -225,7 +227,7 @@ public: } private: - diagnostic_event_id_t m_first_fclose_event; + diagnostics::paths::event_id_t m_first_fclose_event; }; class file_leak : public file_diagnostic @@ -303,7 +305,7 @@ public: } private: - diagnostic_event_id_t m_fopen_event; + diagnostics::paths::event_id_t m_fopen_event; std::unique_ptr<program_state> m_final_state; }; diff --git a/gcc/analyzer/sm-malloc.cc b/gcc/analyzer/sm-malloc.cc index 2a218d0688be..a6b14219068a 100644 --- a/gcc/analyzer/sm-malloc.cc +++ b/gcc/analyzer/sm-malloc.cc @@ -20,7 +20,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "stringpool.h" #include "attribs.h" #include "xml-printer.h" @@ -814,18 +814,18 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &change) const final override { if (change.m_old_state == m_sm.get_start_state () && unchecked_p (change.m_new_state)) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::memory); + return diagnostics::paths::event::meaning (diagnostics::paths::event::verb::acquire, + diagnostics::paths::event::noun::memory); if (freed_p (change.m_new_state)) - return diagnostic_event::meaning (diagnostic_event::verb::release, - diagnostic_event::noun::memory); - return diagnostic_event::meaning (); + return diagnostics::paths::event::meaning (diagnostics::paths::event::verb::release, + diagnostics::paths::event::noun::memory); + return diagnostics::paths::event::meaning (); } protected: @@ -918,7 +918,7 @@ public: } private: - diagnostic_event_id_t m_alloc_event; + diagnostics::paths::event_id_t m_alloc_event; const deallocator_set *m_expected_deallocators; const deallocator *m_actual_dealloc; }; @@ -988,7 +988,7 @@ public: } private: - diagnostic_event_id_t m_first_free_event; + diagnostics::paths::event_id_t m_first_free_event; const char *m_funcname; }; @@ -1031,7 +1031,7 @@ public: } protected: - diagnostic_event_id_t m_origin_of_unchecked_event; + diagnostics::paths::event_id_t m_origin_of_unchecked_event; }; /* Concrete subclass for describing dereference of a possible NULL @@ -1419,7 +1419,7 @@ public: } private: - diagnostic_event_id_t m_free_event; + diagnostics::paths::event_id_t m_free_event; const deallocator *m_deallocator; }; @@ -1500,7 +1500,7 @@ public: } private: - diagnostic_event_id_t m_alloc_event; + diagnostics::paths::event_id_t m_alloc_event; std::unique_ptr<program_state> m_final_state; }; @@ -1768,7 +1768,7 @@ private: return result; } - diagnostic_event_id_t m_first_deref_event; + diagnostics::paths::event_id_t m_first_deref_event; const exploded_node *m_deref_enode; tree m_deref_expr; const exploded_node *m_check_enode; diff --git a/gcc/analyzer/sm-pattern-test.cc b/gcc/analyzer/sm-pattern-test.cc index 02b32ac19a21..12449a1d48d1 100644 --- a/gcc/analyzer/sm-pattern-test.cc +++ b/gcc/analyzer/sm-pattern-test.cc @@ -23,7 +23,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" #include "tree-pretty-print.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "analyzer/analyzer-logging.h" #include "analyzer/sm.h" diff --git a/gcc/analyzer/sm-sensitive.cc b/gcc/analyzer/sm-sensitive.cc index f8fcdede8d8e..4611b10e35a0 100644 --- a/gcc/analyzer/sm-sensitive.cc +++ b/gcc/analyzer/sm-sensitive.cc @@ -21,7 +21,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "analyzer/analyzer-logging.h" #include "analyzer/sm.h" @@ -106,14 +106,15 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &change) const final override { + using event = diagnostics::paths::event; + if (change.m_new_state == m_sm.m_sensitive) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::sensitive); - return diagnostic_event::meaning (); + return event::meaning (event::verb::acquire, event::noun::sensitive); + return event::meaning (); } bool describe_call_with_state (pretty_printer &pp, @@ -162,7 +163,7 @@ public: private: const sensitive_state_machine &m_sm; tree m_arg; - diagnostic_event_id_t m_first_sensitive_event; + diagnostics::paths::event_id_t m_first_sensitive_event; }; /* sensitive_state_machine's ctor. */ diff --git a/gcc/analyzer/sm-signal.cc b/gcc/analyzer/sm-signal.cc index 5a4b384648f9..35ecde1d24bb 100644 --- a/gcc/analyzer/sm-signal.cc +++ b/gcc/analyzer/sm-signal.cc @@ -22,7 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "analyzer/common.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "sbitmap.h" #include "ordered-hash-map.h" #include "selftest.h" diff --git a/gcc/analyzer/sm-taint.cc b/gcc/analyzer/sm-taint.cc index 5c8cc7ed205f..af937f876185 100644 --- a/gcc/analyzer/sm-taint.cc +++ b/gcc/analyzer/sm-taint.cc @@ -209,14 +209,15 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &change) const final override { + using event = diagnostics::paths::event; if (change.m_new_state == m_sm.m_tainted) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::taint); - return diagnostic_event::meaning (); + return event::meaning (event::verb::acquire, + event::noun::taint); + return event::meaning (); } void maybe_add_sarif_properties (sarif_object &result_obj) diff --git a/gcc/analyzer/varargs.cc b/gcc/analyzer/varargs.cc index 494727149171..1fdfd34cdcd2 100644 --- a/gcc/analyzer/varargs.cc +++ b/gcc/analyzer/varargs.cc @@ -334,17 +334,17 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &change) const final override { if (change.m_new_state == m_sm.m_started) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::resource); + return diagnostics::paths::event::meaning (diagnostics::paths::event::verb::acquire, + diagnostics::paths::event::noun::resource); if (change.m_new_state == m_sm.m_ended) - return diagnostic_event::meaning (diagnostic_event::verb::release, - diagnostic_event::noun::resource); - return diagnostic_event::meaning (); + return diagnostics::paths::event::meaning (diagnostics::paths::event::verb::release, + diagnostics::paths::event::noun::resource); + return diagnostics::paths::event::meaning (); } protected: @@ -452,7 +452,7 @@ public: } private: - diagnostic_event_id_t m_va_end_event; + diagnostics::paths::event_id_t m_va_end_event; const char *m_usage_fnname; }; @@ -539,7 +539,7 @@ public: } private: - diagnostic_event_id_t m_start_event; + diagnostics::paths::event_id_t m_start_event; const char *m_start_event_fnname; std::unique_ptr<program_state> m_final_state; }; diff --git a/gcc/diagnostic-format-html.cc b/gcc/diagnostic-format-html.cc index df0a32a81ac7..03421166ff64 100644 --- a/gcc/diagnostic-format-html.cc +++ b/gcc/diagnostic-format-html.cc @@ -32,7 +32,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic-format-sarif.h" #include "diagnostics/output-file.h" #include "diagnostic-buffer.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostics/client-data-hooks.h" #include "selftest.h" #include "selftest-diagnostic.h" @@ -153,7 +153,7 @@ public: } std::unique_ptr<xml::node> - maybe_make_state_diagram (const diagnostic_event &event); + maybe_make_state_diagram (const paths::event &event); private: void @@ -607,7 +607,7 @@ print_pre_source (xml::printer &xp, const char *text) } std::unique_ptr<xml::node> -html_builder::maybe_make_state_diagram (const diagnostic_event &event) +html_builder::maybe_make_state_diagram (const paths::event &event) { if (!m_html_gen_opts.m_show_state_diagrams) return nullptr; @@ -665,7 +665,7 @@ class html_path_label_writer : public html_label_writer public: html_path_label_writer (xml::printer &xp, html_builder &builder, - const diagnostic_path &path, + const paths::path &path, const std::string &event_id_prefix) : m_xp (xp), m_html_builder (builder), @@ -686,7 +686,7 @@ public: void end_label () final override { - const diagnostic_event &event + const paths::event &event = m_path.get_event (m_curr_event_id.zero_based ()); if (auto state_doc = m_html_builder.maybe_make_state_diagram (event)) { @@ -714,10 +714,10 @@ private: xml::printer &m_xp; html_builder &m_html_builder; - const diagnostic_path &m_path; + const paths::path &m_path; const std::string &m_event_id_prefix; int m_next_event_idx; - diagnostic_event_id_t m_curr_event_id; + paths::event_id_t m_curr_event_id; }; /* See https://pf3.patternfly.org/v3/pattern-library/widgets/#alerts */ @@ -1551,7 +1551,7 @@ test_token_printer () { token_printer_test t; - diagnostic_event_id_t event_id (0); + paths::event_id_t event_id (0); pp_printf (&t.m_pp, "foo %@ bar", &event_id); ASSERT_XML_PRINT_EQ (t.m_top_element, diff --git a/gcc/diagnostic-format-html.h b/gcc/diagnostic-format-html.h index d55cd301dc63..8e3a2f89dc96 100644 --- a/gcc/diagnostic-format-html.h +++ b/gcc/diagnostic-format-html.h @@ -56,7 +56,7 @@ make_html_sink (diagnostic_context &context, extern void print_path_as_html (xml::printer &xp, - const diagnostic_path &path, + const diagnostics::paths::path &path, diagnostic_context &dc, html_label_writer *event_label_writer, const diagnostic_source_print_policy &dspp); diff --git a/gcc/diagnostic-format-sarif.cc b/gcc/diagnostic-format-sarif.cc index 4f1cd0bd4e0c..bc6f19fae2e0 100644 --- a/gcc/diagnostic-format-sarif.cc +++ b/gcc/diagnostic-format-sarif.cc @@ -30,7 +30,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostics/metadata.h" #include "diagnostics/digraphs.h" #include "diagnostics/state-graphs.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostic-format.h" #include "diagnostic-buffer.h" #include "json.h" @@ -534,22 +534,22 @@ public: unsigned get_index_within_parent () const { return m_idx_within_parent; } sarif_thread_flow & - get_or_append_thread_flow (const diagnostic_thread &thread, - diagnostic_thread_id_t thread_id); + get_or_append_thread_flow (const paths::thread &thread, + paths::thread_id_t thread_id); sarif_thread_flow & - get_thread_flow (diagnostic_thread_id_t thread_id); + get_thread_flow (paths::thread_id_t thread_id); void add_location (sarif_thread_flow_location &); sarif_thread_flow_location & - get_thread_flow_loc_obj (diagnostic_event_id_t event_id) const; + get_thread_flow_loc_obj (paths::event_id_t event_id) const; private: sarif_result &m_parent; const unsigned m_idx_within_parent; - hash_map<int_hash<diagnostic_thread_id_t, -1, -2>, + hash_map<int_hash<paths::thread_id_t, -1, -2>, sarif_thread_flow *> m_thread_id_map; // borrowed ptr json::array *m_thread_flows_arr; // borrowed @@ -565,7 +565,7 @@ class sarif_thread_flow : public sarif_object { public: sarif_thread_flow (sarif_code_flow &parent, - const diagnostic_thread &thread, + const paths::thread &thread, unsigned idx_within_parent); sarif_code_flow &get_parent () const { return m_parent; } @@ -865,19 +865,19 @@ private: logical_locations::key logical_loc); std::unique_ptr<sarif_location> make_location_object (sarif_location_manager &loc_mgr, - const diagnostic_event &event, + const paths::event &event, enum diagnostic_artifact_role role); std::unique_ptr<sarif_code_flow> make_code_flow_object (sarif_result &result, unsigned idx_within_parent, - const diagnostic_path &path); + const paths::path &path); void populate_thread_flow_location_object (sarif_result &result, sarif_thread_flow_location &thread_flow_loc_obj, - const diagnostic_event &event, + const paths::event &event, int event_execution_idx); std::unique_ptr<json::array> - maybe_make_kinds_array (diagnostic_event::meaning m) const; + maybe_make_kinds_array (paths::event::meaning m) const; std::unique_ptr<sarif_physical_location> maybe_make_physical_location_object (location_t loc, enum diagnostic_artifact_role role, @@ -1574,8 +1574,8 @@ sarif_code_flow::sarif_code_flow (sarif_result &parent, } sarif_thread_flow & -sarif_code_flow::get_or_append_thread_flow (const diagnostic_thread &thread, - diagnostic_thread_id_t thread_id) +sarif_code_flow::get_or_append_thread_flow (const paths::thread &thread, + paths::thread_id_t thread_id) { sarif_thread_flow **slot = m_thread_id_map.get (thread_id); if (slot) @@ -1591,7 +1591,7 @@ sarif_code_flow::get_or_append_thread_flow (const diagnostic_thread &thread, } sarif_thread_flow & -sarif_code_flow::get_thread_flow (diagnostic_thread_id_t thread_id) +sarif_code_flow::get_thread_flow (paths::thread_id_t thread_id) { sarif_thread_flow **slot = m_thread_id_map.get (thread_id); gcc_assert (slot); // it must already have one @@ -1605,7 +1605,7 @@ sarif_code_flow::add_location (sarif_thread_flow_location &tfl_obj) } sarif_thread_flow_location & -sarif_code_flow::get_thread_flow_loc_obj (diagnostic_event_id_t event_id) const +sarif_code_flow::get_thread_flow_loc_obj (paths::event_id_t event_id) const { gcc_assert (event_id.known_p ()); gcc_assert ((size_t)event_id.zero_based () < m_all_tfl_objs.size ()); @@ -1617,7 +1617,7 @@ sarif_code_flow::get_thread_flow_loc_obj (diagnostic_event_id_t event_id) const /* class sarif_thread_flow : public sarif_object. */ sarif_thread_flow::sarif_thread_flow (sarif_code_flow &parent, - const diagnostic_thread &thread, + const paths::thread &thread, unsigned idx_within_parent) : m_parent (parent), m_idx_within_parent (idx_within_parent) @@ -2060,7 +2060,7 @@ sarif_builder::make_result_object (const diagnostic_info &diagnostic, diagnostic_artifact_role::result_file)); /* "codeFlows" property (SARIF v2.1.0 section 3.27.18). */ - if (const diagnostic_path *path = diagnostic.richloc->get_path ()) + if (const paths::path *path = diagnostic.richloc->get_path ()) { auto code_flows_arr = std::make_unique<json::array> (); const unsigned code_flow_index = 0; @@ -2430,11 +2430,11 @@ sarif_builder::make_location_object (sarif_location_manager &loc_mgr, } /* Make a "location" object (SARIF v2.1.0 section 3.28) for EVENT - within a diagnostic_path. */ + within a paths::path. */ std::unique_ptr<sarif_location> sarif_builder::make_location_object (sarif_location_manager &loc_mgr, - const diagnostic_event &event, + const paths::event &event, enum diagnostic_artifact_role role) { auto location_obj = std::make_unique<sarif_location> (); @@ -3050,7 +3050,7 @@ make_minimal_sarif_logical_location (logical_locations::key logical_loc) label_text make_sarif_url_for_event (const sarif_code_flow *code_flow, - diagnostic_event_id_t event_id) + paths::event_id_t event_id) { gcc_assert (event_id.known_p ()); @@ -3084,7 +3084,7 @@ make_sarif_url_for_event (const sarif_code_flow *code_flow, std::unique_ptr<sarif_code_flow> sarif_builder::make_code_flow_object (sarif_result &result, unsigned idx_within_parent, - const diagnostic_path &path) + const paths::path &path) { auto code_flow_obj = std::make_unique <sarif_code_flow> (result, idx_within_parent); @@ -3096,8 +3096,8 @@ sarif_builder::make_code_flow_object (sarif_result &result, SARIF file. */ for (unsigned i = 0; i < path.num_events (); i++) { - const diagnostic_event &event = path.get_event (i); - const diagnostic_thread_id_t thread_id = event.get_thread_id (); + const paths::event &event = path.get_event (i); + const paths::thread_id_t thread_id = event.get_thread_id (); sarif_thread_flow &thread_flow_obj = code_flow_obj->get_or_append_thread_flow (path.get_thread (thread_id), @@ -3109,7 +3109,7 @@ sarif_builder::make_code_flow_object (sarif_result &result, m_current_code_flow = code_flow_obj.get (); for (unsigned i = 0; i < path.num_events (); i++) { - const diagnostic_event &event = path.get_event (i); + const paths::event &event = path.get_event (i); sarif_thread_flow_location &thread_flow_loc_obj = code_flow_obj->get_thread_flow_loc_obj (i); populate_thread_flow_location_object (result, @@ -3129,10 +3129,10 @@ void sarif_builder:: populate_thread_flow_location_object (sarif_result &result, sarif_thread_flow_location &tfl_obj, - const diagnostic_event &ev, + const paths::event &ev, int event_execution_idx) { - /* Give diagnostic_event subclasses a chance to add custom properties + /* Give paths::event subclasses a chance to add custom properties via a property bag. */ ev.maybe_add_sarif_properties (*this, tfl_obj); @@ -3141,7 +3141,7 @@ populate_thread_flow_location_object (sarif_result &result, { sarif_property_bag &props = tfl_obj.get_or_create_properties (); -#define PROPERTY_PREFIX "gcc/diagnostic_event/" +#define PROPERTY_PREFIX "gcc/diagnostics/paths/event/" props.set_graph (PROPERTY_PREFIX "state_graph", *this, /* Use RESULT for any related locations in the graph's @@ -3160,7 +3160,7 @@ populate_thread_flow_location_object (sarif_result &result, make_location_object (result, ev, diagnostic_artifact_role::traced_file)); /* "kinds" property (SARIF v2.1.0 section 3.38.8). */ - diagnostic_event::meaning m = ev.get_meaning (); + paths::event::meaning m = ev.get_meaning (); if (auto kinds_arr = maybe_make_kinds_array (m)) tfl_obj.set<json::array> ("kinds", std::move (kinds_arr)); @@ -3183,22 +3183,25 @@ populate_thread_flow_location_object (sarif_result &result, Otherwise, return nullptr. */ std::unique_ptr<json::array> -sarif_builder::maybe_make_kinds_array (diagnostic_event::meaning m) const +sarif_builder:: +maybe_make_kinds_array (paths::event::meaning m) const { - if (m.m_verb == diagnostic_event::verb::unknown - && m.m_noun == diagnostic_event::noun::unknown - && m.m_property == diagnostic_event::property::unknown) + using namespace paths; + + if (m.m_verb == event::verb::unknown + && m.m_noun == event::noun::unknown + && m.m_property == event::property::unknown) return nullptr; auto kinds_arr = std::make_unique<json::array> (); if (const char *verb_str - = diagnostic_event::meaning::maybe_get_verb_str (m.m_verb)) + = event::meaning::maybe_get_verb_str (m.m_verb)) kinds_arr->append_string (verb_str); if (const char *noun_str - = diagnostic_event::meaning::maybe_get_noun_str (m.m_noun)) + = event::meaning::maybe_get_noun_str (m.m_noun)) kinds_arr->append_string (noun_str); if (const char *property_str - = diagnostic_event::meaning::maybe_get_property_str (m.m_property)) + = event::meaning::maybe_get_property_str (m.m_property)) kinds_arr->append_string (property_str); return kinds_arr; } diff --git a/gcc/diagnostic-format-text.cc b/gcc/diagnostic-format-text.cc index fd4e421b56d6..f39381f1bd19 100644 --- a/gcc/diagnostic-format-text.cc +++ b/gcc/diagnostic-format-text.cc @@ -28,7 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic-color.h" #include "diagnostic-url.h" #include "diagnostics/metadata.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostics/client-data-hooks.h" #include "diagnostics/diagram.h" #include "diagnostic-format-text.h" @@ -42,6 +42,8 @@ along with GCC; see the file COPYING3. If not see # pragma GCC diagnostic ignored "-Wformat-diag" #endif +using namespace diagnostics; + /* Concrete buffering implementation subclass for JSON output. */ class diagnostic_text_format_buffer : public diagnostic_per_format_buffer @@ -277,7 +279,7 @@ void diagnostic_text_output_format:: after_diagnostic (const diagnostic_info &diagnostic) { - if (const diagnostic_path *path = diagnostic.richloc->get_path ()) + if (const paths::path *path = diagnostic.richloc->get_path ()) print_path (*path); } diff --git a/gcc/diagnostic-format-text.h b/gcc/diagnostic-format-text.h index bcaabf874fbd..d4771967ff71 100644 --- a/gcc/diagnostic-format-text.h +++ b/gcc/diagnostic-format-text.h @@ -87,7 +87,7 @@ public: char *build_indent_prefix (bool with_bullet) const; - void print_path (const diagnostic_path &path); + void print_path (const diagnostics::paths::path &path); bool show_column_p () const { return get_context ().m_show_column; } diff --git a/gcc/diagnostic-show-locus.cc b/gcc/diagnostic-show-locus.cc index da7637cbcbb1..492d94f13c5d 100644 --- a/gcc/diagnostic-show-locus.cc +++ b/gcc/diagnostic-show-locus.cc @@ -2701,7 +2701,7 @@ layout_printer<to_text>::begin_label (int range_idx, bool is_label_text) { /* Colorize the text, unless it's for labels for events in a - diagnostic_path. */ + diagnostic path. */ if (is_label_text && m_is_diagnostic_path) return; diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc index 1fc3720a1258..b5858b218eda 100644 --- a/gcc/diagnostic.cc +++ b/gcc/diagnostic.cc @@ -34,7 +34,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic-color.h" #include "diagnostic-url.h" #include "diagnostics/metadata.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostics/client-data-hooks.h" #include "diagnostics/diagram.h" #include "diagnostic-format.h" diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 4d8a76b21b4f..13f7525344e6 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -96,17 +96,17 @@ enum diagnostics_output_format DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE }; -/* An enum for controlling how diagnostic_paths should be printed. */ +/* An enum for controlling how diagnostic paths should be printed. */ enum diagnostic_path_format { - /* Don't print diagnostic_paths. */ + /* Don't print diagnostic paths. */ DPF_NONE, - /* Print diagnostic_paths by emitting a separate "note" for every event + /* Print diagnostic paths by emitting a separate "note" for every event in the path. */ DPF_SEPARATE_EVENTS, - /* Print diagnostic_paths by consolidating events together where they + /* Print diagnostic paths by consolidating events together where they are close enough, and printing such runs of events with multiple calls to diagnostic_show_locus, showing the individual events in each run via labels in the source. */ @@ -931,7 +931,7 @@ private: /* True if we should print any rules associated with diagnostics. */ bool m_show_rules; - /* How should diagnostic_path objects be printed. */ + /* How should diagnostics::paths::path objects be printed. */ enum diagnostic_path_format m_path_format; /* True if we should print stack depths when printing diagnostic paths. */ diff --git a/gcc/diagnostic-event-id.h b/gcc/diagnostics/event-id.h similarity index 74% rename from gcc/diagnostic-event-id.h rename to gcc/diagnostics/event-id.h index 7a45a7294c2d..167599d1b0e0 100644 --- a/gcc/diagnostic-event-id.h +++ b/gcc/diagnostics/event-id.h @@ -1,4 +1,4 @@ -/* A class for referring to events within a diagnostic_path. +/* A class for referring to events within a diagnostics::paths::path. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com> @@ -18,10 +18,10 @@ 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/>. */ -#ifndef GCC_DIAGNOSTIC_EVENT_ID_H -#define GCC_DIAGNOSTIC_EVENT_ID_H +#ifndef GCC_DIAGNOSTICS_EVENT_ID_H +#define GCC_DIAGNOSTICS_EVENT_ID_H -/* A class for referring to events within a diagnostic_path. +/* A class for referring to events within a diagnostics::paths::path. They are stored as 0-based offsets into the events, but printed (e.g. via %@) as 1-based numbers. @@ -30,8 +30,10 @@ along with GCC; see the file COPYING3. If not see which would be shown to the user as "(1)", "(2)" and "(3)". This has its own header so that pretty-print.cc can use this - to implement "%@" without bringing in all of diagnostic_path - (which e.g. refers to "tree"). */ + to implement "%@" without bringing in all of diagnostics::paths. + + This has to be in the global namespace for compatibility with + c-format.cc in GCC 10 onwards. */ class diagnostic_event_id_t { @@ -58,15 +60,24 @@ class diagnostic_event_id_t int m_index; // zero-based }; +namespace diagnostics { +namespace paths { + +typedef diagnostic_event_id_t event_id_t; + +/* A type for compactly referring to a particular thread within a + diagnostics::paths::path. Typically there is just one thread per path, + with id 0. */ +typedef int thread_id_t; + +} // namespace paths +} // namespace diagnostics + + /* A pointer to a diagnostic_event_id_t, for use with the "%@" format code, which will print a 1-based representation for it, with suitable colorization, e.g. "(1)". The %@ format code requires that known_p be true for the event ID. */ typedef diagnostic_event_id_t *diagnostic_event_id_ptr; -/* A type for compactly referring to a particular thread within a - diagnostic_path. Typically there is just one thread per path, - with id 0. */ -typedef int diagnostic_thread_id_t; - -#endif /* ! GCC_DIAGNOSTIC_EVENT_ID_H */ +#endif /* ! GCC_DIAGNOSTICS_EVENT_ID_H */ diff --git a/gcc/lazy-diagnostic-path.cc b/gcc/diagnostics/lazy-paths.cc similarity index 88% rename from gcc/lazy-diagnostic-path.cc rename to gcc/diagnostics/lazy-paths.cc index 34743e35617a..8de5db42a211 100644 --- a/gcc/lazy-diagnostic-path.cc +++ b/gcc/diagnostics/lazy-paths.cc @@ -27,56 +27,58 @@ along with GCC; see the file COPYING3. If not see #include "version.h" #include "intl.h" #include "diagnostic.h" -#include "lazy-diagnostic-path.h" +#include "diagnostics/lazy-paths.h" #include "selftest.h" #include "selftest-diagnostic.h" #include "simple-diagnostic-path.h" #include "gcc-rich-location.h" #include "diagnostic-format-text.h" -/* class lazy_diagnostic_path : public diagnostic_path. */ +using namespace diagnostics::paths; -/* Implementation of diagnostic_path vfuncs in terms of a lazily-generated +/* class lazy_path : public path. */ + +/* Implementation of path vfuncs in terms of a lazily-generated path. */ unsigned -lazy_diagnostic_path::num_events () const +lazy_path::num_events () const { lazily_generate_path (); return m_inner_path->num_events (); } -const diagnostic_event & -lazy_diagnostic_path::get_event (int idx) const +const event & +lazy_path::get_event (int idx) const { lazily_generate_path (); return m_inner_path->get_event (idx); } unsigned -lazy_diagnostic_path::num_threads () const +lazy_path::num_threads () const { lazily_generate_path (); return m_inner_path->num_threads (); } -const diagnostic_thread & -lazy_diagnostic_path::get_thread (diagnostic_thread_id_t idx) const +const thread & +lazy_path::get_thread (thread_id_t idx) const { lazily_generate_path (); return m_inner_path->get_thread (idx); } bool -lazy_diagnostic_path::same_function_p (int event_idx_a, - int event_idx_b) const +lazy_path::same_function_p (int event_idx_a, + int event_idx_b) const { lazily_generate_path (); return m_inner_path->same_function_p (event_idx_a, event_idx_b); } void -lazy_diagnostic_path::lazily_generate_path () const +lazy_path::lazily_generate_path () const { if (!m_inner_path) m_inner_path = make_inner_path (); @@ -87,15 +89,15 @@ lazy_diagnostic_path::lazily_generate_path () const namespace selftest { -class test_lazy_path : public lazy_diagnostic_path +class test_lazy_path : public lazy_path { public: test_lazy_path (pretty_printer &pp) - : lazy_diagnostic_path (m_logical_loc_mgr), + : lazy_path (m_logical_loc_mgr), m_pp (pp) { } - std::unique_ptr<diagnostic_path> make_inner_path () const final override + std::unique_ptr<path> make_inner_path () const final override { tree fntype_void_void = build_function_type_array (void_type_node, 0, nullptr); @@ -214,7 +216,7 @@ test_emission (pretty_printer *event_pp) /* Run all of the selftests within this file. */ void -lazy_diagnostic_path_cc_tests () +diagnostics_lazy_paths_cc_tests () { /* In a few places we use the global dc's printer to determine colorization so ensure this off during the tests. */ diff --git a/gcc/lazy-diagnostic-path.h b/gcc/diagnostics/lazy-paths.h similarity index 65% rename from gcc/lazy-diagnostic-path.h rename to gcc/diagnostics/lazy-paths.h index 9609cab02953..01b921ba7772 100644 --- a/gcc/lazy-diagnostic-path.h +++ b/gcc/diagnostics/lazy-paths.h @@ -18,13 +18,16 @@ 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/>. */ -#ifndef GCC_LAZY_DIAGNOSTIC_PATH_H -#define GCC_LAZY_DIAGNOSTIC_PATH_H +#ifndef GCC_DIAGNOSTICS_LAZY_PATHS_H +#define GCC_DIAGNOSTICS_LAZY_PATHS_H -#include "diagnostic-path.h" +#include "diagnostics/paths.h" -/* An implementation of diagnostic_path which has a trivial ctor - and lazily creates another diagnostic_path the first time the path +namespace diagnostics { +namespace paths { + +/* An implementation of diagnostics::paths::path which has a trivial ctor + and lazily creates another path the first time the path is queried, deferring to this inner path for all queries. Use this to avoid expensive path creation logic when creating @@ -32,16 +35,16 @@ along with GCC; see the file COPYING3. If not see is actually used by a diagnostic, and thus avoided for warnings that are disabled. */ -class lazy_diagnostic_path : public diagnostic_path +class lazy_path : public path { public: - virtual ~lazy_diagnostic_path () {} + virtual ~lazy_path () {} unsigned num_events () const final override; - const diagnostic_event & get_event (int idx) const final override; + const event & get_event (int idx) const final override; unsigned num_threads () const final override; - const diagnostic_thread & - get_thread (diagnostic_thread_id_t) const final override; + const thread & + get_thread (thread_id_t) const final override; bool same_function_p (int event_idx_a, int event_idx_b) const final override; @@ -49,16 +52,19 @@ class lazy_diagnostic_path : public diagnostic_path bool generated_p () const { return m_inner_path != nullptr; } protected: - lazy_diagnostic_path (const logical_location_manager &logical_loc_mgr) - : diagnostic_path (logical_loc_mgr) + lazy_path (const logical_locations::manager &logical_loc_mgr) + : path (logical_loc_mgr) { } private: void lazily_generate_path () const; - virtual std::unique_ptr<diagnostic_path> make_inner_path () const = 0; + virtual std::unique_ptr<path> make_inner_path () const = 0; - mutable std::unique_ptr<diagnostic_path> m_inner_path; + mutable std::unique_ptr<path> m_inner_path; }; -#endif /* ! GCC_LAZY_DIAGNOSTIC_PATH_H */ +} // namespace paths +} // namespace diagnostics + +#endif /* ! GCC_DIAGNOSTICS_LAZY_PATHS_H */ diff --git a/gcc/diagnostic-path-output.cc b/gcc/diagnostics/paths-output.cc similarity index 95% rename from gcc/diagnostic-path-output.cc rename to gcc/diagnostics/paths-output.cc index a05319c81acc..c3e152fa07ef 100644 --- a/gcc/diagnostic-path-output.cc +++ b/gcc/diagnostics/paths-output.cc @@ -28,15 +28,15 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic.h" #include "diagnostic-macro-unwinding.h" #include "intl.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "gcc-rich-location.h" #include "diagnostic-color.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "diagnostic-label-effects.h" #include "pretty-print-markup.h" #include "selftest.h" #include "selftest-diagnostic.h" -#include "selftest-diagnostic-path.h" +#include "diagnostics/selftest-paths.h" #include "text-art/theme.h" #include "diagnostic-format-text.h" #include "diagnostic-format-html.h" @@ -55,6 +55,7 @@ along with GCC; see the file COPYING3. If not see namespace { using namespace diagnostics; +using namespace diagnostics::paths; /* A bundle of state for printing a path. */ @@ -85,18 +86,18 @@ private: }; /* Subclass of range_label for showing a particular event - when showing a consecutive run of events within a diagnostic_path as + when showing a consecutive run of events within a diagnostic path as labelled ranges within one gcc_rich_location. */ class path_label : public range_label { public: - path_label (const diagnostic_path &path, + path_label (const path &path_, const pretty_printer &ref_pp, unsigned start_idx, bool colorize, bool allow_emojis) - : m_path (path), + : m_path (path_), m_ref_pp (ref_pp), m_start_idx (start_idx), m_effects (*this), m_colorize (colorize), m_allow_emojis (allow_emojis) @@ -105,18 +106,17 @@ class path_label : public range_label label_text get_text (unsigned range_idx) const final override { unsigned event_idx = m_start_idx + range_idx; - const diagnostic_event &event = m_path.get_event (event_idx); + const event &ev = m_path.get_event (event_idx); - const diagnostic_event::meaning meaning (event.get_meaning ()); + const event::meaning meaning (ev.get_meaning ()); auto pp = m_ref_pp.clone (); pp_show_color (pp.get ()) = m_colorize; - diagnostic_event_id_t event_id (event_idx); - + event_id_t event_id (event_idx); pp_printf (pp.get (), "%@", &event_id); pp_space (pp.get ()); - if (meaning.m_verb == diagnostic_event::verb::danger + if (meaning.m_verb == event::verb::danger && m_allow_emojis) { pp_unicode_character (pp.get (), 0x26A0); /* U+26A0 WARNING SIGN. */ @@ -130,7 +130,7 @@ class path_label : public range_label pp_string (pp.get (), " "); } - event.print_desc (*pp.get ()); + ev.print_desc (*pp.get ()); label_text result = label_text::take (xstrdup (pp_formatted_text (pp.get ()))); @@ -152,28 +152,28 @@ class path_label : public range_label } bool has_in_edge (unsigned range_idx) const final override { - if (const diagnostic_event *prev_event + if (const event *prev_event = m_path_label.get_prev_event (range_idx)) return prev_event->connect_to_next_event_p (); return false; } bool has_out_edge (unsigned range_idx) const final override { - const diagnostic_event &event = m_path_label.get_event (range_idx); - return event.connect_to_next_event_p (); + const event &ev = m_path_label.get_event (range_idx); + return ev.connect_to_next_event_p (); } private: const path_label &m_path_label; }; - const diagnostic_event &get_event (unsigned range_idx) const + const event &get_event (unsigned range_idx) const { unsigned event_idx = m_start_idx + range_idx; return m_path.get_event (event_idx); } - const diagnostic_event *get_prev_event (unsigned range_idx) const + const event *get_prev_event (unsigned range_idx) const { if (m_start_idx + range_idx == 0) return nullptr; @@ -181,7 +181,7 @@ class path_label : public range_label return &m_path.get_event (event_idx); } - const diagnostic_path &m_path; + const path &m_path; const pretty_printer &m_ref_pp; unsigned m_start_idx; path_label_effects m_effects; @@ -190,20 +190,20 @@ class path_label : public range_label }; /* Return true if E1 and E2 can be consolidated into the same run of events - when printing a diagnostic_path. */ + when printing a diagnostic path. */ static bool -can_consolidate_events (const diagnostic_path &path, - const diagnostic_event &e1, +can_consolidate_events (const path &p, + const event &e1, unsigned ev1_idx, - const diagnostic_event &e2, + const event &e2, unsigned ev2_idx, bool check_locations) { if (e1.get_thread_id () != e2.get_thread_id ()) return false; - if (!path.same_function_p (ev1_idx, ev2_idx)) + if (!p.same_function_p (ev1_idx, ev2_idx)) return false; if (e1.get_stack_depth () != e2.get_stack_depth ()) @@ -233,16 +233,16 @@ struct event_range; struct path_summary; class thread_event_printer; -/* A bundle of information about all of the events in a diagnostic_path +/* A bundle of information about all of the events in a diagnostic path relating to a specific path, for use by path_summary. */ class per_thread_summary { public: - per_thread_summary (const diagnostic_path &path, + per_thread_summary (const path &path_, const logical_locations::manager &logical_loc_mgr, label_text name, unsigned swimlane_idx) - : m_path (path), + : m_path (path_), m_logical_loc_mgr (logical_loc_mgr), m_name (std::move (name)), m_swimlane_idx (swimlane_idx), @@ -269,7 +269,7 @@ private: friend class thread_event_printer; friend struct event_range; - const diagnostic_path &m_path; + const path &m_path; const logical_locations::manager &m_logical_loc_mgr; const label_text m_name; @@ -281,7 +281,7 @@ private: // The event ranges specific to this thread: auto_vec<event_range *> m_event_ranges; - const diagnostic_event *m_last_event; + const event *m_last_event; int m_min_depth; int m_max_depth; @@ -400,7 +400,7 @@ emit_svg_arrow (xml::printer &xp, int old_depth, int new_depth) xp.add_raw (pp_formatted_text (pp)); } -/* A range of consecutive events within a diagnostic_path, all within the +/* A range of consecutive events within a diagnostic path, all within the same thread, and with the same fndecl and stack_depth, and which are suitable to print with a single call to diagnostic_show_locus. */ struct event_range @@ -425,7 +425,7 @@ struct event_range the events already on this source line, *and* a new event at COLUMN. */ bool can_add_label_for_event_p (bool has_in_edge, - const diagnostic_event *prev_event, + const event *prev_event, bool has_out_edge, int column) const { @@ -490,20 +490,20 @@ struct event_range int m_max_label_source_column; }; - event_range (const diagnostic_path &path, + event_range (const path &path_, const pretty_printer &ref_pp, unsigned start_idx, - const diagnostic_event &initial_event, + const event &initial_event, per_thread_summary &t, bool show_event_links, bool colorize_labels, bool allow_emojis) - : m_path (path), + : m_path (path_), m_initial_event (initial_event), m_logical_loc (initial_event.get_logical_location ()), m_stack_depth (initial_event.get_stack_depth ()), m_start_idx (start_idx), m_end_idx (start_idx), - m_path_label (path, ref_pp, + m_path_label (path_, ref_pp, start_idx, colorize_labels, allow_emojis), m_richloc (initial_event.get_location (), &m_path_label, nullptr), m_thread_id (initial_event.get_thread_id ()), @@ -518,7 +518,7 @@ struct event_range per_source_line_info &source_line_info = get_per_source_line_info (exploc.line); - const diagnostic_event *prev_thread_event = t.m_last_event; + const event *prev_thread_event = t.m_last_event; const bool has_in_edge = (prev_thread_event ? prev_thread_event->connect_to_next_event_p () @@ -542,7 +542,7 @@ struct event_range } bool maybe_add_event (const path_print_policy &policy, - const diagnostic_event &new_ev, + const event &new_ev, unsigned new_ev_idx, bool check_rich_locations) { @@ -559,7 +559,7 @@ struct event_range (line_table, new_ev.get_location (), LOCATION_ASPECT_CARET); per_source_line_info &source_line_info = get_per_source_line_info (exploc.line); - const diagnostic_event *prev_event = nullptr; + const event *prev_event = nullptr; if (new_ev_idx > 0) prev_event = &m_path.get_event (new_ev_idx - 1); const bool has_in_edge = (prev_event @@ -626,7 +626,7 @@ struct event_range { for (unsigned i = m_start_idx; i <= m_end_idx; i++) { - const diagnostic_event &iter_event = m_path.get_event (i); + const event &iter_event = m_path.get_event (i); diagnostic_event_id_t event_id (i); pp_printf (&pp, " %@: ", &event_id); iter_event.print_desc (pp); @@ -684,7 +684,7 @@ struct event_range { for (unsigned i = m_start_idx; i <= m_end_idx; i++) { - const diagnostic_event &iter_event = m_path.get_event (i); + const event &iter_event = m_path.get_event (i); diagnostic_event_id_t event_id (i); pretty_printer pp; pp_printf (&pp, " %@: ", &event_id); @@ -707,22 +707,22 @@ struct event_range // TODO: show macro expansions } - const diagnostic_path &m_path; - const diagnostic_event &m_initial_event; + const path &m_path; + const event &m_initial_event; logical_locations::key m_logical_loc; int m_stack_depth; unsigned m_start_idx; unsigned m_end_idx; path_label m_path_label; gcc_rich_location m_richloc; - diagnostic_thread_id_t m_thread_id; + thread_id_t m_thread_id; per_thread_summary &m_per_thread_summary; hash_map<int_hash<int, -1, -2>, per_source_line_info> m_source_line_info_map; bool m_show_event_links; }; -/* A struct for grouping together the events in a diagnostic_path into +/* A struct for grouping together the events in a path into ranges of events, partitioned by thread and by stack frame (i.e. by fndecl and stack depth). */ @@ -730,7 +730,7 @@ struct path_summary { path_summary (const path_print_policy &policy, const pretty_printer &ref_pp, - const diagnostic_path &path, + const path &path_, bool check_rich_locations, bool colorize = false, bool show_event_links = true); @@ -742,7 +742,7 @@ struct path_summary unsigned get_num_ranges () const { return m_ranges.length (); } bool multithreaded_p () const { return m_per_thread_summary.length () > 1; } - const per_thread_summary &get_events_for_thread_id (diagnostic_thread_id_t tid) + const per_thread_summary &get_events_for_thread_id (thread_id_t tid) { per_thread_summary **slot = m_thread_id_to_events.get (tid); gcc_assert (slot); @@ -753,20 +753,20 @@ struct path_summary const logical_locations::manager &m_logical_loc_mgr; auto_delete_vec <event_range> m_ranges; auto_delete_vec <per_thread_summary> m_per_thread_summary; - hash_map<int_hash<diagnostic_thread_id_t, -1, -2>, + hash_map<int_hash<thread_id_t, -1, -2>, per_thread_summary *> m_thread_id_to_events; private: per_thread_summary & - get_or_create_events_for_thread_id (const diagnostic_path &path, - diagnostic_thread_id_t tid) + get_or_create_events_for_thread_id (const path &path_, + thread_id_t tid) { if (per_thread_summary **slot = m_thread_id_to_events.get (tid)) return **slot; - const diagnostic_thread &thread = path.get_thread (tid); + const thread &thread = path_.get_thread (tid); per_thread_summary *pts - = new per_thread_summary (path, + = new per_thread_summary (path_, m_logical_loc_mgr, thread.get_name (false), m_per_thread_summary.length ()); @@ -800,40 +800,40 @@ per_thread_summary::interprocedural_p () const path_summary::path_summary (const path_print_policy &policy, const pretty_printer &ref_pp, - const diagnostic_path &path, + const path &path_, bool check_rich_locations, bool colorize, bool show_event_links) -: m_logical_loc_mgr (path.get_logical_location_manager ()) +: m_logical_loc_mgr (path_.get_logical_location_manager ()) { - const unsigned num_events = path.num_events (); + const unsigned num_events = path_.num_events (); event_range *cur_event_range = nullptr; for (unsigned idx = 0; idx < num_events; idx++) { - const diagnostic_event &event = path.get_event (idx); - const diagnostic_thread_id_t thread_id = event.get_thread_id (); + const event &ev = path_.get_event (idx); + const thread_id_t thread_id = ev.get_thread_id (); per_thread_summary &pts - = get_or_create_events_for_thread_id (path, thread_id); + = get_or_create_events_for_thread_id (path_, thread_id); - pts.update_depth_limits (event.get_stack_depth ()); + pts.update_depth_limits (ev.get_stack_depth ()); if (cur_event_range) if (cur_event_range->maybe_add_event (policy, - event, + ev, idx, check_rich_locations)) continue; auto theme = policy.get_diagram_theme (); const bool allow_emojis = theme ? theme->emojis_p () : false; - cur_event_range = new event_range (path, ref_pp, - idx, event, pts, + cur_event_range = new event_range (path_, ref_pp, + idx, ev, pts, show_event_links, colorize, allow_emojis); m_ranges.safe_push (cur_event_range); pts.m_event_ranges.safe_push (cur_event_range); - pts.m_last_event = &event; + pts.m_last_event = &ev; } } @@ -1286,8 +1286,8 @@ print_path_summary_as_html (const path_summary &ps, class element_event_desc : public pp_element { public: - element_event_desc (const diagnostic_event &event) - : m_event (event) + element_event_desc (const event &event_) + : m_event (event_) { } @@ -1299,15 +1299,15 @@ public: } private: - const diagnostic_event &m_event; + const event &m_event; }; /* Print PATH according to the context's path_format. */ void -diagnostic_text_output_format::print_path (const diagnostic_path &path) +diagnostic_text_output_format::print_path (const path &path_) { - const unsigned num_events = path.num_events (); + const unsigned num_events = path_.num_events (); switch (get_context ().get_path_format ()) { @@ -1318,36 +1318,36 @@ diagnostic_text_output_format::print_path (const diagnostic_path &path) case DPF_SEPARATE_EVENTS: { /* A note per event. */ - auto &logical_loc_mgr = path.get_logical_location_manager (); + auto &logical_loc_mgr = path_.get_logical_location_manager (); for (unsigned i = 0; i < num_events; i++) { - const diagnostic_event &event = path.get_event (i); - element_event_desc e_event_desc (event); + const event &ev = path_.get_event (i); + element_event_desc e_event_desc (ev); diagnostic_event_id_t event_id (i); if (get_context ().show_path_depths_p ()) { - int stack_depth = event.get_stack_depth (); + int stack_depth = ev.get_stack_depth (); /* -fdiagnostics-path-format=separate-events doesn't print fndecl information, so with -fdiagnostics-show-path-depths print the fndecls too, if any. */ if (logical_locations::key logical_loc - = event.get_logical_location ()) + = ev.get_logical_location ()) { label_text name (logical_loc_mgr.get_name_for_path_output (logical_loc)); - inform (event.get_location (), + inform (ev.get_location (), "%@ %e (fndecl %qs, depth %i)", &event_id, &e_event_desc, name.get (), stack_depth); } else - inform (event.get_location (), + inform (ev.get_location (), "%@ %e (depth %i)", &event_id, &e_event_desc, stack_depth); } else - inform (event.get_location (), + inform (ev.get_location (), "%@ %e", &event_id, &e_event_desc); } } @@ -1363,7 +1363,7 @@ diagnostic_text_output_format::print_path (const diagnostic_path &path) const bool show_event_links = m_source_printing.show_event_links_p; path_summary summary (policy, *pp, - path, + path_, check_rich_locations, colorize, show_event_links); @@ -1378,12 +1378,12 @@ diagnostic_text_output_format::print_path (const diagnostic_path &path) } } -/* Print PATH as HTML to XP, using DC and DSPP for settings. +/* Print PATH_ as HTML to XP, using DC and DSPP for settings. If non-null, use EVENT_LABEL_WRITER when writing events. */ void print_path_as_html (xml::printer &xp, - const diagnostic_path &path, + const path &path_, diagnostic_context &dc, html_label_writer *event_label_writer, const diagnostic_source_print_policy &dspp) @@ -1396,7 +1396,7 @@ print_path_as_html (xml::printer &xp, const bool show_event_links = source_printing_opts.show_event_links_p; path_summary summary (policy, *dc.get_reference_printer (), - path, + path_, check_rich_locations, colorize, show_event_links); @@ -1408,16 +1408,16 @@ print_path_as_html (xml::printer &xp, namespace selftest { -/* Return true iff all events in PATH have locations for which column data +/* Return true iff all events in PATH_ have locations for which column data is available, so that selftests that require precise string output can bail out for awkward line_table cases. */ static bool -path_events_have_column_data_p (const diagnostic_path &path) +path_events_have_column_data_p (const path &path_) { - for (unsigned idx = 0; idx < path.num_events (); idx++) + for (unsigned idx = 0; idx < path_.num_events (); idx++) { - location_t event_loc = path.get_event (idx).get_location (); + location_t event_loc = path_.get_event (idx).get_location (); if (line_table->get_pure_location (event_loc) > LINE_MAP_MAX_LOCATION_WITH_COLS) return false; @@ -1709,7 +1709,7 @@ test_interprocedural_path_2 (pretty_printer *event_pp) } /* Verify that print_path_summary is sane in the face of a recursive - diagnostic_path. */ + diagnostic path. */ static void test_recursion (pretty_printer *event_pp) @@ -2692,7 +2692,7 @@ control_flow_tests (const line_table_case &case_) /* Run all of the selftests within this file. */ void -diagnostic_path_output_cc_tests () +diagnostics_paths_output_cc_tests () { pretty_printer pp; pp_show_color (&pp) = false; diff --git a/gcc/diagnostic-path.cc b/gcc/diagnostics/paths.cc similarity index 83% rename from gcc/diagnostic-path.cc rename to gcc/diagnostics/paths.cc index 86ada604b7cb..bc769c45766e 100644 --- a/gcc/diagnostic-path.cc +++ b/gcc/diagnostics/paths.cc @@ -26,7 +26,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "diagnostic.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostics/state-graphs.h" /* Disable warnings about missing quoting in GCC diagnostics for the print @@ -37,13 +37,14 @@ along with GCC; see the file COPYING3. If not see #endif using namespace diagnostics; +using namespace diagnostics::paths; -/* class diagnostic_event. */ +/* class diagnostics::paths::event. */ -/* struct diagnostic_event::meaning. */ +/* struct event::meaning. */ void -diagnostic_event::meaning::dump_to_pp (pretty_printer *pp) const +event::meaning::dump_to_pp (pretty_printer *pp) const { bool need_comma = false; pp_character (pp, '{'); @@ -73,7 +74,7 @@ diagnostic_event::meaning::dump_to_pp (pretty_printer *pp) const threadFlowLocation "kinds" property (SARIF v2.1.0 section 3.38.8). */ const char * -diagnostic_event::meaning::maybe_get_verb_str (enum verb v) +event::meaning::maybe_get_verb_str (enum verb v) { switch (v) { @@ -104,7 +105,7 @@ diagnostic_event::meaning::maybe_get_verb_str (enum verb v) threadFlowLocation "kinds" property (SARIF v2.1.0 section 3.38.8). */ const char * -diagnostic_event::meaning::maybe_get_noun_str (enum noun n) +event::meaning::maybe_get_noun_str (enum noun n) { switch (n) { @@ -131,7 +132,7 @@ diagnostic_event::meaning::maybe_get_noun_str (enum noun n) threadFlowLocation "kinds" property (SARIF v2.1.0 section 3.38.8). */ const char * -diagnostic_event::meaning::maybe_get_property_str (enum property p) +event::meaning::maybe_get_property_str (enum property p) { switch (p) { @@ -150,7 +151,7 @@ diagnostic_event::meaning::maybe_get_property_str (enum property p) (for debugging/logging purposes). */ label_text -diagnostic_event::get_desc (pretty_printer &ref_pp) const +event::get_desc (pretty_printer &ref_pp) const { auto pp = ref_pp.clone (); pp_show_color (pp.get ()) = false; @@ -158,30 +159,30 @@ diagnostic_event::get_desc (pretty_printer &ref_pp) const return label_text::take (xstrdup (pp_formatted_text (pp.get ()))); } -// Base implementation of diagnostic_event::maybe_make_diagnostic_state_graph +// Base implementation of event::maybe_make_diagnostic_state_graph -std::unique_ptr<diagnostics::digraphs::digraph> -diagnostic_event::maybe_make_diagnostic_state_graph (bool) const +std::unique_ptr<digraphs::digraph> +event::maybe_make_diagnostic_state_graph (bool) const { // Don't attempt to make a state graph: return nullptr; } -/* class diagnostic_path. */ +/* class diagnostics::paths::path. */ -/* Subroutine of diagnostic_path::interprocedural_p. +/* Subroutine of path::interprocedural_p. Look for the first event in this path that is within a function i.e. has a non-null logical location for which function_p is true. If found, write its index to *OUT_IDX and return true. Otherwise return false. */ bool -diagnostic_path::get_first_event_in_a_function (unsigned *out_idx) const +path::get_first_event_in_a_function (unsigned *out_idx) const { const unsigned num = num_events (); for (unsigned i = 0; i < num; i++) { - const diagnostic_event &event = get_event (i); + const event &event = get_event (i); if (logical_locations::key logical_loc = event.get_logical_location ()) if (m_logical_loc_mgr.function_p (logical_loc)) { @@ -196,14 +197,14 @@ diagnostic_path::get_first_event_in_a_function (unsigned *out_idx) const function, or false if it is purely intraprocedural. */ bool -diagnostic_path::interprocedural_p () const +path::interprocedural_p () const { /* Ignore leading events that are outside of any function. */ unsigned first_fn_event_idx; if (!get_first_event_in_a_function (&first_fn_event_idx)) return false; - const diagnostic_event &first_fn_event = get_event (first_fn_event_idx); + const event &first_fn_event = get_event (first_fn_event_idx); int first_fn_stack_depth = first_fn_event.get_stack_depth (); const unsigned num = num_events (); @@ -220,10 +221,10 @@ diagnostic_path::interprocedural_p () const /* Print PATH by emitting a dummy "note" associated with it. */ DEBUG_FUNCTION -void debug (diagnostic_path *path) +void debug (path *p) { rich_location richloc (line_table, UNKNOWN_LOCATION); - richloc.set_path (path); + richloc.set_path (p); inform (&richloc, "debug path"); } diff --git a/gcc/diagnostic-path.h b/gcc/diagnostics/paths.h similarity index 82% rename from gcc/diagnostic-path.h rename to gcc/diagnostics/paths.h index 18b33271cca4..2de99b06dab1 100644 --- a/gcc/diagnostic-path.h +++ b/gcc/diagnostics/paths.h @@ -18,11 +18,11 @@ 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/>. */ -#ifndef GCC_DIAGNOSTIC_PATH_H -#define GCC_DIAGNOSTIC_PATH_H +#ifndef GCC_DIAGNOSTICS_PATHS_H +#define GCC_DIAGNOSTICS_PATHS_H #include "diagnostic.h" /* for ATTRIBUTE_GCC_DIAG. */ -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "diagnostics/logical-locations.h" namespace xml { class document; } @@ -31,12 +31,18 @@ class sarif_builder; class sarif_object; namespace diagnostics { -namespace digraphs { - class digraph; -} // namespace digraphs + namespace digraphs { + class digraph; + } // namespace digraphs + namespace logical_locations { + class manager; + } // logical_locations } //namespace diagnostics -/* A diagnostic_path is an optional additional piece of metadata associated +namespace diagnostics { +namespace paths { + +/* A diagnostics::paths::path is an optional additional piece of metadata associated with a diagnostic (via its rich_location). It describes a sequence of events predicted by the compiler that @@ -74,9 +80,9 @@ namespace digraphs { /* Abstract base classes, describing events within a path, and the paths themselves. */ -/* One event within a diagnostic_path. */ +/* One event within a path. */ -class diagnostic_event +class event { public: /* Enums for giving a sense of what this event means. @@ -148,7 +154,7 @@ class diagnostic_event enum property m_property; }; - virtual ~diagnostic_event () {} + virtual ~event () {} virtual location_t get_location () const = 0; @@ -160,7 +166,7 @@ class diagnostic_event virtual void print_desc (pretty_printer &pp) const = 0; /* Get a logical location for this event, or null if there is none. */ - virtual diagnostics::logical_locations::key get_logical_location () const = 0; + virtual logical_locations::key get_logical_location () const = 0; virtual meaning get_meaning () const = 0; @@ -168,7 +174,7 @@ class diagnostic_event next event (e.g. to highlight control flow). */ virtual bool connect_to_next_event_p () const = 0; - virtual diagnostic_thread_id_t get_thread_id () const = 0; + virtual thread_id_t get_thread_id () const = 0; /* Hook for SARIF output to allow for adding diagnostic-specific properties to the threadFlowLocation object's property bag. */ @@ -180,37 +186,35 @@ class diagnostic_event /* Hook for capturing state at this event, potentially for visualizing in HTML output, or for adding to SARIF. */ - virtual std::unique_ptr<diagnostics::digraphs::digraph> + virtual std::unique_ptr<digraphs::digraph> maybe_make_diagnostic_state_graph (bool debug) const; label_text get_desc (pretty_printer &ref_pp) const; }; /* Abstract base class representing a thread of execution within - a diagnostic_path. - Each diagnostic_event is associated with one thread. - Typically there is just one thread per diagnostic_path. */ + a diagnostics::paths::path. + Each event is associated with one thread. + Typically there is just one thread per diagnostics::paths::path. */ -class diagnostic_thread +class thread { public: - virtual ~diagnostic_thread () {} + virtual ~thread () {} virtual label_text get_name (bool can_colorize) const = 0; }; /* Abstract base class for getting at a sequence of events. */ -class diagnostic_path +class path { public: - using logical_location_manager = diagnostics::logical_locations::manager; - - virtual ~diagnostic_path () {} + virtual ~path () {} virtual unsigned num_events () const = 0; - virtual const diagnostic_event & get_event (int idx) const = 0; + virtual const event & get_event (int idx) const = 0; virtual unsigned num_threads () const = 0; - virtual const diagnostic_thread & - get_thread (diagnostic_thread_id_t) const = 0; + virtual const thread & + get_thread (thread_id_t) const = 0; /* Return true iff the two events are both within the same function, or both outside of any function. */ @@ -221,13 +225,13 @@ class diagnostic_path bool interprocedural_p () const; bool multithreaded_p () const; - const logical_location_manager &get_logical_location_manager () const + const logical_locations::manager &get_logical_location_manager () const { return m_logical_loc_mgr; } protected: - diagnostic_path (const logical_location_manager &logical_loc_mgr) + path (const logical_locations::manager &logical_loc_mgr) : m_logical_loc_mgr (logical_loc_mgr) { } @@ -235,12 +239,15 @@ protected: private: bool get_first_event_in_a_function (unsigned *out_idx) const; - const logical_location_manager &m_logical_loc_mgr; + const logical_locations::manager &m_logical_loc_mgr; }; +} // namespace paths +} // namespace diagnostics + /* Concrete subclasses of the above can be found in simple-diagnostic-path.h. */ -extern void debug (diagnostic_path *path); +extern void debug (diagnostics::paths::path *path); -#endif /* ! GCC_DIAGNOSTIC_PATH_H */ +#endif /* ! GCC_DIAGNOSTICS_PATHS_H */ diff --git a/gcc/selftest-diagnostic-path.cc b/gcc/diagnostics/selftest-paths.cc similarity index 87% rename from gcc/selftest-diagnostic-path.cc rename to gcc/diagnostics/selftest-paths.cc index c7b96f128232..beb795ddab78 100644 --- a/gcc/selftest-diagnostic-path.cc +++ b/gcc/diagnostics/selftest-paths.cc @@ -27,22 +27,24 @@ along with GCC; see the file COPYING3. If not see #include "demangle.h" #include "backtrace.h" #include "diagnostic.h" -#include "selftest-diagnostic-path.h" +#include "diagnostics/selftest-paths.h" #if CHECKING_P namespace selftest { -/* class test_diagnostic_path : public diagnostic_path. */ +using namespace diagnostics::paths; + +/* class test_diagnostic_path : public diagnostics::paths::path. */ test_diagnostic_path::test_diagnostic_path (pretty_printer *event_pp) -: diagnostic_path (m_test_logical_loc_mgr), +: path (m_test_logical_loc_mgr), m_event_pp (event_pp) { add_thread ("main"); } -/* Implementation of diagnostic_path::num_events vfunc for +/* Implementation of path::num_events vfunc for test_diagnostic_path: simply get the number of events in the vec. */ unsigned @@ -54,7 +56,7 @@ test_diagnostic_path::num_events () const /* Implementation of diagnostic_path::get_event vfunc for test_diagnostic_path: simply return the event in the vec. */ -const diagnostic_event & +const event & test_diagnostic_path::get_event (int idx) const { return *m_events[idx]; @@ -66,8 +68,8 @@ test_diagnostic_path::num_threads () const return m_threads.length (); } -const diagnostic_thread & -test_diagnostic_path::get_thread (diagnostic_thread_id_t idx) const +const thread & +test_diagnostic_path::get_thread (thread_id_t idx) const { return *m_threads[idx]; } @@ -80,7 +82,7 @@ test_diagnostic_path::same_function_p (int event_idx_a, == m_events[event_idx_b]->get_logical_location ()); } -diagnostic_thread_id_t +thread_id_t test_diagnostic_path::add_thread (const char *name) { m_threads.safe_push (new test_diagnostic_thread (name)); @@ -95,7 +97,7 @@ test_diagnostic_path::add_thread (const char *name) Return the id of the new event. */ -diagnostic_event_id_t +event_id_t test_diagnostic_path::add_event (location_t loc, const char *funcname, int depth, @@ -126,11 +128,11 @@ test_diagnostic_path::add_event (location_t loc, pp_clear_output_area (pp); - return diagnostic_event_id_t (m_events.length () - 1); + return event_id_t (m_events.length () - 1); } -diagnostic_event_id_t -test_diagnostic_path::add_thread_event (diagnostic_thread_id_t thread_id, +event_id_t +test_diagnostic_path::add_thread_event (thread_id_t thread_id, location_t loc, const char *funcname, int depth, @@ -163,7 +165,7 @@ test_diagnostic_path::add_thread_event (diagnostic_thread_id_t thread_id, pp_clear_output_area (pp); - return diagnostic_event_id_t (m_events.length () - 1); + return event_id_t (m_events.length () - 1); } /* Mark the most recent event on this path (which must exist) as being @@ -179,7 +181,7 @@ test_diagnostic_path::connect_to_next_event () void test_diagnostic_path::add_entry (const char *callee_name, int stack_depth, - diagnostic_thread_id_t thread_id) + thread_id_t thread_id) { add_thread_event (thread_id, UNKNOWN_LOCATION, callee_name, stack_depth, "entering %qs", callee_name); @@ -188,7 +190,7 @@ test_diagnostic_path::add_entry (const char *callee_name, void test_diagnostic_path::add_return (const char *caller_name, int stack_depth, - diagnostic_thread_id_t thread_id) + thread_id_t thread_id) { add_thread_event (thread_id, UNKNOWN_LOCATION, caller_name, stack_depth, "returning to %qs", caller_name); @@ -198,7 +200,7 @@ void test_diagnostic_path::add_call (const char *caller_name, int caller_stack_depth, const char *callee_name, - diagnostic_thread_id_t thread_id) + thread_id_t thread_id) { add_thread_event (thread_id, UNKNOWN_LOCATION, caller_name, caller_stack_depth, @@ -221,7 +223,7 @@ test_diagnostic_event (location_t loc, logical_location logical_loc, int depth, const char *desc, - diagnostic_thread_id_t thread_id) + thread_id_t thread_id) : m_loc (loc), m_logical_loc (logical_loc), m_depth (depth), m_desc (xstrdup (desc)), diff --git a/gcc/selftest-diagnostic-path.h b/gcc/diagnostics/selftest-paths.h similarity index 74% rename from gcc/selftest-diagnostic-path.h rename to gcc/diagnostics/selftest-paths.h index 00b6c64ffcfe..39b591473f19 100644 --- a/gcc/selftest-diagnostic-path.h +++ b/gcc/diagnostics/selftest-paths.h @@ -18,10 +18,10 @@ 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/>. */ -#ifndef GCC_SELFTEST_DIAGNOSTIC_PATH_H -#define GCC_SELFTEST_DIAGNOSTIC_PATH_H +#ifndef GCC_DIAGNOSTICS_SELFTEST_PATHS_H +#define GCC_DIAGNOSTICS_SELFTEST_PATHS_H -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostics/selftest-logical-locations.h" /* The selftest code should entirely disappear in a production @@ -38,16 +38,17 @@ namespace selftest { /* An implementation of diagnostic_event. */ -class test_diagnostic_event : public diagnostic_event +class test_diagnostic_event : public diagnostics::paths::event { public: using logical_location = diagnostics::logical_locations::key; + using thread_id_t = diagnostics::paths::thread_id_t; test_diagnostic_event (location_t loc, logical_location logical_loc, int depth, const char *desc, - diagnostic_thread_id_t thread_id = 0); + thread_id_t thread_id = 0); ~test_diagnostic_event (); location_t get_location () const final override { return m_loc; } @@ -68,7 +69,7 @@ class test_diagnostic_event : public diagnostic_event { return m_connected_to_next_event; } - diagnostic_thread_id_t get_thread_id () const final override + thread_id_t get_thread_id () const final override { return m_thread_id; } @@ -84,12 +85,12 @@ class test_diagnostic_event : public diagnostic_event int m_depth; char *m_desc; // has been formatted; doesn't get i18n-ed bool m_connected_to_next_event; - diagnostic_thread_id_t m_thread_id; + thread_id_t m_thread_id; }; -/* A simple implementation of diagnostic_thread. */ +/* A simple implementation of diagnostics::paths::thread. */ -class test_diagnostic_thread : public diagnostic_thread +class test_diagnostic_thread : public diagnostics::paths::thread { public: test_diagnostic_thread (const char *name) : m_name (name) {} @@ -102,33 +103,38 @@ private: const char *m_name; // has been i18n-ed and formatted }; -/* A concrete subclass of diagnostic_path for implementing selftests +/* A concrete subclass of diagnostics::paths::path for implementing selftests - a vector of test_diagnostic_event instances - adds member functions for adding test event - does no translation of its events - has no dependency on "tree". */ -class test_diagnostic_path : public diagnostic_path +class test_diagnostic_path : public diagnostics::paths::path { public: + using thread = diagnostics::paths::thread; + using thread_id_t = diagnostics::paths::thread_id_t; + using event = diagnostics::paths::event; + using event_id_t = diagnostics::paths::event_id_t; + test_diagnostic_path (pretty_printer *event_pp); unsigned num_events () const final override; - const diagnostic_event & get_event (int idx) const final override; + const event & get_event (int idx) const final override; unsigned num_threads () const final override; - const diagnostic_thread & - get_thread (diagnostic_thread_id_t) const final override; + const thread & + get_thread (thread_id_t) const final override; bool same_function_p (int event_idx_a, int event_idx_b) const final override; - diagnostic_thread_id_t add_thread (const char *name); + thread_id_t add_thread (const char *name); - diagnostic_event_id_t add_event (location_t loc, const char *funcname, int depth, - const char *fmt, ...) + event_id_t add_event (location_t loc, const char *funcname, int depth, + const char *fmt, ...) ATTRIBUTE_GCC_DIAG(5,6); - diagnostic_event_id_t - add_thread_event (diagnostic_thread_id_t thread_id, + event_id_t + add_thread_event (thread_id_t thread_id, location_t loc, const char *funcname, int depth, const char *fmt, ...) ATTRIBUTE_GCC_DIAG(6,7); @@ -136,13 +142,13 @@ class test_diagnostic_path : public diagnostic_path void connect_to_next_event (); void add_entry (const char *callee_name, int stack_depth, - diagnostic_thread_id_t thread_id = 0); + thread_id_t thread_id = 0); void add_return (const char *caller_name, int stack_depth, - diagnostic_thread_id_t thread_id = 0); + thread_id_t thread_id = 0); void add_call (const char *caller_name, int caller_stack_depth, const char *callee_name, - diagnostic_thread_id_t thread_id = 0); + thread_id_t thread_id = 0); private: diagnostics::logical_locations::key @@ -160,4 +166,4 @@ class test_diagnostic_path : public diagnostic_path #endif /* #if CHECKING_P */ -#endif /* ! GCC_SELFTEST_DIAGNOSTIC_PATH_H */ +#endif /* ! GCC_DIAGNOSTICS_SELFTEST_PATHS_H */ diff --git a/gcc/doc/analyzer.texi b/gcc/doc/analyzer.texi index 4efba4d157a0..87a2a40215e8 100644 --- a/gcc/doc/analyzer.texi +++ b/gcc/doc/analyzer.texi @@ -432,7 +432,7 @@ binop_svalue (mult_expr, initial_svalue(‘size_t’, decl_region(frame_region( @subsection Analyzer Paths We need to explain to the user what the problem is, and to persuade them -that there really is a problem. Hence having a @code{diagnostic_path} +that there really is a problem. Hence having a @code{diagnostics::paths::path} isn't just an incidental detail of the analyzer; it's required. Paths ought to be: @@ -491,7 +491,7 @@ and notes if it is infeasible. The above gives us a shortest feasible @code{exploded_path} through the @code{exploded_graph} (a list of @code{exploded_edge *}). We use this -@code{exploded_path} to build a @code{diagnostic_path} (a list of +@code{exploded_path} to build a @code{diagnostics::paths::path} (a list of @strong{events} for the diagnostic subsystem) - specifically a @code{checker_path}. diff --git a/gcc/libgdiagnostics.cc b/gcc/libgdiagnostics.cc index b1bd0147bae2..bc309c10c4e8 100644 --- a/gcc/libgdiagnostics.cc +++ b/gcc/libgdiagnostics.cc @@ -28,7 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic-color.h" #include "diagnostic-url.h" #include "diagnostics/metadata.h" -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "diagnostics/client-data-hooks.h" #include "diagnostic-format-sarif.h" #include "diagnostic-format-text.h" @@ -210,7 +210,7 @@ struct diagnostic_logical_location }; static diagnostic_event_id -as_diagnostic_event_id (diagnostic_event_id_t id) +as_diagnostic_event_id (diagnostics::paths::event_id_t id) { return id.zero_based (); } @@ -993,7 +993,7 @@ struct diagnostic_edge : public diagnostics::digraphs::edge } }; -class libgdiagnostics_path_event : public diagnostic_event +class libgdiagnostics_path_event : public diagnostics::paths::event { public: libgdiagnostics_path_event (const diagnostic_physical_location *physical_loc, @@ -1010,7 +1010,7 @@ public: gcc_assert (m_msg_buf); } - /* diagnostic_event vfunc implementations. */ + /* diagnostics::paths::event vfunc implementations. */ location_t get_location () const final override { @@ -1047,7 +1047,7 @@ public: return false; // TODO } - diagnostic_thread_id_t get_thread_id () const final override + diagnostics::paths::thread_id_t get_thread_id () const final override { return 0; } @@ -1090,7 +1090,7 @@ private: std::unique_ptr<diagnostic_message_buffer> m_msg_buf; }; -class libgdiagnostics_path_thread : public diagnostic_thread +class libgdiagnostics_path_thread : public diagnostics::paths::thread { public: libgdiagnostics_path_thread (const char *name) : m_name (name) {} @@ -1105,15 +1105,15 @@ private: /* This has to be a "struct" as it is exposed in the C API. */ -struct diagnostic_execution_path : public diagnostic_path +struct diagnostic_execution_path : public diagnostics::paths::path { - diagnostic_execution_path (const logical_location_manager &logical_loc_mgr) - : diagnostic_path (logical_loc_mgr), + diagnostic_execution_path (const diagnostics::logical_locations::manager &logical_loc_mgr) + : diagnostics::paths::path (logical_loc_mgr), m_thread ("") { } - diagnostic_event_id_t + diagnostics::paths::event_id_t add_event_va (const diagnostic_physical_location *physical_loc, const diagnostic_logical_location *logical_loc, unsigned stack_depth, @@ -1148,19 +1148,19 @@ struct diagnostic_execution_path : public diagnostic_path return m_events.size () - 1; } - /* diagnostic_path vfunc implementations. */ + /* diagnostics::paths::path vfunc implementations. */ unsigned num_events () const final override { return m_events.size (); } - const diagnostic_event & get_event (int idx) const final override + const diagnostics::paths::event & get_event (int idx) const final override { return *m_events[idx]; } unsigned num_threads () const final override { return 1; } - const diagnostic_thread & - get_thread (diagnostic_thread_id_t) const final override + const diagnostics::paths::thread & + get_thread (diagnostics::paths::thread_id_t) const final override { return m_thread; } @@ -2303,11 +2303,12 @@ diagnostic_execution_path_add_event (diagnostic_execution_path *path, va_list args; va_start (args, gmsgid); - diagnostic_event_id_t result = path->add_event_va (physical_loc, - logical_loc, - stack_depth, - nullptr, - gmsgid, &args); + diagnostics::paths::event_id_t result + = path->add_event_va (physical_loc, + logical_loc, + stack_depth, + nullptr, + gmsgid, &args); va_end (args); return as_diagnostic_event_id (result); @@ -2326,11 +2327,12 @@ diagnostic_execution_path_add_event_va (diagnostic_execution_path *path, FAIL_IF_NULL (path); FAIL_IF_NULL (gmsgid); - diagnostic_event_id_t result = path->add_event_va (physical_loc, - logical_loc, - stack_depth, - nullptr, - gmsgid, args); + diagnostics::paths::event_id_t result + = path->add_event_va (physical_loc, + logical_loc, + stack_depth, + nullptr, + gmsgid, args); return as_diagnostic_event_id (result); } diff --git a/gcc/libsarifreplay.cc b/gcc/libsarifreplay.cc index 815869886013..1e4a74f71b55 100644 --- a/gcc/libsarifreplay.cc +++ b/gcc/libsarifreplay.cc @@ -1865,7 +1865,7 @@ handle_thread_flow_location_object (const json::object &tflow_loc_obj, libgdiagnostics::graph state_graph; if (auto sarif_state_graph = maybe_get_property_bag_value<json::object> (tflow_loc_obj, - "gcc/diagnostic_event/state_graph")) + "gcc/diagnostics/paths/event/state_graph")) { enum status s = handle_graph_object (*sarif_state_graph, run_obj, state_graph); diff --git a/gcc/pretty-print-format-impl.h b/gcc/pretty-print-format-impl.h index 90692c80c7e8..2aded64d071a 100644 --- a/gcc/pretty-print-format-impl.h +++ b/gcc/pretty-print-format-impl.h @@ -22,7 +22,7 @@ along with GCC; see the file COPYING3. If not see #define GCC_PRETTY_PRINT_FORMAT_IMPL_H #include "pretty-print.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" /* A struct representing a pending item to be printed within pp_format. @@ -224,14 +224,14 @@ struct pp_token_end_url : public pp_token struct pp_token_event_id : public pp_token { - pp_token_event_id (diagnostic_event_id_t event_id) + pp_token_event_id (diagnostics::paths::event_id_t event_id) : pp_token (kind::event_id), m_event_id (event_id) { gcc_assert (event_id.known_p ()); } - diagnostic_event_id_t m_event_id; + diagnostics::paths::event_id_t m_event_id; }; template <> diff --git a/gcc/pretty-print.cc b/gcc/pretty-print.cc index 7e1b52ad7797..94d1dc65c09f 100644 --- a/gcc/pretty-print.cc +++ b/gcc/pretty-print.cc @@ -28,7 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "pretty-print-markup.h" #include "pretty-print-urlifier.h" #include "diagnostic-color.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "diagnostic-highlight-colors.h" #include "auto-obstack.h" #include "selftest.h" @@ -3413,8 +3413,8 @@ test_pp_format () "foo", 0x12345678); /* Verify "%@". */ { - diagnostic_event_id_t first (2); - diagnostic_event_id_t second (7); + diagnostics::paths::event_id_t first (2); + diagnostics::paths::event_id_t second (7); ASSERT_PP_FORMAT_2 ("first `free' at (3); second `free' at (8)", "first %<free%> at %@; second %<free%> at %@", diff --git a/gcc/selftest-run-tests.cc b/gcc/selftest-run-tests.cc index 81434cd6ddc0..ec34cb774c7e 100644 --- a/gcc/selftest-run-tests.cc +++ b/gcc/selftest-run-tests.cc @@ -105,14 +105,14 @@ selftest::run_tests () diagnostics_digraphs_cc_tests (); diagnostics_output_spec_cc_tests (); diagnostics_state_graphs_cc_tests (); + diagnostics_lazy_paths_cc_tests (); + diagnostics_paths_output_cc_tests (); edit_context_cc_tests (); fold_const_cc_tests (); spellcheck_cc_tests (); spellcheck_tree_cc_tests (); tree_cfg_cc_tests (); - diagnostic_path_output_cc_tests (); simple_diagnostic_path_cc_tests (); - lazy_diagnostic_path_cc_tests (); attribs_cc_tests (); path_coverage_cc_tests (); diff --git a/gcc/selftest.h b/gcc/selftest.h index b125a2384b08..9ca67d9e42ea 100644 --- a/gcc/selftest.h +++ b/gcc/selftest.h @@ -224,10 +224,11 @@ extern void dbgcnt_cc_tests (); extern void diagnostic_color_cc_tests (); extern void diagnostic_format_html_cc_tests (); extern void diagnostic_format_sarif_cc_tests (); -extern void diagnostic_path_output_cc_tests (); extern void diagnostic_show_locus_cc_tests (); extern void diagnostics_digraphs_cc_tests (); +extern void diagnostics_lazy_paths_cc_tests (); extern void diagnostics_output_spec_cc_tests (); +extern void diagnostics_paths_output_cc_tests (); extern void diagnostics_selftest_logical_locations_cc_tests (); extern void diagnostics_state_graphs_cc_tests (); extern void digraph_cc_tests (); @@ -249,7 +250,6 @@ extern void input_cc_tests (); extern void ipa_modref_tree_cc_tests (); extern void json_cc_tests (); extern void json_parser_cc_tests (); -extern void lazy_diagnostic_path_cc_tests (); extern void opt_suggestions_cc_tests (); extern void optinfo_emit_json_cc_tests (); extern void opts_cc_tests (); diff --git a/gcc/simple-diagnostic-path.cc b/gcc/simple-diagnostic-path.cc index d64f7b6647ac..2e112b5fffcc 100644 --- a/gcc/simple-diagnostic-path.cc +++ b/gcc/simple-diagnostic-path.cc @@ -1,4 +1,4 @@ -/* Concrete classes for implementing diagnostic paths. +/* Concrete classes for implementing diagnostic paths, using tree. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com> @@ -32,29 +32,31 @@ along with GCC; see the file COPYING3. If not see #include "simple-diagnostic-path.h" #include "selftest.h" -/* class simple_diagnostic_path : public diagnostic_path. */ +using namespace diagnostics::paths; + +/* class simple_diagnostic_path : public diagnostics::paths::path. */ simple_diagnostic_path:: simple_diagnostic_path (const tree_logical_location_manager &logical_loc_mgr, pretty_printer *event_pp) -: diagnostic_path (logical_loc_mgr), +: path (logical_loc_mgr), m_event_pp (event_pp), m_localize_events (true) { add_thread ("main"); } -/* Implementation of diagnostic_path::get_event vfunc for +/* Implementation of path::get_event vfunc for simple_diagnostic_path: simply return the event in the vec. */ -const diagnostic_event & +const event & simple_diagnostic_path::get_event (int idx) const { return *m_events[idx]; } -const diagnostic_thread & -simple_diagnostic_path::get_thread (diagnostic_thread_id_t idx) const +const thread & +simple_diagnostic_path::get_thread (thread_id_t idx) const { return *m_threads[idx]; } @@ -67,7 +69,7 @@ simple_diagnostic_path::same_function_p (int event_idx_a, == m_events[event_idx_b]->get_fndecl ()); } -diagnostic_thread_id_t +thread_id_t simple_diagnostic_path::add_thread (const char *name) { m_threads.safe_push (new simple_diagnostic_thread (name)); @@ -82,7 +84,7 @@ simple_diagnostic_path::add_thread (const char *name) Return the id of the new event. */ -diagnostic_event_id_t +event_id_t simple_diagnostic_path::add_event (location_t loc, tree fndecl, int depth, const char *fmt, ...) { @@ -108,11 +110,11 @@ simple_diagnostic_path::add_event (location_t loc, tree fndecl, int depth, pp_clear_output_area (pp); - return diagnostic_event_id_t (m_events.length () - 1); + return event_id_t (m_events.length () - 1); } -diagnostic_event_id_t -simple_diagnostic_path::add_thread_event (diagnostic_thread_id_t thread_id, +event_id_t +simple_diagnostic_path::add_thread_event (thread_id_t thread_id, location_t loc, tree fndecl, int depth, @@ -141,7 +143,7 @@ simple_diagnostic_path::add_thread_event (diagnostic_thread_id_t thread_id, pp_clear_output_area (pp); - return diagnostic_event_id_t (m_events.length () - 1); + return event_id_t (m_events.length () - 1); } /* Mark the most recent event on this path (which must exist) as being @@ -163,7 +165,7 @@ simple_diagnostic_event (location_t loc, tree fndecl, int depth, const char *desc, - diagnostic_thread_id_t thread_id) + thread_id_t thread_id) : m_loc (loc), m_fndecl (fndecl), m_logical_loc (tree_logical_location_manager::key_from_tree (fndecl)), m_depth (depth), m_desc (xstrdup (desc)), diff --git a/gcc/simple-diagnostic-path.h b/gcc/simple-diagnostic-path.h index 1f9dfd8476db..d549c247c2f3 100644 --- a/gcc/simple-diagnostic-path.h +++ b/gcc/simple-diagnostic-path.h @@ -1,4 +1,4 @@ -/* Concrete classes for implementing diagnostic paths. +/* Concrete classes for implementing diagnostic paths, using tree. Copyright (C) 2019-2025 Free Software Foundation, Inc. Contributed by David Malcolm <dmalc...@redhat.com> @@ -21,20 +21,23 @@ along with GCC; see the file COPYING3. If not see #ifndef GCC_SIMPLE_DIAGNOSTIC_PATH_H #define GCC_SIMPLE_DIAGNOSTIC_PATH_H -#include "diagnostic-path.h" +#include "diagnostics/paths.h" #include "tree-logical-location.h" /* Concrete subclasses of the abstract base classes declared in diagnostic-path.h. */ -/* A simple implementation of diagnostic_event. */ +/* A simple implementation of diagnostic event. + This uses "tree" and so is not in "namespace diagnostics". */ -class simple_diagnostic_event : public diagnostic_event +class simple_diagnostic_event : public diagnostics::paths::event { public: + using thread_id_t = diagnostics::paths::thread_id_t; + simple_diagnostic_event (location_t loc, tree fndecl, int depth, const char *desc, - diagnostic_thread_id_t thread_id = 0); + thread_id_t thread_id = 0); ~simple_diagnostic_event (); location_t get_location () const final override { return m_loc; } @@ -53,7 +56,7 @@ class simple_diagnostic_event : public diagnostic_event { return m_connected_to_next_event; } - diagnostic_thread_id_t get_thread_id () const final override + thread_id_t get_thread_id () const final override { return m_thread_id; } @@ -72,12 +75,12 @@ class simple_diagnostic_event : public diagnostic_event int m_depth; char *m_desc; // has been i18n-ed and formatted bool m_connected_to_next_event; - diagnostic_thread_id_t m_thread_id; + thread_id_t m_thread_id; }; -/* A simple implementation of diagnostic_thread. */ +/* A simple implementation of diagnostics::paths::thread. */ -class simple_diagnostic_thread : public diagnostic_thread +class simple_diagnostic_thread : public diagnostics::paths::thread { public: simple_diagnostic_thread (const char *name) : m_name (name) {} @@ -93,28 +96,33 @@ private: /* A simple implementation of diagnostic_path, as a vector of simple_diagnostic_event instances. */ -class simple_diagnostic_path : public diagnostic_path +class simple_diagnostic_path : public diagnostics::paths::path { public: + using thread = diagnostics::paths::thread; + using thread_id_t = diagnostics::paths::thread_id_t; + using event = diagnostics::paths::event; + using event_id_t = diagnostics::paths::event_id_t; + simple_diagnostic_path (const tree_logical_location_manager &logical_loc_mgr, pretty_printer *event_pp); unsigned num_events () const final override { return m_events.length (); } - const diagnostic_event & get_event (int idx) const final override; + const event & get_event (int idx) const final override; unsigned num_threads () const final override { return m_threads.length (); } - const diagnostic_thread & - get_thread (diagnostic_thread_id_t) const final override; + const thread & + get_thread (thread_id_t) const final override; bool same_function_p (int event_idx_a, int event_idx_b) const final override; - diagnostic_thread_id_t add_thread (const char *name); + thread_id_t add_thread (const char *name); - diagnostic_event_id_t add_event (location_t loc, tree fndecl, int depth, - const char *fmt, ...) + event_id_t add_event (location_t loc, tree fndecl, int depth, + const char *fmt, ...) ATTRIBUTE_GCC_DIAG(5,6); - diagnostic_event_id_t - add_thread_event (diagnostic_thread_id_t thread_id, + event_id_t + add_thread_event (thread_id_t thread_id, location_t loc, tree fndecl, int depth, const char *fmt, ...) ATTRIBUTE_GCC_DIAG(6,7); diff --git a/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc b/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc index fa2f2fa01610..c101c45b541a 100644 --- a/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc +++ b/gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.cc @@ -16,7 +16,7 @@ #include "gimple.h" #include "gimple-iterator.h" #include "gimple-walk.h" -#include "diagnostic-event-id.h" +#include "diagnostics/event-id.h" #include "analyzer/common.h" #include "analyzer/analyzer-logging.h" #include "json.h" @@ -120,20 +120,22 @@ public: return false; } - diagnostic_event::meaning + diagnostics::paths::event::meaning get_meaning_for_state_change (const evdesc::state_change &change) const final override { + using event = diagnostics::paths::event; + if (change.is_global_p ()) { if (change.m_new_state == m_sm.m_released_gil) - return diagnostic_event::meaning (diagnostic_event::verb::release, - diagnostic_event::noun::lock); + return event::meaning (event::verb::release, + event::noun::lock); else if (change.m_new_state == m_sm.get_start_state ()) - return diagnostic_event::meaning (diagnostic_event::verb::acquire, - diagnostic_event::noun::lock); + return event::meaning (event::verb::acquire, + event::noun::lock); } - return diagnostic_event::meaning (); + return event::meaning (); } protected: gil_diagnostic (const gil_state_machine &sm) : m_sm (sm) diff --git a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.cc b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.cc index babfc3b158bc..6d3f6f88c021 100644 --- a/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.cc +++ b/gcc/testsuite/gcc.dg/plugin/diagnostic_plugin_test_paths.cc @@ -32,7 +32,6 @@ #include "intl.h" #include "plugin-version.h" #include "diagnostic.h" -#include "diagnostic-path.h" #include "diagnostics/metadata.h" #include "context.h" #include "print-tree.h" @@ -223,7 +222,7 @@ class test_diagnostic_path : public simple_diagnostic_path diagnostic_event_id_t add_event_2 (event_location_t evloc, int stack_depth, const char *desc, - diagnostic_thread_id_t thread_id = 0) + diagnostics::paths::thread_id_t thread_id = 0) { gcc_assert (evloc.m_fun); return add_thread_event (thread_id, evloc.m_loc, evloc.m_fun->decl, @@ -232,7 +231,7 @@ class test_diagnostic_path : public simple_diagnostic_path diagnostic_event_id_t add_event_2_with_event_id (event_location_t evloc, int stack_depth, const char *fmt, - diagnostic_thread_id_t thread_id, + diagnostics::paths::thread_id_t thread_id, diagnostic_event_id_t event_id) { gcc_assert (evloc.m_fun); @@ -242,7 +241,7 @@ class test_diagnostic_path : public simple_diagnostic_path } void add_entry (event_location_t evloc, int stack_depth, const char *funcname, - diagnostic_thread_id_t thread_id = 0) + diagnostics::paths::thread_id_t thread_id = 0) { gcc_assert (evloc.m_fun); add_thread_event (thread_id, evloc.m_loc, evloc.m_fun->decl, stack_depth, @@ -502,8 +501,8 @@ example_4 () gcc_rich_location richloc (call_to_acquire_lock_a_in_bar.m_loc); test_diagnostic_path path (global_dc->get_reference_printer ()); - diagnostic_thread_id_t thread_1 = path.add_thread ("Thread 1"); - diagnostic_thread_id_t thread_2 = path.add_thread ("Thread 2"); + diagnostics::paths::thread_id_t thread_1 = path.add_thread ("Thread 1"); + diagnostics::paths::thread_id_t thread_2 = path.add_thread ("Thread 2"); path.add_entry (entry_to_foo, 0, "foo", thread_1); diagnostic_event_id_t event_a_acquired = path.add_event_2 (call_to_acquire_lock_a_in_foo, 1, diff --git a/gcc/testsuite/gcc.dg/sarif-output/include-chain-2.h b/gcc/testsuite/gcc.dg/sarif-output/include-chain-2.h index 382ac026fe04..f60fb331d470 100644 --- a/gcc/testsuite/gcc.dg/sarif-output/include-chain-2.h +++ b/gcc/testsuite/gcc.dg/sarif-output/include-chain-2.h @@ -1,4 +1,4 @@ -/* Generate a warning with a diagnostic_path within a header. */ +/* Generate a warning with a diagnostic path within a header. */ void test (void *ptr) { diff --git a/gcc/testsuite/lib/sarif.py b/gcc/testsuite/lib/sarif.py index 06d05c027a43..d75a87ec73a2 100644 --- a/gcc/testsuite/lib/sarif.py +++ b/gcc/testsuite/lib/sarif.py @@ -30,7 +30,7 @@ def get_result_by_index(sarif, idx): return results[idx] def get_state_graph(events, event_idx): - graph = events[event_idx]['properties']['gcc/diagnostic_event/state_graph'] + graph = events[event_idx]['properties']['gcc/diagnostics/paths/event/state_graph'] if 0: print(graph) assert graph is not None diff --git a/libcpp/include/rich-location.h b/libcpp/include/rich-location.h index fe9868de4253..caa976929472 100644 --- a/libcpp/include/rich-location.h +++ b/libcpp/include/rich-location.h @@ -213,7 +213,7 @@ semi_embedded_vec<T, NUM_EMBEDDED>::truncate (int len) } class fixit_hint; -class diagnostic_path; +namespace diagnostics { namespace paths { class path; }} /* A "rich" source code location, for use when printing diagnostics. A rich_location has one or more carets&ranges, where the carets @@ -520,8 +520,8 @@ class rich_location } /* An optional path through the code. */ - const diagnostic_path *get_path () const { return m_path; } - void set_path (const diagnostic_path *path) { m_path = path; } + const diagnostics::paths::path *get_path () const { return m_path; } + void set_path (const diagnostics::paths::path *path) { m_path = path; } /* A flag for hinting that the diagnostic involves character encoding issues, and thus that it will be helpful to the user if we show some @@ -567,7 +567,7 @@ protected: static const int MAX_STATIC_FIXIT_HINTS = 2; semi_embedded_vec <fixit_hint *, MAX_STATIC_FIXIT_HINTS> m_fixit_hints; - const diagnostic_path *m_path; + const diagnostics::paths::path *m_path; }; /* Abstract base class for labelling a range within a rich_location -- 2.26.3