From: David Malcolm Date: Tue, 30 Sep 2025 21:23:31 +0000 (-0400) Subject: diagnostics: simplifying output-spec.cc X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=233d3121c3a64e1e39590f5bd545469b05b9024d;p=thirdparty%2Fgcc.git diagnostics: simplifying output-spec.cc No functional change intended. gcc/ChangeLog: * diagnostics/output-spec.cc: Rename "parsed_arg" to "scheme_and_kvs" throughout. Rename "unparsed_arg" to "unparsed_spec" throughout, and make a member of output_spec::context rather than passing it around. * diagnostics/output-spec.h: Likewise. * libgdiagnostics.cc: Likewise. * opts-diagnostic.cc: Likewise. Signed-off-by: David Malcolm --- diff --git a/gcc/diagnostics/output-spec.cc b/gcc/diagnostics/output-spec.cc index 8ec638a83bf..33a5f0d317e 100644 --- a/gcc/diagnostics/output-spec.cc +++ b/gcc/diagnostics/output-spec.cc @@ -75,13 +75,11 @@ public: virtual std::unique_ptr make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const = 0; + const scheme_name_and_params &scheme_and_kvs) const = 0; protected: bool parse_bool_value (const context &ctxt, - const char *unparsed_arg, const std::string &key, const std::string &value, bool &out) const @@ -101,7 +99,7 @@ public: ctxt.report_error ("%<%s%s%>:" " unexpected value %qs for key %qs; expected %qs or %qs", - ctxt.get_option_name (), unparsed_arg, + ctxt.get_option_name (), ctxt.get_unparsed_spec (), value.c_str (), key.c_str (), "yes", "no"); @@ -112,7 +110,6 @@ public: template bool parse_enum_value (const context &ctxt, - const char *unparsed_arg, const std::string &key, const std::string &value, const std::array, NumValues> &value_names, @@ -132,7 +129,7 @@ public: ctxt.report_error ("%<%s%s%>:" " unexpected value %qs for key %qs; known values: %e", - ctxt.get_option_name (), unparsed_arg, + ctxt.get_option_name (), ctxt.get_unparsed_spec (), value.c_str (), key.c_str (), &e); @@ -148,8 +145,7 @@ public: std::unique_ptr make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg); + const scheme_name_and_params &scheme_and_kvs); const scheme_handler *get_scheme_handler (const std::string &scheme_name); @@ -165,8 +161,7 @@ public: std::unique_ptr make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const final override; + const scheme_name_and_params &scheme_and_kvs) const final override; }; class sarif_scheme_handler : public output_factory::scheme_handler @@ -177,8 +172,7 @@ public: std::unique_ptr make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const final override; + const scheme_name_and_params &scheme_and_kvs) const final override; private: static std::unique_ptr @@ -193,8 +187,7 @@ public: std::unique_ptr make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const final override; + const scheme_name_and_params &scheme_and_kvs) const final override; }; /* struct context. */ @@ -209,8 +202,7 @@ context::report_error (const char *gmsgid, ...) const } void -context::report_unknown_key (const char *unparsed_arg, - const std::string &key, +context::report_unknown_key (const std::string &key, const std::string &scheme_name, auto_vec &known_keys) const { @@ -218,13 +210,12 @@ context::report_unknown_key (const char *unparsed_arg, report_error ("%<%s%s%>:" " unknown key %qs for format %qs; known keys: %e", - get_option_name (), unparsed_arg, + get_option_name (), get_unparsed_spec (), key.c_str (), scheme_name.c_str (), &e); } void -context::report_missing_key (const char *unparsed_arg, - const std::string &key, +context::report_missing_key (const std::string &key, const std::string &scheme_name, const char *metavar) const { @@ -232,7 +223,7 @@ context::report_missing_key (const char *unparsed_arg, ("%<%s%s%>:" " missing required key %qs for format %qs;" " try %<%s%s:%s=%s%>", - get_option_name (), unparsed_arg, + get_option_name (), get_unparsed_spec (), key.c_str (), scheme_name.c_str (), get_option_name (), scheme_name.c_str (), key.c_str (), metavar); } @@ -250,12 +241,13 @@ context::open_output_file (label_text &&filename) const } static std::unique_ptr -parse (const context &ctxt, const char *unparsed_arg) +parse (const context &ctxt) { scheme_name_and_params result; - if (const char *const colon = strchr (unparsed_arg, ':')) + const char *const unparsed_spec = ctxt.get_unparsed_spec (); + if (const char *const colon = strchr (unparsed_spec, ':')) { - result.m_scheme_name = std::string (unparsed_arg, colon - unparsed_arg); + result.m_scheme_name = std::string (unparsed_spec, colon - unparsed_spec); /* Expect zero of more of KEY=VALUE,KEY=VALUE, etc .*/ const char *iter = colon + 1; const char *last_separator = ":"; @@ -271,7 +263,7 @@ parse (const context &ctxt, const char *unparsed_arg) " expected KEY=VALUE-style parameter for format %qs" " after %qs;" " got %qs", - ctxt.get_option_name (), unparsed_arg, + ctxt.get_option_name (), ctxt.get_unparsed_spec (), result.m_scheme_name.c_str (), last_separator, iter); @@ -295,20 +287,19 @@ parse (const context &ctxt, const char *unparsed_arg) } } else - result.m_scheme_name = unparsed_arg; + result.m_scheme_name = unparsed_spec; return std::make_unique (std::move (result)); } std::unique_ptr -context::parse_and_make_sink (const char *unparsed_arg, - diagnostics::context &dc) +context::parse_and_make_sink (diagnostics::context &dc) { - auto parsed_arg = parse (*this, unparsed_arg); + auto parsed_arg = parse (*this); if (!parsed_arg) return nullptr; output_factory factory; - return factory.make_sink (*this, dc, unparsed_arg, *parsed_arg); + return factory.make_sink (*this, dc, *parsed_arg); } /* class output_factory::scheme_handler. */ @@ -334,10 +325,9 @@ output_factory::get_scheme_handler (const std::string &scheme_name) std::unique_ptr output_factory::make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) + const scheme_name_and_params &scheme_and_kvs) { - auto scheme_handler = get_scheme_handler (parsed_arg.m_scheme_name); + auto scheme_handler = get_scheme_handler (scheme_and_kvs.m_scheme_name); if (!scheme_handler) { auto_vec strings; @@ -346,12 +336,12 @@ output_factory::make_sink (const context &ctxt, pp_markup::comma_separated_quoted_strings e (strings); ctxt.report_error ("%<%s%s%>:" " unrecognized format %qs; known formats: %e", - ctxt.get_option_name (), unparsed_arg, - parsed_arg.m_scheme_name.c_str (), &e); + ctxt.get_option_name (), ctxt.get_unparsed_spec (), + scheme_and_kvs.m_scheme_name.c_str (), &e); return nullptr; } - return scheme_handler->make_sink (ctxt, dc, unparsed_arg, parsed_arg); + return scheme_handler->make_sink (ctxt, dc, scheme_and_kvs); } /* class text_scheme_handler : public output_factory::scheme_handler. */ @@ -359,40 +349,39 @@ output_factory::make_sink (const context &ctxt, std::unique_ptr text_scheme_handler::make_sink (const context &ctxt, diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const + const scheme_name_and_params &scheme_and_kvs) const { bool show_color = pp_show_color (dc.get_reference_printer ()); bool show_nesting = true; bool show_locations_in_nesting = true; bool show_levels = false; - for (auto& iter : parsed_arg.m_kvs) + for (auto& iter : scheme_and_kvs.m_kvs) { const std::string &key = iter.first; const std::string &value = iter.second; if (key == "color") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, show_color)) + if (!parse_bool_value (ctxt, key, value, show_color)) return nullptr; continue; } if (key == "show-nesting") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, show_nesting)) return nullptr; continue; } if (key == "show-nesting-locations") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, show_locations_in_nesting)) return nullptr; continue; } if (key == "show-nesting-levels") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, show_levels)) + if (!parse_bool_value (ctxt, key, value, show_levels)) return nullptr; continue; } @@ -403,8 +392,7 @@ text_scheme_handler::make_sink (const context &ctxt, known_keys.safe_push ("show-nesting"); known_keys.safe_push ("show-nesting-locations"); known_keys.safe_push ("show-nesting-levels"); - ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), - known_keys); + ctxt.report_unknown_key (key, get_scheme_name (), known_keys); return nullptr; } @@ -418,16 +406,16 @@ text_scheme_handler::make_sink (const context &ctxt, /* class sarif_scheme_handler : public output_factory::scheme_handler. */ std::unique_ptr -sarif_scheme_handler::make_sink (const context &ctxt, - diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const +sarif_scheme_handler:: +make_sink (const context &ctxt, + diagnostics::context &dc, + const scheme_name_and_params &scheme_and_kvs) const { label_text filename; enum sarif_serialization_kind serialization_kind = sarif_serialization_kind::json; sarif_generation_options sarif_gen_opts; - for (auto& iter : parsed_arg.m_kvs) + for (auto& iter : scheme_and_kvs.m_kvs) { const std::string &key = iter.first; const std::string &value = iter.second; @@ -443,7 +431,7 @@ sarif_scheme_handler::make_sink (const context &ctxt, {{{"json", sarif_serialization_kind::json}}}; if (!parse_enum_value - (ctxt, unparsed_arg, + (ctxt, key, value, value_names, serialization_kind)) @@ -458,7 +446,7 @@ sarif_scheme_handler::make_sink (const context &ctxt, {"2.2-prerelease", sarif_version::v2_2_prerelease_2024_08_08}}}; if (!parse_enum_value - (ctxt, unparsed_arg, + (ctxt, key, value, value_names, sarif_gen_opts.m_version)) @@ -467,7 +455,7 @@ sarif_scheme_handler::make_sink (const context &ctxt, } if (key == "state-graphs") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, sarif_gen_opts.m_state_graph)) return nullptr; continue; @@ -479,8 +467,7 @@ sarif_scheme_handler::make_sink (const context &ctxt, known_keys.safe_push ("serialization"); known_keys.safe_push ("state-graphs"); known_keys.safe_push ("version"); - ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), - known_keys); + ctxt.report_unknown_key (key, get_scheme_name (), known_keys); return nullptr; } @@ -493,8 +480,7 @@ sarif_scheme_handler::make_sink (const context &ctxt, const char *basename = ctxt.get_base_filename (); if (!basename) { - ctxt.report_missing_key (unparsed_arg, - "file", + ctxt.report_missing_key ("file", get_scheme_name (), "FILENAME"); return nullptr; @@ -535,20 +521,20 @@ make_sarif_serialization_object (enum sarif_serialization_kind kind) /* class html_scheme_handler : public output_factory::scheme_handler. */ std::unique_ptr -html_scheme_handler::make_sink (const context &ctxt, - diagnostics::context &dc, - const char *unparsed_arg, - const scheme_name_and_params &parsed_arg) const +html_scheme_handler:: +make_sink (const context &ctxt, + diagnostics::context &dc, + const scheme_name_and_params &scheme_and_kvs) const { label_text filename; html_generation_options html_gen_opts; - for (auto& iter : parsed_arg.m_kvs) + for (auto& iter : scheme_and_kvs.m_kvs) { const std::string &key = iter.first; const std::string &value = iter.second; if (key == "css") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, html_gen_opts.m_css)) return nullptr; continue; @@ -560,28 +546,28 @@ html_scheme_handler::make_sink (const context &ctxt, } if (key == "javascript") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, html_gen_opts.m_javascript)) return nullptr; continue; } if (key == "show-state-diagrams") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, html_gen_opts.m_show_state_diagrams)) return nullptr; continue; } if (key == "show-state-diagrams-dot-src") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, html_gen_opts.m_show_state_diagrams_dot_src)) return nullptr; continue; } if (key == "show-state-diagrams-sarif") { - if (!parse_bool_value (ctxt, unparsed_arg, key, value, + if (!parse_bool_value (ctxt, key, value, html_gen_opts.m_show_state_diagrams_sarif)) return nullptr; continue; @@ -595,8 +581,7 @@ html_scheme_handler::make_sink (const context &ctxt, known_keys.safe_push ("show-state-diagrams"); known_keys.safe_push ("show-state-diagram-dot-src"); known_keys.safe_push ("show-state-diagram-sarif"); - ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), - known_keys); + ctxt.report_unknown_key (key, get_scheme_name (), known_keys); return nullptr; } @@ -609,8 +594,7 @@ html_scheme_handler::make_sink (const context &ctxt, const char *basename = ctxt.get_base_filename (); if (!basename) { - ctxt.report_missing_key (unparsed_arg, - "file", + ctxt.report_missing_key ("file", get_scheme_name (), "FILENAME"); return nullptr; @@ -668,12 +652,14 @@ struct parser_test test_spec_context (diagnostics::context &dc, line_maps *location_mgr, location_t loc, - const char *option_name) + const char *option_name, + const char *unparsed_arg) : dc_spec_context (dc, location_mgr, location_mgr, loc, - option_name) + option_name, + unparsed_arg) { } @@ -684,18 +670,18 @@ struct parser_test } }; - parser_test () + parser_test (const char *unparsed_spec) : m_dc (), - m_ctxt (m_dc, line_table, UNKNOWN_LOCATION, "-fOPTION="), + m_ctxt (m_dc, line_table, UNKNOWN_LOCATION, "-fOPTION=", unparsed_spec), m_fmt (m_dc.get_sink (0)) { pp_buffer (m_fmt.get_printer ())->m_flush_p = false; } std::unique_ptr - parse (const char *unparsed_arg) + parse () { - return diagnostics::output_spec::parse (m_ctxt, unparsed_arg); + return diagnostics::output_spec::parse (m_ctxt); } bool execution_failed_p () const @@ -725,8 +711,8 @@ test_output_arg_parsing () /* Minimal correct example. */ { - parser_test pt; - auto result = pt.parse ("foo"); + parser_test pt ("foo"); + auto result = pt.parse (); ASSERT_EQ (result->m_scheme_name, "foo"); ASSERT_EQ (result->m_kvs.size (), 0); ASSERT_FALSE (pt.execution_failed_p ()); @@ -734,8 +720,8 @@ test_output_arg_parsing () /* Stray trailing colon with no key/value pairs. */ { - parser_test pt; - auto result = pt.parse ("foo:"); + parser_test pt ("foo:"); + auto result = pt.parse (); ASSERT_EQ (result, nullptr); ASSERT_TRUE (pt.execution_failed_p ()); ASSERT_STREQ (pt.get_diagnostic_text (), @@ -747,8 +733,8 @@ test_output_arg_parsing () /* No key before '='. */ { - parser_test pt; - auto result = pt.parse ("foo:="); + parser_test pt ("foo:="); + auto result = pt.parse (); ASSERT_EQ (result, nullptr); ASSERT_TRUE (pt.execution_failed_p ()); ASSERT_STREQ (pt.get_diagnostic_text (), @@ -760,8 +746,8 @@ test_output_arg_parsing () /* No value for key. */ { - parser_test pt; - auto result = pt.parse ("foo:key,"); + parser_test pt ("foo:key,"); + auto result = pt.parse (); ASSERT_EQ (result, nullptr); ASSERT_TRUE (pt.execution_failed_p ()); ASSERT_STREQ (pt.get_diagnostic_text (), @@ -773,8 +759,8 @@ test_output_arg_parsing () /* Correct example, with one key/value pair. */ { - parser_test pt; - auto result = pt.parse ("foo:key=value"); + parser_test pt ("foo:key=value"); + auto result = pt.parse (); ASSERT_EQ (result->m_scheme_name, "foo"); ASSERT_EQ (result->m_kvs.size (), 1); ASSERT_EQ (result->m_kvs[0].first, "key"); @@ -784,8 +770,8 @@ test_output_arg_parsing () /* Stray trailing comma. */ { - parser_test pt; - auto result = pt.parse ("foo:key=value,"); + parser_test pt ("foo:key=value,"); + auto result = pt.parse (); ASSERT_EQ (result, nullptr); ASSERT_TRUE (pt.execution_failed_p ()); ASSERT_STREQ (pt.get_diagnostic_text (), @@ -797,8 +783,8 @@ test_output_arg_parsing () /* Correct example, with two key/value pairs. */ { - parser_test pt; - auto result = pt.parse ("foo:color=red,shape=circle"); + parser_test pt ("foo:color=red,shape=circle"); + auto result = pt.parse (); ASSERT_EQ (result->m_scheme_name, "foo"); ASSERT_EQ (result->m_kvs.size (), 2); ASSERT_EQ (result->m_kvs[0].first, "color"); diff --git a/gcc/diagnostics/output-spec.h b/gcc/diagnostics/output-spec.h index c84d237de49..e24002bc8ae 100644 --- a/gcc/diagnostics/output-spec.h +++ b/gcc/diagnostics/output-spec.h @@ -34,22 +34,19 @@ class context { public: std::unique_ptr - parse_and_make_sink (const char *, - diagnostics::context &dc); + parse_and_make_sink (diagnostics::context &dc); void report_error (const char *gmsgid, ...) const ATTRIBUTE_GCC_DIAG(2,3); void - report_unknown_key (const char *unparsed_arg, - const std::string &key, + report_unknown_key (const std::string &key, const std::string &scheme_name, auto_vec &known_keys) const; void - report_missing_key (const char *unparsed_arg, - const std::string &key, + report_missing_key (const std::string &key, const std::string &scheme_name, const char *metavar) const; @@ -59,6 +56,9 @@ class context const char * get_option_name () const { return m_option_name; } + const char * + get_unparsed_spec () const { return m_unparsed_spec; } + line_maps * get_affected_location_mgr () const { return m_affected_location_mgr; } @@ -72,13 +72,20 @@ class context protected: context (const char *option_name, + const char *unparsed_spec, line_maps *affected_location_mgr) : m_option_name (option_name), + m_unparsed_spec (unparsed_spec), m_affected_location_mgr (affected_location_mgr) { } + // e.g. "-fdiagnostics-add-output=" const char *m_option_name; + + // e.g. "scheme:foo=bar,key=value" + const char *m_unparsed_spec; + line_maps *m_affected_location_mgr; }; @@ -91,8 +98,9 @@ public: line_maps *affected_location_mgr, line_maps *control_location_mgr, location_t loc, - const char *option_name) - : context (option_name, affected_location_mgr), + const char *option_name, + const char *unparsed_spec) + : context (option_name, unparsed_spec, affected_location_mgr), m_dc (dc), m_control_location_mgr (control_location_mgr), m_loc (loc) diff --git a/gcc/libgdiagnostics.cc b/gcc/libgdiagnostics.cc index cceddff9d69..6b269a1d1fe 100644 --- a/gcc/libgdiagnostics.cc +++ b/gcc/libgdiagnostics.cc @@ -2481,9 +2481,10 @@ struct spec_context : public diagnostics::output_spec::context { public: spec_context (const char *option_name, + const char *unparsed_spec, diagnostic_manager &affected_mgr, diagnostic_manager &control_mgr) - : context (option_name, affected_mgr.get_line_table ()), + : context (option_name, unparsed_spec, affected_mgr.get_line_table ()), m_control_mgr (control_mgr) {} @@ -2519,8 +2520,8 @@ diagnostic_manager_add_sink_from_spec (diagnostic_manager *affected_mgr, FAIL_IF_NULL (spec); FAIL_IF_NULL (control_mgr); - spec_context ctxt (option_name, *affected_mgr, *control_mgr); - auto inner_sink = ctxt.parse_and_make_sink (spec, affected_mgr->get_dc ()); + spec_context ctxt (option_name, spec, *affected_mgr, *control_mgr); + auto inner_sink = ctxt.parse_and_make_sink (affected_mgr->get_dc ()); if (!inner_sink) return -1; affected_mgr->get_dc ().add_sink (std::move (inner_sink)); diff --git a/gcc/opts-diagnostic.cc b/gcc/opts-diagnostic.cc index 0e0296ab5aa..6f459ec4617 100644 --- a/gcc/opts-diagnostic.cc +++ b/gcc/opts-diagnostic.cc @@ -47,12 +47,14 @@ public: diagnostics::context &dc, line_maps *location_mgr, location_t loc, - const char *option_name) + const char *option_name, + const char *option_value) : dc_spec_context (dc, location_mgr, location_mgr, loc, - option_name), + option_name, + option_value), m_opts (opts) {} @@ -72,17 +74,17 @@ public: void handle_OPT_fdiagnostics_add_output_ (const gcc_options &opts, diagnostics::context &dc, - const char *arg, + const char *unparsed_spec, location_t loc) { - gcc_assert (arg); + gcc_assert (unparsed_spec); gcc_assert (line_table); const char *const option_name = "-fdiagnostics-add-output="; DIAGNOSTICS_LOG_SCOPE_PRINTF2 (dc.get_logger (), - "handling: %s%s", option_name, arg); - opt_spec_context ctxt (opts, dc, line_table, loc, option_name); - auto sink = ctxt.parse_and_make_sink (arg, dc); + "handling: %s%s", option_name, unparsed_spec); + opt_spec_context ctxt (opts, dc, line_table, loc, option_name, unparsed_spec); + auto sink = ctxt.parse_and_make_sink (dc); if (!sink) return; @@ -93,17 +95,17 @@ handle_OPT_fdiagnostics_add_output_ (const gcc_options &opts, void handle_OPT_fdiagnostics_set_output_ (const gcc_options &opts, diagnostics::context &dc, - const char *arg, + const char *unparsed_spec, location_t loc) { - gcc_assert (arg); + gcc_assert (unparsed_spec); gcc_assert (line_table); const char *const option_name = "-fdiagnostics-set-output="; DIAGNOSTICS_LOG_SCOPE_PRINTF2 (dc.get_logger (), - "handling: %s%s", option_name, arg); - opt_spec_context ctxt (opts, dc, line_table, loc, option_name); - auto sink = ctxt.parse_and_make_sink (arg, dc); + "handling: %s%s", option_name, unparsed_spec); + opt_spec_context ctxt (opts, dc, line_table, loc, option_name, unparsed_spec); + auto sink = ctxt.parse_and_make_sink (dc); if (!sink) return;