aboutsummaryrefslogtreecommitdiff
path: root/gcc/diagnostics/sarif-sink.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/diagnostics/sarif-sink.h')
-rw-r--r--gcc/diagnostics/sarif-sink.h189
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 */