LCOV - code coverage report
Current view: top level - gcc - optinfo.h Coverage Total Hit
Test: gcc.info Lines: 100.0 % 14 14
Test Date: 2026-02-28 14:20:25 Functions: - 0 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Optimization information.
       2              :    Copyright (C) 2018-2026 Free Software Foundation, Inc.
       3              :    Contributed by David Malcolm <dmalcolm@redhat.com>.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it under
       8              : the terms of the GNU General Public License as published by the Free
       9              : Software Foundation; either version 3, or (at your option) any later
      10              : version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      13              : WARRANTY; without even the implied warranty of MERCHANTABILITY or
      14              : FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      15              : for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #ifndef GCC_OPTINFO_H
      22              : #define GCC_OPTINFO_H
      23              : 
      24              : /* An "optinfo" is a bundle of information describing part of an
      25              :    optimization, which can be emitted to zero or more of several
      26              :    destinations, such as:
      27              : 
      28              :    * saved to a file as an "optimization record"
      29              : 
      30              :    They are generated in response to calls to the "dump_*" API in
      31              :    dumpfile.h; repeated calls to the "dump_*" API are consolidated
      32              :    into a pending optinfo instance, with a "dump_*_loc" starting a new
      33              :    optinfo instance.
      34              : 
      35              :    The data sent to the dump calls are captured within the pending optinfo
      36              :    instance as a sequence of optinfo_items.  For example, given:
      37              : 
      38              :       if (dump_enabled_p ())
      39              :         {
      40              :           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
      41              :                            "not vectorized: live stmt not supported: ");
      42              :           dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, stmt, 0);
      43              :         }
      44              : 
      45              :    the "dump_printf_loc" call begins a new optinfo containing two items:
      46              :    (1) a text item containing "not vectorized: live stmt not supported: "
      47              :    (2) a gimple item for "stmt"
      48              : 
      49              :    Dump destinations are thus able to access rich metadata about the
      50              :    items when the optinfo is emitted to them, rather than just having plain
      51              :    text.  For example, when saving the above optinfo to a file as an
      52              :    "optimization record", the record could capture the source location of
      53              :    "stmt" above, rather than just its textual form.
      54              : 
      55              :    The currently pending optinfo is emitted and deleted:
      56              :    * each time a "dump_*_loc" call occurs (which starts the next optinfo), or
      57              :    * when the dump files are changed (at the end of a pass)
      58              : 
      59              :    Dumping to an optinfo instance is non-trivial (due to building optinfo_item
      60              :    instances), so all usage should be guarded by
      61              : 
      62              :      if (optinfo_enabled_p ())
      63              : 
      64              :    which is off by default.  */
      65              : 
      66              : 
      67              : /* Forward decls.  */
      68              : class opt_pass;
      69              : class optinfo_item;
      70              : 
      71              : /* Return true if any of the active optinfo destinations make use
      72              :    of inlining information.
      73              :    (if true, then the information is preserved).  */
      74              : 
      75              : extern bool optinfo_wants_inlining_info_p ();
      76              : 
      77              : class dump_context;
      78              : 
      79              : /* A bundle of information describing part of an optimization.  */
      80              : 
      81              : class optinfo
      82              : {
      83              :   friend class dump_context;
      84              : 
      85              :  public:
      86              :   /* The various kinds of optinfo.  */
      87              :   enum class kind
      88              :   {
      89              :     success,
      90              :     failure,
      91              :     note,
      92              :     scope
      93              :   };
      94              : 
      95        70478 :   optinfo (const dump_location_t &loc,
      96              :            enum kind kind_,
      97              :            opt_pass *pass)
      98        70478 :   : m_loc (loc), m_kind (kind_), m_pass (pass), m_items ()
      99              :   {}
     100              :   ~optinfo ();
     101              : 
     102              :   const dump_location_t &
     103          336 :   get_dump_location () const { return m_loc; }
     104              : 
     105              :   const dump_user_location_t &
     106         5932 :   get_user_location () const { return m_loc.get_user_location (); }
     107              : 
     108              :   const dump_impl_location_t &
     109        43676 :   get_impl_location () const { return m_loc.get_impl_location (); }
     110              : 
     111        92104 :   enum kind get_kind () const { return m_kind; }
     112        42780 :   opt_pass *get_pass () const { return m_pass; }
     113       148187 :   unsigned int num_items () const { return m_items.length (); }
     114       105403 :   const optinfo_item *get_item (unsigned int i) const { return m_items[i]; }
     115              : 
     116        42892 :   location_t get_location_t () const { return m_loc.get_location_t (); }
     117        42780 :   profile_count get_count () const { return m_loc.get_count (); }
     118              : 
     119              :   void add_item (std::unique_ptr<optinfo_item> item);
     120              : 
     121              :   void emit_for_opt_problem () const;
     122              : 
     123              :   static const char *kind_to_string (enum kind k);
     124              :   static dump_flags_t kind_to_dump_flag (enum kind k);
     125              : 
     126              :  private:
     127              :   /* Pre-canned ways of manipulating the optinfo, for use by friend class
     128              :      dump_context.  */
     129              :   void handle_dump_file_kind (dump_flags_t);
     130              : 
     131              :  private:
     132              :   dump_location_t m_loc;
     133              :   enum kind m_kind;
     134              :   opt_pass *m_pass;
     135              :   auto_vec <optinfo_item *> m_items;
     136              : };
     137              : 
     138              : /* An item within an optinfo.  */
     139              : 
     140              : class optinfo_item
     141              : {
     142              :  public:
     143              :   /* An enum for discriminating between different kinds of optinfo_item.  */
     144              :   enum class kind
     145              :   {
     146              :     text,
     147              :     tree,
     148              :     gimple,
     149              :     symtab_node
     150              :   };
     151              : 
     152              :   optinfo_item (enum kind kind_, location_t location,
     153              :                 char *text);
     154              :   ~optinfo_item ();
     155              : 
     156       106579 :   enum kind get_kind () const { return m_kind; }
     157        36602 :   location_t get_location () const { return m_location; }
     158     16575486 :   const char *get_text () const { return m_text; }
     159              : 
     160              :  private:
     161              :   /* Metadata (e.g. for optimization records).  */
     162              :   enum kind m_kind;
     163              :   location_t m_location;
     164              : 
     165              :   /* The textual form of the item, owned by the item.  */
     166              :   char *m_text;
     167              : };
     168              : 
     169              : #endif /* #ifndef GCC_OPTINFO_H */
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.