1/* Optimization information.
2   Copyright (C) 2018-2020 Free Software Foundation, Inc.
3   Contributed by David Malcolm <dmalcolm@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along 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.  */
68class opt_pass;
69class 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
75extern bool optinfo_wants_inlining_info_p ();
76
77/* The various kinds of optinfo.  */
78
79enum optinfo_kind
80{
81  OPTINFO_KIND_SUCCESS,
82  OPTINFO_KIND_FAILURE,
83  OPTINFO_KIND_NOTE,
84  OPTINFO_KIND_SCOPE
85};
86
87extern const char *optinfo_kind_to_string (enum optinfo_kind kind);
88
89class dump_context;
90
91/* A bundle of information describing part of an optimization.  */
92
93class optinfo
94{
95  friend class dump_context;
96
97 public:
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 &
106  get_dump_location () const { return m_loc; }
107
108  const dump_user_location_t &
109  get_user_location () const { return m_loc.get_user_location (); }
110
111  const dump_impl_location_t &
112  get_impl_location () const { return m_loc.get_impl_location (); }
113
114  enum optinfo_kind get_kind () const { return m_kind; }
115  opt_pass *get_pass () const { return m_pass; }
116  unsigned int num_items () const { return m_items.length (); }
117  const optinfo_item *get_item (unsigned int i) const { return m_items[i]; }
118
119  location_t get_location_t () const { return m_loc.get_location_t (); }
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
140enum 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
150class optinfo_item
151{
152 public:
153  optinfo_item (enum optinfo_item_kind kind, location_t location,
154		char *text);
155  ~optinfo_item ();
156
157  enum optinfo_item_kind get_kind () const { return m_kind; }
158  location_t get_location () const { return m_location; }
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