annotate gcc/optinfo.h @ 143:76e1cf5455ef

add cbc_gc test
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 19:24:05 +0900
parents 84e7813d76e9
children 1830386684a0
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.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 Copyright (C) 2018 Free Software Foundation, Inc.
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. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 struct opt_pass;
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 /* Should optinfo instances be created?
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 All creation of optinfos should be guarded by this predicate.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 Return true if any optinfo destinations are active. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 extern bool optinfo_enabled_p ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 /* Return true if any of the active optinfo destinations make use
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 of inlining information.
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 (if true, then the information is preserved). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 extern bool optinfo_wants_inlining_info_p ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 /* The various kinds of optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 enum optinfo_kind
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 OPTINFO_KIND_SUCCESS,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 OPTINFO_KIND_FAILURE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 OPTINFO_KIND_NOTE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 OPTINFO_KIND_SCOPE
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 extern const char *optinfo_kind_to_string (enum optinfo_kind kind);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 class dump_context;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 /* A bundle of information describing part of an optimization. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 class optinfo
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 friend class dump_context;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 optinfo (const dump_location_t &loc,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 enum optinfo_kind kind,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 opt_pass *pass)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 : m_loc (loc), m_kind (kind), m_pass (pass), m_items ()
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 ~optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 const dump_location_t &
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 get_dump_location () const { return m_loc; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 const dump_user_location_t &
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 get_user_location () const { return m_loc.get_user_location (); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 const dump_impl_location_t &
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 get_impl_location () const { return m_loc.get_impl_location (); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 enum optinfo_kind get_kind () const { return m_kind; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 opt_pass *get_pass () const { return m_pass; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 unsigned int num_items () const { return m_items.length (); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 const optinfo_item *get_item (unsigned int i) const { return m_items[i]; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 location_t get_location_t () const { return m_loc.get_location_t (); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 profile_count get_count () const { return m_loc.get_count (); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 void add_item (optinfo_item *item);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 void emit_for_opt_problem () const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 void emit () const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 /* Pre-canned ways of manipulating the optinfo, for use by friend class
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 dump_context. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 void handle_dump_file_kind (dump_flags_t);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 dump_location_t m_loc;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 enum optinfo_kind m_kind;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 opt_pass *m_pass;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 auto_vec <optinfo_item *> m_items;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 /* An enum for discriminating between different kinds of optinfo_item. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 enum optinfo_item_kind
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 OPTINFO_ITEM_KIND_TEXT,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 OPTINFO_ITEM_KIND_TREE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 OPTINFO_ITEM_KIND_GIMPLE,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 OPTINFO_ITEM_KIND_SYMTAB_NODE
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 /* An item within an optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 class optinfo_item
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 optinfo_item (enum optinfo_item_kind kind, location_t location,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 char *text);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 ~optinfo_item ();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 enum optinfo_item_kind get_kind () const { return m_kind; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 location_t get_location () const { return m_location; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 const char *get_text () const { return m_text; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 /* Metadata (e.g. for optimization records). */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 enum optinfo_item_kind m_kind;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 location_t m_location;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 /* The textual form of the item, owned by the item. */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 char *m_text;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178 #endif /* #ifndef GCC_OPTINFO_H */