131
|
1 /* Optimization information.
|
145
|
2 Copyright (C) 2018-2020 Free Software Foundation, Inc.
|
131
|
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. */
|
145
|
68 class opt_pass;
|
131
|
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:
|
|
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
|
|
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
|
|
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 */
|