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