1 /* Definitions for the shared dumpfile.
2 Copyright (C) 2004-2019 Free Software Foundation, Inc.
4 This file is part of GCC.
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)
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.
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/>. */
21 #ifndef GCC_DUMPFILE_H
22 #define GCC_DUMPFILE_H 1
24 #include "profile-count.h"
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.c), with additional codes for middle-end
29 specific entities (see dumpfile.c). */
31 #if GCC_VERSION >= 9000
32 #define ATTRIBUTE_GCC_DUMP_PRINTF(m, n) \
33 __attribute__ ((__format__ (__gcc_dump_printf__, m ,n))) \
36 #define ATTRIBUTE_GCC_DUMP_PRINTF(m, n) ATTRIBUTE_NONNULL(m)
39 /* Different tree dump places. When you add new tree dump places,
40 extend the DUMP_FILES array in dumpfile.c. */
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 */
52 TDI_lang_all
, /* enable all the language dumps. */
53 TDI_tree_all
, /* enable all the GENERIC/GIMPLE dumps. */
54 TDI_rtl_all
, /* enable all the RTL dumps. */
55 TDI_ipa_all
, /* enable all the IPA dumps. */
60 /* Enum used to distinguish dump files to types. */
71 /* Bit masks to control dumping. Not all values are applicable to all
72 dumps. Add new ones at the end. When you define new values, extend
73 the DUMP_OPTIONS array in dumpfile.c. The TDF_* flags coexist with
74 MSG_* flags (for -fopt-info) and the bit values must be chosen to
78 /* Value of TDF_NONE is used just for bits filtered by TDF_KIND_MASK. */
81 /* Dump node addresses. */
82 TDF_ADDRESS
= (1 << 0),
84 /* Don't go wild following links. */
87 /* Don't unparse the function. */
90 /* Show more detailed info about each pass. */
91 TDF_DETAILS
= (1 << 3),
93 /* Dump various statistics about each pass. */
96 /* Display basic block boundaries. */
97 TDF_BLOCKS
= (1 << 5),
99 /* Display virtual operands. */
102 /* Display statement line numbers. */
103 TDF_LINENO
= (1 << 7),
105 /* Display decl UIDs. */
108 /* Address of stmt. */
109 TDF_STMTADDR
= (1 << 9),
111 /* A graph dump is being emitted. */
112 TDF_GRAPH
= (1 << 10),
114 /* Display memory symbols in expr.
116 TDF_MEMSYMS
= (1 << 11),
118 /* A flag to only print the RHS of a gimple stmt. */
119 TDF_RHS_ONLY
= (1 << 12),
121 /* Display asm names of decls. */
122 TDF_ASMNAME
= (1 << 13),
124 /* Display EH region number holding this gimple statement. */
127 /* Omit UIDs from dumps. */
128 TDF_NOUID
= (1 << 15),
130 /* Display alias information. */
131 TDF_ALIAS
= (1 << 16),
133 /* Enumerate locals by uid. */
134 TDF_ENUMERATE_LOCALS
= (1 << 17),
136 /* Dump cselib details. */
137 TDF_CSELIB
= (1 << 18),
139 /* Dump SCEV details. */
140 TDF_SCEV
= (1 << 19),
142 /* Dump in GIMPLE FE syntax */
143 TDF_GIMPLE
= (1 << 20),
145 /* Dump folding details. */
146 TDF_FOLDING
= (1 << 21),
148 /* MSG_* flags for expressing the kinds of message to
149 be emitted by -fopt-info. */
151 /* -fopt-info optimized sources. */
152 MSG_OPTIMIZED_LOCATIONS
= (1 << 22),
154 /* Missed opportunities. */
155 MSG_MISSED_OPTIMIZATION
= (1 << 23),
157 /* General optimization info. */
158 MSG_NOTE
= (1 << 24),
160 /* Mask for selecting MSG_-kind flags. */
161 MSG_ALL_KINDS
= (MSG_OPTIMIZED_LOCATIONS
162 | MSG_MISSED_OPTIMIZATION
165 /* MSG_PRIORITY_* flags for expressing the priority levels of message
166 to be emitted by -fopt-info, and filtering on them.
167 By default, messages at the top-level dump scope are "user-facing",
168 whereas those that are in nested scopes are implicitly "internals".
169 This behavior can be overridden for a given dump message by explicitly
170 specifying one of the MSG_PRIORITY_* flags.
172 By default, dump files show both kinds of message, whereas -fopt-info
173 only shows "user-facing" messages, and requires the "-internals"
174 sub-option of -fopt-info to show the internal messages. */
176 /* Implicitly supplied for messages at the top-level dump scope. */
177 MSG_PRIORITY_USER_FACING
= (1 << 25),
179 /* Implicitly supplied for messages within nested dump scopes. */
180 MSG_PRIORITY_INTERNALS
= (1 << 26),
182 /* Supplied when an opt_problem generated in a nested scope is re-emitted
183 at the top-level. We want to default to showing these in -fopt-info
184 output, but to *not* show them in dump files, as the message would be
185 shown twice, messing up "scan-tree-dump-times" in DejaGnu tests. */
186 MSG_PRIORITY_REEMITTED
= (1 << 27),
188 /* Mask for selecting MSG_PRIORITY_* flags. */
189 MSG_ALL_PRIORITIES
= (MSG_PRIORITY_USER_FACING
190 | MSG_PRIORITY_INTERNALS
191 | MSG_PRIORITY_REEMITTED
),
193 /* Dumping for -fcompare-debug. */
194 TDF_COMPARE_DEBUG
= (1 << 28),
197 TDF_ERROR
= (1 << 26),
200 TDF_ALL_VALUES
= (1 << 29) - 1
203 /* Dump flags type. */
205 typedef enum dump_flag dump_flags_t
;
207 static inline dump_flags_t
208 operator| (dump_flags_t lhs
, dump_flags_t rhs
)
210 return (dump_flags_t
)((int)lhs
| (int)rhs
);
213 static inline dump_flags_t
214 operator& (dump_flags_t lhs
, dump_flags_t rhs
)
216 return (dump_flags_t
)((int)lhs
& (int)rhs
);
219 static inline dump_flags_t
220 operator~ (dump_flags_t flags
)
222 return (dump_flags_t
)~((int)flags
);
225 static inline dump_flags_t
&
226 operator|= (dump_flags_t
&lhs
, dump_flags_t rhs
)
228 lhs
= (dump_flags_t
)((int)lhs
| (int)rhs
);
232 static inline dump_flags_t
&
233 operator&= (dump_flags_t
&lhs
, dump_flags_t rhs
)
235 lhs
= (dump_flags_t
)((int)lhs
& (int)rhs
);
239 /* Flags to control high-level -fopt-info dumps. Usually these flags
240 define a group of passes. An optimization pass can be part of
247 /* IPA optimization passes */
248 OPTGROUP_IPA
= (1 << 1),
250 /* Loop optimization passes */
251 OPTGROUP_LOOP
= (1 << 2),
253 /* Inlining passes */
254 OPTGROUP_INLINE
= (1 << 3),
256 /* OMP (Offloading and Multi Processing) transformations */
257 OPTGROUP_OMP
= (1 << 4),
259 /* Vectorization passes */
260 OPTGROUP_VEC
= (1 << 5),
262 /* All other passes */
263 OPTGROUP_OTHER
= (1 << 6),
265 OPTGROUP_ALL
= (OPTGROUP_IPA
| OPTGROUP_LOOP
| OPTGROUP_INLINE
266 | OPTGROUP_OMP
| OPTGROUP_VEC
| OPTGROUP_OTHER
)
269 typedef enum optgroup_flag optgroup_flags_t
;
271 static inline optgroup_flags_t
272 operator| (optgroup_flags_t lhs
, optgroup_flags_t rhs
)
274 return (optgroup_flags_t
)((int)lhs
| (int)rhs
);
277 static inline optgroup_flags_t
&
278 operator|= (optgroup_flags_t
&lhs
, optgroup_flags_t rhs
)
280 lhs
= (optgroup_flags_t
)((int)lhs
| (int)rhs
);
284 /* Define a tree dump switch. */
285 struct dump_file_info
287 /* Suffix to give output file. */
289 /* Command line dump switch. */
291 /* Command line glob. */
293 /* Filename for the pass-specific stream. */
294 const char *pfilename
;
295 /* Filename for the -fopt-info stream. */
296 const char *alt_filename
;
297 /* Pass-specific dump stream. */
299 /* -fopt-info stream. */
305 /* A pass flags for -fopt-info. */
306 dump_flags_t alt_flags
;
307 /* Flags for -fopt-info given by a user. */
308 optgroup_flags_t optgroup_flags
;
309 /* State of pass-specific stream. */
311 /* State of the -fopt-info stream. */
313 /* Dump file number. */
315 /* Fields "suffix", "swtch", "glob" can be const strings,
316 or can be dynamically allocated, needing free. */
318 /* When a given dump file is being initialized, this flag is set to true
319 if the corresponding TDF_graph dump file has also been initialized. */
320 bool graph_dump_initialized
;
323 /* A class for describing where in the user's source that a dump message
324 relates to, with various constructors for convenience.
325 In particular, this lets us associate dump messages
326 with hotness information (e.g. from PGO), allowing them to
327 be prioritized by code hotness. */
329 class dump_user_location_t
332 /* Default constructor, analogous to UNKNOWN_LOCATION. */
333 dump_user_location_t () : m_count (), m_loc (UNKNOWN_LOCATION
) {}
335 /* Construct from a gimple statement (using its location and hotness). */
336 dump_user_location_t (const gimple
*stmt
);
338 /* Construct from an RTL instruction (using its location and hotness). */
339 dump_user_location_t (const rtx_insn
*insn
);
341 /* Construct from a location_t. This one is deprecated (since it doesn't
342 capture hotness information); it thus needs to be spelled out. */
343 static dump_user_location_t
344 from_location_t (location_t loc
)
346 return dump_user_location_t (profile_count (), loc
);
349 /* Construct from a function declaration. This one requires spelling out
350 to avoid accidentally constructing from other kinds of tree. */
351 static dump_user_location_t
352 from_function_decl (tree fndecl
);
354 profile_count
get_count () const { return m_count
; }
355 location_t
get_location_t () const { return m_loc
; }
358 /* Private ctor from count and location, for use by from_location_t. */
359 dump_user_location_t (profile_count count
, location_t loc
)
360 : m_count (count
), m_loc (loc
)
363 profile_count m_count
;
367 /* A class for identifying where in the compiler's own source
368 (or a plugin) that a dump message is being emitted from. */
370 class dump_impl_location_t
373 dump_impl_location_t (
374 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
375 const char *file
= __builtin_FILE (),
376 int line
= __builtin_LINE (),
377 const char *function
= __builtin_FUNCTION ()
379 const char *file
= __FILE__
,
381 const char *function
= NULL
384 : m_file (file
), m_line (line
), m_function (function
)
389 const char *m_function
;
392 /* A bundle of metadata for describing a dump message:
394 (b) the source location within the compiler/plugin.
396 The constructors use default parameters so that (b) gets sets up
399 Hence you can pass in e.g. MSG_NOTE, and the dump call
400 will automatically record where in GCC's source code the
401 dump was emitted from. */
403 class dump_metadata_t
406 dump_metadata_t (dump_flags_t dump_flags
,
407 const dump_impl_location_t
&impl_location
408 = dump_impl_location_t ())
409 : m_dump_flags (dump_flags
),
410 m_impl_location (impl_location
)
414 dump_flags_t
get_dump_flags () const { return m_dump_flags
; }
416 const dump_impl_location_t
&
417 get_impl_location () const { return m_impl_location
; }
420 dump_flags_t m_dump_flags
;
421 dump_impl_location_t m_impl_location
;
424 /* A bundle of information for describing the location of a dump message:
425 (a) the source location and hotness within the user's code, together with
426 (b) the source location within the compiler/plugin.
428 The constructors use default parameters so that (b) gets sets up
431 The upshot is that you can pass in e.g. a gimple * to dump_printf_loc,
432 and the dump call will automatically record where in GCC's source
433 code the dump was emitted from. */
435 class dump_location_t
438 /* Default constructor, analogous to UNKNOWN_LOCATION. */
439 dump_location_t (const dump_impl_location_t
&impl_location
440 = dump_impl_location_t ())
441 : m_user_location (dump_user_location_t ()),
442 m_impl_location (impl_location
)
446 /* Construct from a gimple statement (using its location and hotness). */
447 dump_location_t (const gimple
*stmt
,
448 const dump_impl_location_t
&impl_location
449 = dump_impl_location_t ())
450 : m_user_location (dump_user_location_t (stmt
)),
451 m_impl_location (impl_location
)
455 /* Construct from an RTL instruction (using its location and hotness). */
456 dump_location_t (const rtx_insn
*insn
,
457 const dump_impl_location_t
&impl_location
458 = dump_impl_location_t ())
459 : m_user_location (dump_user_location_t (insn
)),
460 m_impl_location (impl_location
)
464 /* Construct from a dump_user_location_t. */
465 dump_location_t (const dump_user_location_t
&user_location
,
466 const dump_impl_location_t
&impl_location
467 = dump_impl_location_t ())
468 : m_user_location (user_location
),
469 m_impl_location (impl_location
)
473 /* Construct from a location_t. This one is deprecated (since it doesn't
474 capture hotness information), and thus requires spelling out. */
475 static dump_location_t
476 from_location_t (location_t loc
,
477 const dump_impl_location_t
&impl_location
478 = dump_impl_location_t ())
480 return dump_location_t (dump_user_location_t::from_location_t (loc
),
484 const dump_user_location_t
&
485 get_user_location () const { return m_user_location
; }
487 const dump_impl_location_t
&
488 get_impl_location () const { return m_impl_location
; }
490 location_t
get_location_t () const
492 return m_user_location
.get_location_t ();
495 profile_count
get_count () const { return m_user_location
.get_count (); }
498 dump_user_location_t m_user_location
;
499 dump_impl_location_t m_impl_location
;
503 extern FILE *dump_begin (int, dump_flags_t
*, int part
=-1);
504 extern void dump_end (int, FILE *);
505 extern int opt_info_switch_p (const char *);
506 extern const char *dump_flag_name (int);
507 extern const kv_pair
<optgroup_flags_t
> optgroup_options
[];
509 parse_dump_option (const char *, const char **);
511 /* Global variables used to communicate with passes. */
512 extern FILE *dump_file
;
513 extern dump_flags_t dump_flags
;
514 extern const char *dump_file_name
;
516 extern bool dumps_are_enabled
;
518 extern void set_dump_file (FILE *new_dump_file
);
520 /* Return true if any of the dumps is enabled, false otherwise. */
522 dump_enabled_p (void)
524 return dumps_are_enabled
;
527 /* The following API calls (which *don't* take a "FILE *")
528 write the output to zero or more locations.
530 Some destinations are written to immediately as dump_* calls
531 are made; for others, the output is consolidated into an "optinfo"
532 instance (with its own metadata), and only emitted once the optinfo
535 The destinations are:
537 (a) the "immediate" destinations:
538 (a.1) the active dump_file, if any
539 (a.2) the -fopt-info destination, if any
540 (b) the "optinfo" destinations, if any:
541 (b.1) as optimization records
543 dump_* (MSG_*) --> dumpfile.c --> items --> (a.1) dump_file
544 | `-> (a.2) alt_dump_file
547 `---> optinfo destinations
548 (b.1) optimization records
550 For optinfos, the dump_*_loc mark the beginning of an optinfo
551 instance: all subsequent dump_* calls are consolidated into
552 that optinfo, until the next dump_*_loc call (or a change in
553 dump scope, or a call to dumpfile_ensure_any_optinfo_are_flushed).
555 A group of dump_* calls should be guarded by:
557 if (dump_enabled_p ())
559 to minimize the work done for the common case where dumps
562 extern void dump_printf (const dump_metadata_t
&, const char *, ...)
563 ATTRIBUTE_GCC_DUMP_PRINTF (2, 3);
565 extern void dump_printf_loc (const dump_metadata_t
&, const dump_user_location_t
&,
567 ATTRIBUTE_GCC_DUMP_PRINTF (3, 0);
568 extern void dump_function (int phase
, tree fn
);
569 extern void dump_basic_block (dump_flags_t
, basic_block
, int);
570 extern void dump_generic_expr_loc (const dump_metadata_t
&,
571 const dump_user_location_t
&,
573 extern void dump_generic_expr (const dump_metadata_t
&, dump_flags_t
, tree
);
574 extern void dump_gimple_stmt_loc (const dump_metadata_t
&,
575 const dump_user_location_t
&,
576 dump_flags_t
, gimple
*, int);
577 extern void dump_gimple_stmt (const dump_metadata_t
&, dump_flags_t
, gimple
*, int);
578 extern void dump_gimple_expr_loc (const dump_metadata_t
&,
579 const dump_user_location_t
&,
580 dump_flags_t
, gimple
*, int);
581 extern void dump_gimple_expr (const dump_metadata_t
&, dump_flags_t
, gimple
*, int);
582 extern void dump_symtab_node (const dump_metadata_t
&, symtab_node
*);
584 template<unsigned int N
, typename C
>
585 void dump_dec (const dump_metadata_t
&, const poly_int
<N
, C
> &);
586 extern void dump_dec (dump_flags_t
, const poly_wide_int
&, signop
);
587 extern void dump_hex (dump_flags_t
, const poly_wide_int
&);
589 extern void dumpfile_ensure_any_optinfo_are_flushed ();
591 /* Managing nested scopes, so that dumps can express the call chain
592 leading to a dump message. */
594 extern unsigned int get_dump_scope_depth ();
595 extern void dump_begin_scope (const char *name
,
596 const dump_user_location_t
&user_location
,
597 const dump_impl_location_t
&impl_location
);
598 extern void dump_end_scope ();
600 /* Implementation detail of the AUTO_DUMP_SCOPE macro below.
602 A RAII-style class intended to make it easy to emit dump
603 information about entering and exiting a collection of nested
606 class auto_dump_scope
609 auto_dump_scope (const char *name
,
610 const dump_user_location_t
&user_location
,
611 const dump_impl_location_t
&impl_location
612 = dump_impl_location_t ())
614 if (dump_enabled_p ())
615 dump_begin_scope (name
, user_location
, impl_location
);
619 if (dump_enabled_p ())
624 /* A macro for calling:
625 dump_begin_scope (NAME, USER_LOC);
626 via an RAII object, thus printing "=== MSG ===\n" to the dumpfile etc,
629 once the object goes out of scope, thus capturing the nesting of
632 These scopes affect dump messages within them: dump messages at the
633 top level implicitly default to MSG_PRIORITY_USER_FACING, whereas those
634 in a nested scope implicitly default to MSG_PRIORITY_INTERNALS. */
636 #define AUTO_DUMP_SCOPE(NAME, USER_LOC) \
637 auto_dump_scope scope (NAME, USER_LOC)
639 extern void dump_function (int phase
, tree fn
);
640 extern void print_combine_total_stats (void);
641 extern bool enable_rtl_dump_file (void);
644 extern void dump_node (const_tree
, dump_flags_t
, FILE *);
647 extern void dump_combine_total_stats (FILE *);
649 extern void dump_bb (FILE *, basic_block
, int, dump_flags_t
);
655 /* A class for managing all of the various dump files used by the
656 optimization passes. */
665 /* Register a dumpfile.
667 TAKE_OWNERSHIP determines whether callee takes ownership of strings
668 SUFFIX, SWTCH, and GLOB. */
670 dump_register (const char *suffix
, const char *swtch
, const char *glob
,
671 dump_kind dkind
, optgroup_flags_t optgroup_flags
,
672 bool take_ownership
);
674 /* Allow languages and middle-end to register their dumps before the
675 optimization passes. */
679 /* Return the dump_file_info for the given phase. */
680 struct dump_file_info
*
681 get_dump_file_info (int phase
) const;
683 struct dump_file_info
*
684 get_dump_file_info_by_switch (const char *swtch
) const;
686 /* Return the name of the dump file for the given phase.
687 If the dump is not enabled, returns NULL. */
689 get_dump_file_name (int phase
, int part
= -1) const;
692 get_dump_file_name (struct dump_file_info
*dfi
, int part
= -1) const;
695 dump_switch_p (const char *arg
);
697 /* Start a dump for PHASE. Store user-supplied dump flags in
698 *FLAG_PTR. Return the number of streams opened. Set globals
699 DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and
700 set dump_flags appropriately for both pass dump stream and
701 -fopt-info stream. */
703 dump_start (int phase
, dump_flags_t
*flag_ptr
);
705 /* Finish a tree dump for PHASE and close associated dump streams. Also
706 reset the globals DUMP_FILE, ALT_DUMP_FILE, and DUMP_FLAGS. */
708 dump_finish (int phase
);
711 dump_begin (int phase
, dump_flags_t
*flag_ptr
, int part
);
713 /* Returns nonzero if tree dump PHASE has been initialized. */
715 dump_initialized_p (int phase
) const;
717 /* Returns the switch name of PHASE. */
719 dump_flag_name (int phase
) const;
721 void register_pass (opt_pass
*pass
);
726 dump_phase_enabled_p (int phase
) const;
729 dump_switch_p_1 (const char *arg
, struct dump_file_info
*dfi
, bool doglob
);
732 dump_enable_all (dump_kind dkind
, dump_flags_t flags
, const char *filename
);
735 opt_info_enable_passes (optgroup_flags_t optgroup_flags
, dump_flags_t flags
,
736 const char *filename
);
738 bool update_dfi_for_opt_info (dump_file_info
*dfi
) const;
742 /* Dynamically registered dump files and switches. */
744 struct dump_file_info
*m_extra_dump_files
;
745 size_t m_extra_dump_files_in_use
;
746 size_t m_extra_dump_files_alloced
;
748 /* Stored values from -fopt-info, for handling passes created after
749 option-parsing (by backends and by plugins). */
750 optgroup_flags_t m_optgroup_flags
;
751 dump_flags_t m_optinfo_flags
;
752 char *m_optinfo_filename
;
754 /* Grant access to dump_enable_all. */
755 friend bool ::enable_rtl_dump_file (void);
757 /* Grant access to opt_info_enable_passes. */
758 friend int ::opt_info_switch_p (const char *arg
);
760 }; // class dump_manager
764 #endif /* GCC_DUMPFILE_H */