Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu. Pushed to trunk as r16-250-ga25818cd302a77.
gcc/ChangeLog: * diagnostic-format-sarif.cc (sarif_builder::get_opts): New accessor. (sarif_builder::get_version): Update for... (sarif_builder::m_version): Replace this field... (sarif_builder::m_m_sarif_gen_opts): ...with this. (sarif_builder::sarif_builder): Replace version with sarif_gen_opts throughout. (sarif_builder::make_top_level_object): Use get_version. (sarif_output_format::sarif_output_format): Replace version with sarif_gen_opts throughout. (sarif_stream_output_format::sarif_stream_output_format): Likewise. (sarif_file_output_format::sarif_file_output_format): Likewise. (diagnostic_output_format_init_sarif_stderr): Drop version param and use default for sarif_generation_options instead. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. (make_sarif_sink): Replace version with sarif_gen_opts throughout. (sarif_generation_options::sarif_generation_options): New. (selftest::test_sarif_diagnostic_context::test_sarif_diagnostic_context): Replace version with sarif_gen_opts throughout. (selftest::test_make_location_object): Likewise. (selftest::test_simple_log): Likewise. (selftest::test_simple_log_2): Likewise. (selftest::test_message_with_embedded_link): Likewise. (selftest::test_message_with_braces): Likewise. (selftest::test_buffering): Likewise. (selftest::run_tests_per_version): Replace with... (selftest::for_each_sarif_gen_option): ...this... (selftest::run_line_table_case_tests_per_version): ...and this. (selftest::diagnostic_format_sarif_cc_tests): Update to use for_each_sarif_gen_option and run_line_table_case_tests_per_version. * diagnostic-format-sarif.h (enum class sarif_version): Move lower down. (diagnostic_output_format_init_sarif_stderr): Drop "version" param. (diagnostic_output_format_init_sarif_file): Likewise. (diagnostic_output_format_init_sarif_stream): Likewise. (struct sarif_generation_options): New. (make_sarif_sink): Add "formatted" param. Replace version param with sarif_gen_opts. * diagnostic.cc (diagnostic_output_format_init): Drop hardcoded sarif_version::v2_1_0 arguments from calls, which instead use the default ctor for sarif_generation_options internally. * libgdiagnostics.cc (sarif_sink::sarif_sink): Replace version param with sarif_gen_opts, and update for changes to make_sarif_sink. (diagnostic_manager_add_sarif_sink): Use sarif_gen_opts rather than version. * opts-diagnostic.cc (sarif_scheme_handler::make_sink): Likewise. Pass "true" for "formatted" param. Signed-off-by: David Malcolm <dmalc...@redhat.com> --- gcc/diagnostic-format-sarif.cc | 140 ++++++++++++++++++--------------- gcc/diagnostic-format-sarif.h | 36 ++++++--- gcc/diagnostic.cc | 4 +- gcc/libgdiagnostics.cc | 15 ++-- gcc/opts-diagnostic.cc | 6 +- 5 files changed, 115 insertions(+), 86 deletions(-) diff --git a/gcc/diagnostic-format-sarif.cc b/gcc/diagnostic-format-sarif.cc index 8dbc91ee8f3..c490d0d1785 100644 --- a/gcc/diagnostic-format-sarif.cc +++ b/gcc/diagnostic-format-sarif.cc @@ -689,7 +689,7 @@ public: const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version); + const sarif_generation_options &sarif_gen_opts); ~sarif_builder (); void set_printer (pretty_printer &printer) @@ -743,7 +743,7 @@ public: diagnostic_context &get_context () const { return m_context; } pretty_printer *get_printer () const { return m_printer; } token_printer &get_token_printer () { return m_token_printer; } - enum sarif_version get_version () const { return m_version; } + enum sarif_version get_version () const { return m_sarif_gen_opts.m_version; } size_t num_results () const { return m_results_array->size (); } sarif_result &get_result (size_t idx) @@ -753,6 +753,8 @@ public: return *static_cast<sarif_result *> (element); } + const sarif_generation_options &get_opts () const { return m_sarif_gen_opts; } + private: class sarif_token_printer : public token_printer { @@ -865,7 +867,6 @@ private: pretty_printer *m_printer; const line_maps *m_line_maps; sarif_token_printer m_token_printer; - enum sarif_version m_version; /* The JSON object for the invocation object. */ std::unique_ptr<sarif_invocation> m_invocation_obj; @@ -892,6 +893,7 @@ private: int m_tabstop; bool m_formatted; + const sarif_generation_options m_sarif_gen_opts; unsigned m_next_result_idx; sarif_code_flow *m_current_code_flow; @@ -1561,12 +1563,11 @@ sarif_builder::sarif_builder (diagnostic_context &context, const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version) + const sarif_generation_options &sarif_gen_opts) : m_context (context), m_printer (&printer), m_line_maps (line_maps), m_token_printer (*this), - m_version (version), m_invocation_obj (::make_unique<sarif_invocation> (*this, context.get_original_argv ())), @@ -1577,6 +1578,7 @@ sarif_builder::sarif_builder (diagnostic_context &context, m_rules_arr (new json::array ()), m_tabstop (context.m_tabstop), m_formatted (formatted), + m_sarif_gen_opts (sarif_gen_opts), m_next_result_idx (0), m_current_code_flow (nullptr) { @@ -2961,10 +2963,10 @@ make_top_level_object (std::unique_ptr<sarif_invocation> invocation_obj, auto log_obj = ::make_unique<sarif_log> (); /* "$schema" property (SARIF v2.1.0 section 3.13.3) . */ - log_obj->set_string ("$schema", sarif_version_to_url (m_version)); + log_obj->set_string ("$schema", sarif_version_to_url (get_version ())); /* "version" property (SARIF v2.1.0 section 3.13.2). */ - log_obj->set_string ("version", sarif_version_to_property (m_version)); + log_obj->set_string ("version", sarif_version_to_property (get_version ())); /* "runs" property (SARIF v2.1.0 section 3.13.4). */ auto run_arr = ::make_unique<json::array> (); @@ -3534,10 +3536,10 @@ protected: const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version) + const sarif_generation_options &sarif_gen_opts) : diagnostic_output_format (context), m_builder (context, *get_printer (), line_maps, main_input_filename_, - formatted, version), + formatted, sarif_gen_opts), m_buffer (nullptr) {} @@ -3552,10 +3554,11 @@ public: const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version, + const sarif_generation_options &sarif_gen_opts, FILE *stream) : sarif_output_format (context, line_maps, main_input_filename_, - formatted, version), + formatted, + sarif_gen_opts), m_stream (stream) { } @@ -3578,10 +3581,10 @@ public: const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version, + const sarif_generation_options &sarif_gen_opts, diagnostic_output_file output_file) : sarif_output_format (context, line_maps, main_input_filename_, - formatted, version), + formatted, sarif_gen_opts), m_output_file (std::move (output_file)) { gcc_assert (m_output_file.get_open_file ()); @@ -3741,17 +3744,17 @@ void diagnostic_output_format_init_sarif_stderr (diagnostic_context &context, const line_maps *line_maps, const char *main_input_filename_, - bool formatted, - enum sarif_version version) + bool formatted) { gcc_assert (line_maps); + const sarif_generation_options sarif_gen_opts; diagnostic_output_format_init_sarif (context, ::make_unique<sarif_stream_output_format> (context, line_maps, main_input_filename_, formatted, - version, + sarif_gen_opts, stderr)); } @@ -3798,7 +3801,6 @@ diagnostic_output_format_init_sarif_file (diagnostic_context &context, line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version, const char *base_file_name) { gcc_assert (line_maps); @@ -3808,13 +3810,14 @@ diagnostic_output_format_init_sarif_file (diagnostic_context &context, line_maps, base_file_name); + const sarif_generation_options sarif_gen_opts; diagnostic_output_format_init_sarif (context, ::make_unique<sarif_file_output_format> (context, line_maps, main_input_filename_, formatted, - version, + sarif_gen_opts, std::move (output_file))); } @@ -3825,17 +3828,17 @@ diagnostic_output_format_init_sarif_stream (diagnostic_context &context, const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version, FILE *stream) { gcc_assert (line_maps); + const sarif_generation_options sarif_gen_opts; diagnostic_output_format_init_sarif (context, ::make_unique<sarif_stream_output_format> (context, line_maps, main_input_filename_, formatted, - version, + sarif_gen_opts, stream)); } @@ -3843,19 +3846,27 @@ std::unique_ptr<diagnostic_output_format> make_sarif_sink (diagnostic_context &context, const line_maps &line_maps, const char *main_input_filename_, - enum sarif_version version, + bool formatted, + const sarif_generation_options &sarif_gen_opts, diagnostic_output_file output_file) { auto sink = ::make_unique<sarif_file_output_format> (context, &line_maps, main_input_filename_, - true, - version, + formatted, + sarif_gen_opts, std::move (output_file)); sink->update_printer (); return sink; } +// struct sarif_generation_options + +sarif_generation_options::sarif_generation_options () +: m_version (sarif_version::v2_1_0) +{ +} + #if CHECKING_P namespace selftest { @@ -3868,13 +3879,13 @@ class test_sarif_diagnostic_context : public test_diagnostic_context { public: test_sarif_diagnostic_context (const char *main_input_filename, - enum sarif_version version) + const sarif_generation_options &sarif_gen_opts) { auto format = ::make_unique<buffered_output_format> (*this, line_table, main_input_filename, true, - version); + sarif_gen_opts); m_format = format.get (); // borrowed diagnostic_output_format_init_sarif (*this, std::move (format)); } @@ -3895,9 +3906,9 @@ private: const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version) + const sarif_generation_options &sarif_gen_opts) : sarif_output_format (context, line_maps, main_input_filename_, - formatted, version) + formatted, sarif_gen_opts) { } bool machine_readable_stderr_p () const final override @@ -3917,8 +3928,8 @@ private: with labels and escape-on-output. */ static void -test_make_location_object (const line_table_case &case_, - enum sarif_version version) +test_make_location_object (const sarif_generation_options &sarif_gen_opts, + const line_table_case &case_) { diagnostic_show_locus_fixture_one_liner_utf8 f (case_); location_t line_end = linemap_position_for_column (line_table, 31); @@ -3930,7 +3941,7 @@ test_make_location_object (const line_table_case &case_, test_diagnostic_context dc; pretty_printer pp; sarif_builder builder (dc, pp, line_table, "MAIN_INPUT_FILENAME", - true, version); + true, sarif_gen_opts); /* These "columns" are byte offsets, whereas later on the columns in the generated SARIF use sarif_builder::get_sarif_column and @@ -4041,9 +4052,9 @@ test_make_location_object (const line_table_case &case_, Verify various basic properties. */ static void -test_simple_log (enum sarif_version version) +test_simple_log (const sarif_generation_options &sarif_gen_opts) { - test_sarif_diagnostic_context dc ("MAIN_INPUT_FILENAME", version); + test_sarif_diagnostic_context dc ("MAIN_INPUT_FILENAME", sarif_gen_opts); rich_location richloc (line_table, UNKNOWN_LOCATION); dc.report (DK_ERROR, richloc, nullptr, 0, "this is a test: %i", 42); @@ -4052,6 +4063,7 @@ test_simple_log (enum sarif_version version) // 3.13 sarifLog: auto log = log_ptr.get (); + const enum sarif_version version = sarif_gen_opts.m_version; ASSERT_JSON_STRING_PROPERTY_EQ (log, "$schema", sarif_version_to_url (version)); ASSERT_JSON_STRING_PROPERTY_EQ (log, "version", @@ -4158,8 +4170,8 @@ test_simple_log (enum sarif_version version) /* As above, but with a "real" location_t. */ static void -test_simple_log_2 (const line_table_case &case_, - enum sarif_version version) +test_simple_log_2 (const sarif_generation_options &sarif_gen_opts, + const line_table_case &case_) { auto_fix_quotes fix_quotes; @@ -4174,7 +4186,7 @@ test_simple_log_2 (const line_table_case &case_, if (line_end > LINE_MAP_MAX_LOCATION_WITH_COLS) return; - test_sarif_diagnostic_context dc (f.get_filename (), version); + test_sarif_diagnostic_context dc (f.get_filename (), sarif_gen_opts); const location_t typo_loc = make_location (linemap_position_for_column (line_table, 1), @@ -4304,11 +4316,11 @@ get_message_from_log (const sarif_log *log) /* Tests of messages with embedded links; see SARIF v2.1.0 3.11.6. */ static void -test_message_with_embedded_link (enum sarif_version version) +test_message_with_embedded_link (const sarif_generation_options &sarif_gen_opts) { auto_fix_quotes fix_quotes; { - test_sarif_diagnostic_context dc ("test.c", version); + test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts); rich_location richloc (line_table, UNKNOWN_LOCATION); dc.report (DK_ERROR, richloc, nullptr, 0, "before %{text%} after", @@ -4324,7 +4336,7 @@ test_message_with_embedded_link (enum sarif_version version) /* Escaping in message text. This is "EXAMPLE 1" from 3.11.6. */ { - test_sarif_diagnostic_context dc ("test.c", version); + test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts); rich_location richloc (line_table, UNKNOWN_LOCATION); /* Disable "unquoted sequence of 2 consecutive punctuation @@ -4364,7 +4376,7 @@ test_message_with_embedded_link (enum sarif_version version) } }; - test_sarif_diagnostic_context dc ("test.c", version); + test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts); dc.push_owned_urlifier (::make_unique<test_urlifier> ()); rich_location richloc (line_table, UNKNOWN_LOCATION); dc.report (DK_ERROR, richloc, nullptr, 0, @@ -4382,11 +4394,11 @@ test_message_with_embedded_link (enum sarif_version version) 3.11.5 ("Messages with placeholders"). */ static void -test_message_with_braces (enum sarif_version version) +test_message_with_braces (const sarif_generation_options &sarif_gen_opts) { auto_fix_quotes fix_quotes; { - test_sarif_diagnostic_context dc ("test.c", version); + test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts); rich_location richloc (line_table, UNKNOWN_LOCATION); dc.report (DK_ERROR, richloc, nullptr, 0, "open brace: %qs close brace: %qs", @@ -4401,9 +4413,9 @@ test_message_with_braces (enum sarif_version version) } static void -test_buffering (enum sarif_version version) +test_buffering (const sarif_generation_options &sarif_gen_opts) { - test_sarif_diagnostic_context dc ("test.c", version); + test_sarif_diagnostic_context dc ("test.c", sarif_gen_opts); diagnostic_buffer buf_a (dc); diagnostic_buffer buf_b (dc); @@ -4487,41 +4499,45 @@ test_buffering (enum sarif_version version) } } +template <class ...ArgTypes> static void -run_tests_per_version (const line_table_case &case_) +for_each_sarif_gen_option (void (*callback) (const sarif_generation_options &, + ArgTypes ...), + ArgTypes ...args) { + sarif_generation_options sarif_gen_opts; for (int version_idx = 0; version_idx < (int)sarif_version::num_versions; ++version_idx) { - enum sarif_version version - = static_cast<enum sarif_version> (version_idx); + sarif_gen_opts.m_version = static_cast<enum sarif_version> (version_idx); - test_make_location_object (case_, version); - test_simple_log_2 (case_, version); + callback (sarif_gen_opts, args...); } } +static void +run_line_table_case_tests_per_version (const line_table_case &case_) +{ + for_each_sarif_gen_option<const line_table_case &> + (test_make_location_object, case_); + + for_each_sarif_gen_option<const line_table_case &> + (test_simple_log_2, case_); +} + /* Run all of the selftests within this file. */ void diagnostic_format_sarif_cc_tests () { - for (int version_idx = 0; - version_idx < (int)sarif_version::num_versions; - ++version_idx) - { - enum sarif_version version - = static_cast<enum sarif_version> (version_idx); - - test_simple_log (version); - test_message_with_embedded_link (version); - test_message_with_braces (version); - test_buffering (version); - } + for_each_sarif_gen_option (test_simple_log); + for_each_sarif_gen_option (test_message_with_embedded_link); + for_each_sarif_gen_option (test_message_with_braces); + for_each_sarif_gen_option (test_buffering); - /* Run tests per (line-table-case, SARIF version) pair. */ - for_each_line_table_case (run_tests_per_version); + /* Run tests per (SARIF gen-option, line-table-case) pair. */ + for_each_line_table_case (run_line_table_case_tests_per_version); } } // namespace selftest diff --git a/gcc/diagnostic-format-sarif.h b/gcc/diagnostic-format-sarif.h index 5dc6176afe3..524a0c7c6b5 100644 --- a/gcc/diagnostic-format-sarif.h +++ b/gcc/diagnostic-format-sarif.h @@ -27,14 +27,6 @@ along with GCC; see the file COPYING3. If not see class logical_location; -enum class sarif_version -{ - v2_1_0, - v2_2_prerelease_2024_08_08, - - num_versions -}; - extern diagnostic_output_file diagnostic_output_format_open_sarif_file (diagnostic_context &context, line_maps *line_maps, @@ -44,27 +36,45 @@ extern void diagnostic_output_format_init_sarif_stderr (diagnostic_context &context, const line_maps *line_maps, const char *main_input_filename_, - bool formatted, - enum sarif_version version); + bool formatted); extern void diagnostic_output_format_init_sarif_file (diagnostic_context &context, line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version, const char *base_file_name); extern void diagnostic_output_format_init_sarif_stream (diagnostic_context &context, const line_maps *line_maps, const char *main_input_filename_, bool formatted, - enum sarif_version version, FILE *stream); + +enum class sarif_version +{ + v2_1_0, + v2_2_prerelease_2024_08_08, + + num_versions +}; + +/* A bundle of state for controlling what to put in SARIF output, + such as which version of SARIF to generate + (as opposed to SARIF *serialization* options, such as formatting). */ + +struct sarif_generation_options +{ + sarif_generation_options (); + + enum sarif_version m_version; +}; + extern std::unique_ptr<diagnostic_output_format> make_sarif_sink (diagnostic_context &context, const line_maps &line_maps, const char *main_input_filename_, - enum sarif_version version, + bool formatted, + const sarif_generation_options &sarif_gen_opts, diagnostic_output_file output_file); /* Concrete subclass of json::object for SARIF property bags diff --git a/gcc/diagnostic.cc b/gcc/diagnostic.cc index 07c76b6c652..91f02ad1927 100644 --- a/gcc/diagnostic.cc +++ b/gcc/diagnostic.cc @@ -1830,8 +1830,7 @@ diagnostic_output_format_init (diagnostic_context &context, diagnostic_output_format_init_sarif_stderr (context, line_table, main_input_filename_, - json_formatting, - sarif_version::v2_1_0); + json_formatting); break; case DIAGNOSTICS_OUTPUT_FORMAT_SARIF_FILE: @@ -1839,7 +1838,6 @@ diagnostic_output_format_init (diagnostic_context &context, line_table, main_input_filename_, json_formatting, - sarif_version::v2_1_0, base_file_name); break; } diff --git a/gcc/libgdiagnostics.cc b/gcc/libgdiagnostics.cc index d274283742f..9f70669f938 100644 --- a/gcc/libgdiagnostics.cc +++ b/gcc/libgdiagnostics.cc @@ -298,7 +298,7 @@ public: sarif_sink (diagnostic_manager &mgr, FILE *dst_stream, const diagnostic_file *main_input_file, - enum sarif_version version); + const sarif_generation_options &sarif_gen_opts); }; /* Helper for the linemap code. */ @@ -1071,7 +1071,7 @@ diagnostic_text_sink::text_starter (diagnostic_text_output_format &text_output, sarif_sink::sarif_sink (diagnostic_manager &mgr, FILE *dst_stream, const diagnostic_file *main_input_file, - enum sarif_version version) + const sarif_generation_options &sarif_gen_opts) : sink (mgr) { diagnostic_output_file output_file (dst_stream, false, @@ -1079,7 +1079,8 @@ sarif_sink::sarif_sink (diagnostic_manager &mgr, auto inner_sink = make_sarif_sink (mgr.get_dc (), *mgr.get_line_table (), main_input_file->get_name (), - version, + true, + sarif_gen_opts, std::move (output_file)); mgr.get_dc ().add_sink (std::move (inner_sink)); } @@ -1271,7 +1272,7 @@ diagnostic_manager_add_sarif_sink (diagnostic_manager *diag_mgr, FAIL_IF_NULL (dst_stream); FAIL_IF_NULL (main_input_file); - enum sarif_version internal_version; + sarif_generation_options sarif_gen_opts; switch (version) { default: @@ -1279,17 +1280,17 @@ diagnostic_manager_add_sarif_sink (diagnostic_manager *diag_mgr, __func__, (int)version); abort (); case DIAGNOSTIC_SARIF_VERSION_2_1_0: - internal_version = sarif_version::v2_1_0; + sarif_gen_opts.m_version = sarif_version::v2_1_0; break; case DIAGNOSTIC_SARIF_VERSION_2_2_PRERELEASE: - internal_version = sarif_version::v2_2_prerelease_2024_08_08; + sarif_gen_opts.m_version = sarif_version::v2_2_prerelease_2024_08_08; break; } diag_mgr->add_sink (make_unique<sarif_sink> (*diag_mgr, dst_stream, main_input_file, - internal_version)); + sarif_gen_opts)); } /* Public entrypoint. */ diff --git a/gcc/opts-diagnostic.cc b/gcc/opts-diagnostic.cc index cab7925aa34..4267db5a435 100644 --- a/gcc/opts-diagnostic.cc +++ b/gcc/opts-diagnostic.cc @@ -485,10 +485,14 @@ sarif_scheme_handler::make_sink (const context &ctxt, if (!output_file) return nullptr; + sarif_generation_options sarif_gen_opts; + sarif_gen_opts.m_version = version; + auto sink = make_sarif_sink (ctxt.m_dc, *line_table, ctxt.m_opts.x_main_input_filename, - version, + true, + sarif_gen_opts, std::move (output_file)); return sink; } -- 2.26.3