Line data Source code
1 : /* Properties for capturing state graphs in SARIF property bags.
2 : Copyright (C) 2025-2026 Free Software Foundation, Inc.
3 : Contributed by David Malcolm <dmalcolm@redhat.com>.
4 :
5 : This file is part of GCC.
6 :
7 : GCC is free software; you can redistribute it and/or modify it under
8 : the terms of the GNU General Public License as published by the Free
9 : Software Foundation; either version 3, or (at your option) any later
10 : version.
11 :
12 : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : for more details.
16 :
17 : You should have received a copy of the GNU General Public License
18 : along with GCC; see the file COPYING3. If not see
19 : <http://www.gnu.org/licenses/>. */
20 :
21 : #include "config.h"
22 : #include "system.h"
23 : #include "coretypes.h"
24 : #include "json.h"
25 : #include "custom-sarif-properties/state-graphs.h"
26 :
27 : /* graph. */
28 : namespace graph = custom_sarif_properties::state_graphs::graph;
29 : #define STATE_GRAPH_PREFIX "gcc/diagnostic_state_graph/"
30 : const char *const graph::prefix = STATE_GRAPH_PREFIX;
31 : #undef STATE_GRAPH_PREFIX
32 :
33 : /* node. */
34 : namespace node = custom_sarif_properties::state_graphs::node;
35 : #define STATE_NODE_PREFIX "gcc/diagnostic_state_node/"
36 :
37 : const json::enum_property<enum node::kind_t>
38 : node::kind_prop (STATE_NODE_PREFIX "kind");
39 :
40 : const json::string_property node::function (STATE_NODE_PREFIX "function");
41 :
42 : const json::string_property node::dynamic_extents
43 : (STATE_NODE_PREFIX "dynamic-extents");
44 :
45 : const json::string_property node::name (STATE_NODE_PREFIX "name");
46 : const json::string_property node::type (STATE_NODE_PREFIX "type");
47 : const json::json_property node::value (STATE_NODE_PREFIX "value");
48 : const json::string_property node::value_str (STATE_NODE_PREFIX "value_str");
49 :
50 : const json::string_property node::index (STATE_NODE_PREFIX "index");
51 :
52 : const json::string_property node::bits (STATE_NODE_PREFIX "bits");
53 :
54 : const json::string_property node::num_bits (STATE_NODE_PREFIX "num_bits");
55 :
56 : const json::string_property node::deallocator (STATE_NODE_PREFIX "deallocator");
57 :
58 : const json::string_property node::expected_deallocators
59 : (STATE_NODE_PREFIX "expected-deallocators");
60 :
61 : const json::enum_property<enum node::dynalloc_state_t>
62 : node::dynalloc_state_prop (STATE_NODE_PREFIX "dynalloc-state");
63 :
64 : #undef STATE_NODE_PREFIX
65 :
66 :
67 : /* edge. */
68 : namespace edge_props = custom_sarif_properties::state_graphs::edge;
69 : #define STATE_EDGE_PREFIX "gcc/diagnostic_state_edge/"
70 : extern const char *const edge_props::prefix = STATE_EDGE_PREFIX;
71 : #undef STATE_EDGE_PREFIX
72 :
73 : // Traits for enum node:kind_t
74 :
75 : namespace json {
76 :
77 : template<>
78 : enum node::kind_t
79 4 : json::enum_traits<enum node::kind_t>::get_unknown_value ()
80 : {
81 4 : return node::kind_t::other;
82 : }
83 :
84 : static const char * const node_kind_strs[] = {
85 : "globals",
86 : "code",
87 : "function",
88 : "stack",
89 : "stack-frame",
90 : "heap",
91 : "thread-local",
92 : "dynalloc-buffer",
93 : "variable",
94 : "field",
95 : "padding",
96 : "element",
97 : "other",
98 : };
99 :
100 : template<>
101 : bool
102 16 : json::enum_traits<enum node::kind_t>::
103 : maybe_get_value_from_string (const char *str,
104 : enum_t &out)
105 : {
106 129 : for (size_t i = 0; i < ARRAY_SIZE (node_kind_strs); ++i)
107 129 : if (!strcmp (node_kind_strs[i], str))
108 : {
109 16 : out = static_cast<enum_t> (i);
110 16 : return true;
111 : }
112 : return false;
113 : }
114 :
115 : template<>
116 : const char *
117 507 : json::enum_traits<enum node::kind_t>::get_string_for_value (enum_t value)
118 : {
119 507 : return node_kind_strs[static_cast<int> (value)];
120 : }
121 :
122 : // Traits for enum node:dynalloc_state_t
123 :
124 : template<>
125 : enum node::dynalloc_state_t
126 4 : json::enum_traits<enum node::dynalloc_state_t>::get_unknown_value ()
127 : {
128 4 : return node::dynalloc_state_t::unknown;
129 : }
130 :
131 : static const char * const dynalloc_state_strs[] = {
132 : "unknown",
133 : "nonnull",
134 : "unchecked",
135 : "freed"
136 : };
137 :
138 : template<>
139 : bool
140 4 : json::enum_traits<enum node::dynalloc_state_t>::
141 : maybe_get_value_from_string (const char *str,
142 : enum_t &out)
143 : {
144 16 : for (size_t i = 0; i < ARRAY_SIZE (dynalloc_state_strs); ++i)
145 16 : if (!strcmp (dynalloc_state_strs[i], str))
146 : {
147 4 : out = static_cast<enum_t> (i);
148 4 : return true;
149 : }
150 : return false;
151 : }
152 :
153 : template<>
154 : const char *
155 48 : json::enum_traits<enum node::dynalloc_state_t>::
156 : get_string_for_value (enum_t value)
157 : {
158 48 : return dynalloc_state_strs[static_cast <size_t> (value)];
159 : }
160 :
161 : } // namespace json
|