annotate gcc/optinfo.h @ 158:494b0b89df80 default tip

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