1*e4b17023SJohn Marino /* Instruction scheduling pass. Log dumping infrastructure.
2*e4b17023SJohn Marino Copyright (C) 2006, 2007, 2008, 2010 Free Software Foundation, Inc.
3*e4b17023SJohn Marino
4*e4b17023SJohn Marino This file is part of GCC.
5*e4b17023SJohn Marino
6*e4b17023SJohn Marino GCC is free software; you can redistribute it and/or modify it under
7*e4b17023SJohn Marino the terms of the GNU General Public License as published by the Free
8*e4b17023SJohn Marino Software Foundation; either version 3, or (at your option) any later
9*e4b17023SJohn Marino version.
10*e4b17023SJohn Marino
11*e4b17023SJohn Marino GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12*e4b17023SJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or
13*e4b17023SJohn Marino FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14*e4b17023SJohn Marino for more details.
15*e4b17023SJohn Marino
16*e4b17023SJohn Marino You should have received a copy of the GNU General Public License
17*e4b17023SJohn Marino along with GCC; see the file COPYING3. If not see
18*e4b17023SJohn Marino <http://www.gnu.org/licenses/>. */
19*e4b17023SJohn Marino
20*e4b17023SJohn Marino #include "config.h"
21*e4b17023SJohn Marino #include "system.h"
22*e4b17023SJohn Marino #include "coretypes.h"
23*e4b17023SJohn Marino #include "tm.h"
24*e4b17023SJohn Marino #include "diagnostic-core.h"
25*e4b17023SJohn Marino #include "rtl.h"
26*e4b17023SJohn Marino #include "tm_p.h"
27*e4b17023SJohn Marino #include "hard-reg-set.h"
28*e4b17023SJohn Marino #include "regs.h"
29*e4b17023SJohn Marino #include "function.h"
30*e4b17023SJohn Marino #include "flags.h"
31*e4b17023SJohn Marino #include "insn-config.h"
32*e4b17023SJohn Marino #include "insn-attr.h"
33*e4b17023SJohn Marino #include "params.h"
34*e4b17023SJohn Marino #include "output.h"
35*e4b17023SJohn Marino #include "basic-block.h"
36*e4b17023SJohn Marino #include "cselib.h"
37*e4b17023SJohn Marino #include "target.h"
38*e4b17023SJohn Marino
39*e4b17023SJohn Marino #ifdef INSN_SCHEDULING
40*e4b17023SJohn Marino #include "sel-sched-ir.h"
41*e4b17023SJohn Marino #include "sel-sched-dump.h"
42*e4b17023SJohn Marino
43*e4b17023SJohn Marino
44*e4b17023SJohn Marino /* These variables control high-level pretty printing. */
45*e4b17023SJohn Marino static int sel_dump_cfg_flags = SEL_DUMP_CFG_FLAGS;
46*e4b17023SJohn Marino static int sel_debug_cfg_flags = SEL_DUMP_CFG_FLAGS;
47*e4b17023SJohn Marino
48*e4b17023SJohn Marino /* True when a cfg should be dumped. */
49*e4b17023SJohn Marino static bool sel_dump_cfg_p;
50*e4b17023SJohn Marino
51*e4b17023SJohn Marino /* Variables that are used to build the cfg dump file name. */
52*e4b17023SJohn Marino static const char * const sel_debug_cfg_root = "./";
53*e4b17023SJohn Marino static const char * const sel_debug_cfg_root_postfix_default = "";
54*e4b17023SJohn Marino static const char *sel_debug_cfg_root_postfix = "";
55*e4b17023SJohn Marino static int sel_dump_cfg_fileno = -1;
56*e4b17023SJohn Marino static int sel_debug_cfg_fileno = -1;
57*e4b17023SJohn Marino
58*e4b17023SJohn Marino /* When this flag is on, we are dumping to the .dot file.
59*e4b17023SJohn Marino When it is off, we are dumping to log.
60*e4b17023SJohn Marino This is useful to differentiate formatting between log and .dot
61*e4b17023SJohn Marino files. */
62*e4b17023SJohn Marino bool sched_dump_to_dot_p = false;
63*e4b17023SJohn Marino
64*e4b17023SJohn Marino /* Controls how insns from a fence list should be dumped. */
65*e4b17023SJohn Marino static int dump_flist_insn_flags = (DUMP_INSN_UID | DUMP_INSN_BBN
66*e4b17023SJohn Marino | DUMP_INSN_SEQNO);
67*e4b17023SJohn Marino
68*e4b17023SJohn Marino
69*e4b17023SJohn Marino /* The variable used to hold the value of sched_dump when temporarily
70*e4b17023SJohn Marino switching dump output to the other source, e.g. the .dot file. */
71*e4b17023SJohn Marino static FILE *saved_sched_dump = NULL;
72*e4b17023SJohn Marino
73*e4b17023SJohn Marino /* Switch sched_dump to TO. It must not be called twice. */
74*e4b17023SJohn Marino static void
switch_dump(FILE * to)75*e4b17023SJohn Marino switch_dump (FILE *to)
76*e4b17023SJohn Marino {
77*e4b17023SJohn Marino gcc_assert (saved_sched_dump == NULL);
78*e4b17023SJohn Marino
79*e4b17023SJohn Marino saved_sched_dump = sched_dump;
80*e4b17023SJohn Marino sched_dump = to;
81*e4b17023SJohn Marino }
82*e4b17023SJohn Marino
83*e4b17023SJohn Marino /* Restore previously switched dump. */
84*e4b17023SJohn Marino static void
restore_dump(void)85*e4b17023SJohn Marino restore_dump (void)
86*e4b17023SJohn Marino {
87*e4b17023SJohn Marino sched_dump = saved_sched_dump;
88*e4b17023SJohn Marino saved_sched_dump = NULL;
89*e4b17023SJohn Marino }
90*e4b17023SJohn Marino
91*e4b17023SJohn Marino
92*e4b17023SJohn Marino /* Functions for dumping instructions, av sets, and exprs. */
93*e4b17023SJohn Marino
94*e4b17023SJohn Marino /* Default flags for dumping insns. */
95*e4b17023SJohn Marino static int dump_insn_rtx_flags = DUMP_INSN_RTX_PATTERN;
96*e4b17023SJohn Marino
97*e4b17023SJohn Marino /* Default flags for dumping vinsns. */
98*e4b17023SJohn Marino static int dump_vinsn_flags = (DUMP_VINSN_INSN_RTX | DUMP_VINSN_TYPE
99*e4b17023SJohn Marino | DUMP_VINSN_COUNT);
100*e4b17023SJohn Marino
101*e4b17023SJohn Marino /* Default flags for dumping expressions. */
102*e4b17023SJohn Marino static int dump_expr_flags = DUMP_EXPR_ALL;
103*e4b17023SJohn Marino
104*e4b17023SJohn Marino /* Default flags for dumping insns when debugging. */
105*e4b17023SJohn Marino static int debug_insn_rtx_flags = DUMP_INSN_RTX_ALL;
106*e4b17023SJohn Marino
107*e4b17023SJohn Marino /* Default flags for dumping vinsns when debugging. */
108*e4b17023SJohn Marino static int debug_vinsn_flags = DUMP_VINSN_ALL;
109*e4b17023SJohn Marino
110*e4b17023SJohn Marino /* Default flags for dumping expressions when debugging. */
111*e4b17023SJohn Marino static int debug_expr_flags = DUMP_EXPR_ALL;
112*e4b17023SJohn Marino
113*e4b17023SJohn Marino /* Controls how an insn from stream should be dumped when debugging. */
114*e4b17023SJohn Marino static int debug_insn_flags = DUMP_INSN_ALL;
115*e4b17023SJohn Marino
116*e4b17023SJohn Marino /* Print an rtx X. */
117*e4b17023SJohn Marino void
sel_print_rtl(rtx x)118*e4b17023SJohn Marino sel_print_rtl (rtx x)
119*e4b17023SJohn Marino {
120*e4b17023SJohn Marino print_rtl_single (sched_dump, x);
121*e4b17023SJohn Marino }
122*e4b17023SJohn Marino
123*e4b17023SJohn Marino /* Dump insn INSN honoring FLAGS. */
124*e4b17023SJohn Marino void
dump_insn_rtx_1(rtx insn,int flags)125*e4b17023SJohn Marino dump_insn_rtx_1 (rtx insn, int flags)
126*e4b17023SJohn Marino {
127*e4b17023SJohn Marino int all;
128*e4b17023SJohn Marino
129*e4b17023SJohn Marino /* flags == -1 also means dumping all. */
130*e4b17023SJohn Marino all = (flags & 1);;
131*e4b17023SJohn Marino if (all)
132*e4b17023SJohn Marino flags |= DUMP_INSN_RTX_ALL;
133*e4b17023SJohn Marino
134*e4b17023SJohn Marino sel_print ("(");
135*e4b17023SJohn Marino
136*e4b17023SJohn Marino if (flags & DUMP_INSN_RTX_UID)
137*e4b17023SJohn Marino sel_print ("%d;", INSN_UID (insn));
138*e4b17023SJohn Marino
139*e4b17023SJohn Marino if (flags & DUMP_INSN_RTX_PATTERN)
140*e4b17023SJohn Marino {
141*e4b17023SJohn Marino char buf[2048];
142*e4b17023SJohn Marino
143*e4b17023SJohn Marino print_insn (buf, insn, 0);
144*e4b17023SJohn Marino sel_print ("%s;", buf);
145*e4b17023SJohn Marino }
146*e4b17023SJohn Marino
147*e4b17023SJohn Marino if (flags & DUMP_INSN_RTX_BBN)
148*e4b17023SJohn Marino {
149*e4b17023SJohn Marino basic_block bb = BLOCK_FOR_INSN (insn);
150*e4b17023SJohn Marino
151*e4b17023SJohn Marino sel_print ("bb:%d;", bb != NULL ? bb->index : -1);
152*e4b17023SJohn Marino }
153*e4b17023SJohn Marino
154*e4b17023SJohn Marino sel_print (")");
155*e4b17023SJohn Marino }
156*e4b17023SJohn Marino
157*e4b17023SJohn Marino
158*e4b17023SJohn Marino /* Dump INSN with default flags. */
159*e4b17023SJohn Marino void
dump_insn_rtx(rtx insn)160*e4b17023SJohn Marino dump_insn_rtx (rtx insn)
161*e4b17023SJohn Marino {
162*e4b17023SJohn Marino dump_insn_rtx_1 (insn, dump_insn_rtx_flags);
163*e4b17023SJohn Marino }
164*e4b17023SJohn Marino
165*e4b17023SJohn Marino
166*e4b17023SJohn Marino /* Dump INSN to stderr. */
167*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn_rtx(rtx insn)168*e4b17023SJohn Marino debug_insn_rtx (rtx insn)
169*e4b17023SJohn Marino {
170*e4b17023SJohn Marino switch_dump (stderr);
171*e4b17023SJohn Marino dump_insn_rtx_1 (insn, debug_insn_rtx_flags);
172*e4b17023SJohn Marino sel_print ("\n");
173*e4b17023SJohn Marino restore_dump ();
174*e4b17023SJohn Marino }
175*e4b17023SJohn Marino
176*e4b17023SJohn Marino /* Dump vinsn VI honoring flags. */
177*e4b17023SJohn Marino void
dump_vinsn_1(vinsn_t vi,int flags)178*e4b17023SJohn Marino dump_vinsn_1 (vinsn_t vi, int flags)
179*e4b17023SJohn Marino {
180*e4b17023SJohn Marino int all;
181*e4b17023SJohn Marino
182*e4b17023SJohn Marino /* flags == -1 also means dumping all. */
183*e4b17023SJohn Marino all = flags & 1;
184*e4b17023SJohn Marino if (all)
185*e4b17023SJohn Marino flags |= DUMP_VINSN_ALL;
186*e4b17023SJohn Marino
187*e4b17023SJohn Marino sel_print ("(");
188*e4b17023SJohn Marino
189*e4b17023SJohn Marino if (flags & DUMP_VINSN_INSN_RTX)
190*e4b17023SJohn Marino dump_insn_rtx_1 (VINSN_INSN_RTX (vi), dump_insn_rtx_flags | all);
191*e4b17023SJohn Marino
192*e4b17023SJohn Marino if (flags & DUMP_VINSN_TYPE)
193*e4b17023SJohn Marino sel_print ("type:%s;", GET_RTX_NAME (VINSN_TYPE (vi)));
194*e4b17023SJohn Marino
195*e4b17023SJohn Marino if (flags & DUMP_VINSN_COUNT)
196*e4b17023SJohn Marino sel_print ("count:%d;", VINSN_COUNT (vi));
197*e4b17023SJohn Marino
198*e4b17023SJohn Marino if (flags & DUMP_VINSN_COST)
199*e4b17023SJohn Marino {
200*e4b17023SJohn Marino int cost = vi->cost;
201*e4b17023SJohn Marino
202*e4b17023SJohn Marino if (cost != -1)
203*e4b17023SJohn Marino sel_print ("cost:%d;", cost);
204*e4b17023SJohn Marino }
205*e4b17023SJohn Marino
206*e4b17023SJohn Marino sel_print (")");
207*e4b17023SJohn Marino }
208*e4b17023SJohn Marino
209*e4b17023SJohn Marino /* Dump vinsn VI with default flags. */
210*e4b17023SJohn Marino void
dump_vinsn(vinsn_t vi)211*e4b17023SJohn Marino dump_vinsn (vinsn_t vi)
212*e4b17023SJohn Marino {
213*e4b17023SJohn Marino dump_vinsn_1 (vi, dump_vinsn_flags);
214*e4b17023SJohn Marino }
215*e4b17023SJohn Marino
216*e4b17023SJohn Marino /* Dump vinsn VI to stderr. */
217*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_vinsn(vinsn_t vi)218*e4b17023SJohn Marino debug_vinsn (vinsn_t vi)
219*e4b17023SJohn Marino {
220*e4b17023SJohn Marino switch_dump (stderr);
221*e4b17023SJohn Marino dump_vinsn_1 (vi, debug_vinsn_flags);
222*e4b17023SJohn Marino sel_print ("\n");
223*e4b17023SJohn Marino restore_dump ();
224*e4b17023SJohn Marino }
225*e4b17023SJohn Marino
226*e4b17023SJohn Marino /* Dump EXPR honoring flags. */
227*e4b17023SJohn Marino void
dump_expr_1(expr_t expr,int flags)228*e4b17023SJohn Marino dump_expr_1 (expr_t expr, int flags)
229*e4b17023SJohn Marino {
230*e4b17023SJohn Marino int all;
231*e4b17023SJohn Marino
232*e4b17023SJohn Marino /* flags == -1 also means dumping all. */
233*e4b17023SJohn Marino all = flags & 1;
234*e4b17023SJohn Marino if (all)
235*e4b17023SJohn Marino flags |= DUMP_EXPR_ALL;
236*e4b17023SJohn Marino
237*e4b17023SJohn Marino sel_print ("[");
238*e4b17023SJohn Marino
239*e4b17023SJohn Marino if (flags & DUMP_EXPR_VINSN)
240*e4b17023SJohn Marino dump_vinsn_1 (EXPR_VINSN (expr), dump_vinsn_flags | all);
241*e4b17023SJohn Marino
242*e4b17023SJohn Marino if (flags & DUMP_EXPR_SPEC)
243*e4b17023SJohn Marino {
244*e4b17023SJohn Marino int spec = EXPR_SPEC (expr);
245*e4b17023SJohn Marino
246*e4b17023SJohn Marino if (spec != 0)
247*e4b17023SJohn Marino sel_print ("spec:%d;", spec);
248*e4b17023SJohn Marino }
249*e4b17023SJohn Marino
250*e4b17023SJohn Marino if (flags & DUMP_EXPR_USEFULNESS)
251*e4b17023SJohn Marino {
252*e4b17023SJohn Marino int use = EXPR_USEFULNESS (expr);
253*e4b17023SJohn Marino
254*e4b17023SJohn Marino if (use != REG_BR_PROB_BASE)
255*e4b17023SJohn Marino sel_print ("use:%d;", use);
256*e4b17023SJohn Marino }
257*e4b17023SJohn Marino
258*e4b17023SJohn Marino if (flags & DUMP_EXPR_PRIORITY)
259*e4b17023SJohn Marino sel_print ("prio:%d;", EXPR_PRIORITY (expr));
260*e4b17023SJohn Marino
261*e4b17023SJohn Marino if (flags & DUMP_EXPR_SCHED_TIMES)
262*e4b17023SJohn Marino {
263*e4b17023SJohn Marino int times = EXPR_SCHED_TIMES (expr);
264*e4b17023SJohn Marino
265*e4b17023SJohn Marino if (times != 0)
266*e4b17023SJohn Marino sel_print ("times:%d;", times);
267*e4b17023SJohn Marino }
268*e4b17023SJohn Marino
269*e4b17023SJohn Marino if (flags & DUMP_EXPR_SPEC_DONE_DS)
270*e4b17023SJohn Marino {
271*e4b17023SJohn Marino ds_t spec_done_ds = EXPR_SPEC_DONE_DS (expr);
272*e4b17023SJohn Marino
273*e4b17023SJohn Marino if (spec_done_ds != 0)
274*e4b17023SJohn Marino sel_print ("ds:%d;", spec_done_ds);
275*e4b17023SJohn Marino }
276*e4b17023SJohn Marino
277*e4b17023SJohn Marino if (flags & DUMP_EXPR_ORIG_BB)
278*e4b17023SJohn Marino {
279*e4b17023SJohn Marino int orig_bb = EXPR_ORIG_BB_INDEX (expr);
280*e4b17023SJohn Marino
281*e4b17023SJohn Marino if (orig_bb != 0)
282*e4b17023SJohn Marino sel_print ("orig_bb:%d;", orig_bb);
283*e4b17023SJohn Marino }
284*e4b17023SJohn Marino
285*e4b17023SJohn Marino if (EXPR_TARGET_AVAILABLE (expr) < 1)
286*e4b17023SJohn Marino sel_print ("target:%d;", EXPR_TARGET_AVAILABLE (expr));
287*e4b17023SJohn Marino sel_print ("]");
288*e4b17023SJohn Marino }
289*e4b17023SJohn Marino
290*e4b17023SJohn Marino /* Dump expression EXPR with default flags. */
291*e4b17023SJohn Marino void
dump_expr(expr_t expr)292*e4b17023SJohn Marino dump_expr (expr_t expr)
293*e4b17023SJohn Marino {
294*e4b17023SJohn Marino dump_expr_1 (expr, dump_expr_flags);
295*e4b17023SJohn Marino }
296*e4b17023SJohn Marino
297*e4b17023SJohn Marino /* Dump expression EXPR to stderr. */
298*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_expr(expr_t expr)299*e4b17023SJohn Marino debug_expr (expr_t expr)
300*e4b17023SJohn Marino {
301*e4b17023SJohn Marino switch_dump (stderr);
302*e4b17023SJohn Marino dump_expr_1 (expr, debug_expr_flags);
303*e4b17023SJohn Marino sel_print ("\n");
304*e4b17023SJohn Marino restore_dump ();
305*e4b17023SJohn Marino }
306*e4b17023SJohn Marino
307*e4b17023SJohn Marino /* Dump insn I honoring FLAGS. */
308*e4b17023SJohn Marino void
dump_insn_1(insn_t i,int flags)309*e4b17023SJohn Marino dump_insn_1 (insn_t i, int flags)
310*e4b17023SJohn Marino {
311*e4b17023SJohn Marino int all;
312*e4b17023SJohn Marino
313*e4b17023SJohn Marino all = flags & 1;
314*e4b17023SJohn Marino if (all)
315*e4b17023SJohn Marino flags |= DUMP_INSN_ALL;
316*e4b17023SJohn Marino
317*e4b17023SJohn Marino if (!sched_dump_to_dot_p)
318*e4b17023SJohn Marino sel_print ("(");
319*e4b17023SJohn Marino
320*e4b17023SJohn Marino if (flags & DUMP_INSN_EXPR)
321*e4b17023SJohn Marino {
322*e4b17023SJohn Marino dump_expr_1 (INSN_EXPR (i), dump_expr_flags | all);
323*e4b17023SJohn Marino sel_print (";");
324*e4b17023SJohn Marino }
325*e4b17023SJohn Marino else if (flags & DUMP_INSN_PATTERN)
326*e4b17023SJohn Marino {
327*e4b17023SJohn Marino dump_insn_rtx_1 (i, DUMP_INSN_RTX_PATTERN | all);
328*e4b17023SJohn Marino sel_print (";");
329*e4b17023SJohn Marino }
330*e4b17023SJohn Marino else if (flags & DUMP_INSN_UID)
331*e4b17023SJohn Marino sel_print ("uid:%d;", INSN_UID (i));
332*e4b17023SJohn Marino
333*e4b17023SJohn Marino if (flags & DUMP_INSN_SEQNO)
334*e4b17023SJohn Marino sel_print ("seqno:%d;", INSN_SEQNO (i));
335*e4b17023SJohn Marino
336*e4b17023SJohn Marino if (flags & DUMP_INSN_SCHED_CYCLE)
337*e4b17023SJohn Marino {
338*e4b17023SJohn Marino int cycle = INSN_SCHED_CYCLE (i);
339*e4b17023SJohn Marino
340*e4b17023SJohn Marino if (cycle != 0)
341*e4b17023SJohn Marino sel_print ("cycle:%d;", cycle);
342*e4b17023SJohn Marino }
343*e4b17023SJohn Marino
344*e4b17023SJohn Marino if (!sched_dump_to_dot_p)
345*e4b17023SJohn Marino sel_print (")");
346*e4b17023SJohn Marino }
347*e4b17023SJohn Marino
348*e4b17023SJohn Marino /* Dump insn I with default flags. */
349*e4b17023SJohn Marino void
dump_insn(insn_t i)350*e4b17023SJohn Marino dump_insn (insn_t i)
351*e4b17023SJohn Marino {
352*e4b17023SJohn Marino dump_insn_1 (i, DUMP_INSN_EXPR | DUMP_INSN_SCHED_CYCLE);
353*e4b17023SJohn Marino }
354*e4b17023SJohn Marino
355*e4b17023SJohn Marino /* Dump INSN to stderr. */
356*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn(insn_t insn)357*e4b17023SJohn Marino debug_insn (insn_t insn)
358*e4b17023SJohn Marino {
359*e4b17023SJohn Marino switch_dump (stderr);
360*e4b17023SJohn Marino dump_insn_1 (insn, debug_insn_flags);
361*e4b17023SJohn Marino sel_print ("\n");
362*e4b17023SJohn Marino restore_dump ();
363*e4b17023SJohn Marino }
364*e4b17023SJohn Marino
365*e4b17023SJohn Marino /* Dumps av_set AV. */
366*e4b17023SJohn Marino void
dump_av_set(av_set_t av)367*e4b17023SJohn Marino dump_av_set (av_set_t av)
368*e4b17023SJohn Marino {
369*e4b17023SJohn Marino av_set_iterator i;
370*e4b17023SJohn Marino expr_t expr;
371*e4b17023SJohn Marino
372*e4b17023SJohn Marino if (!sched_dump_to_dot_p)
373*e4b17023SJohn Marino sel_print ("{");
374*e4b17023SJohn Marino
375*e4b17023SJohn Marino FOR_EACH_EXPR (expr, i, av)
376*e4b17023SJohn Marino {
377*e4b17023SJohn Marino dump_expr (expr);
378*e4b17023SJohn Marino if (!sched_dump_to_dot_p)
379*e4b17023SJohn Marino sel_print (" ");
380*e4b17023SJohn Marino else
381*e4b17023SJohn Marino sel_print ("\n");
382*e4b17023SJohn Marino }
383*e4b17023SJohn Marino
384*e4b17023SJohn Marino if (!sched_dump_to_dot_p)
385*e4b17023SJohn Marino sel_print ("}");
386*e4b17023SJohn Marino }
387*e4b17023SJohn Marino
388*e4b17023SJohn Marino /* Dumps lvset LV. */
389*e4b17023SJohn Marino void
dump_lv_set(regset lv)390*e4b17023SJohn Marino dump_lv_set (regset lv)
391*e4b17023SJohn Marino {
392*e4b17023SJohn Marino sel_print ("{");
393*e4b17023SJohn Marino
394*e4b17023SJohn Marino /* This code was adapted from cfg.c: dump_regset (). */
395*e4b17023SJohn Marino if (lv == NULL)
396*e4b17023SJohn Marino sel_print ("nil");
397*e4b17023SJohn Marino else
398*e4b17023SJohn Marino {
399*e4b17023SJohn Marino unsigned i;
400*e4b17023SJohn Marino reg_set_iterator rsi;
401*e4b17023SJohn Marino int count = 0;
402*e4b17023SJohn Marino
403*e4b17023SJohn Marino EXECUTE_IF_SET_IN_REG_SET (lv, 0, i, rsi)
404*e4b17023SJohn Marino {
405*e4b17023SJohn Marino sel_print (" %d", i);
406*e4b17023SJohn Marino if (i < FIRST_PSEUDO_REGISTER)
407*e4b17023SJohn Marino {
408*e4b17023SJohn Marino sel_print (" [%s]", reg_names[i]);
409*e4b17023SJohn Marino ++count;
410*e4b17023SJohn Marino }
411*e4b17023SJohn Marino
412*e4b17023SJohn Marino ++count;
413*e4b17023SJohn Marino
414*e4b17023SJohn Marino if (sched_dump_to_dot_p && count == 12)
415*e4b17023SJohn Marino {
416*e4b17023SJohn Marino count = 0;
417*e4b17023SJohn Marino sel_print ("\n");
418*e4b17023SJohn Marino }
419*e4b17023SJohn Marino }
420*e4b17023SJohn Marino }
421*e4b17023SJohn Marino
422*e4b17023SJohn Marino sel_print ("}\n");
423*e4b17023SJohn Marino }
424*e4b17023SJohn Marino
425*e4b17023SJohn Marino /* Dumps a list of instructions pointed to by P. */
426*e4b17023SJohn Marino static void
dump_ilist(ilist_t p)427*e4b17023SJohn Marino dump_ilist (ilist_t p)
428*e4b17023SJohn Marino {
429*e4b17023SJohn Marino while (p)
430*e4b17023SJohn Marino {
431*e4b17023SJohn Marino dump_insn (ILIST_INSN (p));
432*e4b17023SJohn Marino p = ILIST_NEXT (p);
433*e4b17023SJohn Marino }
434*e4b17023SJohn Marino }
435*e4b17023SJohn Marino
436*e4b17023SJohn Marino /* Dumps a list of boundaries pointed to by BNDS. */
437*e4b17023SJohn Marino void
dump_blist(blist_t bnds)438*e4b17023SJohn Marino dump_blist (blist_t bnds)
439*e4b17023SJohn Marino {
440*e4b17023SJohn Marino for (; bnds; bnds = BLIST_NEXT (bnds))
441*e4b17023SJohn Marino {
442*e4b17023SJohn Marino bnd_t bnd = BLIST_BND (bnds);
443*e4b17023SJohn Marino
444*e4b17023SJohn Marino sel_print ("[to: %d; ptr: ", INSN_UID (BND_TO (bnd)));
445*e4b17023SJohn Marino dump_ilist (BND_PTR (bnd));
446*e4b17023SJohn Marino sel_print ("] ");
447*e4b17023SJohn Marino }
448*e4b17023SJohn Marino }
449*e4b17023SJohn Marino
450*e4b17023SJohn Marino /* Dumps a list of fences pointed to by L. */
451*e4b17023SJohn Marino void
dump_flist(flist_t l)452*e4b17023SJohn Marino dump_flist (flist_t l)
453*e4b17023SJohn Marino {
454*e4b17023SJohn Marino while (l)
455*e4b17023SJohn Marino {
456*e4b17023SJohn Marino dump_insn_1 (FENCE_INSN (FLIST_FENCE (l)), dump_flist_insn_flags);
457*e4b17023SJohn Marino sel_print (" ");
458*e4b17023SJohn Marino l = FLIST_NEXT (l);
459*e4b17023SJohn Marino }
460*e4b17023SJohn Marino }
461*e4b17023SJohn Marino
462*e4b17023SJohn Marino /* Dumps an insn vector SUCCS. */
463*e4b17023SJohn Marino void
dump_insn_vector(rtx_vec_t succs)464*e4b17023SJohn Marino dump_insn_vector (rtx_vec_t succs)
465*e4b17023SJohn Marino {
466*e4b17023SJohn Marino int i;
467*e4b17023SJohn Marino rtx succ;
468*e4b17023SJohn Marino
469*e4b17023SJohn Marino FOR_EACH_VEC_ELT (rtx, succs, i, succ)
470*e4b17023SJohn Marino if (succ)
471*e4b17023SJohn Marino dump_insn (succ);
472*e4b17023SJohn Marino else
473*e4b17023SJohn Marino sel_print ("NULL ");
474*e4b17023SJohn Marino }
475*e4b17023SJohn Marino
476*e4b17023SJohn Marino /* Dumps a hard reg set SET to FILE using PREFIX. */
477*e4b17023SJohn Marino static void
print_hard_reg_set(FILE * file,const char * prefix,HARD_REG_SET set)478*e4b17023SJohn Marino print_hard_reg_set (FILE *file, const char *prefix, HARD_REG_SET set)
479*e4b17023SJohn Marino {
480*e4b17023SJohn Marino int i;
481*e4b17023SJohn Marino
482*e4b17023SJohn Marino fprintf (file, "%s{ ", prefix);
483*e4b17023SJohn Marino for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
484*e4b17023SJohn Marino {
485*e4b17023SJohn Marino if (TEST_HARD_REG_BIT (set, i))
486*e4b17023SJohn Marino fprintf (file, "%d ", i);
487*e4b17023SJohn Marino }
488*e4b17023SJohn Marino fprintf (file, "}\n");
489*e4b17023SJohn Marino }
490*e4b17023SJohn Marino
491*e4b17023SJohn Marino /* Dumps a hard reg set SET using PREFIX. */
492*e4b17023SJohn Marino void
dump_hard_reg_set(const char * prefix,HARD_REG_SET set)493*e4b17023SJohn Marino dump_hard_reg_set (const char *prefix, HARD_REG_SET set)
494*e4b17023SJohn Marino {
495*e4b17023SJohn Marino print_hard_reg_set (sched_dump, prefix, set);
496*e4b17023SJohn Marino }
497*e4b17023SJohn Marino
498*e4b17023SJohn Marino /* Pretty print INSN. This is used as a hook. */
499*e4b17023SJohn Marino const char *
sel_print_insn(const_rtx insn,int aligned ATTRIBUTE_UNUSED)500*e4b17023SJohn Marino sel_print_insn (const_rtx insn, int aligned ATTRIBUTE_UNUSED)
501*e4b17023SJohn Marino {
502*e4b17023SJohn Marino static char buf[80];
503*e4b17023SJohn Marino
504*e4b17023SJohn Marino /* '+' before insn means it is a new cycle start and it's not been
505*e4b17023SJohn Marino scheduled yet. '>' - has been scheduled. */
506*e4b17023SJohn Marino if (s_i_d && INSN_LUID (insn) > 0)
507*e4b17023SJohn Marino if (GET_MODE (insn) == TImode)
508*e4b17023SJohn Marino sprintf (buf, "%s %4d",
509*e4b17023SJohn Marino INSN_SCHED_TIMES (insn) > 0 ? "> " : "< ",
510*e4b17023SJohn Marino INSN_UID (insn));
511*e4b17023SJohn Marino else
512*e4b17023SJohn Marino sprintf (buf, "%s %4d",
513*e4b17023SJohn Marino INSN_SCHED_TIMES (insn) > 0 ? "! " : " ",
514*e4b17023SJohn Marino INSN_UID (insn));
515*e4b17023SJohn Marino else
516*e4b17023SJohn Marino if (GET_MODE (insn) == TImode)
517*e4b17023SJohn Marino sprintf (buf, "+ %4d", INSN_UID (insn));
518*e4b17023SJohn Marino else
519*e4b17023SJohn Marino sprintf (buf, " %4d", INSN_UID (insn));
520*e4b17023SJohn Marino
521*e4b17023SJohn Marino return buf;
522*e4b17023SJohn Marino }
523*e4b17023SJohn Marino
524*e4b17023SJohn Marino
525*e4b17023SJohn Marino /* Functions for pretty printing of CFG. */
526*e4b17023SJohn Marino
527*e4b17023SJohn Marino /* Replace all occurencies of STR1 to STR2 in BUF.
528*e4b17023SJohn Marino The BUF must be large enough to hold the result. */
529*e4b17023SJohn Marino static void
replace_str_in_buf(char * buf,const char * str1,const char * str2)530*e4b17023SJohn Marino replace_str_in_buf (char *buf, const char *str1, const char *str2)
531*e4b17023SJohn Marino {
532*e4b17023SJohn Marino int buf_len = strlen (buf);
533*e4b17023SJohn Marino int str1_len = strlen (str1);
534*e4b17023SJohn Marino int str2_len = strlen (str2);
535*e4b17023SJohn Marino int diff = str2_len - str1_len;
536*e4b17023SJohn Marino
537*e4b17023SJohn Marino char *p = buf;
538*e4b17023SJohn Marino do
539*e4b17023SJohn Marino {
540*e4b17023SJohn Marino p = strstr (p, str1);
541*e4b17023SJohn Marino if (p)
542*e4b17023SJohn Marino {
543*e4b17023SJohn Marino char *p1 = p + str1_len;
544*e4b17023SJohn Marino /* Copy the rest of buf and '\0'. */
545*e4b17023SJohn Marino int n = buf + buf_len - p1;
546*e4b17023SJohn Marino int i;
547*e4b17023SJohn Marino
548*e4b17023SJohn Marino /* Shift str by DIFF chars. */
549*e4b17023SJohn Marino if (diff > 0)
550*e4b17023SJohn Marino for (i = n; i >= 0; i--)
551*e4b17023SJohn Marino p1[i + diff] = p1[i];
552*e4b17023SJohn Marino else
553*e4b17023SJohn Marino for (i = 0; i <= n; i++)
554*e4b17023SJohn Marino p1[i + diff] = p1[i];
555*e4b17023SJohn Marino
556*e4b17023SJohn Marino /* Copy str2. */
557*e4b17023SJohn Marino for (i = 0; i < str2_len; i++)
558*e4b17023SJohn Marino p[i] = str2[i];
559*e4b17023SJohn Marino
560*e4b17023SJohn Marino p += str2_len;
561*e4b17023SJohn Marino buf_len += diff;
562*e4b17023SJohn Marino }
563*e4b17023SJohn Marino
564*e4b17023SJohn Marino }
565*e4b17023SJohn Marino while (p);
566*e4b17023SJohn Marino }
567*e4b17023SJohn Marino
568*e4b17023SJohn Marino /* Replace characters in BUF that have special meaning in .dot file. */
569*e4b17023SJohn Marino static void
sel_prepare_string_for_dot_label(char * buf)570*e4b17023SJohn Marino sel_prepare_string_for_dot_label (char *buf)
571*e4b17023SJohn Marino {
572*e4b17023SJohn Marino static char specials_from[7][2] = { "<", ">", "{", "|", "}", "\"",
573*e4b17023SJohn Marino "\n" };
574*e4b17023SJohn Marino static char specials_to[7][3] = { "\\<", "\\>", "\\{", "\\|", "\\}",
575*e4b17023SJohn Marino "\\\"", "\\l" };
576*e4b17023SJohn Marino unsigned i;
577*e4b17023SJohn Marino
578*e4b17023SJohn Marino for (i = 0; i < 7; i++)
579*e4b17023SJohn Marino replace_str_in_buf (buf, specials_from[i], specials_to[i]);
580*e4b17023SJohn Marino }
581*e4b17023SJohn Marino
582*e4b17023SJohn Marino /* This function acts like printf but dumps to the sched_dump file. */
583*e4b17023SJohn Marino void
sel_print(const char * fmt,...)584*e4b17023SJohn Marino sel_print (const char *fmt, ...)
585*e4b17023SJohn Marino {
586*e4b17023SJohn Marino va_list ap;
587*e4b17023SJohn Marino va_start (ap, fmt);
588*e4b17023SJohn Marino if (sched_dump_to_dot_p)
589*e4b17023SJohn Marino {
590*e4b17023SJohn Marino char *message;
591*e4b17023SJohn Marino if (vasprintf (&message, fmt, ap) >= 0 && message != NULL)
592*e4b17023SJohn Marino {
593*e4b17023SJohn Marino message = (char *) xrealloc (message, 2 * strlen (message) + 1);
594*e4b17023SJohn Marino sel_prepare_string_for_dot_label (message);
595*e4b17023SJohn Marino fprintf (sched_dump, "%s", message);
596*e4b17023SJohn Marino free (message);
597*e4b17023SJohn Marino }
598*e4b17023SJohn Marino }
599*e4b17023SJohn Marino else
600*e4b17023SJohn Marino vfprintf (sched_dump, fmt, ap);
601*e4b17023SJohn Marino va_end (ap);
602*e4b17023SJohn Marino }
603*e4b17023SJohn Marino
604*e4b17023SJohn Marino /* Dump INSN with FLAGS. */
605*e4b17023SJohn Marino static void
sel_dump_cfg_insn(insn_t insn,int flags)606*e4b17023SJohn Marino sel_dump_cfg_insn (insn_t insn, int flags)
607*e4b17023SJohn Marino {
608*e4b17023SJohn Marino int insn_flags = DUMP_INSN_UID | DUMP_INSN_PATTERN;
609*e4b17023SJohn Marino
610*e4b17023SJohn Marino if (sched_luids != NULL && INSN_LUID (insn) > 0)
611*e4b17023SJohn Marino {
612*e4b17023SJohn Marino if (flags & SEL_DUMP_CFG_INSN_SEQNO)
613*e4b17023SJohn Marino insn_flags |= DUMP_INSN_SEQNO | DUMP_INSN_SCHED_CYCLE | DUMP_INSN_EXPR;
614*e4b17023SJohn Marino }
615*e4b17023SJohn Marino
616*e4b17023SJohn Marino dump_insn_1 (insn, insn_flags);
617*e4b17023SJohn Marino }
618*e4b17023SJohn Marino
619*e4b17023SJohn Marino /* Dump E to the dot file F. */
620*e4b17023SJohn Marino static void
sel_dump_cfg_edge(FILE * f,edge e)621*e4b17023SJohn Marino sel_dump_cfg_edge (FILE *f, edge e)
622*e4b17023SJohn Marino {
623*e4b17023SJohn Marino int w;
624*e4b17023SJohn Marino const char *color;
625*e4b17023SJohn Marino
626*e4b17023SJohn Marino if (e->flags & EDGE_FALLTHRU)
627*e4b17023SJohn Marino {
628*e4b17023SJohn Marino w = 10;
629*e4b17023SJohn Marino color = ", color = red";
630*e4b17023SJohn Marino }
631*e4b17023SJohn Marino else if (e->src->next_bb == e->dest)
632*e4b17023SJohn Marino {
633*e4b17023SJohn Marino w = 3;
634*e4b17023SJohn Marino color = ", color = blue";
635*e4b17023SJohn Marino }
636*e4b17023SJohn Marino else
637*e4b17023SJohn Marino {
638*e4b17023SJohn Marino w = 1;
639*e4b17023SJohn Marino color = "";
640*e4b17023SJohn Marino }
641*e4b17023SJohn Marino
642*e4b17023SJohn Marino fprintf (f, "\tbb%d -> bb%d [weight = %d%s];\n",
643*e4b17023SJohn Marino e->src->index, e->dest->index, w, color);
644*e4b17023SJohn Marino }
645*e4b17023SJohn Marino
646*e4b17023SJohn Marino
647*e4b17023SJohn Marino /* Return true if BB has a predesessor from current region.
648*e4b17023SJohn Marino TODO: Either make this function to trace back through empty block
649*e4b17023SJohn Marino or just remove those empty blocks. */
650*e4b17023SJohn Marino static bool
has_preds_in_current_region_p(basic_block bb)651*e4b17023SJohn Marino has_preds_in_current_region_p (basic_block bb)
652*e4b17023SJohn Marino {
653*e4b17023SJohn Marino edge e;
654*e4b17023SJohn Marino edge_iterator ei;
655*e4b17023SJohn Marino
656*e4b17023SJohn Marino gcc_assert (!in_current_region_p (bb));
657*e4b17023SJohn Marino
658*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->preds)
659*e4b17023SJohn Marino if (in_current_region_p (e->src))
660*e4b17023SJohn Marino return true;
661*e4b17023SJohn Marino
662*e4b17023SJohn Marino return false;
663*e4b17023SJohn Marino }
664*e4b17023SJohn Marino
665*e4b17023SJohn Marino /* Dump a cfg region to the dot file F honoring FLAGS. */
666*e4b17023SJohn Marino static void
sel_dump_cfg_2(FILE * f,int flags)667*e4b17023SJohn Marino sel_dump_cfg_2 (FILE *f, int flags)
668*e4b17023SJohn Marino {
669*e4b17023SJohn Marino basic_block bb;
670*e4b17023SJohn Marino
671*e4b17023SJohn Marino sched_dump_to_dot_p = true;
672*e4b17023SJohn Marino switch_dump (f);
673*e4b17023SJohn Marino
674*e4b17023SJohn Marino fprintf (f, "digraph G {\n"
675*e4b17023SJohn Marino "\tratio = 2.25;\n"
676*e4b17023SJohn Marino "\tnode [shape = record, fontsize = 9];\n");
677*e4b17023SJohn Marino
678*e4b17023SJohn Marino if (flags & SEL_DUMP_CFG_FUNCTION_NAME)
679*e4b17023SJohn Marino fprintf (f, "function [label = \"%s\"];\n", current_function_name ());
680*e4b17023SJohn Marino
681*e4b17023SJohn Marino FOR_EACH_BB (bb)
682*e4b17023SJohn Marino {
683*e4b17023SJohn Marino insn_t insn = BB_HEAD (bb);
684*e4b17023SJohn Marino insn_t next_tail = NEXT_INSN (BB_END (bb));
685*e4b17023SJohn Marino edge e;
686*e4b17023SJohn Marino edge_iterator ei;
687*e4b17023SJohn Marino bool in_region_p = ((flags & SEL_DUMP_CFG_CURRENT_REGION)
688*e4b17023SJohn Marino && in_current_region_p (bb));
689*e4b17023SJohn Marino bool full_p = (!(flags & SEL_DUMP_CFG_CURRENT_REGION)
690*e4b17023SJohn Marino || in_region_p);
691*e4b17023SJohn Marino bool some_p = full_p || has_preds_in_current_region_p (bb);
692*e4b17023SJohn Marino const char *color;
693*e4b17023SJohn Marino const char *style;
694*e4b17023SJohn Marino
695*e4b17023SJohn Marino if (!some_p)
696*e4b17023SJohn Marino continue;
697*e4b17023SJohn Marino
698*e4b17023SJohn Marino if ((flags & SEL_DUMP_CFG_CURRENT_REGION)
699*e4b17023SJohn Marino && in_current_region_p (bb)
700*e4b17023SJohn Marino && BLOCK_TO_BB (bb->index) == 0)
701*e4b17023SJohn Marino color = "color = green, ";
702*e4b17023SJohn Marino else
703*e4b17023SJohn Marino color = "";
704*e4b17023SJohn Marino
705*e4b17023SJohn Marino if ((flags & SEL_DUMP_CFG_FENCES)
706*e4b17023SJohn Marino && in_region_p)
707*e4b17023SJohn Marino {
708*e4b17023SJohn Marino style = "";
709*e4b17023SJohn Marino
710*e4b17023SJohn Marino if (!sel_bb_empty_p (bb))
711*e4b17023SJohn Marino {
712*e4b17023SJohn Marino bool first_p = true;
713*e4b17023SJohn Marino insn_t tail = BB_END (bb);
714*e4b17023SJohn Marino insn_t cur_insn;
715*e4b17023SJohn Marino
716*e4b17023SJohn Marino cur_insn = bb_note (bb);
717*e4b17023SJohn Marino
718*e4b17023SJohn Marino do
719*e4b17023SJohn Marino {
720*e4b17023SJohn Marino fence_t fence;
721*e4b17023SJohn Marino
722*e4b17023SJohn Marino cur_insn = NEXT_INSN (cur_insn);
723*e4b17023SJohn Marino fence = flist_lookup (fences, cur_insn);
724*e4b17023SJohn Marino
725*e4b17023SJohn Marino if (fence != NULL)
726*e4b17023SJohn Marino {
727*e4b17023SJohn Marino if (!FENCE_SCHEDULED_P (fence))
728*e4b17023SJohn Marino {
729*e4b17023SJohn Marino if (first_p)
730*e4b17023SJohn Marino color = "color = red, ";
731*e4b17023SJohn Marino else
732*e4b17023SJohn Marino color = "color = yellow, ";
733*e4b17023SJohn Marino }
734*e4b17023SJohn Marino else
735*e4b17023SJohn Marino color = "color = blue, ";
736*e4b17023SJohn Marino }
737*e4b17023SJohn Marino
738*e4b17023SJohn Marino first_p = false;
739*e4b17023SJohn Marino }
740*e4b17023SJohn Marino while (cur_insn != tail);
741*e4b17023SJohn Marino }
742*e4b17023SJohn Marino }
743*e4b17023SJohn Marino else if (!full_p)
744*e4b17023SJohn Marino style = "style = dashed, ";
745*e4b17023SJohn Marino else
746*e4b17023SJohn Marino style = "";
747*e4b17023SJohn Marino
748*e4b17023SJohn Marino fprintf (f, "\tbb%d [%s%slabel = \"{Basic block %d", bb->index,
749*e4b17023SJohn Marino style, color, bb->index);
750*e4b17023SJohn Marino
751*e4b17023SJohn Marino if ((flags & SEL_DUMP_CFG_BB_LOOP)
752*e4b17023SJohn Marino && bb->loop_father != NULL)
753*e4b17023SJohn Marino fprintf (f, ", loop %d", bb->loop_father->num);
754*e4b17023SJohn Marino
755*e4b17023SJohn Marino if (full_p
756*e4b17023SJohn Marino && (flags & SEL_DUMP_CFG_BB_NOTES_LIST))
757*e4b17023SJohn Marino {
758*e4b17023SJohn Marino insn_t notes = BB_NOTE_LIST (bb);
759*e4b17023SJohn Marino
760*e4b17023SJohn Marino if (notes != NULL_RTX)
761*e4b17023SJohn Marino {
762*e4b17023SJohn Marino fprintf (f, "|");
763*e4b17023SJohn Marino
764*e4b17023SJohn Marino /* For simplicity, we dump notes from note_list in reversed order
765*e4b17023SJohn Marino to that what they will appear in the code. */
766*e4b17023SJohn Marino while (notes != NULL_RTX)
767*e4b17023SJohn Marino {
768*e4b17023SJohn Marino sel_dump_cfg_insn (notes, flags);
769*e4b17023SJohn Marino fprintf (f, "\\l");
770*e4b17023SJohn Marino
771*e4b17023SJohn Marino notes = PREV_INSN (notes);
772*e4b17023SJohn Marino }
773*e4b17023SJohn Marino }
774*e4b17023SJohn Marino }
775*e4b17023SJohn Marino
776*e4b17023SJohn Marino if (full_p
777*e4b17023SJohn Marino && (flags & SEL_DUMP_CFG_AV_SET)
778*e4b17023SJohn Marino && in_current_region_p (bb)
779*e4b17023SJohn Marino && !sel_bb_empty_p (bb))
780*e4b17023SJohn Marino {
781*e4b17023SJohn Marino fprintf (f, "|");
782*e4b17023SJohn Marino
783*e4b17023SJohn Marino if (BB_AV_SET_VALID_P (bb))
784*e4b17023SJohn Marino dump_av_set (BB_AV_SET (bb));
785*e4b17023SJohn Marino else if (BB_AV_LEVEL (bb) == -1)
786*e4b17023SJohn Marino fprintf (f, "AV_SET needs update");
787*e4b17023SJohn Marino }
788*e4b17023SJohn Marino
789*e4b17023SJohn Marino if ((flags & SEL_DUMP_CFG_LV_SET)
790*e4b17023SJohn Marino && !sel_bb_empty_p (bb))
791*e4b17023SJohn Marino {
792*e4b17023SJohn Marino fprintf (f, "|");
793*e4b17023SJohn Marino
794*e4b17023SJohn Marino if (BB_LV_SET_VALID_P (bb))
795*e4b17023SJohn Marino dump_lv_set (BB_LV_SET (bb));
796*e4b17023SJohn Marino else
797*e4b17023SJohn Marino fprintf (f, "LV_SET needs update");
798*e4b17023SJohn Marino }
799*e4b17023SJohn Marino
800*e4b17023SJohn Marino if (full_p
801*e4b17023SJohn Marino && (flags & SEL_DUMP_CFG_BB_INSNS))
802*e4b17023SJohn Marino {
803*e4b17023SJohn Marino fprintf (f, "|");
804*e4b17023SJohn Marino while (insn != next_tail)
805*e4b17023SJohn Marino {
806*e4b17023SJohn Marino sel_dump_cfg_insn (insn, flags);
807*e4b17023SJohn Marino fprintf (f, "\\l");
808*e4b17023SJohn Marino
809*e4b17023SJohn Marino insn = NEXT_INSN (insn);
810*e4b17023SJohn Marino }
811*e4b17023SJohn Marino }
812*e4b17023SJohn Marino
813*e4b17023SJohn Marino fprintf (f, "}\"];\n");
814*e4b17023SJohn Marino
815*e4b17023SJohn Marino FOR_EACH_EDGE (e, ei, bb->succs)
816*e4b17023SJohn Marino if (full_p || in_current_region_p (e->dest))
817*e4b17023SJohn Marino sel_dump_cfg_edge (f, e);
818*e4b17023SJohn Marino }
819*e4b17023SJohn Marino
820*e4b17023SJohn Marino fprintf (f, "}");
821*e4b17023SJohn Marino
822*e4b17023SJohn Marino restore_dump ();
823*e4b17023SJohn Marino sched_dump_to_dot_p = false;
824*e4b17023SJohn Marino }
825*e4b17023SJohn Marino
826*e4b17023SJohn Marino /* Dump a cfg region to the file specified by TAG honoring flags.
827*e4b17023SJohn Marino The file is created by the function. */
828*e4b17023SJohn Marino static void
sel_dump_cfg_1(const char * tag,int flags)829*e4b17023SJohn Marino sel_dump_cfg_1 (const char *tag, int flags)
830*e4b17023SJohn Marino {
831*e4b17023SJohn Marino char *buf;
832*e4b17023SJohn Marino int i;
833*e4b17023SJohn Marino FILE *f;
834*e4b17023SJohn Marino
835*e4b17023SJohn Marino ++sel_dump_cfg_fileno;
836*e4b17023SJohn Marino
837*e4b17023SJohn Marino if (!sel_dump_cfg_p)
838*e4b17023SJohn Marino return;
839*e4b17023SJohn Marino
840*e4b17023SJohn Marino i = 1 + snprintf (NULL, 0, "%s/%s%05d-%s.dot", sel_debug_cfg_root,
841*e4b17023SJohn Marino sel_debug_cfg_root_postfix, sel_dump_cfg_fileno, tag);
842*e4b17023SJohn Marino buf = XNEWVEC (char, i);
843*e4b17023SJohn Marino snprintf (buf, i, "%s/%s%05d-%s.dot", sel_debug_cfg_root,
844*e4b17023SJohn Marino sel_debug_cfg_root_postfix, sel_dump_cfg_fileno, tag);
845*e4b17023SJohn Marino
846*e4b17023SJohn Marino f = fopen (buf, "w");
847*e4b17023SJohn Marino
848*e4b17023SJohn Marino if (f == NULL)
849*e4b17023SJohn Marino fprintf (stderr, "Can't create file: %s.\n", buf);
850*e4b17023SJohn Marino else
851*e4b17023SJohn Marino {
852*e4b17023SJohn Marino sel_dump_cfg_2 (f, flags);
853*e4b17023SJohn Marino
854*e4b17023SJohn Marino fclose (f);
855*e4b17023SJohn Marino }
856*e4b17023SJohn Marino
857*e4b17023SJohn Marino free (buf);
858*e4b17023SJohn Marino }
859*e4b17023SJohn Marino
860*e4b17023SJohn Marino /* Setup cfg dumping flags. Used for debugging. */
861*e4b17023SJohn Marino void
setup_dump_cfg_params(void)862*e4b17023SJohn Marino setup_dump_cfg_params (void)
863*e4b17023SJohn Marino {
864*e4b17023SJohn Marino sel_dump_cfg_flags = SEL_DUMP_CFG_FLAGS;
865*e4b17023SJohn Marino sel_dump_cfg_p = 0;
866*e4b17023SJohn Marino sel_debug_cfg_root_postfix = sel_debug_cfg_root_postfix_default;
867*e4b17023SJohn Marino }
868*e4b17023SJohn Marino
869*e4b17023SJohn Marino /* Debug a cfg region with FLAGS. */
870*e4b17023SJohn Marino void
sel_debug_cfg_1(int flags)871*e4b17023SJohn Marino sel_debug_cfg_1 (int flags)
872*e4b17023SJohn Marino {
873*e4b17023SJohn Marino bool t1 = sel_dump_cfg_p;
874*e4b17023SJohn Marino int t2 = sel_dump_cfg_fileno;
875*e4b17023SJohn Marino
876*e4b17023SJohn Marino sel_dump_cfg_p = true;
877*e4b17023SJohn Marino sel_dump_cfg_fileno = ++sel_debug_cfg_fileno;
878*e4b17023SJohn Marino
879*e4b17023SJohn Marino sel_dump_cfg_1 ("sel-debug-cfg", flags);
880*e4b17023SJohn Marino
881*e4b17023SJohn Marino sel_dump_cfg_fileno = t2;
882*e4b17023SJohn Marino sel_dump_cfg_p = t1;
883*e4b17023SJohn Marino }
884*e4b17023SJohn Marino
885*e4b17023SJohn Marino /* Dumps av_set AV to stderr. */
886*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_av_set(av_set_t av)887*e4b17023SJohn Marino debug_av_set (av_set_t av)
888*e4b17023SJohn Marino {
889*e4b17023SJohn Marino switch_dump (stderr);
890*e4b17023SJohn Marino dump_av_set (av);
891*e4b17023SJohn Marino sel_print ("\n");
892*e4b17023SJohn Marino restore_dump ();
893*e4b17023SJohn Marino }
894*e4b17023SJohn Marino
895*e4b17023SJohn Marino /* Dump LV to stderr. */
896*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_lv_set(regset lv)897*e4b17023SJohn Marino debug_lv_set (regset lv)
898*e4b17023SJohn Marino {
899*e4b17023SJohn Marino switch_dump (stderr);
900*e4b17023SJohn Marino dump_lv_set (lv);
901*e4b17023SJohn Marino sel_print ("\n");
902*e4b17023SJohn Marino restore_dump ();
903*e4b17023SJohn Marino }
904*e4b17023SJohn Marino
905*e4b17023SJohn Marino /* Dump an instruction list P to stderr. */
906*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_ilist(ilist_t p)907*e4b17023SJohn Marino debug_ilist (ilist_t p)
908*e4b17023SJohn Marino {
909*e4b17023SJohn Marino switch_dump (stderr);
910*e4b17023SJohn Marino dump_ilist (p);
911*e4b17023SJohn Marino sel_print ("\n");
912*e4b17023SJohn Marino restore_dump ();
913*e4b17023SJohn Marino }
914*e4b17023SJohn Marino
915*e4b17023SJohn Marino /* Dump a boundary list BNDS to stderr. */
916*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_blist(blist_t bnds)917*e4b17023SJohn Marino debug_blist (blist_t bnds)
918*e4b17023SJohn Marino {
919*e4b17023SJohn Marino switch_dump (stderr);
920*e4b17023SJohn Marino dump_blist (bnds);
921*e4b17023SJohn Marino sel_print ("\n");
922*e4b17023SJohn Marino restore_dump ();
923*e4b17023SJohn Marino }
924*e4b17023SJohn Marino
925*e4b17023SJohn Marino /* Dump an insn vector SUCCS. */
926*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_insn_vector(rtx_vec_t succs)927*e4b17023SJohn Marino debug_insn_vector (rtx_vec_t succs)
928*e4b17023SJohn Marino {
929*e4b17023SJohn Marino switch_dump (stderr);
930*e4b17023SJohn Marino dump_insn_vector (succs);
931*e4b17023SJohn Marino sel_print ("\n");
932*e4b17023SJohn Marino restore_dump ();
933*e4b17023SJohn Marino }
934*e4b17023SJohn Marino
935*e4b17023SJohn Marino /* Dump a hard reg set SET to stderr. */
936*e4b17023SJohn Marino DEBUG_FUNCTION void
debug_hard_reg_set(HARD_REG_SET set)937*e4b17023SJohn Marino debug_hard_reg_set (HARD_REG_SET set)
938*e4b17023SJohn Marino {
939*e4b17023SJohn Marino switch_dump (stderr);
940*e4b17023SJohn Marino dump_hard_reg_set ("", set);
941*e4b17023SJohn Marino sel_print ("\n");
942*e4b17023SJohn Marino restore_dump ();
943*e4b17023SJohn Marino }
944*e4b17023SJohn Marino
945*e4b17023SJohn Marino /* Debug a cfg region with default flags. */
946*e4b17023SJohn Marino void
sel_debug_cfg(void)947*e4b17023SJohn Marino sel_debug_cfg (void)
948*e4b17023SJohn Marino {
949*e4b17023SJohn Marino sel_debug_cfg_1 (sel_debug_cfg_flags);
950*e4b17023SJohn Marino }
951*e4b17023SJohn Marino
952*e4b17023SJohn Marino /* Print a current cselib value for X's address to stderr. */
953*e4b17023SJohn Marino DEBUG_FUNCTION rtx
debug_mem_addr_value(rtx x)954*e4b17023SJohn Marino debug_mem_addr_value (rtx x)
955*e4b17023SJohn Marino {
956*e4b17023SJohn Marino rtx t, addr;
957*e4b17023SJohn Marino enum machine_mode address_mode;
958*e4b17023SJohn Marino
959*e4b17023SJohn Marino gcc_assert (MEM_P (x));
960*e4b17023SJohn Marino address_mode = targetm.addr_space.address_mode (MEM_ADDR_SPACE (x));
961*e4b17023SJohn Marino
962*e4b17023SJohn Marino t = shallow_copy_rtx (x);
963*e4b17023SJohn Marino if (cselib_lookup (XEXP (t, 0), address_mode, 0, GET_MODE (t)))
964*e4b17023SJohn Marino XEXP (t, 0) = cselib_subst_to_values (XEXP (t, 0), GET_MODE (t));
965*e4b17023SJohn Marino
966*e4b17023SJohn Marino t = canon_rtx (t);
967*e4b17023SJohn Marino addr = get_addr (XEXP (t, 0));
968*e4b17023SJohn Marino debug_rtx (t);
969*e4b17023SJohn Marino debug_rtx (addr);
970*e4b17023SJohn Marino return t;
971*e4b17023SJohn Marino }
972*e4b17023SJohn Marino #endif
973*e4b17023SJohn Marino
974