aboutsummaryrefslogtreecommitdiff
path: root/gcc/graph.cc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-01-28 10:28:39 +0100
committerRichard Biener <rguenther@suse.de>2022-01-28 11:28:09 +0100
commitb500d2591ea0080459d5dee127f63c010530f6b6 (patch)
treeb386e601c3e57f56cab6d98d20eb523f71c06015 /gcc/graph.cc
parentb16a3dea1d1bfa3dde556af84b3592140320b605 (diff)
downloadgcc-b500d2591ea0080459d5dee127f63c010530f6b6.zip
gcc-b500d2591ea0080459d5dee127f63c010530f6b6.tar.gz
gcc-b500d2591ea0080459d5dee127f63c010530f6b6.tar.bz2
Make graph dumping work for fn != cfun
The following makes dumping of a function as graph work as intended when specifying a function other than cfun. Unfortunately the loop and the dominance APIs are not set up to work for other functions than cfun so you won't get any fancy loop dumps but the non-loop dump works up to reaching mark_dfs_back_edges which I trivially made function aware and adjusted current callers with a wrapper. With all this, doing dot-fn id->src_cfun from the debugger when debugging inlining works. Previously you got a strange mix of the src and dest functions visualized ;) 2022-01-28 Richard Biener <rguenther@suse.de> * cfganal.h (mark_dfs_back_edges): Provide API with struct function argument. * cfganal.cc (mark_dfs_back_edges): Take a struct function to work on, add a wrapper passing cfun. * graph.cc (draw_cfg_nodes_no_loops): Replace stray cfun uses with fun which is already passed. (draw_cfg_edges): Likewise. (draw_cfg_nodes_for_loop): Do not use draw_cfg_nodes_for_loop for fun != cfun.
Diffstat (limited to 'gcc/graph.cc')
-rw-r--r--gcc/graph.cc15
1 files changed, 8 insertions, 7 deletions
diff --git a/gcc/graph.cc b/gcc/graph.cc
index 9990c8e..bc29862 100644
--- a/gcc/graph.cc
+++ b/gcc/graph.cc
@@ -169,14 +169,14 @@ draw_cfg_nodes_no_loops (pretty_printer *pp, struct function *fun)
int *rpo = XNEWVEC (int, n_basic_blocks_for_fn (fun));
int i, n;
- auto_sbitmap visited (last_basic_block_for_fn (cfun));
+ auto_sbitmap visited (last_basic_block_for_fn (fun));
bitmap_clear (visited);
n = pre_and_rev_post_order_compute_fn (fun, NULL, rpo, true);
for (i = n_basic_blocks_for_fn (fun) - n;
i < n_basic_blocks_for_fn (fun); i++)
{
- basic_block bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]);
+ basic_block bb = BASIC_BLOCK_FOR_FN (fun, rpo[i]);
draw_cfg_node (pp, fun->funcdef_no, bb);
bitmap_set_bit (visited, bb->index);
}
@@ -248,7 +248,8 @@ draw_cfg_nodes_for_loop (pretty_printer *pp, int funcdef_no,
static void
draw_cfg_nodes (pretty_printer *pp, struct function *fun)
{
- if (loops_for_fn (fun))
+ /* ??? The loop and dominance APIs are dependent on fun == cfun. */
+ if (fun == cfun && loops_for_fn (fun))
draw_cfg_nodes_for_loop (pp, fun->funcdef_no, get_loop (fun, 0));
else
draw_cfg_nodes_no_loops (pp, fun);
@@ -267,7 +268,7 @@ draw_cfg_edges (pretty_printer *pp, struct function *fun)
edge e;
edge_iterator ei;
unsigned int idx = 0;
- FOR_EACH_BB_FN (bb, cfun)
+ FOR_EACH_BB_FN (bb, fun)
FOR_EACH_EDGE (e, ei, bb->succs)
{
if (e->flags & EDGE_DFS_BACK)
@@ -275,13 +276,13 @@ draw_cfg_edges (pretty_printer *pp, struct function *fun)
idx++;
}
- mark_dfs_back_edges ();
- FOR_ALL_BB_FN (bb, cfun)
+ mark_dfs_back_edges (fun);
+ FOR_ALL_BB_FN (bb, fun)
draw_cfg_node_succ_edges (pp, fun->funcdef_no, bb);
/* Restore EDGE_DFS_BACK flag from dfs_back. */
idx = 0;
- FOR_EACH_BB_FN (bb, cfun)
+ FOR_EACH_BB_FN (bb, fun)
FOR_EACH_EDGE (e, ei, bb->succs)
{
if (bitmap_bit_p (dfs_back, idx))