analyzer: fixes to -fdump-analyzer-json

I've been implementing a PyGTK viewer for the output of
-fdump-analyzer-json, to help me debug analyzer issues:
  https://github.com/davidmalcolm/gcc-analyzer-viewer
The viewer is very much just a work in progress.

This patch adds some fields that were missing from the dump, and
fixes some mistakes I spotted whilst working on the viewer.

gcc/analyzer/ChangeLog:
	* engine.cc (strongly_connected_components::to_json): New.
	(worklist::to_json): New.
	(exploded_graph::to_json): JSON-ify the worklist.
	* exploded-graph.h (strongly_connected_components::to_json): New
	decl.
	(worklist::to_json): New decl.
	* store.cc (store::to_json): Fix comment.
	* supergraph.cc (supernode::to_json): Fix reference to
	"returning_call" in comment.  Add optional "fun" to JSON.
	(edge_kind_to_string): New.
	(superedge::to_json): Add "kind" to JSON.
This commit is contained in:
David Malcolm 2021-01-14 15:39:14 -05:00
parent 8a18261afd
commit dea4a32b24
4 changed files with 60 additions and 4 deletions

View File

@ -1772,6 +1772,17 @@ strongly_connected_components::dump () const
}
}
/* Return a new json::array of per-snode SCC ids. */
json::array *
strongly_connected_components::to_json () const
{
json::array *scc_arr = new json::array ();
for (int i = 0; i < m_sg.num_nodes (); i++)
scc_arr->append (new json::integer_number (get_scc_id (i)));
return scc_arr;
}
/* Subroutine of strongly_connected_components's ctor, part of Tarjan's
SCC algorithm. */
@ -1968,6 +1979,22 @@ worklist::key_t::cmp (const worklist::key_t &ka, const worklist::key_t &kb)
return ka.m_enode->m_index - kb.m_enode->m_index;
}
/* Return a new json::object of the form
{"scc" : [per-snode-IDs]}, */
json::object *
worklist::to_json () const
{
json::object *worklist_obj = new json::object ();
worklist_obj->set ("scc", m_scc.to_json ());
/* The following field isn't yet being JSONified:
queue_t m_queue; */
return worklist_obj;
}
/* exploded_graph's ctor. */
exploded_graph::exploded_graph (const supergraph &sg, logger *logger,
@ -3315,10 +3342,10 @@ exploded_graph::to_json () const
/* m_sg is JSONified at the top-level. */
egraph_obj->set ("ext_state", m_ext_state.to_json ());
egraph_obj->set ("worklist", m_worklist.to_json ());
egraph_obj->set ("diagnostic_manager", m_diagnostic_manager.to_json ());
/* The following fields aren't yet being JSONified:
worklist m_worklist;
const state_purge_map *const m_purge_map;
const analysis_plan &m_plan;
stats m_global_stats;

View File

@ -622,6 +622,8 @@ public:
void dump () const;
json::array *to_json () const;
private:
struct per_node_data
{
@ -664,6 +666,8 @@ public:
return m_scc.get_scc_id (snode.m_index);
}
json::object *to_json () const;
private:
class key_t
{

View File

@ -1740,7 +1740,7 @@ store::dump (bool simple) const
{PARENT_REGION_DESC: {BASE_REGION_DESC: object for binding_map,
... for each cluster within parent region},
...for each parent region,
"called_unknown_function": true/false}. */
"called_unknown_fn": true/false}. */
json::object *
store::to_json () const

View File

@ -634,8 +634,9 @@ supernode::dump_dot_id (pretty_printer *pp) const
/* Return a new json::object of the form
{"idx": int,
"fun": optional str
"bb_idx": int,
"m_returning_call": optional str,
"returning_call": optional str,
"phis": [str],
"stmts" : [str]}. */
@ -646,6 +647,8 @@ supernode::to_json () const
snode_obj->set ("idx", new json::integer_number (m_index));
snode_obj->set ("bb_idx", new json::integer_number (m_bb->index));
if (function *fun = get_function ())
snode_obj->set ("fun", new json::string (function_name (fun)));
if (m_returning_call)
{
@ -753,6 +756,26 @@ supernode::get_stmt_index (const gimple *stmt) const
gcc_unreachable ();
}
/* Get a string for PK. */
static const char *
edge_kind_to_string (enum edge_kind kind)
{
switch (kind)
{
default:
gcc_unreachable ();
case SUPEREDGE_CFG_EDGE:
return "SUPEREDGE_CFG_EDGE";
case SUPEREDGE_CALL:
return "SUPEREDGE_CALL";
case SUPEREDGE_RETURN:
return "SUPEREDGE_RETURN";
case SUPEREDGE_INTRAPROCEDURAL_CALL:
return "SUPEREDGE_INTRAPROCEDURAL_CALL";
}
};
/* Dump this superedge to PP. */
void
@ -855,7 +878,8 @@ superedge::dump_dot (graphviz_out *gv, const dump_args_t &) const
}
/* Return a new json::object of the form
{"src_idx": int, the index of the source supernode,
{"kind" : str,
"src_idx": int, the index of the source supernode,
"dst_idx": int, the index of the destination supernode,
"desc" : str. */
@ -863,6 +887,7 @@ json::object *
superedge::to_json () const
{
json::object *sedge_obj = new json::object ();
sedge_obj->set ("kind", new json::string (edge_kind_to_string (m_kind)));
sedge_obj->set ("src_idx", new json::integer_number (m_src->m_index));
sedge_obj->set ("dst_idx", new json::integer_number (m_dest->m_index));