LCOV - code coverage report
Current view: top level - gcc - dumpfile.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 3 3 100.0 %
Date: 2023-07-19 08:18:47 Functions: 0 0 -

          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 */

Generated by: LCOV version 1.16