diff options
Diffstat (limited to 'gcc/diagnostics/sarif-sink.h')
-rw-r--r-- | gcc/diagnostics/sarif-sink.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/gcc/diagnostics/sarif-sink.h b/gcc/diagnostics/sarif-sink.h new file mode 100644 index 0000000..9f8a73f --- /dev/null +++ b/gcc/diagnostics/sarif-sink.h @@ -0,0 +1,189 @@ +/* SARIF output for diagnostics. + Copyright (C) 2023-2025 Free Software Foundation, Inc. + Contributed by David Malcolm <dmalcolm@redhat.com>. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 3, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +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_DIAGNOSTICS_SARIF_SINK_H +#define GCC_DIAGNOSTICS_SARIF_SINK_H + +#include "json.h" +#include "diagnostics/sink.h" +#include "diagnostics/output-file.h" +#include "diagnostics/logical-locations.h" + +namespace diagnostics { + +namespace digraphs { + class digraph; + class node; + class edge; +} + +/* Enum for choosing what format to serializing the generated SARIF into. */ + +enum class sarif_serialization_kind +{ + json, + + num_values +}; + +extern output_file +open_sarif_output_file (context &dc, + line_maps *line_maps, + const char *base_file_name, + enum sarif_serialization_kind serialization_kind); + +extern sink & +init_sarif_stderr (context &dc, + const line_maps *line_maps, + bool formatted); +extern sink & +init_sarif_file (context &dc, + line_maps *line_maps, + bool formatted, + const char *base_file_name); +extern sink & +init_sarif_stream (context &dc, + const line_maps *line_maps, + bool formatted, + FILE *stream); + +/* Abstract base class for handling JSON output vs other kinds of + serialization of the json tree. */ + +class sarif_serialization_format +{ +public: + virtual ~sarif_serialization_format () {} + virtual void write_to_file (FILE *outf, + const json::value &top) = 0; +}; + +/* Concrete subclass for serializing SARIF as JSON. */ + +class sarif_serialization_format_json : public sarif_serialization_format +{ +public: + sarif_serialization_format_json (bool formatted) + : m_formatted (formatted) + { + } + void write_to_file (FILE *outf, const json::value &top) final override; + +private: + bool m_formatted; +}; + +/* Control of SARIF generation. */ + +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; + bool m_state_graph; +}; + +extern std::unique_ptr<sink> +make_sarif_sink (context &dc, + const line_maps &line_maps, + std::unique_ptr<sarif_serialization_format> serialization_format, + const sarif_generation_options &sarif_gen_opts, + output_file output_file_); + +class sarif_builder; +class sarif_location_manager; + +/* Concrete subclass of json::object for SARIF property bags + (SARIF v2.1.0 section 3.8). */ + +class sarif_property_bag : public json::object +{ +public: + void set_logical_location (const char *property_name, + sarif_builder &, + logical_locations::key logical_loc); + void set_graph (const char *property_name, + sarif_builder &, + sarif_location_manager *sarif_location_mgr, + const digraphs::digraph &g); +}; + +/* Concrete subclass of json::object for SARIF objects that can + contain property bags (as per SARIF v2.1.0 section 3.8.1, which has: + "In addition to those properties that are explicitly documented, every + object defined in this document MAY contain a property named properties + whose value is a property bag.") */ + +class sarif_object : public json::object +{ +public: + sarif_property_bag &get_or_create_properties (); +}; + +/* Subclass of sarif_object for SARIF "graph" objects + (SARIF v2.1.0 section 3.39). */ + +class sarif_graph : public sarif_object +{ +}; + +/* Subclass of sarif_object for SARIF "node" objects + (SARIF v2.1.0 section 3.40). */ + +class sarif_node : public sarif_object +{ +}; + +/* Subclass of sarif_object for SARIF "edge" objects + (SARIF v2.1.0 section 3.41). */ + +class sarif_edge : public sarif_object +{ +}; + +extern std::unique_ptr<sarif_graph> +make_sarif_graph (const digraphs::digraph &g, + sarif_builder *builder, + sarif_location_manager *sarif_location_mgr); + +extern std::unique_ptr<sarif_node> +make_sarif_node (const digraphs::node &n, + sarif_builder *builder, + sarif_location_manager *sarif_location_mgr); + +extern std::unique_ptr<sarif_edge> +make_sarif_edge (const digraphs::edge &e, + sarif_builder *builder); + +} // namespace diagnostics + +#endif /* ! GCC_DIAGNOSTICS_SARIF_SINK_H */ |