1 /* Optimization information.
2    Copyright (C) 2018-2020 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 /* The various kinds of optinfo.  */
78 
79 enum optinfo_kind
80 {
81   OPTINFO_KIND_SUCCESS,
82   OPTINFO_KIND_FAILURE,
83   OPTINFO_KIND_NOTE,
84   OPTINFO_KIND_SCOPE
85 };
86 
87 extern const char *optinfo_kind_to_string (enum optinfo_kind kind);
88 
89 class dump_context;
90 
91 /* A bundle of information describing part of an optimization.  */
92 
93 class optinfo
94 {
95   friend class dump_context;
96 
97  public:
optinfo(const dump_location_t & loc,enum optinfo_kind kind,opt_pass * pass)98   optinfo (const dump_location_t &loc,
99 	   enum optinfo_kind kind,
100 	   opt_pass *pass)
101   : m_loc (loc), m_kind (kind), m_pass (pass), m_items ()
102   {}
103   ~optinfo ();
104 
105   const dump_location_t &
get_dump_location()106   get_dump_location () const { return m_loc; }
107 
108   const dump_user_location_t &
get_user_location()109   get_user_location () const { return m_loc.get_user_location (); }
110 
111   const dump_impl_location_t &
get_impl_location()112   get_impl_location () const { return m_loc.get_impl_location (); }
113 
get_kind()114   enum optinfo_kind get_kind () const { return m_kind; }
get_pass()115   opt_pass *get_pass () const { return m_pass; }
num_items()116   unsigned int num_items () const { return m_items.length (); }
get_item(unsigned int i)117   const optinfo_item *get_item (unsigned int i) const { return m_items[i]; }
118 
get_location_t()119   location_t get_location_t () const { return m_loc.get_location_t (); }
get_count()120   profile_count get_count () const { return m_loc.get_count (); }
121 
122   void add_item (optinfo_item *item);
123 
124   void emit_for_opt_problem () const;
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 optinfo_kind m_kind;
134   opt_pass *m_pass;
135   auto_vec <optinfo_item *> m_items;
136 };
137 
138 /* An enum for discriminating between different kinds of optinfo_item.  */
139 
140 enum optinfo_item_kind
141 {
142   OPTINFO_ITEM_KIND_TEXT,
143   OPTINFO_ITEM_KIND_TREE,
144   OPTINFO_ITEM_KIND_GIMPLE,
145   OPTINFO_ITEM_KIND_SYMTAB_NODE
146 };
147 
148 /* An item within an optinfo.  */
149 
150 class optinfo_item
151 {
152  public:
153   optinfo_item (enum optinfo_item_kind kind, location_t location,
154 		char *text);
155   ~optinfo_item ();
156 
get_kind()157   enum optinfo_item_kind get_kind () const { return m_kind; }
get_location()158   location_t get_location () const { return m_location; }
get_text()159   const char *get_text () const { return m_text; }
160 
161  private:
162   /* Metadata (e.g. for optimization records).  */
163   enum optinfo_item_kind m_kind;
164   location_t m_location;
165 
166   /* The textual form of the item, owned by the item.  */
167   char *m_text;
168 };
169 
170 #endif /* #ifndef GCC_OPTINFO_H */
171