1 /* Dump infrastructure for optimizations and intermediate representation.
2 Copyright (C) 2012-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
22 #include "coretypes.h"
25 #include "gimple-pretty-print.h"
26 #include "diagnostic-core.h"
31 /* If non-NULL, return one past-the-end of the matching SUBPART of
33 #define skip_leading_substring(whole, part) \
34 (strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part))
36 static dump_flags_t pflags
; /* current dump_flags */
37 static dump_flags_t alt_flags
; /* current opt_info flags */
39 static void dump_loc (dump_flags_t
, FILE *, source_location
);
40 static FILE *dump_open_alternate_stream (struct dump_file_info
*);
42 /* These are currently used for communicating between passes.
43 However, instead of accessing them directly, the passes can use
44 dump_printf () for dumps. */
45 FILE *dump_file
= NULL
;
46 FILE *alt_dump_file
= NULL
;
47 const char *dump_file_name
;
48 dump_flags_t dump_flags
;
50 CONSTEXPR
dump_file_info::dump_file_info (): suffix (NULL
), swtch (NULL
),
51 glob (NULL
), pfilename (NULL
), alt_filename (NULL
), pstream (NULL
),
52 alt_stream (NULL
), dkind (DK_none
), pflags (), alt_flags (0),
53 optgroup_flags (0), pstate (0), alt_state (0), num (0), owns_strings (false),
54 graph_dump_initialized (false)
58 dump_file_info::dump_file_info (const char *_suffix
, const char *_swtch
,
59 dump_kind _dkind
, int _num
):
60 suffix (_suffix
), swtch (_swtch
), glob (NULL
),
61 pfilename (NULL
), alt_filename (NULL
), pstream (NULL
), alt_stream (NULL
),
62 dkind (_dkind
), pflags (), alt_flags (0), optgroup_flags (0),
63 pstate (0), alt_state (0), num (_num
), owns_strings (false),
64 graph_dump_initialized (false)
68 /* Table of tree dump switches. This must be consistent with the
69 TREE_DUMP_INDEX enumeration in dumpfile.h. */
70 static struct dump_file_info dump_files
[TDI_end
] =
73 dump_file_info (".cgraph", "ipa-cgraph", DK_ipa
, 0),
74 dump_file_info (".type-inheritance", "ipa-type-inheritance", DK_ipa
, 0),
75 dump_file_info (".ipa-clones", "ipa-clones", DK_ipa
, 0),
76 dump_file_info (".tu", "translation-unit", DK_lang
, 1),
77 dump_file_info (".class", "class-hierarchy", DK_lang
, 2),
78 dump_file_info (".original", "tree-original", DK_tree
, 3),
79 dump_file_info (".gimple", "tree-gimple", DK_tree
, 4),
80 dump_file_info (".nested", "tree-nested", DK_tree
, 5),
81 #define FIRST_AUTO_NUMBERED_DUMP 6
83 dump_file_info (NULL
, "lang-all", DK_lang
, 0),
84 dump_file_info (NULL
, "tree-all", DK_tree
, 0),
85 dump_file_info (NULL
, "rtl-all", DK_rtl
, 0),
86 dump_file_info (NULL
, "ipa-all", DK_ipa
, 0),
89 /* Define a name->number mapping for a dump flag value. */
90 struct dump_option_value_info
92 const char *const name
; /* the name of the value */
93 const dump_flags_t value
; /* the value of the name */
96 /* Table of dump options. This must be consistent with the TDF_* flags
97 in dumpfile.h and opt_info_options below. */
98 static const struct dump_option_value_info dump_options
[] =
100 {"address", TDF_ADDRESS
},
101 {"asmname", TDF_ASMNAME
},
104 {"graph", TDF_GRAPH
},
105 {"details", (TDF_DETAILS
| MSG_OPTIMIZED_LOCATIONS
106 | MSG_MISSED_OPTIMIZATION
108 {"cselib", TDF_CSELIB
},
109 {"stats", TDF_STATS
},
110 {"blocks", TDF_BLOCKS
},
112 {"lineno", TDF_LINENO
},
114 {"stmtaddr", TDF_STMTADDR
},
115 {"memsyms", TDF_MEMSYMS
},
116 {"verbose", TDF_VERBOSE
},
118 {"alias", TDF_ALIAS
},
119 {"nouid", TDF_NOUID
},
120 {"enumerate_locals", TDF_ENUMERATE_LOCALS
},
122 {"gimple", TDF_GIMPLE
},
123 {"optimized", MSG_OPTIMIZED_LOCATIONS
},
124 {"missed", MSG_MISSED_OPTIMIZATION
},
127 {"all", ~(TDF_RAW
| TDF_SLIM
| TDF_LINENO
128 | TDF_STMTADDR
| TDF_GRAPH
| TDF_DIAGNOSTIC
| TDF_VERBOSE
129 | TDF_RHS_ONLY
| TDF_NOUID
| TDF_ENUMERATE_LOCALS
| TDF_SCEV
134 /* A subset of the dump_options table which is used for -fopt-info
135 types. This must be consistent with the MSG_* flags in dumpfile.h.
137 static const struct dump_option_value_info optinfo_verbosity_options
[] =
139 {"optimized", MSG_OPTIMIZED_LOCATIONS
},
140 {"missed", MSG_MISSED_OPTIMIZATION
},
146 /* Flags used for -fopt-info groups. */
147 static const struct dump_option_value_info optgroup_options
[] =
149 {"ipa", OPTGROUP_IPA
},
150 {"loop", OPTGROUP_LOOP
},
151 {"inline", OPTGROUP_INLINE
},
152 {"omp", OPTGROUP_OMP
},
153 {"vec", OPTGROUP_VEC
},
154 {"optall", OPTGROUP_ALL
},
158 gcc::dump_manager::dump_manager ():
159 m_next_dump (FIRST_AUTO_NUMBERED_DUMP
),
160 m_extra_dump_files (NULL
),
161 m_extra_dump_files_in_use (0),
162 m_extra_dump_files_alloced (0)
166 gcc::dump_manager::~dump_manager ()
168 for (size_t i
= 0; i
< m_extra_dump_files_in_use
; i
++)
170 dump_file_info
*dfi
= &m_extra_dump_files
[i
];
171 /* suffix, swtch, glob are statically allocated for the entries
172 in dump_files, and for statistics, but are dynamically allocated
173 for those for passes. */
174 if (dfi
->owns_strings
)
176 XDELETEVEC (const_cast <char *> (dfi
->suffix
));
177 XDELETEVEC (const_cast <char *> (dfi
->swtch
));
178 XDELETEVEC (const_cast <char *> (dfi
->glob
));
180 /* These, if non-NULL, are always dynamically allocated. */
181 XDELETEVEC (const_cast <char *> (dfi
->pfilename
));
182 XDELETEVEC (const_cast <char *> (dfi
->alt_filename
));
184 XDELETEVEC (m_extra_dump_files
);
189 dump_register (const char *suffix
, const char *swtch
, const char *glob
,
190 dump_kind dkind
, int optgroup_flags
, bool take_ownership
)
192 int num
= m_next_dump
++;
194 size_t count
= m_extra_dump_files_in_use
++;
196 if (count
>= m_extra_dump_files_alloced
)
198 if (m_extra_dump_files_alloced
== 0)
199 m_extra_dump_files_alloced
= 32;
201 m_extra_dump_files_alloced
*= 2;
202 m_extra_dump_files
= XRESIZEVEC (struct dump_file_info
,
204 m_extra_dump_files_alloced
);
207 memset (&m_extra_dump_files
[count
], 0, sizeof (struct dump_file_info
));
208 m_extra_dump_files
[count
].suffix
= suffix
;
209 m_extra_dump_files
[count
].swtch
= swtch
;
210 m_extra_dump_files
[count
].glob
= glob
;
211 m_extra_dump_files
[count
].dkind
= dkind
;
212 m_extra_dump_files
[count
].optgroup_flags
= optgroup_flags
;
213 m_extra_dump_files
[count
].num
= num
;
214 m_extra_dump_files
[count
].owns_strings
= take_ownership
;
216 return count
+ TDI_end
;
220 /* Return the dump_file_info for the given phase. */
222 struct dump_file_info
*
224 get_dump_file_info (int phase
) const
227 return &dump_files
[phase
];
228 else if ((size_t) (phase
- TDI_end
) >= m_extra_dump_files_in_use
)
231 return m_extra_dump_files
+ (phase
- TDI_end
);
234 /* Locate the dump_file_info with swtch equal to SWTCH,
235 or return NULL if no such dump_file_info exists. */
237 struct dump_file_info
*
239 get_dump_file_info_by_switch (const char *swtch
) const
241 for (unsigned i
= 0; i
< m_extra_dump_files_in_use
; i
++)
242 if (0 == strcmp (m_extra_dump_files
[i
].swtch
, swtch
))
243 return &m_extra_dump_files
[i
];
250 /* Return the name of the dump file for the given phase.
251 The caller is responsible for calling free on the returned
253 If the dump is not enabled, returns NULL. */
257 get_dump_file_name (int phase
) const
259 struct dump_file_info
*dfi
;
261 if (phase
== TDI_none
)
264 dfi
= get_dump_file_info (phase
);
266 return get_dump_file_name (dfi
);
269 /* Return the name of the dump file for the given dump_file_info.
270 The caller is responsible for calling free on the returned
272 If the dump is not enabled, returns NULL. */
276 get_dump_file_name (struct dump_file_info
*dfi
) const
282 if (dfi
->pstate
== 0)
285 /* If available, use the command line dump filename. */
287 return xstrdup (dfi
->pfilename
);
293 /* (null), LANG, TREE, RTL, IPA. */
294 char suffix
= " ltri"[dfi
->dkind
];
296 if (snprintf (dump_id
, sizeof (dump_id
), ".%03d%c", dfi
->num
, suffix
) < 0)
300 return concat (dump_base_name
, dump_id
, dfi
->suffix
, NULL
);
303 /* For a given DFI, open an alternate dump filename (which could also
304 be a standard stream such as stdout/stderr). If the alternate dump
305 file cannot be opened, return NULL. */
308 dump_open_alternate_stream (struct dump_file_info
*dfi
)
311 if (!dfi
->alt_filename
)
315 return dfi
->alt_stream
;
317 stream
= strcmp ("stderr", dfi
->alt_filename
) == 0
319 : strcmp ("stdout", dfi
->alt_filename
) == 0
321 : fopen (dfi
->alt_filename
, dfi
->alt_state
< 0 ? "w" : "a");
324 error ("could not open dump file %qs: %m", dfi
->alt_filename
);
331 /* Print source location on DFILE if enabled. */
334 dump_loc (dump_flags_t dump_kind
, FILE *dfile
, source_location loc
)
338 if (LOCATION_LOCUS (loc
) > BUILTINS_LOCATION
)
339 fprintf (dfile
, "%s:%d:%d: note: ", LOCATION_FILE (loc
),
340 LOCATION_LINE (loc
), LOCATION_COLUMN (loc
));
341 else if (current_function_decl
)
342 fprintf (dfile
, "%s:%d:%d: note: ",
343 DECL_SOURCE_FILE (current_function_decl
),
344 DECL_SOURCE_LINE (current_function_decl
),
345 DECL_SOURCE_COLUMN (current_function_decl
));
349 /* Dump gimple statement GS with SPC indentation spaces and
350 EXTRA_DUMP_FLAGS on the dump streams if DUMP_KIND is enabled. */
353 dump_gimple_stmt (dump_flags_t dump_kind
, dump_flags_t extra_dump_flags
,
356 if (dump_file
&& (dump_kind
& pflags
))
357 print_gimple_stmt (dump_file
, gs
, spc
, dump_flags
| extra_dump_flags
);
359 if (alt_dump_file
&& (dump_kind
& alt_flags
))
360 print_gimple_stmt (alt_dump_file
, gs
, spc
, dump_flags
| extra_dump_flags
);
363 /* Similar to dump_gimple_stmt, except additionally print source location. */
366 dump_gimple_stmt_loc (dump_flags_t dump_kind
, source_location loc
,
367 dump_flags_t extra_dump_flags
, gimple
*gs
, int spc
)
369 if (dump_file
&& (dump_kind
& pflags
))
371 dump_loc (dump_kind
, dump_file
, loc
);
372 print_gimple_stmt (dump_file
, gs
, spc
, dump_flags
| extra_dump_flags
);
375 if (alt_dump_file
&& (dump_kind
& alt_flags
))
377 dump_loc (dump_kind
, alt_dump_file
, loc
);
378 print_gimple_stmt (alt_dump_file
, gs
, spc
, dump_flags
| extra_dump_flags
);
382 /* Dump expression tree T using EXTRA_DUMP_FLAGS on dump streams if
383 DUMP_KIND is enabled. */
386 dump_generic_expr (dump_flags_t dump_kind
, dump_flags_t extra_dump_flags
,
389 if (dump_file
&& (dump_kind
& pflags
))
390 print_generic_expr (dump_file
, t
, dump_flags
| extra_dump_flags
);
392 if (alt_dump_file
&& (dump_kind
& alt_flags
))
393 print_generic_expr (alt_dump_file
, t
, dump_flags
| extra_dump_flags
);
397 /* Similar to dump_generic_expr, except additionally print the source
401 dump_generic_expr_loc (int dump_kind
, source_location loc
,
402 dump_flags_t extra_dump_flags
, tree t
)
404 if (dump_file
&& (dump_kind
& pflags
))
406 dump_loc (dump_kind
, dump_file
, loc
);
407 print_generic_expr (dump_file
, t
, dump_flags
| extra_dump_flags
);
410 if (alt_dump_file
&& (dump_kind
& alt_flags
))
412 dump_loc (dump_kind
, alt_dump_file
, loc
);
413 print_generic_expr (alt_dump_file
, t
, dump_flags
| extra_dump_flags
);
417 /* Output a formatted message using FORMAT on appropriate dump streams. */
420 dump_printf (dump_flags_t dump_kind
, const char *format
, ...)
422 if (dump_file
&& (dump_kind
& pflags
))
425 va_start (ap
, format
);
426 vfprintf (dump_file
, format
, ap
);
430 if (alt_dump_file
&& (dump_kind
& alt_flags
))
433 va_start (ap
, format
);
434 vfprintf (alt_dump_file
, format
, ap
);
439 /* Similar to dump_printf, except source location is also printed. */
442 dump_printf_loc (dump_flags_t dump_kind
, source_location loc
,
443 const char *format
, ...)
445 if (dump_file
&& (dump_kind
& pflags
))
448 dump_loc (dump_kind
, dump_file
, loc
);
449 va_start (ap
, format
);
450 vfprintf (dump_file
, format
, ap
);
454 if (alt_dump_file
&& (dump_kind
& alt_flags
))
457 dump_loc (dump_kind
, alt_dump_file
, loc
);
458 va_start (ap
, format
);
459 vfprintf (alt_dump_file
, format
, ap
);
464 /* Start a dump for PHASE. Store user-supplied dump flags in
465 *FLAG_PTR. Return the number of streams opened. Set globals
466 DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and
467 set dump_flags appropriately for both pass dump stream and
468 -fopt-info stream. */
472 dump_start (int phase
, dump_flags_t
*flag_ptr
)
476 struct dump_file_info
*dfi
;
478 if (phase
== TDI_none
|| !dump_phase_enabled_p (phase
))
481 dfi
= get_dump_file_info (phase
);
482 name
= get_dump_file_name (phase
);
485 stream
= strcmp ("stderr", name
) == 0
487 : strcmp ("stdout", name
) == 0
489 : fopen (name
, dfi
->pstate
< 0 ? "w" : "a");
491 error ("could not open dump file %qs: %m", name
);
498 dfi
->pstream
= stream
;
499 dump_file
= dfi
->pstream
;
500 /* Initialize current dump flags. */
501 pflags
= dfi
->pflags
;
504 stream
= dump_open_alternate_stream (dfi
);
507 dfi
->alt_stream
= stream
;
509 alt_dump_file
= dfi
->alt_stream
;
510 /* Initialize current -fopt-info flags. */
511 alt_flags
= dfi
->alt_flags
;
515 *flag_ptr
= dfi
->pflags
;
520 /* Finish a tree dump for PHASE and close associated dump streams. Also
521 reset the globals DUMP_FILE, ALT_DUMP_FILE, and DUMP_FLAGS. */
525 dump_finish (int phase
)
527 struct dump_file_info
*dfi
;
531 dfi
= get_dump_file_info (phase
);
532 if (dfi
->pstream
&& (!dfi
->pfilename
533 || (strcmp ("stderr", dfi
->pfilename
) != 0
534 && strcmp ("stdout", dfi
->pfilename
) != 0)))
535 fclose (dfi
->pstream
);
537 if (dfi
->alt_stream
&& strcmp ("stderr", dfi
->alt_filename
) != 0
538 && strcmp ("stdout", dfi
->alt_filename
) != 0)
539 fclose (dfi
->alt_stream
);
541 dfi
->alt_stream
= NULL
;
544 alt_dump_file
= NULL
;
545 dump_flags
= TDI_none
;
550 /* Begin a tree dump for PHASE. Stores any user supplied flag in
551 *FLAG_PTR and returns a stream to write to. If the dump is not
552 enabled, returns NULL.
553 Multiple calls will reopen and append to the dump file. */
556 dump_begin (int phase
, dump_flags_t
*flag_ptr
)
558 return g
->get_dumps ()->dump_begin (phase
, flag_ptr
);
563 dump_begin (int phase
, dump_flags_t
*flag_ptr
)
566 struct dump_file_info
*dfi
;
569 if (phase
== TDI_none
|| !dump_phase_enabled_p (phase
))
572 name
= get_dump_file_name (phase
);
575 dfi
= get_dump_file_info (phase
);
577 stream
= strcmp ("stderr", name
) == 0
579 : strcmp ("stdout", name
) == 0
581 : fopen (name
, dfi
->pstate
< 0 ? "w" : "a");
584 error ("could not open dump file %qs: %m", name
);
590 *flag_ptr
= dfi
->pflags
;
592 /* Initialize current flags */
593 pflags
= dfi
->pflags
;
597 /* Returns nonzero if dump PHASE is enabled for at least one stream.
598 If PHASE is TDI_tree_all, return nonzero if any dump is enabled for
603 dump_phase_enabled_p (int phase
) const
605 if (phase
== TDI_tree_all
)
608 for (i
= TDI_none
+ 1; i
< (size_t) TDI_end
; i
++)
609 if (dump_files
[i
].pstate
|| dump_files
[i
].alt_state
)
611 for (i
= 0; i
< m_extra_dump_files_in_use
; i
++)
612 if (m_extra_dump_files
[i
].pstate
|| m_extra_dump_files
[i
].alt_state
)
618 struct dump_file_info
*dfi
= get_dump_file_info (phase
);
619 return dfi
->pstate
|| dfi
->alt_state
;
623 /* Returns nonzero if tree dump PHASE has been initialized. */
627 dump_initialized_p (int phase
) const
629 struct dump_file_info
*dfi
= get_dump_file_info (phase
);
630 return dfi
->pstate
> 0 || dfi
->alt_state
> 0;
633 /* Returns the switch name of PHASE. */
636 dump_flag_name (int phase
)
638 return g
->get_dumps ()->dump_flag_name (phase
);
643 dump_flag_name (int phase
) const
645 struct dump_file_info
*dfi
= get_dump_file_info (phase
);
649 /* Finish a tree dump for PHASE. STREAM is the stream created by
653 dump_end (int phase ATTRIBUTE_UNUSED
, FILE *stream
)
655 if (stream
!= stderr
&& stream
!= stdout
)
659 /* Enable all tree dumps with FLAGS on FILENAME. Return number of
660 enabled tree dumps. */
664 dump_enable_all (dump_kind dkind
, dump_flags_t flags
, const char *filename
)
669 for (i
= TDI_none
+ 1; i
< (size_t) TDI_end
; i
++)
671 if ((dump_files
[i
].dkind
== dkind
))
673 const char *old_filename
= dump_files
[i
].pfilename
;
674 dump_files
[i
].pstate
= -1;
675 dump_files
[i
].pflags
|= flags
;
677 /* Override the existing filename. */
680 dump_files
[i
].pfilename
= xstrdup (filename
);
681 /* Since it is a command-line provided file, which is
682 common to all the phases, use it in append mode. */
683 dump_files
[i
].pstate
= 1;
685 if (old_filename
&& filename
!= old_filename
)
686 free (CONST_CAST (char *, old_filename
));
690 for (i
= 0; i
< m_extra_dump_files_in_use
; i
++)
692 if ((m_extra_dump_files
[i
].dkind
== dkind
))
694 const char *old_filename
= m_extra_dump_files
[i
].pfilename
;
695 m_extra_dump_files
[i
].pstate
= -1;
696 m_extra_dump_files
[i
].pflags
|= flags
;
698 /* Override the existing filename. */
701 m_extra_dump_files
[i
].pfilename
= xstrdup (filename
);
702 /* Since it is a command-line provided file, which is
703 common to all the phases, use it in append mode. */
704 m_extra_dump_files
[i
].pstate
= 1;
706 if (old_filename
&& filename
!= old_filename
)
707 free (CONST_CAST (char *, old_filename
));
714 /* Enable -fopt-info dumps on all dump files matching OPTGROUP_FLAGS.
715 Enable dumps with FLAGS on FILENAME. Return the number of enabled
720 opt_info_enable_passes (int optgroup_flags
, dump_flags_t flags
,
721 const char *filename
)
726 for (i
= TDI_none
+ 1; i
< (size_t) TDI_end
; i
++)
728 if ((dump_files
[i
].optgroup_flags
& optgroup_flags
))
730 const char *old_filename
= dump_files
[i
].alt_filename
;
731 /* Since this file is shared among different passes, it
732 should be opened in append mode. */
733 dump_files
[i
].alt_state
= 1;
734 dump_files
[i
].alt_flags
|= flags
;
736 /* Override the existing filename. */
738 dump_files
[i
].alt_filename
= xstrdup (filename
);
739 if (old_filename
&& filename
!= old_filename
)
740 free (CONST_CAST (char *, old_filename
));
744 for (i
= 0; i
< m_extra_dump_files_in_use
; i
++)
746 if ((m_extra_dump_files
[i
].optgroup_flags
& optgroup_flags
))
748 const char *old_filename
= m_extra_dump_files
[i
].alt_filename
;
749 /* Since this file is shared among different passes, it
750 should be opened in append mode. */
751 m_extra_dump_files
[i
].alt_state
= 1;
752 m_extra_dump_files
[i
].alt_flags
|= flags
;
754 /* Override the existing filename. */
756 m_extra_dump_files
[i
].alt_filename
= xstrdup (filename
);
757 if (old_filename
&& filename
!= old_filename
)
758 free (CONST_CAST (char *, old_filename
));
765 /* Parse ARG as a dump switch. Return nonzero if it is, and store the
766 relevant details in the dump_files array. */
770 dump_switch_p_1 (const char *arg
, struct dump_file_info
*dfi
, bool doglob
)
772 const char *option_value
;
776 if (doglob
&& !dfi
->glob
)
779 option_value
= skip_leading_substring (arg
, doglob
? dfi
->glob
: dfi
->swtch
);
783 if (*option_value
&& *option_value
!= '-' && *option_value
!= '=')
791 const struct dump_option_value_info
*option_ptr
;
798 end_ptr
= strchr (ptr
, '-');
799 eq_ptr
= strchr (ptr
, '=');
801 if (eq_ptr
&& !end_ptr
)
805 end_ptr
= ptr
+ strlen (ptr
);
806 length
= end_ptr
- ptr
;
808 for (option_ptr
= dump_options
; option_ptr
->name
; option_ptr
++)
809 if (strlen (option_ptr
->name
) == length
810 && !memcmp (option_ptr
->name
, ptr
, length
))
812 flags
|= option_ptr
->value
;
818 /* Interpret rest of the argument as a dump filename. This
819 filename overrides other command line filenames. */
821 free (CONST_CAST (char *, dfi
->pfilename
));
822 dfi
->pfilename
= xstrdup (ptr
+ 1);
826 warning (0, "ignoring unknown option %q.*s in %<-fdump-%s%>",
827 length
, ptr
, dfi
->swtch
);
833 dfi
->pflags
|= flags
;
835 /* Process -fdump-tree-all and -fdump-rtl-all, by enabling all the
837 if (dfi
->suffix
== NULL
)
838 dump_enable_all (dfi
->dkind
, dfi
->pflags
, dfi
->pfilename
);
845 dump_switch_p (const char *arg
)
850 for (i
= TDI_none
+ 1; i
!= TDI_end
; i
++)
851 any
|= dump_switch_p_1 (arg
, &dump_files
[i
], false);
853 /* Don't glob if we got a hit already */
855 for (i
= TDI_none
+ 1; i
!= TDI_end
; i
++)
856 any
|= dump_switch_p_1 (arg
, &dump_files
[i
], true);
858 for (i
= 0; i
< m_extra_dump_files_in_use
; i
++)
859 any
|= dump_switch_p_1 (arg
, &m_extra_dump_files
[i
], false);
862 for (i
= 0; i
< m_extra_dump_files_in_use
; i
++)
863 any
|= dump_switch_p_1 (arg
, &m_extra_dump_files
[i
], true);
869 /* Parse ARG as a -fopt-info switch and store flags, optgroup_flags
870 and filename. Return non-zero if it is a recognized switch. */
873 opt_info_switch_p_1 (const char *arg
, dump_flags_t
*flags
, int *optgroup_flags
,
876 const char *option_value
;
887 return 1; /* Handle '-fopt-info' without any additional options. */
891 const struct dump_option_value_info
*option_ptr
;
898 end_ptr
= strchr (ptr
, '-');
899 eq_ptr
= strchr (ptr
, '=');
901 if (eq_ptr
&& !end_ptr
)
905 end_ptr
= ptr
+ strlen (ptr
);
906 length
= end_ptr
- ptr
;
908 for (option_ptr
= optinfo_verbosity_options
; option_ptr
->name
;
910 if (strlen (option_ptr
->name
) == length
911 && !memcmp (option_ptr
->name
, ptr
, length
))
913 *flags
|= option_ptr
->value
;
917 for (option_ptr
= optgroup_options
; option_ptr
->name
; option_ptr
++)
918 if (strlen (option_ptr
->name
) == length
919 && !memcmp (option_ptr
->name
, ptr
, length
))
921 *optgroup_flags
|= option_ptr
->value
;
927 /* Interpret rest of the argument as a dump filename. This
928 filename overrides other command line filenames. */
929 *filename
= xstrdup (ptr
+ 1);
934 warning (0, "unknown option %q.*s in %<-fopt-info-%s%>",
945 /* Return non-zero if ARG is a recognized switch for
946 -fopt-info. Return zero otherwise. */
949 opt_info_switch_p (const char *arg
)
954 static char *file_seen
= NULL
;
955 gcc::dump_manager
*dumps
= g
->get_dumps ();
957 if (!opt_info_switch_p_1 (arg
, &flags
, &optgroup_flags
, &filename
))
961 filename
= xstrdup ("stderr");
963 /* Bail out if a different filename has been specified. */
964 if (file_seen
&& strcmp (file_seen
, filename
))
966 warning (0, "ignoring possibly conflicting option %<-fopt-info-%s%>",
971 file_seen
= xstrdup (filename
);
973 flags
= MSG_OPTIMIZED_LOCATIONS
;
975 optgroup_flags
= OPTGROUP_ALL
;
977 return dumps
->opt_info_enable_passes (optgroup_flags
, flags
, filename
);
980 /* Print basic block on the dump streams. */
983 dump_basic_block (int dump_kind
, basic_block bb
, int indent
)
985 if (dump_file
&& (dump_kind
& pflags
))
986 dump_bb (dump_file
, bb
, indent
, TDF_DETAILS
);
987 if (alt_dump_file
&& (dump_kind
& alt_flags
))
988 dump_bb (alt_dump_file
, bb
, indent
, TDF_DETAILS
);
991 /* Dump FUNCTION_DECL FN as tree dump PHASE. */
994 dump_function (int phase
, tree fn
)
999 stream
= dump_begin (phase
, &flags
);
1002 dump_function_to_file (fn
, stream
, flags
);
1003 dump_end (phase
, stream
);
1007 /* Print information from the combine pass on dump_file. */
1010 print_combine_total_stats (void)
1013 dump_combine_total_stats (dump_file
);
1016 /* Enable RTL dump for all the RTL passes. */
1019 enable_rtl_dump_file (void)
1021 gcc::dump_manager
*dumps
= g
->get_dumps ();
1023 dumps
->dump_enable_all (DK_rtl
, dump_flags_t (TDF_DETAILS
) | TDF_BLOCKS
,
1025 return num_enabled
> 0;