aboutsummaryrefslogtreecommitdiff
path: root/gcc/opts-diagnostic.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/opts-diagnostic.cc')
-rw-r--r--gcc/opts-diagnostic.cc33
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;