diff options
Diffstat (limited to 'gcc/opts-diagnostic.cc')
-rw-r--r-- | gcc/opts-diagnostic.cc | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/gcc/opts-diagnostic.cc b/gcc/opts-diagnostic.cc index b51c8a8..1eec010 100644 --- a/gcc/opts-diagnostic.cc +++ b/gcc/opts-diagnostic.cc @@ -434,6 +434,8 @@ sarif_scheme_handler::make_sink (const context &ctxt, const scheme_name_and_params &parsed_arg) const { label_text filename; + enum sarif_serialization_kind serialization_kind + = sarif_serialization_kind::json; enum sarif_version version = sarif_version::v2_1_0; for (auto& iter : parsed_arg.m_kvs) { @@ -444,6 +446,20 @@ sarif_scheme_handler::make_sink (const context &ctxt, filename = label_text::take (xstrdup (value.c_str ())); continue; } + if (key == "serialization") + { + static const std::array<std::pair<const char *, enum sarif_serialization_kind>, + (size_t)sarif_serialization_kind::num_values> value_names + {{{"json", sarif_serialization_kind::json}}}; + + if (!parse_enum_value<enum sarif_serialization_kind> + (ctxt, unparsed_arg, + key, value, + value_names, + serialization_kind)) + return nullptr; + continue; + } if (key == "version") { static const std::array<std::pair<const char *, enum sarif_version>, @@ -462,6 +478,7 @@ sarif_scheme_handler::make_sink (const context &ctxt, /* Key not found. */ auto_vec<const char *> known_keys; known_keys.safe_push ("file"); + known_keys.safe_push ("serialization"); known_keys.safe_push ("version"); ctxt.report_unknown_key (unparsed_arg, key, get_scheme_name (), known_keys); @@ -479,7 +496,8 @@ sarif_scheme_handler::make_sink (const context &ctxt, : ctxt.m_opts.x_main_input_basename); output_file = diagnostic_output_format_open_sarif_file (ctxt.m_dc, line_table, - basename); + basename, + serialization_kind); } if (!output_file) return nullptr; @@ -487,10 +505,21 @@ sarif_scheme_handler::make_sink (const context &ctxt, sarif_generation_options sarif_gen_opts; sarif_gen_opts.m_version = version; + std::unique_ptr<sarif_serialization_format> serialization_obj; + switch (serialization_kind) + { + default: + gcc_unreachable (); + case sarif_serialization_kind::json: + serialization_obj + = std::make_unique<sarif_serialization_format_json> (true); + break; + } + auto sink = make_sarif_sink (ctxt.m_dc, *line_table, ctxt.m_opts.x_main_input_filename, - true, + std::move (serialization_obj), sarif_gen_opts, std::move (output_file)); return sink; |