Line data Source code
1 : /* Definitions for the shared dumpfile.
2 : Copyright (C) 2004-2023 Free Software Foundation, Inc.
3 :
4 : This file is part of GCC.
5 :
6 : GCC is free software; you can redistribute it and/or modify
7 : it under the terms of the GNU General Public License as published by
8 : the Free Software Foundation; either version 3, or (at your option)
9 : any later version.
10 :
11 : GCC is distributed in the hope that it will be useful,
12 : but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : GNU General Public License for more details.
15 :
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/>. */
19 :
20 :
21 : #ifndef GCC_DUMPFILE_H
22 : #define GCC_DUMPFILE_H 1
23 :
24 : #include "profile-count.h"
25 :
26 : /* An attribute for annotating formatting printing functions that use
27 : the dumpfile/optinfo formatting codes. These are the pretty_printer
28 : format codes (see pretty-print.cc), with additional codes for middle-end
29 : specific entities (see dumpfile.cc). */
30 :
31 : #if GCC_VERSION >= 9000
32 : #define ATTRIBUTE_GCC_DUMP_PRINTF(m, n) \
33 : __attribute__ ((__format__ (__gcc_dump_printf__, m ,n))) \
34 : ATTRIBUTE_NONNULL(m)
35 : #else
36 : #define ATTRIBUTE_GCC_DUMP_PRINTF(m, n) ATTRIBUTE_NONNULL(m)
37 : #endif
38 :
39 : /* Different tree dump places. When you add new tree dump places,
40 : extend the DUMP_FILES array in dumpfile.cc. */
41 : enum tree_dump_index
42 : {
43 : TDI_none, /* No dump */
44 : TDI_cgraph, /* dump function call graph. */
45 : TDI_inheritance, /* dump type inheritance graph. */
46 : TDI_clones, /* dump IPA cloning decisions. */
47 : TDI_original, /* dump each function before optimizing it */
48 : TDI_gimple, /* dump each function after gimplifying it */
49 : TDI_nested, /* dump each function after unnesting it */
50 : TDI_lto_stream_out, /* dump information about lto streaming */
51 : TDI_profile_report, /* dump information about profile quality */
52 :
53 : TDI_lang_all, /* enable all the language dumps. */
54 : TDI_tree_all, /* enable all the GENERIC/GIMPLE dumps. */
55 : TDI_rtl_all, /* enable all the RTL dumps. */
56 : TDI_ipa_all, /* enable all the IPA dumps. */
57 :
58 : TDI_end
59 : };
60 :
61 : /* Enum used to distinguish dump files to types. */
62 :
63 : enum dump_kind
64 : {
65 : DK_none,
66 : DK_lang,
67 : DK_tree,
68 : DK_rtl,
69 : DK_ipa
70 : };
71 :
72 : /* Bit masks to control dumping. Not all values are applicable to all
73 : dumps. Add new ones at the end. When you define new values, extend
74 : the DUMP_OPTIONS array in dumpfile.cc. The TDF_* flags coexist with
75 : MSG_* flags (for -fopt-info) and the bit values must be chosen to
76 : allow that. */
77 : enum dump_flag : uint32_t
78 : {
79 : /* Value of TDF_NONE is used just for bits filtered by TDF_KIND_MASK. */
80 : TDF_NONE = 0,
81 :
82 : /* Dump node addresses. */
83 : TDF_ADDRESS = (1 << 0),
84 :
85 : /* Don't go wild following links. */
86 : TDF_SLIM = (1 << 1),
87 :
88 : /* Don't unparse the function. */
89 : TDF_RAW = (1 << 2),
90 :
91 : /* Show more detailed info about each pass. */
92 : TDF_DETAILS = (1 << 3),
93 :
94 : /* Dump various statistics about each pass. */
95 : TDF_STATS = (1 << 4),
96 :
97 : /* Display basic block boundaries. */
98 : TDF_BLOCKS = (1 << 5),
99 :
100 : /* Display virtual operands. */
101 : TDF_VOPS = (1 << 6),
102 :
103 : /* Display statement line numbers. */
104 : TDF_LINENO = (1 << 7),
105 :
106 : /* Display decl UIDs. */
107 : TDF_UID = (1 << 8),
108 :
109 : /* Address of stmt. */
110 : TDF_STMTADDR = (1 << 9),
111 :
112 : /* A graph dump is being emitted. */
113 : TDF_GRAPH = (1 << 10),
114 :
115 : /* Display memory symbols in expr.
116 : Implies TDF_VOPS. */
117 : TDF_MEMSYMS = (1 << 11),
118 :
119 : /* A flag to only print the RHS of a gimple stmt. */
120 : TDF_RHS_ONLY = (1 << 12),
121 :
122 : /* Display asm names of decls. */
123 : TDF_ASMNAME = (1 << 13),
124 :
125 : /* Display EH region number holding this gimple statement. */
126 : TDF_EH = (1 << 14),
127 :
128 : /* Omit UIDs from dumps. */
129 : TDF_NOUID = (1 << 15),
130 :
131 : /* Display alias information. */
132 : TDF_ALIAS = (1 << 16),
133 :
134 : /* Enumerate locals by uid. */
135 : TDF_ENUMERATE_LOCALS = (1 << 17),
136 :
137 : /* Dump cselib details. */
138 : TDF_CSELIB = (1 << 18),
139 :
140 : /* Dump SCEV details. */
141 : TDF_SCEV = (1 << 19),
142 :
143 : /* Dump in GIMPLE FE syntax. */
144 : TDF_GIMPLE = (1 << 20),
145 :
146 : /* Dump folding details. */
147 : TDF_FOLDING = (1 << 21),
148 :
149 : /* MSG_* flags for expressing the kinds of message to
150 : be emitted by -fopt-info. */
151 :
152 : /* -fopt-info optimized sources. */
153 : MSG_OPTIMIZED_LOCATIONS = (1 << 22),
154 :
155 : /* Missed opportunities. */
156 : MSG_MISSED_OPTIMIZATION = (1 << 23),
157 :
158 : /* General optimization info. */
159 : MSG_NOTE = (1 << 24),
160 :
161 : /* Mask for selecting MSG_-kind flags. */
162 : MSG_ALL_KINDS = (MSG_OPTIMIZED_LOCATIONS
163 : | MSG_MISSED_OPTIMIZATION
164 : | MSG_NOTE),
165 :
166 : /* MSG_PRIORITY_* flags for expressing the priority levels of message
167 : to be emitted by -fopt-info, and filtering on them.
168 : By default, messages at the top-level dump scope are "user-facing",
169 : whereas those that are in nested scopes are implicitly "internals".
170 : This behavior can be overridden for a given dump message by explicitly
171 : specifying one of the MSG_PRIORITY_* flags.
172 :
173 : By default, dump files show both kinds of message, whereas -fopt-info
174 : only shows "user-facing" messages, and requires the "-internals"
175 : sub-option of -fopt-info to show the internal messages. */
176 :
177 : /* Implicitly supplied for messages at the top-level dump scope. */
178 : MSG_PRIORITY_USER_FACING = (1 << 25),
179 :
180 : /* Implicitly supplied for messages within nested dump scopes. */
181 : MSG_PRIORITY_INTERNALS = (1 << 26),
182 :
183 : /* Supplied when an opt_problem generated in a nested scope is re-emitted
184 : at the top-level. We want to default to showing these in -fopt-info
185 : output, but to *not* show them in dump files, as the message would be
186 : shown twice, messing up "scan-tree-dump-times" in DejaGnu tests. */
187 : MSG_PRIORITY_REEMITTED = (1 << 27),
188 :
189 : /* Mask for selecting MSG_PRIORITY_* flags. */
190 : MSG_ALL_PRIORITIES = (MSG_PRIORITY_USER_FACING
191 : | MSG_PRIORITY_INTERNALS
192 : | MSG_PRIORITY_REEMITTED),
193 :
194 : /* All -fdump- flags. */
195 : TDF_ALL_VALUES = (1 << 28) - 1,
196 :
197 : /* Dumping for -fcompare-debug. */
198 : TDF_COMPARE_DEBUG = (1 << 28),
199 :
200 : /* Dump a GIMPLE value which means wrapping certain things with _Literal. */
201 : TDF_GIMPLE_VAL = (1 << 29),
202 :
203 : /* For error. */
204 : TDF_ERROR = ((uint32_t)1 << 30),
205 : };
206 :
207 : /* Dump flags type. */
208 :
209 : typedef enum dump_flag dump_flags_t;
210 :
211 : inline dump_flags_t
212 : operator| (dump_flags_t lhs, dump_flags_t rhs)
213 : {
214 : return (dump_flags_t)((std::underlying_type<dump_flags_t>::type)lhs
215 : | (std::underlying_type<dump_flags_t>::type)rhs);
216 : }
217 :
218 : inline dump_flags_t
219 172 : operator& (dump_flags_t lhs, dump_flags_t rhs)
220 : {
221 172 : return (dump_flags_t)((std::underlying_type<dump_flags_t>::type)lhs
222 172 : & (std::underlying_type<dump_flags_t>::type)rhs);
223 : }
224 :
225 : inline dump_flags_t
226 : operator~ (dump_flags_t flags)
227 : {
228 : return (dump_flags_t)~((std::underlying_type<dump_flags_t>::type)flags);
229 : }
230 :
231 : inline dump_flags_t &
232 : operator|= (dump_flags_t &lhs, dump_flags_t rhs)
233 : {
234 : lhs = (dump_flags_t)((std::underlying_type<dump_flags_t>::type)lhs
235 : | (std::underlying_type<dump_flags_t>::type)rhs);
236 : return lhs;
237 : }
238 :
239 : inline dump_flags_t &
240 : operator&= (dump_flags_t &lhs, dump_flags_t rhs)
241 : {
242 : lhs = (dump_flags_t)((std::underlying_type<dump_flags_t>::type)lhs
243 : & (std::underlying_type<dump_flags_t>::type)rhs);
244 : return lhs;
245 : }
246 :
247 : /* Flags to control high-level -fopt-info dumps. Usually these flags
248 : define a group of passes. An optimization pass can be part of
249 : multiple groups. */
250 :
251 : enum optgroup_flag
252 : {
253 : OPTGROUP_NONE = 0,
254 :
255 : /* IPA optimization passes */
256 : OPTGROUP_IPA = (1 << 1),
257 :
258 : /* Loop optimization passes */
259 : OPTGROUP_LOOP = (1 << 2),
260 :
261 : /* Inlining passes */
262 : OPTGROUP_INLINE = (1 << 3),
263 :
264 : /* OMP (Offloading and Multi Processing) transformations */
265 : OPTGROUP_OMP = (1 << 4),
266 :
267 : /* Vectorization passes */
268 : OPTGROUP_VEC = (1 << 5),
269 :
270 : /* All other passes */
271 : OPTGROUP_OTHER = (1 << 6),
272 :
273 : OPTGROUP_ALL = (OPTGROUP_IPA | OPTGROUP_LOOP | OPTGROUP_INLINE
274 : | OPTGROUP_OMP | OPTGROUP_VEC | OPTGROUP_OTHER)
275 : };
276 :
277 : typedef enum optgroup_flag optgroup_flags_t;
278 :
279 : inline optgroup_flags_t
280 : operator| (optgroup_flags_t lhs, optgroup_flags_t rhs)
281 : {
282 : return (optgroup_flags_t)((std::underlying_type<dump_flags_t>::type)lhs
283 : | (std::underlying_type<dump_flags_t>::type)rhs);
284 : }
285 :
286 : inline optgroup_flags_t &
287 : operator|= (optgroup_flags_t &lhs, optgroup_flags_t rhs)
288 : {
289 : lhs = (optgroup_flags_t)((std::underlying_type<dump_flags_t>::type)lhs
290 : | (std::underlying_type<dump_flags_t>::type)rhs);
291 : return lhs;
292 : }
293 :
294 : /* Define a tree dump switch. */
295 : struct dump_file_info
296 : {
297 : /* Suffix to give output file. */
298 : const char *suffix;
299 : /* Command line dump switch. */
300 : const char *swtch;
301 : /* Command line glob. */
302 : const char *glob;
303 : /* Filename for the pass-specific stream. */
304 : const char *pfilename;
305 : /* Filename for the -fopt-info stream. */
306 : const char *alt_filename;
307 : /* Pass-specific dump stream. */
308 : FILE *pstream;
309 : /* -fopt-info stream. */
310 : FILE *alt_stream;
311 : /* Dump kind. */
312 : dump_kind dkind;
313 : /* Dump flags. */
314 : dump_flags_t pflags;
315 : /* A pass flags for -fopt-info. */
316 : dump_flags_t alt_flags;
317 : /* Flags for -fopt-info given by a user. */
318 : optgroup_flags_t optgroup_flags;
319 : /* State of pass-specific stream. */
320 : int pstate;
321 : /* State of the -fopt-info stream. */
322 : int alt_state;
323 : /* Dump file number. */
324 : int num;
325 : /* Fields "suffix", "swtch", "glob" can be const strings,
326 : or can be dynamically allocated, needing free. */
327 : bool owns_strings;
328 : /* When a given dump file is being initialized, this flag is set to true
329 : if the corresponding TDF_graph dump file has also been initialized. */
330 : bool graph_dump_initialized;
331 : };
332 :
333 : /* A class for describing where in the user's source that a dump message
334 : relates to, with various constructors for convenience.
335 : In particular, this lets us associate dump messages
336 : with hotness information (e.g. from PGO), allowing them to
337 : be prioritized by code hotness. */
338 :
339 : class dump_user_location_t
340 : {
341 : public:
342 : /* Default constructor, analogous to UNKNOWN_LOCATION. */
343 : dump_user_location_t () : m_count (), m_loc (UNKNOWN_LOCATION) {}
344 :
345 : /* Construct from a gimple statement (using its location and hotness). */
346 : dump_user_location_t (const gimple *stmt);
347 :
348 : /* Construct from an RTL instruction (using its location and hotness). */
349 : dump_user_location_t (const rtx_insn *insn);
350 :
351 : /* Construct from a location_t. This one is deprecated (since it doesn't
352 : capture hotness information); it thus needs to be spelled out. */
353 : static dump_user_location_t
354 : from_location_t (location_t loc)
355 : {
356 : return dump_user_location_t (profile_count (), loc);
357 : }
358 :
359 : /* Construct from a function declaration. This one requires spelling out
360 : to avoid accidentally constructing from other kinds of tree. */
361 : static dump_user_location_t
362 : from_function_decl (tree fndecl);
363 :
364 : profile_count get_count () const { return m_count; }
365 : location_t get_location_t () const { return m_loc; }
366 :
367 : private:
368 : /* Private ctor from count and location, for use by from_location_t. */
369 : dump_user_location_t (profile_count count, location_t loc)
370 : : m_count (count), m_loc (loc)
371 : {}
372 :
373 : profile_count m_count;
374 : location_t m_loc;
375 : };
376 :
377 : /* A class for identifying where in the compiler's own source
378 : (or a plugin) that a dump message is being emitted from. */
379 :
380 : class dump_impl_location_t
381 : {
382 : public:
383 : dump_impl_location_t (
384 : #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
385 : const char *file = __builtin_FILE (),
386 : int line = __builtin_LINE (),
387 : const char *function = __builtin_FUNCTION ()
388 : #else
389 : const char *file = __FILE__,
390 : int line = __LINE__,
391 : const char *function = NULL
392 : #endif
393 : )
394 : : m_file (file), m_line (line), m_function (function)
395 : {}
396 :
397 : const char *m_file;
398 : int m_line;
399 : const char *m_function;
400 : };
401 :
402 : /* A bundle of metadata for describing a dump message:
403 : (a) the dump_flags
404 : (b) the source location within the compiler/plugin.
405 :
406 : The constructors use default parameters so that (b) gets sets up
407 : automatically.
408 :
409 : Hence you can pass in e.g. MSG_NOTE, and the dump call
410 : will automatically record where in GCC's source code the
411 : dump was emitted from. */
412 :
413 : class dump_metadata_t
414 : {
415 : public:
416 : dump_metadata_t (dump_flags_t dump_flags,
417 : const dump_impl_location_t &impl_location
418 : = dump_impl_location_t ())
419 : : m_dump_flags (dump_flags),
420 : m_impl_location (impl_location)
421 : {
422 : }
423 :
424 : dump_flags_t get_dump_flags () const { return m_dump_flags; }
425 :
426 : const dump_impl_location_t &
427 : get_impl_location () const { return m_impl_location; }
428 :
429 : private:
430 : dump_flags_t m_dump_flags;
431 : dump_impl_location_t m_impl_location;
432 : };
433 :
434 : /* A bundle of information for describing the location of a dump message:
435 : (a) the source location and hotness within the user's code, together with
436 : (b) the source location within the compiler/plugin.
437 :
438 : The constructors use default parameters so that (b) gets sets up
439 : automatically.
440 :
441 : The upshot is that you can pass in e.g. a gimple * to dump_printf_loc,
442 : and the dump call will automatically record where in GCC's source
443 : code the dump was emitted from. */
444 :
445 : class dump_location_t
446 : {
447 : public:
448 : /* Default constructor, analogous to UNKNOWN_LOCATION. */
449 : dump_location_t (const dump_impl_location_t &impl_location
450 : = dump_impl_location_t ())
451 : : m_user_location (dump_user_location_t ()),
452 : m_impl_location (impl_location)
453 : {
454 : }
455 :
456 : /* Construct from a gimple statement (using its location and hotness). */
457 : dump_location_t (const gimple *stmt,
458 : const dump_impl_location_t &impl_location
459 : = dump_impl_location_t ())
460 : : m_user_location (dump_user_location_t (stmt)),
461 : m_impl_location (impl_location)
462 : {
463 : }
464 :
465 : /* Construct from an RTL instruction (using its location and hotness). */
466 : dump_location_t (const rtx_insn *insn,
467 : const dump_impl_location_t &impl_location
468 : = dump_impl_location_t ())
469 : : m_user_location (dump_user_location_t (insn)),
470 : m_impl_location (impl_location)
471 : {
472 : }
473 :
474 : /* Construct from a dump_user_location_t. */
475 : dump_location_t (const dump_user_location_t &user_location,
476 : const dump_impl_location_t &impl_location
477 : = dump_impl_location_t ())
478 : : m_user_location (user_location),
479 : m_impl_location (impl_location)
480 : {
481 : }
482 :
483 : /* Construct from a location_t. This one is deprecated (since it doesn't
484 : capture hotness information), and thus requires spelling out. */
485 : static dump_location_t
486 : from_location_t (location_t loc,
487 : const dump_impl_location_t &impl_location
488 : = dump_impl_location_t ())
489 : {
490 : return dump_location_t (dump_user_location_t::from_location_t (loc),
491 : impl_location);
492 : }
493 :
494 : const dump_user_location_t &
495 : get_user_location () const { return m_user_location; }
496 :
497 : const dump_impl_location_t &
498 : get_impl_location () const { return m_impl_location; }
499 :
500 : location_t get_location_t () const
501 : {
502 : return m_user_location.get_location_t ();
503 : }
504 :
505 : profile_count get_count () const { return m_user_location.get_count (); }
506 :
507 : private:
508 : dump_user_location_t m_user_location;
509 : dump_impl_location_t m_impl_location;
510 : };
511 :
512 : /* In dumpfile.cc */
513 : extern FILE *dump_begin (int, dump_flags_t *, int part=-1);
514 : extern void dump_end (int, FILE *);
515 : extern int opt_info_switch_p (const char *);
516 : extern const char *dump_flag_name (int);
517 : extern const kv_pair<optgroup_flags_t> optgroup_options[];
518 : extern dump_flags_t
519 : parse_dump_option (const char *, const char **);
520 :
521 : /* Global variables used to communicate with passes. */
522 : extern FILE *dump_file;
523 : extern dump_flags_t dump_flags;
524 : extern const char *dump_file_name;
525 :
526 : extern bool dumps_are_enabled;
527 :
528 : extern void set_dump_file (FILE *new_dump_file);
529 :
530 : /* Return true if any of the dumps is enabled, false otherwise. */
531 : inline bool
532 : dump_enabled_p (void)
533 : {
534 : return dumps_are_enabled;
535 : }
536 :
537 : /* The following API calls (which *don't* take a "FILE *")
538 : write the output to zero or more locations.
539 :
540 : Some destinations are written to immediately as dump_* calls
541 : are made; for others, the output is consolidated into an "optinfo"
542 : instance (with its own metadata), and only emitted once the optinfo
543 : is complete.
544 :
545 : The destinations are:
546 :
547 : (a) the "immediate" destinations:
548 : (a.1) the active dump_file, if any
549 : (a.2) the -fopt-info destination, if any
550 : (b) the "optinfo" destinations, if any:
551 : (b.1) as optimization records
552 :
553 : dump_* (MSG_*) --> dumpfile.cc --> items --> (a.1) dump_file
554 : | `-> (a.2) alt_dump_file
555 : |
556 : `--> (b) optinfo
557 : `---> optinfo destinations
558 : (b.1) optimization records
559 :
560 : For optinfos, the dump_*_loc mark the beginning of an optinfo
561 : instance: all subsequent dump_* calls are consolidated into
562 : that optinfo, until the next dump_*_loc call (or a change in
563 : dump scope, or a call to dumpfile_ensure_any_optinfo_are_flushed).
564 :
565 : A group of dump_* calls should be guarded by:
566 :
567 : if (dump_enabled_p ())
568 :
569 : to minimize the work done for the common case where dumps
570 : are disabled. */
571 :
572 : extern void dump_printf (const dump_metadata_t &, const char *, ...)
573 : ATTRIBUTE_GCC_DUMP_PRINTF (2, 3);
574 :
575 : extern void dump_printf_loc (const dump_metadata_t &, const dump_user_location_t &,
576 : const char *, ...)
577 : ATTRIBUTE_GCC_DUMP_PRINTF (3, 4);
578 : extern void dump_function (int phase, tree fn);
579 : extern void dump_basic_block (dump_flags_t, basic_block, int);
580 : extern void dump_generic_expr_loc (const dump_metadata_t &,
581 : const dump_user_location_t &,
582 : dump_flags_t, tree);
583 : extern void dump_generic_expr (const dump_metadata_t &, dump_flags_t, tree);
584 : extern void dump_gimple_stmt_loc (const dump_metadata_t &,
585 : const dump_user_location_t &,
586 : dump_flags_t, gimple *, int);
587 : extern void dump_gimple_stmt (const dump_metadata_t &, dump_flags_t, gimple *, int);
588 : extern void dump_gimple_expr_loc (const dump_metadata_t &,
589 : const dump_user_location_t &,
590 : dump_flags_t, gimple *, int);
591 : extern void dump_gimple_expr (const dump_metadata_t &, dump_flags_t, gimple *, int);
592 : extern void dump_symtab_node (const dump_metadata_t &, symtab_node *);
593 :
594 : template<unsigned int N, typename C>
595 : void dump_dec (const dump_metadata_t &, const poly_int<N, C> &);
596 : extern void dump_dec (dump_flags_t, const poly_wide_int &, signop);
597 : extern void dump_hex (dump_flags_t, const poly_wide_int &);
598 :
599 : extern void dumpfile_ensure_any_optinfo_are_flushed ();
600 :
601 : /* Managing nested scopes, so that dumps can express the call chain
602 : leading to a dump message. */
603 :
604 : extern unsigned int get_dump_scope_depth ();
605 : extern void dump_begin_scope (const char *name,
606 : const dump_user_location_t &user_location,
607 : const dump_impl_location_t &impl_location);
608 : extern void dump_end_scope ();
609 :
610 : /* Implementation detail of the AUTO_DUMP_SCOPE macro below.
611 :
612 : A RAII-style class intended to make it easy to emit dump
613 : information about entering and exiting a collection of nested
614 : function calls. */
615 :
616 : class auto_dump_scope
617 : {
618 : public:
619 : auto_dump_scope (const char *name,
620 : const dump_user_location_t &user_location,
621 : const dump_impl_location_t &impl_location
622 : = dump_impl_location_t ())
623 : {
624 : if (dump_enabled_p ())
625 : dump_begin_scope (name, user_location, impl_location);
626 : }
627 : ~auto_dump_scope ()
628 : {
629 : if (dump_enabled_p ())
630 : dump_end_scope ();
631 : }
632 : };
633 :
634 : /* A macro for calling:
635 : dump_begin_scope (NAME, USER_LOC);
636 : via an RAII object, thus printing "=== MSG ===\n" to the dumpfile etc,
637 : and then calling
638 : dump_end_scope ();
639 : once the object goes out of scope, thus capturing the nesting of
640 : the scopes.
641 :
642 : These scopes affect dump messages within them: dump messages at the
643 : top level implicitly default to MSG_PRIORITY_USER_FACING, whereas those
644 : in a nested scope implicitly default to MSG_PRIORITY_INTERNALS. */
645 :
646 : #define AUTO_DUMP_SCOPE(NAME, USER_LOC) \
647 : auto_dump_scope scope (NAME, USER_LOC)
648 :
649 : extern void dump_function (int phase, tree fn);
650 : extern void print_combine_total_stats (void);
651 : extern bool enable_rtl_dump_file (void);
652 :
653 : /* In tree-dump.cc */
654 : extern void dump_node (const_tree, dump_flags_t, FILE *);
655 :
656 : /* In combine.cc */
657 : extern void dump_combine_total_stats (FILE *);
658 : /* In cfghooks.cc */
659 : extern void dump_bb (FILE *, basic_block, int, dump_flags_t);
660 :
661 : class opt_pass;
662 :
663 : namespace gcc {
664 :
665 : /* A class for managing all of the various dump files used by the
666 : optimization passes. */
667 :
668 : class dump_manager
669 : {
670 : public:
671 :
672 : dump_manager ();
673 : ~dump_manager ();
674 :
675 : /* Register a dumpfile.
676 :
677 : TAKE_OWNERSHIP determines whether callee takes ownership of strings
678 : SUFFIX, SWTCH, and GLOB. */
679 : unsigned int
680 : dump_register (const char *suffix, const char *swtch, const char *glob,
681 : dump_kind dkind, optgroup_flags_t optgroup_flags,
682 : bool take_ownership);
683 :
684 : /* Allow languages and middle-end to register their dumps before the
685 : optimization passes. */
686 : void
687 : register_dumps ();
688 :
689 : /* Return the dump_file_info for the given phase. */
690 : struct dump_file_info *
691 : get_dump_file_info (int phase) const;
692 :
693 : struct dump_file_info *
694 : get_dump_file_info_by_switch (const char *swtch) const;
695 :
696 : /* Return the name of the dump file for the given phase.
697 : If the dump is not enabled, returns NULL. */
698 : char *
699 : get_dump_file_name (int phase, int part = -1) const;
700 :
701 : char *
702 : get_dump_file_name (struct dump_file_info *dfi, int part = -1) const;
703 :
704 : void
705 : dump_switch_p (const char *arg);
706 :
707 : /* Start a dump for PHASE. Store user-supplied dump flags in
708 : *FLAG_PTR. Return the number of streams opened. Set globals
709 : DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and
710 : set dump_flags appropriately for both pass dump stream and
711 : -fopt-info stream. */
712 : int
713 : dump_start (int phase, dump_flags_t *flag_ptr);
714 :
715 : /* Finish a tree dump for PHASE and close associated dump streams. Also
716 : reset the globals DUMP_FILE, ALT_DUMP_FILE, and DUMP_FLAGS. */
717 : void
718 : dump_finish (int phase);
719 :
720 : FILE *
721 : dump_begin (int phase, dump_flags_t *flag_ptr, int part);
722 :
723 : /* Returns nonzero if tree dump PHASE has been initialized. */
724 : int
725 : dump_initialized_p (int phase) const;
726 :
727 : /* Returns the switch name of PHASE. */
728 : const char *
729 : dump_flag_name (int phase) const;
730 :
731 : void register_pass (opt_pass *pass);
732 :
733 : private:
734 :
735 : int
736 : dump_phase_enabled_p (int phase) const;
737 :
738 : int
739 : dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob);
740 :
741 : int
742 : dump_enable_all (dump_kind dkind, dump_flags_t flags, const char *filename);
743 :
744 : int
745 : opt_info_enable_passes (optgroup_flags_t optgroup_flags, dump_flags_t flags,
746 : const char *filename);
747 :
748 : bool update_dfi_for_opt_info (dump_file_info *dfi) const;
749 :
750 : private:
751 :
752 : /* Dynamically registered dump files and switches. */
753 : int m_next_dump;
754 : struct dump_file_info *m_extra_dump_files;
755 : size_t m_extra_dump_files_in_use;
756 : size_t m_extra_dump_files_alloced;
757 :
758 : /* Stored values from -fopt-info, for handling passes created after
759 : option-parsing (by backends and by plugins). */
760 : optgroup_flags_t m_optgroup_flags;
761 : dump_flags_t m_optinfo_flags;
762 : char *m_optinfo_filename;
763 :
764 : /* Grant access to dump_enable_all. */
765 : friend bool ::enable_rtl_dump_file (void);
766 :
767 : /* Grant access to opt_info_enable_passes. */
768 : friend int ::opt_info_switch_p (const char *arg);
769 :
770 : }; // class dump_manager
771 :
772 : } // namespace gcc
773 :
774 : #endif /* GCC_DUMPFILE_H */
|