annotate gcc/dumpfile.c @ 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
111
kono
parents:
diff changeset
1 /* Dump infrastructure for optimizations and intermediate representation.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2012-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
9 version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
14 for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #include "config.h"
kono
parents:
diff changeset
21 #include "system.h"
kono
parents:
diff changeset
22 #include "coretypes.h"
kono
parents:
diff changeset
23 #include "options.h"
kono
parents:
diff changeset
24 #include "tree.h"
kono
parents:
diff changeset
25 #include "gimple-pretty-print.h"
kono
parents:
diff changeset
26 #include "diagnostic-core.h"
kono
parents:
diff changeset
27 #include "dumpfile.h"
kono
parents:
diff changeset
28 #include "context.h"
kono
parents:
diff changeset
29 #include "profile-count.h"
kono
parents:
diff changeset
30 #include "tree-cfg.h"
kono
parents:
diff changeset
31 #include "langhooks.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
32 #include "backend.h" /* for gimple.h. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
33 #include "gimple.h" /* for dump_user_location_t ctor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
34 #include "rtl.h" /* for dump_user_location_t ctor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
35 #include "selftest.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
36 #include "optinfo.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
37 #include "dump-context.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
38 #include "cgraph.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
39 #include "tree-pass.h" /* for "current_pass". */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
40 #include "optinfo-emit-json.h"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
41 #include "stringpool.h" /* for get_identifier. */
111
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 /* If non-NULL, return one past-the-end of the matching SUBPART of
kono
parents:
diff changeset
44 the WHOLE string. */
kono
parents:
diff changeset
45 #define skip_leading_substring(whole, part) \
kono
parents:
diff changeset
46 (strncmp (whole, part, strlen (part)) ? NULL : whole + strlen (part))
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 static dump_flags_t pflags; /* current dump_flags */
kono
parents:
diff changeset
49
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 static void dump_loc (dump_flags_t, FILE *, location_t);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
51
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
52 /* Current -fopt-info output stream, if any, and flags. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
53 static FILE *alt_dump_file = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
54 static dump_flags_t alt_flags;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
55
111
kono
parents:
diff changeset
56 static FILE *dump_open_alternate_stream (struct dump_file_info *);
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 /* These are currently used for communicating between passes.
kono
parents:
diff changeset
59 However, instead of accessing them directly, the passes can use
kono
parents:
diff changeset
60 dump_printf () for dumps. */
kono
parents:
diff changeset
61 FILE *dump_file = NULL;
kono
parents:
diff changeset
62 const char *dump_file_name;
kono
parents:
diff changeset
63 dump_flags_t dump_flags;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
64 bool dumps_are_enabled = false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
65
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
66
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
67 /* Set global "dump_file" to NEW_DUMP_FILE, refreshing the "dumps_are_enabled"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
68 global. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
69
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
70 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
71 set_dump_file (FILE *new_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
72 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
73 dumpfile_ensure_any_optinfo_are_flushed ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
74 dump_file = new_dump_file;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
75 dump_context::get ().refresh_dumps_are_enabled ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
76 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
77
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
78 /* Set "alt_dump_file" to NEW_ALT_DUMP_FILE, refreshing the "dumps_are_enabled"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
79 global. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
80
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
81 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
82 set_alt_dump_file (FILE *new_alt_dump_file)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
83 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
84 dumpfile_ensure_any_optinfo_are_flushed ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
85 alt_dump_file = new_alt_dump_file;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
86 dump_context::get ().refresh_dumps_are_enabled ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
87 }
111
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 #define DUMP_FILE_INFO(suffix, swtch, dkind, num) \
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
90 {suffix, swtch, NULL, NULL, NULL, NULL, NULL, dkind, TDF_NONE, TDF_NONE, \
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
91 OPTGROUP_NONE, 0, 0, num, false, false}
111
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 /* Table of tree dump switches. This must be consistent with the
kono
parents:
diff changeset
94 TREE_DUMP_INDEX enumeration in dumpfile.h. */
kono
parents:
diff changeset
95 static struct dump_file_info dump_files[TDI_end] =
kono
parents:
diff changeset
96 {
kono
parents:
diff changeset
97 DUMP_FILE_INFO (NULL, NULL, DK_none, 0),
kono
parents:
diff changeset
98 DUMP_FILE_INFO (".cgraph", "ipa-cgraph", DK_ipa, 0),
kono
parents:
diff changeset
99 DUMP_FILE_INFO (".type-inheritance", "ipa-type-inheritance", DK_ipa, 0),
kono
parents:
diff changeset
100 DUMP_FILE_INFO (".ipa-clones", "ipa-clones", DK_ipa, 0),
kono
parents:
diff changeset
101 DUMP_FILE_INFO (".original", "tree-original", DK_tree, 0),
kono
parents:
diff changeset
102 DUMP_FILE_INFO (".gimple", "tree-gimple", DK_tree, 0),
kono
parents:
diff changeset
103 DUMP_FILE_INFO (".nested", "tree-nested", DK_tree, 0),
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 DUMP_FILE_INFO (".lto-stream-out", "ipa-lto-stream-out", DK_ipa, 0),
111
kono
parents:
diff changeset
105 #define FIRST_AUTO_NUMBERED_DUMP 1
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 #define FIRST_ME_AUTO_NUMBERED_DUMP 4
111
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 DUMP_FILE_INFO (NULL, "lang-all", DK_lang, 0),
kono
parents:
diff changeset
109 DUMP_FILE_INFO (NULL, "tree-all", DK_tree, 0),
kono
parents:
diff changeset
110 DUMP_FILE_INFO (NULL, "rtl-all", DK_rtl, 0),
kono
parents:
diff changeset
111 DUMP_FILE_INFO (NULL, "ipa-all", DK_ipa, 0),
kono
parents:
diff changeset
112 };
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 /* Table of dump options. This must be consistent with the TDF_* flags
kono
parents:
diff changeset
115 in dumpfile.h and opt_info_options below. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 static const kv_pair<dump_flags_t> dump_options[] =
111
kono
parents:
diff changeset
117 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 {"none", TDF_NONE},
111
kono
parents:
diff changeset
119 {"address", TDF_ADDRESS},
kono
parents:
diff changeset
120 {"asmname", TDF_ASMNAME},
kono
parents:
diff changeset
121 {"slim", TDF_SLIM},
kono
parents:
diff changeset
122 {"raw", TDF_RAW},
kono
parents:
diff changeset
123 {"graph", TDF_GRAPH},
kono
parents:
diff changeset
124 {"details", (TDF_DETAILS | MSG_OPTIMIZED_LOCATIONS
kono
parents:
diff changeset
125 | MSG_MISSED_OPTIMIZATION
kono
parents:
diff changeset
126 | MSG_NOTE)},
kono
parents:
diff changeset
127 {"cselib", TDF_CSELIB},
kono
parents:
diff changeset
128 {"stats", TDF_STATS},
kono
parents:
diff changeset
129 {"blocks", TDF_BLOCKS},
kono
parents:
diff changeset
130 {"vops", TDF_VOPS},
kono
parents:
diff changeset
131 {"lineno", TDF_LINENO},
kono
parents:
diff changeset
132 {"uid", TDF_UID},
kono
parents:
diff changeset
133 {"stmtaddr", TDF_STMTADDR},
kono
parents:
diff changeset
134 {"memsyms", TDF_MEMSYMS},
kono
parents:
diff changeset
135 {"eh", TDF_EH},
kono
parents:
diff changeset
136 {"alias", TDF_ALIAS},
kono
parents:
diff changeset
137 {"nouid", TDF_NOUID},
kono
parents:
diff changeset
138 {"enumerate_locals", TDF_ENUMERATE_LOCALS},
kono
parents:
diff changeset
139 {"scev", TDF_SCEV},
kono
parents:
diff changeset
140 {"gimple", TDF_GIMPLE},
kono
parents:
diff changeset
141 {"folding", TDF_FOLDING},
kono
parents:
diff changeset
142 {"optimized", MSG_OPTIMIZED_LOCATIONS},
kono
parents:
diff changeset
143 {"missed", MSG_MISSED_OPTIMIZATION},
kono
parents:
diff changeset
144 {"note", MSG_NOTE},
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145 {"optall", MSG_ALL_KINDS},
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 {"all", dump_flags_t (TDF_ALL_VALUES
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 & ~(TDF_RAW | TDF_SLIM | TDF_LINENO | TDF_GRAPH
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 | TDF_STMTADDR | TDF_RHS_ONLY | TDF_NOUID
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 | TDF_ENUMERATE_LOCALS | TDF_SCEV | TDF_GIMPLE))},
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 {NULL, TDF_NONE}
111
kono
parents:
diff changeset
151 };
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 /* A subset of the dump_options table which is used for -fopt-info
kono
parents:
diff changeset
154 types. This must be consistent with the MSG_* flags in dumpfile.h.
kono
parents:
diff changeset
155 */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 static const kv_pair<dump_flags_t> optinfo_verbosity_options[] =
111
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 {"optimized", MSG_OPTIMIZED_LOCATIONS},
kono
parents:
diff changeset
159 {"missed", MSG_MISSED_OPTIMIZATION},
kono
parents:
diff changeset
160 {"note", MSG_NOTE},
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 {"all", MSG_ALL_KINDS},
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 {"internals", MSG_PRIORITY_INTERNALS},
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 {NULL, TDF_NONE}
111
kono
parents:
diff changeset
164 };
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 /* Flags used for -fopt-info groups. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 const kv_pair<optgroup_flags_t> optgroup_options[] =
111
kono
parents:
diff changeset
168 {
kono
parents:
diff changeset
169 {"ipa", OPTGROUP_IPA},
kono
parents:
diff changeset
170 {"loop", OPTGROUP_LOOP},
kono
parents:
diff changeset
171 {"inline", OPTGROUP_INLINE},
kono
parents:
diff changeset
172 {"omp", OPTGROUP_OMP},
kono
parents:
diff changeset
173 {"vec", OPTGROUP_VEC},
kono
parents:
diff changeset
174 {"optall", OPTGROUP_ALL},
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175 {NULL, OPTGROUP_NONE}
111
kono
parents:
diff changeset
176 };
kono
parents:
diff changeset
177
kono
parents:
diff changeset
178 gcc::dump_manager::dump_manager ():
kono
parents:
diff changeset
179 m_next_dump (FIRST_AUTO_NUMBERED_DUMP),
kono
parents:
diff changeset
180 m_extra_dump_files (NULL),
kono
parents:
diff changeset
181 m_extra_dump_files_in_use (0),
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
182 m_extra_dump_files_alloced (0),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 m_optgroup_flags (OPTGROUP_NONE),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 m_optinfo_flags (TDF_NONE),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
185 m_optinfo_filename (NULL)
111
kono
parents:
diff changeset
186 {
kono
parents:
diff changeset
187 }
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 gcc::dump_manager::~dump_manager ()
kono
parents:
diff changeset
190 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
191 free (m_optinfo_filename);
111
kono
parents:
diff changeset
192 for (size_t i = 0; i < m_extra_dump_files_in_use; i++)
kono
parents:
diff changeset
193 {
kono
parents:
diff changeset
194 dump_file_info *dfi = &m_extra_dump_files[i];
kono
parents:
diff changeset
195 /* suffix, swtch, glob are statically allocated for the entries
kono
parents:
diff changeset
196 in dump_files, and for statistics, but are dynamically allocated
kono
parents:
diff changeset
197 for those for passes. */
kono
parents:
diff changeset
198 if (dfi->owns_strings)
kono
parents:
diff changeset
199 {
kono
parents:
diff changeset
200 XDELETEVEC (const_cast <char *> (dfi->suffix));
kono
parents:
diff changeset
201 XDELETEVEC (const_cast <char *> (dfi->swtch));
kono
parents:
diff changeset
202 XDELETEVEC (const_cast <char *> (dfi->glob));
kono
parents:
diff changeset
203 }
kono
parents:
diff changeset
204 /* These, if non-NULL, are always dynamically allocated. */
kono
parents:
diff changeset
205 XDELETEVEC (const_cast <char *> (dfi->pfilename));
kono
parents:
diff changeset
206 XDELETEVEC (const_cast <char *> (dfi->alt_filename));
kono
parents:
diff changeset
207 }
kono
parents:
diff changeset
208 XDELETEVEC (m_extra_dump_files);
kono
parents:
diff changeset
209 }
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 unsigned int
kono
parents:
diff changeset
212 gcc::dump_manager::
kono
parents:
diff changeset
213 dump_register (const char *suffix, const char *swtch, const char *glob,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
214 dump_kind dkind, optgroup_flags_t optgroup_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
215 bool take_ownership)
111
kono
parents:
diff changeset
216 {
kono
parents:
diff changeset
217 int num = m_next_dump++;
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 size_t count = m_extra_dump_files_in_use++;
kono
parents:
diff changeset
220
kono
parents:
diff changeset
221 if (count >= m_extra_dump_files_alloced)
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 if (m_extra_dump_files_alloced == 0)
kono
parents:
diff changeset
224 m_extra_dump_files_alloced = 512;
kono
parents:
diff changeset
225 else
kono
parents:
diff changeset
226 m_extra_dump_files_alloced *= 2;
kono
parents:
diff changeset
227 m_extra_dump_files = XRESIZEVEC (struct dump_file_info,
kono
parents:
diff changeset
228 m_extra_dump_files,
kono
parents:
diff changeset
229 m_extra_dump_files_alloced);
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 /* Construct a new object in the space allocated above. */
kono
parents:
diff changeset
232 new (m_extra_dump_files + count) dump_file_info ();
kono
parents:
diff changeset
233 }
kono
parents:
diff changeset
234 else
kono
parents:
diff changeset
235 {
kono
parents:
diff changeset
236 /* Zero out the already constructed object. */
kono
parents:
diff changeset
237 m_extra_dump_files[count] = dump_file_info ();
kono
parents:
diff changeset
238 }
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 m_extra_dump_files[count].suffix = suffix;
kono
parents:
diff changeset
241 m_extra_dump_files[count].swtch = swtch;
kono
parents:
diff changeset
242 m_extra_dump_files[count].glob = glob;
kono
parents:
diff changeset
243 m_extra_dump_files[count].dkind = dkind;
kono
parents:
diff changeset
244 m_extra_dump_files[count].optgroup_flags = optgroup_flags;
kono
parents:
diff changeset
245 m_extra_dump_files[count].num = num;
kono
parents:
diff changeset
246 m_extra_dump_files[count].owns_strings = take_ownership;
kono
parents:
diff changeset
247
kono
parents:
diff changeset
248 return count + TDI_end;
kono
parents:
diff changeset
249 }
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 /* Allow languages and middle-end to register their dumps before the
kono
parents:
diff changeset
253 optimization passes. */
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 void
kono
parents:
diff changeset
256 gcc::dump_manager::
kono
parents:
diff changeset
257 register_dumps ()
kono
parents:
diff changeset
258 {
kono
parents:
diff changeset
259 lang_hooks.register_dumps (this);
kono
parents:
diff changeset
260 /* If this assert fails, some FE registered more than
kono
parents:
diff changeset
261 FIRST_ME_AUTO_NUMBERED_DUMP - FIRST_AUTO_NUMBERED_DUMP
kono
parents:
diff changeset
262 dump files. Bump FIRST_ME_AUTO_NUMBERED_DUMP accordingly. */
kono
parents:
diff changeset
263 gcc_assert (m_next_dump <= FIRST_ME_AUTO_NUMBERED_DUMP);
kono
parents:
diff changeset
264 m_next_dump = FIRST_ME_AUTO_NUMBERED_DUMP;
kono
parents:
diff changeset
265 dump_files[TDI_original].num = m_next_dump++;
kono
parents:
diff changeset
266 dump_files[TDI_gimple].num = m_next_dump++;
kono
parents:
diff changeset
267 dump_files[TDI_nested].num = m_next_dump++;
kono
parents:
diff changeset
268 }
kono
parents:
diff changeset
269
kono
parents:
diff changeset
270
kono
parents:
diff changeset
271 /* Return the dump_file_info for the given phase. */
kono
parents:
diff changeset
272
kono
parents:
diff changeset
273 struct dump_file_info *
kono
parents:
diff changeset
274 gcc::dump_manager::
kono
parents:
diff changeset
275 get_dump_file_info (int phase) const
kono
parents:
diff changeset
276 {
kono
parents:
diff changeset
277 if (phase < TDI_end)
kono
parents:
diff changeset
278 return &dump_files[phase];
kono
parents:
diff changeset
279 else if ((size_t) (phase - TDI_end) >= m_extra_dump_files_in_use)
kono
parents:
diff changeset
280 return NULL;
kono
parents:
diff changeset
281 else
kono
parents:
diff changeset
282 return m_extra_dump_files + (phase - TDI_end);
kono
parents:
diff changeset
283 }
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 /* Locate the dump_file_info with swtch equal to SWTCH,
kono
parents:
diff changeset
286 or return NULL if no such dump_file_info exists. */
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 struct dump_file_info *
kono
parents:
diff changeset
289 gcc::dump_manager::
kono
parents:
diff changeset
290 get_dump_file_info_by_switch (const char *swtch) const
kono
parents:
diff changeset
291 {
kono
parents:
diff changeset
292 for (unsigned i = 0; i < m_extra_dump_files_in_use; i++)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
293 if (strcmp (m_extra_dump_files[i].swtch, swtch) == 0)
111
kono
parents:
diff changeset
294 return &m_extra_dump_files[i];
kono
parents:
diff changeset
295
kono
parents:
diff changeset
296 /* Not found. */
kono
parents:
diff changeset
297 return NULL;
kono
parents:
diff changeset
298 }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300
kono
parents:
diff changeset
301 /* Return the name of the dump file for the given phase.
kono
parents:
diff changeset
302 The caller is responsible for calling free on the returned
kono
parents:
diff changeset
303 buffer.
kono
parents:
diff changeset
304 If the dump is not enabled, returns NULL. */
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 char *
kono
parents:
diff changeset
307 gcc::dump_manager::
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
308 get_dump_file_name (int phase, int part) const
111
kono
parents:
diff changeset
309 {
kono
parents:
diff changeset
310 struct dump_file_info *dfi;
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 if (phase == TDI_none)
kono
parents:
diff changeset
313 return NULL;
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 dfi = get_dump_file_info (phase);
kono
parents:
diff changeset
316
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
317 return get_dump_file_name (dfi, part);
111
kono
parents:
diff changeset
318 }
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 /* Return the name of the dump file for the given dump_file_info.
kono
parents:
diff changeset
321 The caller is responsible for calling free on the returned
kono
parents:
diff changeset
322 buffer.
kono
parents:
diff changeset
323 If the dump is not enabled, returns NULL. */
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 char *
kono
parents:
diff changeset
326 gcc::dump_manager::
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
327 get_dump_file_name (struct dump_file_info *dfi, int part) const
111
kono
parents:
diff changeset
328 {
kono
parents:
diff changeset
329 char dump_id[10];
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 gcc_assert (dfi);
kono
parents:
diff changeset
332
kono
parents:
diff changeset
333 if (dfi->pstate == 0)
kono
parents:
diff changeset
334 return NULL;
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 /* If available, use the command line dump filename. */
kono
parents:
diff changeset
337 if (dfi->pfilename)
kono
parents:
diff changeset
338 return xstrdup (dfi->pfilename);
kono
parents:
diff changeset
339
kono
parents:
diff changeset
340 if (dfi->num < 0)
kono
parents:
diff changeset
341 dump_id[0] = '\0';
kono
parents:
diff changeset
342 else
kono
parents:
diff changeset
343 {
kono
parents:
diff changeset
344 /* (null), LANG, TREE, RTL, IPA. */
kono
parents:
diff changeset
345 char suffix = " ltri"[dfi->dkind];
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 if (snprintf (dump_id, sizeof (dump_id), ".%03d%c", dfi->num, suffix) < 0)
kono
parents:
diff changeset
348 dump_id[0] = '\0';
kono
parents:
diff changeset
349 }
kono
parents:
diff changeset
350
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
351 if (part != -1)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
352 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
353 char part_id[8];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
354 snprintf (part_id, sizeof (part_id), ".%i", part);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
355 return concat (dump_base_name, dump_id, part_id, dfi->suffix, NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
356 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
357 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
358 return concat (dump_base_name, dump_id, dfi->suffix, NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
359 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
360
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
361 /* Open a dump file called FILENAME. Some filenames are special and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
362 refer to the standard streams. TRUNC indicates whether this is the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
363 first open (so the file should be truncated, rather than appended).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
364 An error message is emitted in the event of failure. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
365
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
366 static FILE *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
367 dump_open (const char *filename, bool trunc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
368 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
369 if (strcmp ("stderr", filename) == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 return stderr;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372 if (strcmp ("stdout", filename) == 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373 || strcmp ("-", filename) == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
374 return stdout;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
375
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
376 FILE *stream = fopen (filename, trunc ? "w" : "a");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
377
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
378 if (!stream)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
379 error ("could not open dump file %qs: %m", filename);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
380 return stream;
111
kono
parents:
diff changeset
381 }
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 /* For a given DFI, open an alternate dump filename (which could also
kono
parents:
diff changeset
384 be a standard stream such as stdout/stderr). If the alternate dump
kono
parents:
diff changeset
385 file cannot be opened, return NULL. */
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 static FILE *
kono
parents:
diff changeset
388 dump_open_alternate_stream (struct dump_file_info *dfi)
kono
parents:
diff changeset
389 {
kono
parents:
diff changeset
390 if (!dfi->alt_filename)
kono
parents:
diff changeset
391 return NULL;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 if (dfi->alt_stream)
kono
parents:
diff changeset
394 return dfi->alt_stream;
kono
parents:
diff changeset
395
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
396 FILE *stream = dump_open (dfi->alt_filename, dfi->alt_state < 0);
111
kono
parents:
diff changeset
397
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
398 if (stream)
111
kono
parents:
diff changeset
399 dfi->alt_state = 1;
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 return stream;
kono
parents:
diff changeset
402 }
kono
parents:
diff changeset
403
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
404 /* Construct a dump_user_location_t from STMT (using its location and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
405 hotness). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 dump_user_location_t::dump_user_location_t (const gimple *stmt)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
408 : m_count (), m_loc (UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
409 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
410 if (stmt)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
411 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
412 if (stmt->bb)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
413 m_count = stmt->bb->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
414 m_loc = gimple_location (stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
415 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
416 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
417
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
418 /* Construct a dump_user_location_t from an RTL instruction (using its
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
419 location and hotness). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
420
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
421 dump_user_location_t::dump_user_location_t (const rtx_insn *insn)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
422 : m_count (), m_loc (UNKNOWN_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
423 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
424 if (insn)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
426 basic_block bb = BLOCK_FOR_INSN (insn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 if (bb)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
428 m_count = bb->count;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
429 m_loc = INSN_LOCATION (insn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
430 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
431 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
432
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
433 /* Construct from a function declaration. This one requires spelling out
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
434 to avoid accidentally constructing from other kinds of tree. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
435
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
436 dump_user_location_t
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
437 dump_user_location_t::from_function_decl (tree fndecl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
438 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
439 gcc_assert (fndecl);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
440
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
441 // FIXME: profile count for function?
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
442 return dump_user_location_t (profile_count (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 DECL_SOURCE_LOCATION (fndecl));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
445
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
446 /* Extract the MSG_* component from DUMP_KIND and return a string for use
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
447 as a prefix to dump messages.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
448 These match the strings in optinfo_verbosity_options and thus the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
449 "OPTIONS" within "-fopt-info-OPTIONS". */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
450
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
451 static const char *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
452 kind_as_string (dump_flags_t dump_kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
453 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
454 switch (dump_kind & MSG_ALL_KINDS)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
455 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
456 default:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
457 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
458 case MSG_OPTIMIZED_LOCATIONS:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
459 return "optimized";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
460 case MSG_MISSED_OPTIMIZATION:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461 return "missed";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
462 case MSG_NOTE:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
463 return "note";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
464 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
465 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
466
111
kono
parents:
diff changeset
467 /* Print source location on DFILE if enabled. */
kono
parents:
diff changeset
468
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
469 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
470 dump_loc (dump_flags_t dump_kind, FILE *dfile, location_t loc)
111
kono
parents:
diff changeset
471 {
kono
parents:
diff changeset
472 if (dump_kind)
kono
parents:
diff changeset
473 {
kono
parents:
diff changeset
474 if (LOCATION_LOCUS (loc) > BUILTINS_LOCATION)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
475 fprintf (dfile, "%s:%d:%d: ", LOCATION_FILE (loc),
111
kono
parents:
diff changeset
476 LOCATION_LINE (loc), LOCATION_COLUMN (loc));
kono
parents:
diff changeset
477 else if (current_function_decl)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478 fprintf (dfile, "%s:%d:%d: ",
111
kono
parents:
diff changeset
479 DECL_SOURCE_FILE (current_function_decl),
kono
parents:
diff changeset
480 DECL_SOURCE_LINE (current_function_decl),
kono
parents:
diff changeset
481 DECL_SOURCE_COLUMN (current_function_decl));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
482 fprintf (dfile, "%s: ", kind_as_string (dump_kind));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
483 /* Indentation based on scope depth. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
484 fprintf (dfile, "%*s", get_dump_scope_depth (), "");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
485 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
486 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
487
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
488 /* Print source location to PP if enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
489
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
490 static void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
491 dump_loc (dump_flags_t dump_kind, pretty_printer *pp, location_t loc)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
492 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
493 if (dump_kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
494 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
495 if (LOCATION_LOCUS (loc) > BUILTINS_LOCATION)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
496 pp_printf (pp, "%s:%d:%d: ", LOCATION_FILE (loc),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
497 LOCATION_LINE (loc), LOCATION_COLUMN (loc));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
498 else if (current_function_decl)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
499 pp_printf (pp, "%s:%d:%d: ",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
500 DECL_SOURCE_FILE (current_function_decl),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
501 DECL_SOURCE_LINE (current_function_decl),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
502 DECL_SOURCE_COLUMN (current_function_decl));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
503 pp_printf (pp, "%s: ", kind_as_string (dump_kind));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
504 /* Indentation based on scope depth. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
505 for (unsigned i = 0; i < get_dump_scope_depth (); i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
506 pp_character (pp, ' ');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
507 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
508 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
509
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
510 /* Implementation of dump_context member functions. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
511
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
512 /* dump_context's dtor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
513
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
514 dump_context::~dump_context ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
515 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
516 delete m_pending;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
517 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
518
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
519 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
520 dump_context::set_json_writer (optrecord_json_writer *writer)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
521 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
522 delete m_json_writer;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
523 m_json_writer = writer;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
524 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
525
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
526 /* Perform cleanup activity for -fsave-optimization-record.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
527 Currently, the file is written out here in one go, before cleaning
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
528 up. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
529
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
530 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
531 dump_context::finish_any_json_writer ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
532 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
533 if (!m_json_writer)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
534 return;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
535
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
536 m_json_writer->write ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
537 delete m_json_writer;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
538 m_json_writer = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
539 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
540
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
541 /* Update the "dumps_are_enabled" global; to be called whenever dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
542 or alt_dump_file change, or when changing dump_context in selftests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
543
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
544 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
545 dump_context::refresh_dumps_are_enabled ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
546 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
547 dumps_are_enabled = (dump_file || alt_dump_file || optinfo_enabled_p ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
548 || m_test_pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
549 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 /* Determine if a message of kind DUMP_KIND and at the current scope depth
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
552 should be printed.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
553
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554 Only show messages that match FILTER both on their kind *and*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555 their priority. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 dump_context::apply_dump_filter_p (dump_flags_t dump_kind,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559 dump_flags_t filter) const
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
560 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561 /* Few messages, if any, have an explicit MSG_PRIORITY.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562 If DUMP_KIND does, we'll use it.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 Otherwise, generate an implicit priority value for the message based
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564 on the current scope depth.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
565 Messages at the top-level scope are MSG_PRIORITY_USER_FACING,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
566 whereas those in nested scopes are MSG_PRIORITY_INTERNALS. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
567 if (!(dump_kind & MSG_ALL_PRIORITIES))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
569 dump_flags_t implicit_priority
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
570 = (m_scope_depth > 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
571 ? MSG_PRIORITY_INTERNALS
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
572 : MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
573 dump_kind |= implicit_priority;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
574 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
575
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
576 return (dump_kind & (filter & MSG_ALL_KINDS)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
577 && dump_kind & (filter & MSG_ALL_PRIORITIES));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
578 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
579
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
580 /* Print LOC to the appropriate dump destinations, given DUMP_KIND.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
581 If optinfos are enabled, begin a new optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
582
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
583 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
584 dump_context::dump_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585 const dump_user_location_t &loc)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
586 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
587 end_any_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
588
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 dump_loc_immediate (metadata.get_dump_flags (), loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
590
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
591 if (optinfo_enabled_p ())
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
592 begin_next_optinfo (metadata, loc);
111
kono
parents:
diff changeset
593 }
kono
parents:
diff changeset
594
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
595 /* As dump_loc above, but without starting a new optinfo. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
596
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
597 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
598 dump_context::dump_loc_immediate (dump_flags_t dump_kind,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
599 const dump_user_location_t &loc)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
600 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
601 location_t srcloc = loc.get_location_t ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 if (dump_file && apply_dump_filter_p (dump_kind, pflags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
604 ::dump_loc (dump_kind, dump_file, srcloc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
605
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
606 if (alt_dump_file && apply_dump_filter_p (dump_kind, alt_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
607 ::dump_loc (dump_kind, alt_dump_file, srcloc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
608
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
609 /* Support for temp_dump_context in selftests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
610 if (m_test_pp && apply_dump_filter_p (dump_kind, m_test_pp_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
611 ::dump_loc (dump_kind, m_test_pp, srcloc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
612 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
613
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 /* Make an item for the given dump call, equivalent to print_gimple_stmt. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616 static optinfo_item *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
617 make_item_for_dump_gimple_stmt (gimple *stmt, int spc, dump_flags_t dump_flags)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
618 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
619 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
620 pp_needs_newline (&pp) = true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
621 pp_gimple_stmt_1 (&pp, stmt, spc, dump_flags);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
622 pp_newline (&pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
623
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
624 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
625 = new optinfo_item (OPTINFO_ITEM_KIND_GIMPLE, gimple_location (stmt),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
626 xstrdup (pp_formatted_text (&pp)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
627 return item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
628 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
629
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
630 /* Dump gimple statement GS with SPC indentation spaces and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
631 EXTRA_DUMP_FLAGS on the dump streams if DUMP_KIND is enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
632
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634 dump_context::dump_gimple_stmt (const dump_metadata_t &metadata,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 dump_flags_t extra_dump_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 gimple *gs, int spc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 = make_item_for_dump_gimple_stmt (gs, spc, dump_flags | extra_dump_flags);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
640 emit_item (item, metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
642 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
643 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
644 optinfo &info = ensure_pending_optinfo (metadata);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
645 info.add_item (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
646 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
647 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
648 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
649 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
650
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
651 /* Similar to dump_gimple_stmt, except additionally print source location. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
652
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
654 dump_context::dump_gimple_stmt_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
655 const dump_user_location_t &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 dump_flags_t extra_dump_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
657 gimple *gs, int spc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
659 dump_loc (metadata, loc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
660 dump_gimple_stmt (metadata, extra_dump_flags, gs, spc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
662
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
663 /* Make an item for the given dump call, equivalent to print_gimple_expr. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
664
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
665 static optinfo_item *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 make_item_for_dump_gimple_expr (gimple *stmt, int spc, dump_flags_t dump_flags)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
667 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
668 dump_flags |= TDF_RHS_ONLY;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
669 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
670 pp_needs_newline (&pp) = true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
671 pp_gimple_stmt_1 (&pp, stmt, spc, dump_flags);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
673 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
674 = new optinfo_item (OPTINFO_ITEM_KIND_GIMPLE, gimple_location (stmt),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
675 xstrdup (pp_formatted_text (&pp)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
676 return item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
677 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
678
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
679 /* Dump gimple statement GS with SPC indentation spaces and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
680 EXTRA_DUMP_FLAGS on the dump streams if DUMP_KIND is enabled.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
681 Do not terminate with a newline or semicolon. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
682
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
683 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
684 dump_context::dump_gimple_expr (const dump_metadata_t &metadata,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
685 dump_flags_t extra_dump_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
686 gimple *gs, int spc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
687 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
688 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
689 = make_item_for_dump_gimple_expr (gs, spc, dump_flags | extra_dump_flags);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 emit_item (item, metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
691
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
692 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
693 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
694 optinfo &info = ensure_pending_optinfo (metadata);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
695 info.add_item (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
696 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
697 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
698 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
699 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
700
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
701 /* Similar to dump_gimple_expr, except additionally print source location. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
702
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
703 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704 dump_context::dump_gimple_expr_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705 const dump_user_location_t &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
706 dump_flags_t extra_dump_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
707 gimple *gs,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
708 int spc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
709 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 dump_loc (metadata, loc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 dump_gimple_expr (metadata, extra_dump_flags, gs, spc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
712 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
713
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
714 /* Make an item for the given dump call, equivalent to print_generic_expr. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
716 static optinfo_item *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
717 make_item_for_dump_generic_expr (tree node, dump_flags_t dump_flags)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
718 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
720 pp_needs_newline (&pp) = true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
721 pp_translate_identifiers (&pp) = false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
722 dump_generic_node (&pp, node, 0, dump_flags, false);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724 location_t loc = UNKNOWN_LOCATION;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 if (EXPR_HAS_LOCATION (node))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 loc = EXPR_LOCATION (node);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 = new optinfo_item (OPTINFO_ITEM_KIND_TREE, loc,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730 xstrdup (pp_formatted_text (&pp)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 return item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
732 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
733
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
734 /* Dump expression tree T using EXTRA_DUMP_FLAGS on dump streams if
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735 DUMP_KIND is enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
736
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
737 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 dump_context::dump_generic_expr (const dump_metadata_t &metadata,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
739 dump_flags_t extra_dump_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740 tree t)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
743 = make_item_for_dump_generic_expr (t, dump_flags | extra_dump_flags);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 emit_item (item, metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
745
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
746 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
747 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 optinfo &info = ensure_pending_optinfo (metadata);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
749 info.add_item (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
750 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
751 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
752 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
753 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
754
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 /* Similar to dump_generic_expr, except additionally print the source
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757 location. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
760 dump_context::dump_generic_expr_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 const dump_user_location_t &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762 dump_flags_t extra_dump_flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 tree t)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
765 dump_loc (metadata, loc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
766 dump_generic_expr (metadata, extra_dump_flags, t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 /* Make an item for the given dump call. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 static optinfo_item *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 make_item_for_dump_symtab_node (symtab_node *node)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 location_t loc = DECL_SOURCE_LOCATION (node->decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775 optinfo_item *item
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
776 = new optinfo_item (OPTINFO_ITEM_KIND_SYMTAB_NODE, loc,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
777 xstrdup (node->dump_name ()));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
778 return item;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
779 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
780
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
781 /* dump_pretty_printer's ctor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
782
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
783 dump_pretty_printer::dump_pretty_printer (dump_context *context,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
784 dump_flags_t dump_kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
785 : pretty_printer (), m_context (context), m_dump_kind (dump_kind),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 m_stashed_items ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
787 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
788 pp_format_decoder (this) = format_decoder_cb;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
789 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
790
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
791 /* Phase 3 of formatting; compare with pp_output_formatted_text.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
792
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
793 Emit optinfo_item instances for the various formatted chunks from phases
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
794 1 and 2 (i.e. pp_format).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
795
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
796 Some chunks may already have had their items built (during decode_format).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
797 These chunks have been stashed into m_stashed_items; we emit them here.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
798
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
799 For all other purely textual chunks, they are printed into
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
800 buffer->formatted_obstack, and then emitted as a textual optinfo_item.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
801 This consolidates multiple adjacent text chunks into a single text
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
802 optinfo_item. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
803
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
804 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
805 dump_pretty_printer::emit_items (optinfo *dest)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
806 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 output_buffer *buffer = pp_buffer (this);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
808 struct chunk_info *chunk_array = buffer->cur_chunk_array;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
809 const char **args = chunk_array->args;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
810
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
811 gcc_assert (buffer->obstack == &buffer->formatted_obstack);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
812 gcc_assert (buffer->line_length == 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
813
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
814 unsigned stashed_item_idx = 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
815 for (unsigned chunk = 0; args[chunk]; chunk++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
816 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
817 if (stashed_item_idx < m_stashed_items.length ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
818 && args[chunk] == *m_stashed_items[stashed_item_idx].buffer_ptr)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
819 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
820 emit_any_pending_textual_chunks (dest);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
821 /* This chunk has a stashed item: use it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
822 emit_item (m_stashed_items[stashed_item_idx++].item, dest);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
823 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
824 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
825 /* This chunk is purely textual. Print it (to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
826 buffer->formatted_obstack), so that we can consolidate adjacent
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
827 chunks into one textual optinfo_item. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
828 pp_string (this, args[chunk]);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
829 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
830
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
831 emit_any_pending_textual_chunks (dest);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
832
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
833 /* Ensure that we consumed all of stashed_items. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
834 gcc_assert (stashed_item_idx == m_stashed_items.length ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
835
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
836 /* Deallocate the chunk structure and everything after it (i.e. the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
837 associated series of formatted strings). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
838 buffer->cur_chunk_array = chunk_array->prev;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
839 obstack_free (&buffer->chunk_obstack, chunk_array);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
841
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842 /* Subroutine of dump_pretty_printer::emit_items
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 for consolidating multiple adjacent pure-text chunks into single
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
844 optinfo_items (in phase 3). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
845
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
846 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
847 dump_pretty_printer::emit_any_pending_textual_chunks (optinfo *dest)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
848 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
849 gcc_assert (buffer->obstack == &buffer->formatted_obstack);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
850
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
851 /* Don't emit an item if the pending text is empty. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 if (output_buffer_last_position_in_text (buffer) == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
854
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
855 char *formatted_text = xstrdup (pp_formatted_text (this));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857 = new optinfo_item (OPTINFO_ITEM_KIND_TEXT, UNKNOWN_LOCATION,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
858 formatted_text);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
859 emit_item (item, dest);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
860
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
861 /* Clear the pending text by unwinding formatted_text back to the start
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
862 of the buffer (without deallocating). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
863 obstack_free (&buffer->formatted_obstack,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
864 buffer->formatted_obstack.object_base);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
865 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
866
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
867 /* Emit ITEM and take ownership of it. If DEST is non-NULL, add ITEM
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868 to DEST; otherwise delete ITEM. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
869
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
870 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
871 dump_pretty_printer::emit_item (optinfo_item *item, optinfo *dest)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
873 m_context->emit_item (item, m_dump_kind);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874 if (dest)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
875 dest->add_item (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
876 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
877 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
878 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
879
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
880 /* Record that ITEM (generated in phase 2 of formatting) is to be used for
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
881 the chunk at BUFFER_PTR in phase 3 (by emit_items). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
882
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
883 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
884 dump_pretty_printer::stash_item (const char **buffer_ptr, optinfo_item *item)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
885 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
886 gcc_assert (buffer_ptr);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
887 gcc_assert (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
888
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
889 m_stashed_items.safe_push (stashed_item (buffer_ptr, item));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
890 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
891
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
892 /* pp_format_decoder callback for dump_pretty_printer, and thus for
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
893 dump_printf and dump_printf_loc.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
894
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
895 A wrapper around decode_format, for type-safety. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
896
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
897 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
898 dump_pretty_printer::format_decoder_cb (pretty_printer *pp, text_info *text,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899 const char *spec, int /*precision*/,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
900 bool /*wide*/, bool /*set_locus*/,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
901 bool /*verbose*/, bool */*quoted*/,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
902 const char **buffer_ptr)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
903 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
904 dump_pretty_printer *opp = static_cast <dump_pretty_printer *> (pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
905 return opp->decode_format (text, spec, buffer_ptr);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
906 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
907
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
908 /* Format decoder for dump_pretty_printer, and thus for dump_printf and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
909 dump_printf_loc.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
910
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
911 Supported format codes (in addition to the standard pretty_printer ones)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
912 are:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
913
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
914 %C: cgraph_node *:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
915 Equivalent to: dump_symtab_node (MSG_*, node)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
916 %E: gimple *:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
917 Equivalent to: dump_gimple_expr (MSG_*, TDF_SLIM, stmt, 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
918 %G: gimple *:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
919 Equivalent to: dump_gimple_stmt (MSG_*, TDF_SLIM, stmt, 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
920 %T: tree:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
921 Equivalent to: dump_generic_expr (MSG_*, arg, TDF_SLIM).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
922
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
923 TODO: add a format code that can handle (symtab_node*) *and* both
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
924 subclasses (presumably means teaching -Wformat about non-virtual
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
925 subclasses).
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
926
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
927 These format codes build optinfo_item instances, thus capturing metadata
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
928 about the arguments being dumped, as well as the textual output. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
929
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
930 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
931 dump_pretty_printer::decode_format (text_info *text, const char *spec,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
932 const char **buffer_ptr)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
933 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
934 /* Various format codes that imply making an optinfo_item and stashed it
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
935 for later use (to capture metadata, rather than plain text). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
936 switch (*spec)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
937 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
938 case 'C':
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
939 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 cgraph_node *node = va_arg (*text->args_ptr, cgraph_node *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
941
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
942 /* Make an item for the node, and stash it. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
943 optinfo_item *item = make_item_for_dump_symtab_node (node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
944 stash_item (buffer_ptr, item);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
945 return true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
946 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
947
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
948 case 'E':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
949 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
950 gimple *stmt = va_arg (*text->args_ptr, gimple *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
951
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
952 /* Make an item for the stmt, and stash it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
953 optinfo_item *item = make_item_for_dump_gimple_expr (stmt, 0, TDF_SLIM);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 stash_item (buffer_ptr, item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
955 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958 case 'G':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960 gimple *stmt = va_arg (*text->args_ptr, gimple *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
961
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
962 /* Make an item for the stmt, and stash it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
963 optinfo_item *item = make_item_for_dump_gimple_stmt (stmt, 0, TDF_SLIM);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
964 stash_item (buffer_ptr, item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
965 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
968 case 'T':
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
969 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970 tree t = va_arg (*text->args_ptr, tree);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
971
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972 /* Make an item for the tree, and stash it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973 optinfo_item *item = make_item_for_dump_generic_expr (t, TDF_SLIM);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
974 stash_item (buffer_ptr, item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
976 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
977
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
978 default:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
979 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
980 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
981 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
982
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
983 /* Output a formatted message using FORMAT on appropriate dump streams. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
984
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
985 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
986 dump_context::dump_printf_va (const dump_metadata_t &metadata, const char *format,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
987 va_list *ap)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
988 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
989 dump_pretty_printer pp (this, metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
990
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
991 text_info text;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
992 text.err_no = errno;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 text.args_ptr = ap;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 text.format_spec = format;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
995
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 /* Phases 1 and 2, using pp_format. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 pp_format (&pp, &text);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 /* Phase 3. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1002 optinfo &info = ensure_pending_optinfo (metadata);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003 pp.emit_items (&info);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1004 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1005 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1006 pp.emit_items (NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1007 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1008
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1009 /* Similar to dump_printf, except source location is also printed, and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1010 dump location captured. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1013 dump_context::dump_printf_loc_va (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1014 const dump_user_location_t &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1015 const char *format, va_list *ap)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1016 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1017 dump_loc (metadata, loc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1018 dump_printf_va (metadata, format, ap);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1019 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1020
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1021 /* Make an item for the given dump call, equivalent to print_dec. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1022
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1023 template<unsigned int N, typename C>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1024 static optinfo_item *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1025 make_item_for_dump_dec (const poly_int<N, C> &value)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1026 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1027 STATIC_ASSERT (poly_coeff_traits<C>::signedness >= 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1028 signop sgn = poly_coeff_traits<C>::signedness ? SIGNED : UNSIGNED;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1029
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1030 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1031
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1032 if (value.is_constant ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1033 pp_wide_int (&pp, value.coeffs[0], sgn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1034 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1035 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1036 pp_character (&pp, '[');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1037 for (unsigned int i = 0; i < N; ++i)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1038 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1039 pp_wide_int (&pp, value.coeffs[i], sgn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1040 pp_character (&pp, i == N - 1 ? ']' : ',');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1041 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1042 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1043
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1044 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1045 = new optinfo_item (OPTINFO_ITEM_KIND_TEXT, UNKNOWN_LOCATION,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1046 xstrdup (pp_formatted_text (&pp)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1047 return item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1048 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1049
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1050 /* Output VALUE in decimal to appropriate dump streams. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1051
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1052 template<unsigned int N, typename C>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1053 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1054 dump_context::dump_dec (const dump_metadata_t &metadata, const poly_int<N, C> &value)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1055 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1056 optinfo_item *item = make_item_for_dump_dec (value);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1057 emit_item (item, metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1058
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1059 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1060 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1061 optinfo &info = ensure_pending_optinfo (metadata);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1062 info.add_item (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1063 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1064 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1065 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1066 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1067
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1068 /* Output the name of NODE on appropriate dump streams. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1069
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1070 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1071 dump_context::dump_symtab_node (const dump_metadata_t &metadata, symtab_node *node)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1072 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1073 optinfo_item *item = make_item_for_dump_symtab_node (node);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1074 emit_item (item, metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1075
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1076 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1077 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1078 optinfo &info = ensure_pending_optinfo (metadata);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1079 info.add_item (item);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1080 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1081 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1082 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1083 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1084
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1085 /* Get the current dump scope-nesting depth.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1086 For use by -fopt-info (for showing nesting via indentation). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1087
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1088 unsigned int
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1089 dump_context::get_scope_depth () const
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1090 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1091 return m_scope_depth;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1092 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1093
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1094 /* Push a nested dump scope.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1095 Increment the scope depth.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1096 Print "=== NAME ===\n" to the dumpfile, if any, and to the -fopt-info
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1097 destination, if any.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1098 Emit a "scope" optinfo if optinfos are enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1099
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1100 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1101 dump_context::begin_scope (const char *name,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1102 const dump_user_location_t &user_location,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1103 const dump_impl_location_t &impl_location)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1104 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1105 m_scope_depth++;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1106
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1107 location_t src_loc = user_location.get_location_t ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1108
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1109 if (dump_file && apply_dump_filter_p (MSG_NOTE, pflags))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1110 ::dump_loc (MSG_NOTE, dump_file, src_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1111
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1112 if (alt_dump_file && apply_dump_filter_p (MSG_NOTE, alt_flags))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1113 ::dump_loc (MSG_NOTE, alt_dump_file, src_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1114
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1115 /* Support for temp_dump_context in selftests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1116 if (m_test_pp && apply_dump_filter_p (MSG_NOTE, m_test_pp_flags))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1117 ::dump_loc (MSG_NOTE, m_test_pp, src_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1118
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1119 pretty_printer pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1120 pp_printf (&pp, "=== %s ===\n", name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1121 optinfo_item *item
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1122 = new optinfo_item (OPTINFO_ITEM_KIND_TEXT, UNKNOWN_LOCATION,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1123 xstrdup (pp_formatted_text (&pp)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1124 emit_item (item, MSG_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1125
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1126 if (optinfo_enabled_p ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1127 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1128 optinfo &info
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1129 = begin_next_optinfo (dump_metadata_t (MSG_NOTE, impl_location),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1130 user_location);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1131 info.m_kind = OPTINFO_KIND_SCOPE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1132 info.add_item (item);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1133 end_any_optinfo ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1134 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1135 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1136 delete item;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1137 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1138
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1139 /* Pop a nested dump scope. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1140
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1141 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1142 dump_context::end_scope ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1143 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1144 end_any_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1145 m_scope_depth--;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1146
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1147 if (m_json_writer)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1148 m_json_writer->pop_scope ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1149 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1150
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1151 /* Should optinfo instances be created?
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1152 All creation of optinfos should be guarded by this predicate.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1153 Return true if any optinfo destinations are active. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1154
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1155 bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1156 dump_context::optinfo_enabled_p () const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1157 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1158 return (optimization_records_enabled_p ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1160
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1161 /* Return the optinfo currently being accumulated, creating one if
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1162 necessary. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1163
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1164 optinfo &
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1165 dump_context::ensure_pending_optinfo (const dump_metadata_t &metadata)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1166 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1167 if (!m_pending)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1168 return begin_next_optinfo (metadata, dump_user_location_t ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1169 return *m_pending;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1170 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1171
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1172 /* Start a new optinfo and return it, ending any optinfo that was already
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1173 accumulated. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1174
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1175 optinfo &
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1176 dump_context::begin_next_optinfo (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1177 const dump_user_location_t &user_loc)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1178 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1179 end_any_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1180 gcc_assert (m_pending == NULL);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1181 dump_location_t loc (user_loc, metadata.get_impl_location ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1182 m_pending = new optinfo (loc, OPTINFO_KIND_NOTE, current_pass);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1183 m_pending->handle_dump_file_kind (metadata.get_dump_flags ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1184 return *m_pending;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1185 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1186
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1187 /* End any optinfo that has been accumulated within this context; emitting
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1188 it to any destinations as appropriate, such as optimization records. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1189
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1190 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1191 dump_context::end_any_optinfo ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1192 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1193 if (m_pending)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1194 emit_optinfo (m_pending);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1195 delete m_pending;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1196 m_pending = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1197 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1198
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1199 /* Emit the optinfo to all of the "non-immediate" destinations
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1200 (emission to "immediate" destinations is done by
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1201 dump_context::emit_item). */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1202
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1203 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1204 dump_context::emit_optinfo (const optinfo *info)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1205 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1206 /* -fsave-optimization-record. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1207 if (m_json_writer)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1208 m_json_writer->add_record (info);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1209 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1210
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1211 /* Emit ITEM to all item destinations (those that don't require
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1212 consolidation into optinfo instances). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1213
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1214 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1215 dump_context::emit_item (optinfo_item *item, dump_flags_t dump_kind)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1216 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1217 if (dump_file && apply_dump_filter_p (dump_kind, pflags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1218 fprintf (dump_file, "%s", item->get_text ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1219
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1220 if (alt_dump_file && apply_dump_filter_p (dump_kind, alt_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1221 fprintf (alt_dump_file, "%s", item->get_text ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1222
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1223 /* Support for temp_dump_context in selftests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1224 if (m_test_pp && apply_dump_filter_p (dump_kind, m_test_pp_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1225 pp_string (m_test_pp, item->get_text ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1226 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1227
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1228 /* The current singleton dump_context, and its default. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1229
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1230 dump_context *dump_context::s_current = &dump_context::s_default;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1231 dump_context dump_context::s_default;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1232
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1233 /* Implementation of dump_* API calls, calling into dump_context
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1234 member functions. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1235
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1236 /* Calls to the dump_* functions do non-trivial work, so they ought
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1237 to be guarded by:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1238 if (dump_enabled_p ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1239 Assert that they are guarded, and, if assertions are disabled,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1240 bail out if the calls weren't properly guarded. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1241
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1242 #define VERIFY_DUMP_ENABLED_P \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1243 do { \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1244 gcc_assert (dump_enabled_p ()); \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1245 if (!dump_enabled_p ()) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1246 return; \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1247 } while (0)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1248
111
kono
parents:
diff changeset
1249 /* Dump gimple statement GS with SPC indentation spaces and
kono
parents:
diff changeset
1250 EXTRA_DUMP_FLAGS on the dump streams if DUMP_KIND is enabled. */
kono
parents:
diff changeset
1251
kono
parents:
diff changeset
1252 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1253 dump_gimple_stmt (const dump_metadata_t &metadata, dump_flags_t extra_dump_flags,
111
kono
parents:
diff changeset
1254 gimple *gs, int spc)
kono
parents:
diff changeset
1255 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1256 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1257 dump_context::get ().dump_gimple_stmt (metadata, extra_dump_flags, gs, spc);
111
kono
parents:
diff changeset
1258 }
kono
parents:
diff changeset
1259
kono
parents:
diff changeset
1260 /* Similar to dump_gimple_stmt, except additionally print source location. */
kono
parents:
diff changeset
1261
kono
parents:
diff changeset
1262 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1263 dump_gimple_stmt_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1264 const dump_user_location_t &loc,
111
kono
parents:
diff changeset
1265 dump_flags_t extra_dump_flags, gimple *gs, int spc)
kono
parents:
diff changeset
1266 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1267 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1268 dump_context::get ().dump_gimple_stmt_loc (metadata, loc, extra_dump_flags,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1269 gs, spc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1270 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1271
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1272 /* Dump gimple statement GS with SPC indentation spaces and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1273 EXTRA_DUMP_FLAGS on the dump streams if DUMP_KIND is enabled.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1274 Do not terminate with a newline or semicolon. */
111
kono
parents:
diff changeset
1275
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1276 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1277 dump_gimple_expr (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1278 dump_flags_t extra_dump_flags,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1279 gimple *gs, int spc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1280 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1281 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1282 dump_context::get ().dump_gimple_expr (metadata, extra_dump_flags, gs, spc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1283 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1284
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1285 /* Similar to dump_gimple_expr, except additionally print source location. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1286
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1287 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1288 dump_gimple_expr_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1289 const dump_user_location_t &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1290 dump_flags_t extra_dump_flags, gimple *gs, int spc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1291 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1292 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1293 dump_context::get ().dump_gimple_expr_loc (metadata, loc, extra_dump_flags,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1294 gs, spc);
111
kono
parents:
diff changeset
1295 }
kono
parents:
diff changeset
1296
kono
parents:
diff changeset
1297 /* Dump expression tree T using EXTRA_DUMP_FLAGS on dump streams if
kono
parents:
diff changeset
1298 DUMP_KIND is enabled. */
kono
parents:
diff changeset
1299
kono
parents:
diff changeset
1300 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1301 dump_generic_expr (const dump_metadata_t &metadata, dump_flags_t extra_dump_flags,
111
kono
parents:
diff changeset
1302 tree t)
kono
parents:
diff changeset
1303 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1304 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1305 dump_context::get ().dump_generic_expr (metadata, extra_dump_flags, t);
111
kono
parents:
diff changeset
1306 }
kono
parents:
diff changeset
1307
kono
parents:
diff changeset
1308 /* Similar to dump_generic_expr, except additionally print the source
kono
parents:
diff changeset
1309 location. */
kono
parents:
diff changeset
1310
kono
parents:
diff changeset
1311 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1312 dump_generic_expr_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1313 const dump_user_location_t &loc,
111
kono
parents:
diff changeset
1314 dump_flags_t extra_dump_flags, tree t)
kono
parents:
diff changeset
1315 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1316 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1317 dump_context::get ().dump_generic_expr_loc (metadata, loc, extra_dump_flags,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1318 t);
111
kono
parents:
diff changeset
1319 }
kono
parents:
diff changeset
1320
kono
parents:
diff changeset
1321 /* Output a formatted message using FORMAT on appropriate dump streams. */
kono
parents:
diff changeset
1322
kono
parents:
diff changeset
1323 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1324 dump_printf (const dump_metadata_t &metadata, const char *format, ...)
111
kono
parents:
diff changeset
1325 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1326 VERIFY_DUMP_ENABLED_P;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1327 va_list ap;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1328 va_start (ap, format);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1329 dump_context::get ().dump_printf_va (metadata, format, &ap);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1330 va_end (ap);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1331 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1332
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1333 /* Similar to dump_printf, except source location is also printed, and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1334 dump location captured. */
111
kono
parents:
diff changeset
1335
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1336 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1337 dump_printf_loc (const dump_metadata_t &metadata,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1338 const dump_user_location_t &loc,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1339 const char *format, ...)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1340 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1341 VERIFY_DUMP_ENABLED_P;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1342 va_list ap;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1343 va_start (ap, format);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1344 dump_context::get ().dump_printf_loc_va (metadata, loc, format, &ap);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1345 va_end (ap);
111
kono
parents:
diff changeset
1346 }
kono
parents:
diff changeset
1347
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1348 /* Output VALUE in decimal to appropriate dump streams. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1349
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1350 template<unsigned int N, typename C>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1351 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1352 dump_dec (const dump_metadata_t &metadata, const poly_int<N, C> &value)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1353 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1354 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1355 dump_context::get ().dump_dec (metadata, value);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1356 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1357
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1358 template void dump_dec (const dump_metadata_t &metadata, const poly_uint16 &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1359 template void dump_dec (const dump_metadata_t &metadata, const poly_int64 &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1360 template void dump_dec (const dump_metadata_t &metadata, const poly_uint64 &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1361 template void dump_dec (const dump_metadata_t &metadata, const poly_offset_int &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1362 template void dump_dec (const dump_metadata_t &metadata, const poly_widest_int &);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1363
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1364 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1365 dump_dec (dump_flags_t dump_kind, const poly_wide_int &value, signop sgn)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1366 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1367 VERIFY_DUMP_ENABLED_P;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1368 if (dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1369 && dump_context::get ().apply_dump_filter_p (dump_kind, pflags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1370 print_dec (value, dump_file, sgn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1371
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1372 if (alt_dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1373 && dump_context::get ().apply_dump_filter_p (dump_kind, alt_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1374 print_dec (value, alt_dump_file, sgn);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1375 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1376
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1377 /* Output VALUE in hexadecimal to appropriate dump streams. */
111
kono
parents:
diff changeset
1378
kono
parents:
diff changeset
1379 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1380 dump_hex (dump_flags_t dump_kind, const poly_wide_int &value)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1381 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1382 VERIFY_DUMP_ENABLED_P;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1383 if (dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1384 && dump_context::get ().apply_dump_filter_p (dump_kind, pflags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1385 print_hex (value, dump_file);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1386
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1387 if (alt_dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1388 && dump_context::get ().apply_dump_filter_p (dump_kind, alt_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1389 print_hex (value, alt_dump_file);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1390 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1391
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1392 /* Emit and delete the currently pending optinfo, if there is one,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1393 without the caller needing to know about class dump_context. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1394
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1395 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1396 dumpfile_ensure_any_optinfo_are_flushed ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1397 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1398 dump_context::get().end_any_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1399 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1400
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1401 /* Output the name of NODE on appropriate dump streams. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1402
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1403 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1404 dump_symtab_node (const dump_metadata_t &metadata, symtab_node *node)
111
kono
parents:
diff changeset
1405 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1406 VERIFY_DUMP_ENABLED_P;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1407 dump_context::get ().dump_symtab_node (metadata, node);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1408 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1409
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1410 /* Get the current dump scope-nesting depth.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1411 For use by -fopt-info (for showing nesting via indentation). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1412
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1413 unsigned int
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1414 get_dump_scope_depth ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1415 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1416 return dump_context::get ().get_scope_depth ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1417 }
111
kono
parents:
diff changeset
1418
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1419 /* Push a nested dump scope.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1420 Print "=== NAME ===\n" to the dumpfile, if any, and to the -fopt-info
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1421 destination, if any.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1422 Emit a "scope" opinfo if optinfos are enabled.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1423 Increment the scope depth. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1424
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1425 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1426 dump_begin_scope (const char *name,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1427 const dump_user_location_t &user_location,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1428 const dump_impl_location_t &impl_location)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1429 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1430 dump_context::get ().begin_scope (name, user_location, impl_location);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1431 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1432
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1433 /* Pop a nested dump scope. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1434
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1435 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1436 dump_end_scope ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1437 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438 dump_context::get ().end_scope ();
111
kono
parents:
diff changeset
1439 }
kono
parents:
diff changeset
1440
kono
parents:
diff changeset
1441 /* Start a dump for PHASE. Store user-supplied dump flags in
kono
parents:
diff changeset
1442 *FLAG_PTR. Return the number of streams opened. Set globals
kono
parents:
diff changeset
1443 DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and
kono
parents:
diff changeset
1444 set dump_flags appropriately for both pass dump stream and
kono
parents:
diff changeset
1445 -fopt-info stream. */
kono
parents:
diff changeset
1446
kono
parents:
diff changeset
1447 int
kono
parents:
diff changeset
1448 gcc::dump_manager::
kono
parents:
diff changeset
1449 dump_start (int phase, dump_flags_t *flag_ptr)
kono
parents:
diff changeset
1450 {
kono
parents:
diff changeset
1451 int count = 0;
kono
parents:
diff changeset
1452 char *name;
kono
parents:
diff changeset
1453 struct dump_file_info *dfi;
kono
parents:
diff changeset
1454 FILE *stream;
kono
parents:
diff changeset
1455 if (phase == TDI_none || !dump_phase_enabled_p (phase))
kono
parents:
diff changeset
1456 return 0;
kono
parents:
diff changeset
1457
kono
parents:
diff changeset
1458 dfi = get_dump_file_info (phase);
kono
parents:
diff changeset
1459 name = get_dump_file_name (phase);
kono
parents:
diff changeset
1460 if (name)
kono
parents:
diff changeset
1461 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1462 stream = dump_open (name, dfi->pstate < 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1463 if (stream)
111
kono
parents:
diff changeset
1464 {
kono
parents:
diff changeset
1465 dfi->pstate = 1;
kono
parents:
diff changeset
1466 count++;
kono
parents:
diff changeset
1467 }
kono
parents:
diff changeset
1468 free (name);
kono
parents:
diff changeset
1469 dfi->pstream = stream;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1470 set_dump_file (dfi->pstream);
111
kono
parents:
diff changeset
1471 /* Initialize current dump flags. */
kono
parents:
diff changeset
1472 pflags = dfi->pflags;
kono
parents:
diff changeset
1473 }
kono
parents:
diff changeset
1474
kono
parents:
diff changeset
1475 stream = dump_open_alternate_stream (dfi);
kono
parents:
diff changeset
1476 if (stream)
kono
parents:
diff changeset
1477 {
kono
parents:
diff changeset
1478 dfi->alt_stream = stream;
kono
parents:
diff changeset
1479 count++;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1480 set_alt_dump_file (dfi->alt_stream);
111
kono
parents:
diff changeset
1481 /* Initialize current -fopt-info flags. */
kono
parents:
diff changeset
1482 alt_flags = dfi->alt_flags;
kono
parents:
diff changeset
1483 }
kono
parents:
diff changeset
1484
kono
parents:
diff changeset
1485 if (flag_ptr)
kono
parents:
diff changeset
1486 *flag_ptr = dfi->pflags;
kono
parents:
diff changeset
1487
kono
parents:
diff changeset
1488 return count;
kono
parents:
diff changeset
1489 }
kono
parents:
diff changeset
1490
kono
parents:
diff changeset
1491 /* Finish a tree dump for PHASE and close associated dump streams. Also
kono
parents:
diff changeset
1492 reset the globals DUMP_FILE, ALT_DUMP_FILE, and DUMP_FLAGS. */
kono
parents:
diff changeset
1493
kono
parents:
diff changeset
1494 void
kono
parents:
diff changeset
1495 gcc::dump_manager::
kono
parents:
diff changeset
1496 dump_finish (int phase)
kono
parents:
diff changeset
1497 {
kono
parents:
diff changeset
1498 struct dump_file_info *dfi;
kono
parents:
diff changeset
1499
kono
parents:
diff changeset
1500 if (phase < 0)
kono
parents:
diff changeset
1501 return;
kono
parents:
diff changeset
1502 dfi = get_dump_file_info (phase);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1503 if (dfi->pstream && dfi->pstream != stdout && dfi->pstream != stderr)
111
kono
parents:
diff changeset
1504 fclose (dfi->pstream);
kono
parents:
diff changeset
1505
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1506 if (dfi->alt_stream && dfi->alt_stream != stdout && dfi->alt_stream != stderr)
111
kono
parents:
diff changeset
1507 fclose (dfi->alt_stream);
kono
parents:
diff changeset
1508
kono
parents:
diff changeset
1509 dfi->alt_stream = NULL;
kono
parents:
diff changeset
1510 dfi->pstream = NULL;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1511 set_dump_file (NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1512 set_alt_dump_file (NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1513 dump_flags = TDF_NONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1514 alt_flags = TDF_NONE;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1515 pflags = TDF_NONE;
111
kono
parents:
diff changeset
1516 }
kono
parents:
diff changeset
1517
kono
parents:
diff changeset
1518 /* Begin a tree dump for PHASE. Stores any user supplied flag in
kono
parents:
diff changeset
1519 *FLAG_PTR and returns a stream to write to. If the dump is not
kono
parents:
diff changeset
1520 enabled, returns NULL.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1521 PART can be used for dump files which should be split to multiple
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522 parts. PART == -1 indicates dump file with no parts.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1523 If PART is -1, multiple calls will reopen and append to the dump file. */
111
kono
parents:
diff changeset
1524
kono
parents:
diff changeset
1525 FILE *
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1526 dump_begin (int phase, dump_flags_t *flag_ptr, int part)
111
kono
parents:
diff changeset
1527 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1528 return g->get_dumps ()->dump_begin (phase, flag_ptr, part);
111
kono
parents:
diff changeset
1529 }
kono
parents:
diff changeset
1530
kono
parents:
diff changeset
1531 FILE *
kono
parents:
diff changeset
1532 gcc::dump_manager::
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1533 dump_begin (int phase, dump_flags_t *flag_ptr, int part)
111
kono
parents:
diff changeset
1534 {
kono
parents:
diff changeset
1535 if (phase == TDI_none || !dump_phase_enabled_p (phase))
kono
parents:
diff changeset
1536 return NULL;
kono
parents:
diff changeset
1537
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1538 char *name = get_dump_file_name (phase, part);
111
kono
parents:
diff changeset
1539 if (!name)
kono
parents:
diff changeset
1540 return NULL;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1541 struct dump_file_info *dfi = get_dump_file_info (phase);
111
kono
parents:
diff changeset
1542
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1543 /* We do not support re-opening of dump files with parts. This would require
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1544 tracking pstate per part of the dump file. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1545 FILE *stream = dump_open (name, part != -1 || dfi->pstate < 0);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1546 if (stream)
111
kono
parents:
diff changeset
1547 dfi->pstate = 1;
kono
parents:
diff changeset
1548 free (name);
kono
parents:
diff changeset
1549
kono
parents:
diff changeset
1550 if (flag_ptr)
kono
parents:
diff changeset
1551 *flag_ptr = dfi->pflags;
kono
parents:
diff changeset
1552
kono
parents:
diff changeset
1553 /* Initialize current flags */
kono
parents:
diff changeset
1554 pflags = dfi->pflags;
kono
parents:
diff changeset
1555 return stream;
kono
parents:
diff changeset
1556 }
kono
parents:
diff changeset
1557
kono
parents:
diff changeset
1558 /* Returns nonzero if dump PHASE is enabled for at least one stream.
kono
parents:
diff changeset
1559 If PHASE is TDI_tree_all, return nonzero if any dump is enabled for
kono
parents:
diff changeset
1560 any phase. */
kono
parents:
diff changeset
1561
kono
parents:
diff changeset
1562 int
kono
parents:
diff changeset
1563 gcc::dump_manager::
kono
parents:
diff changeset
1564 dump_phase_enabled_p (int phase) const
kono
parents:
diff changeset
1565 {
kono
parents:
diff changeset
1566 if (phase == TDI_tree_all)
kono
parents:
diff changeset
1567 {
kono
parents:
diff changeset
1568 size_t i;
kono
parents:
diff changeset
1569 for (i = TDI_none + 1; i < (size_t) TDI_end; i++)
kono
parents:
diff changeset
1570 if (dump_files[i].pstate || dump_files[i].alt_state)
kono
parents:
diff changeset
1571 return 1;
kono
parents:
diff changeset
1572 for (i = 0; i < m_extra_dump_files_in_use; i++)
kono
parents:
diff changeset
1573 if (m_extra_dump_files[i].pstate || m_extra_dump_files[i].alt_state)
kono
parents:
diff changeset
1574 return 1;
kono
parents:
diff changeset
1575 return 0;
kono
parents:
diff changeset
1576 }
kono
parents:
diff changeset
1577 else
kono
parents:
diff changeset
1578 {
kono
parents:
diff changeset
1579 struct dump_file_info *dfi = get_dump_file_info (phase);
kono
parents:
diff changeset
1580 return dfi->pstate || dfi->alt_state;
kono
parents:
diff changeset
1581 }
kono
parents:
diff changeset
1582 }
kono
parents:
diff changeset
1583
kono
parents:
diff changeset
1584 /* Returns nonzero if tree dump PHASE has been initialized. */
kono
parents:
diff changeset
1585
kono
parents:
diff changeset
1586 int
kono
parents:
diff changeset
1587 gcc::dump_manager::
kono
parents:
diff changeset
1588 dump_initialized_p (int phase) const
kono
parents:
diff changeset
1589 {
kono
parents:
diff changeset
1590 struct dump_file_info *dfi = get_dump_file_info (phase);
kono
parents:
diff changeset
1591 return dfi->pstate > 0 || dfi->alt_state > 0;
kono
parents:
diff changeset
1592 }
kono
parents:
diff changeset
1593
kono
parents:
diff changeset
1594 /* Returns the switch name of PHASE. */
kono
parents:
diff changeset
1595
kono
parents:
diff changeset
1596 const char *
kono
parents:
diff changeset
1597 dump_flag_name (int phase)
kono
parents:
diff changeset
1598 {
kono
parents:
diff changeset
1599 return g->get_dumps ()->dump_flag_name (phase);
kono
parents:
diff changeset
1600 }
kono
parents:
diff changeset
1601
kono
parents:
diff changeset
1602 const char *
kono
parents:
diff changeset
1603 gcc::dump_manager::
kono
parents:
diff changeset
1604 dump_flag_name (int phase) const
kono
parents:
diff changeset
1605 {
kono
parents:
diff changeset
1606 struct dump_file_info *dfi = get_dump_file_info (phase);
kono
parents:
diff changeset
1607 return dfi->swtch;
kono
parents:
diff changeset
1608 }
kono
parents:
diff changeset
1609
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1610 /* Handle -fdump-* and -fopt-info for a pass added after
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1611 command-line options are parsed (those from plugins and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612 those from backends).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1613
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1614 Because the registration of plugin/backend passes happens after the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1615 command-line options are parsed, the options that specify single
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1616 pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1617 passes. Therefore we currently can only enable dumping of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1618 new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1619 are specified. This is done here.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1620
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1621 Similarly, the saved -fopt-info options are wired up to the new pass. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1622
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1623 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1624 gcc::dump_manager::register_pass (opt_pass *pass)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1625 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1626 gcc_assert (pass);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1627
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1628 register_one_dump_file (pass);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1629
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1630 dump_file_info *pass_dfi = get_dump_file_info (pass->static_pass_number);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1631 gcc_assert (pass_dfi);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1632
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1633 enum tree_dump_index tdi;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1634 if (pass->type == SIMPLE_IPA_PASS
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1635 || pass->type == IPA_PASS)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1636 tdi = TDI_ipa_all;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1637 else if (pass->type == GIMPLE_PASS)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1638 tdi = TDI_tree_all;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1639 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1640 tdi = TDI_rtl_all;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1641 const dump_file_info *tdi_dfi = get_dump_file_info (tdi);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1642 gcc_assert (tdi_dfi);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1643
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1644 /* Check if dump-all flag is specified. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1645 if (tdi_dfi->pstate)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1646 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1647 pass_dfi->pstate = tdi_dfi->pstate;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1648 pass_dfi->pflags = tdi_dfi->pflags;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1649 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1650
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1651 update_dfi_for_opt_info (pass_dfi);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1652 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1653
111
kono
parents:
diff changeset
1654 /* Finish a tree dump for PHASE. STREAM is the stream created by
kono
parents:
diff changeset
1655 dump_begin. */
kono
parents:
diff changeset
1656
kono
parents:
diff changeset
1657 void
kono
parents:
diff changeset
1658 dump_end (int phase ATTRIBUTE_UNUSED, FILE *stream)
kono
parents:
diff changeset
1659 {
kono
parents:
diff changeset
1660 if (stream != stderr && stream != stdout)
kono
parents:
diff changeset
1661 fclose (stream);
kono
parents:
diff changeset
1662 }
kono
parents:
diff changeset
1663
kono
parents:
diff changeset
1664 /* Enable all tree dumps with FLAGS on FILENAME. Return number of
kono
parents:
diff changeset
1665 enabled tree dumps. */
kono
parents:
diff changeset
1666
kono
parents:
diff changeset
1667 int
kono
parents:
diff changeset
1668 gcc::dump_manager::
kono
parents:
diff changeset
1669 dump_enable_all (dump_kind dkind, dump_flags_t flags, const char *filename)
kono
parents:
diff changeset
1670 {
kono
parents:
diff changeset
1671 int n = 0;
kono
parents:
diff changeset
1672 size_t i;
kono
parents:
diff changeset
1673
kono
parents:
diff changeset
1674 for (i = TDI_none + 1; i < (size_t) TDI_end; i++)
kono
parents:
diff changeset
1675 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1676 if (dump_files[i].dkind == dkind)
111
kono
parents:
diff changeset
1677 {
kono
parents:
diff changeset
1678 const char *old_filename = dump_files[i].pfilename;
kono
parents:
diff changeset
1679 dump_files[i].pstate = -1;
kono
parents:
diff changeset
1680 dump_files[i].pflags |= flags;
kono
parents:
diff changeset
1681 n++;
kono
parents:
diff changeset
1682 /* Override the existing filename. */
kono
parents:
diff changeset
1683 if (filename)
kono
parents:
diff changeset
1684 {
kono
parents:
diff changeset
1685 dump_files[i].pfilename = xstrdup (filename);
kono
parents:
diff changeset
1686 /* Since it is a command-line provided file, which is
kono
parents:
diff changeset
1687 common to all the phases, use it in append mode. */
kono
parents:
diff changeset
1688 dump_files[i].pstate = 1;
kono
parents:
diff changeset
1689 }
kono
parents:
diff changeset
1690 if (old_filename && filename != old_filename)
kono
parents:
diff changeset
1691 free (CONST_CAST (char *, old_filename));
kono
parents:
diff changeset
1692 }
kono
parents:
diff changeset
1693 }
kono
parents:
diff changeset
1694
kono
parents:
diff changeset
1695 for (i = 0; i < m_extra_dump_files_in_use; i++)
kono
parents:
diff changeset
1696 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1697 if (m_extra_dump_files[i].dkind == dkind)
111
kono
parents:
diff changeset
1698 {
kono
parents:
diff changeset
1699 const char *old_filename = m_extra_dump_files[i].pfilename;
kono
parents:
diff changeset
1700 m_extra_dump_files[i].pstate = -1;
kono
parents:
diff changeset
1701 m_extra_dump_files[i].pflags |= flags;
kono
parents:
diff changeset
1702 n++;
kono
parents:
diff changeset
1703 /* Override the existing filename. */
kono
parents:
diff changeset
1704 if (filename)
kono
parents:
diff changeset
1705 {
kono
parents:
diff changeset
1706 m_extra_dump_files[i].pfilename = xstrdup (filename);
kono
parents:
diff changeset
1707 /* Since it is a command-line provided file, which is
kono
parents:
diff changeset
1708 common to all the phases, use it in append mode. */
kono
parents:
diff changeset
1709 m_extra_dump_files[i].pstate = 1;
kono
parents:
diff changeset
1710 }
kono
parents:
diff changeset
1711 if (old_filename && filename != old_filename)
kono
parents:
diff changeset
1712 free (CONST_CAST (char *, old_filename));
kono
parents:
diff changeset
1713 }
kono
parents:
diff changeset
1714 }
kono
parents:
diff changeset
1715
kono
parents:
diff changeset
1716 return n;
kono
parents:
diff changeset
1717 }
kono
parents:
diff changeset
1718
kono
parents:
diff changeset
1719 /* Enable -fopt-info dumps on all dump files matching OPTGROUP_FLAGS.
kono
parents:
diff changeset
1720 Enable dumps with FLAGS on FILENAME. Return the number of enabled
kono
parents:
diff changeset
1721 dumps. */
kono
parents:
diff changeset
1722
kono
parents:
diff changeset
1723 int
kono
parents:
diff changeset
1724 gcc::dump_manager::
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1725 opt_info_enable_passes (optgroup_flags_t optgroup_flags, dump_flags_t flags,
111
kono
parents:
diff changeset
1726 const char *filename)
kono
parents:
diff changeset
1727 {
kono
parents:
diff changeset
1728 int n = 0;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1729
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1730 m_optgroup_flags = optgroup_flags;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1731 m_optinfo_flags = flags;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1732 m_optinfo_filename = xstrdup (filename);
111
kono
parents:
diff changeset
1733
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1734 for (size_t i = TDI_none + 1; i < (size_t) TDI_end; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1735 if (update_dfi_for_opt_info (&dump_files[i]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1736 n++;
111
kono
parents:
diff changeset
1737
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1738 for (size_t i = 0; i < m_extra_dump_files_in_use; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1739 if (update_dfi_for_opt_info (&m_extra_dump_files[i]))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1740 n++;
111
kono
parents:
diff changeset
1741
kono
parents:
diff changeset
1742 return n;
kono
parents:
diff changeset
1743 }
kono
parents:
diff changeset
1744
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1745 /* Use the saved -fopt-info options to update DFI.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1746 Return true if the dump is enabled. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1747
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1748 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1749 gcc::dump_manager::update_dfi_for_opt_info (dump_file_info *dfi) const
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1750 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1751 gcc_assert (dfi);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1752
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1753 if (!(dfi->optgroup_flags & m_optgroup_flags))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1754 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1755
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1756 const char *old_filename = dfi->alt_filename;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1757 /* Since this file is shared among different passes, it
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1758 should be opened in append mode. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1759 dfi->alt_state = 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1760 dfi->alt_flags |= m_optinfo_flags;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1761 /* Override the existing filename. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1762 if (m_optinfo_filename)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1763 dfi->alt_filename = xstrdup (m_optinfo_filename);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1764 if (old_filename && m_optinfo_filename != old_filename)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1765 free (CONST_CAST (char *, old_filename));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1766
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1767 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1768 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1769
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1770 /* Helper routine to parse -<dump format>[=filename]
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1771 and return the corresponding dump flag. If POS_P is non-NULL,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1772 assign start of filename into *POS_P. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1773
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1774 dump_flags_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1775 parse_dump_option (const char *option_value, const char **pos_p)
111
kono
parents:
diff changeset
1776 {
kono
parents:
diff changeset
1777 const char *ptr;
kono
parents:
diff changeset
1778 dump_flags_t flags;
kono
parents:
diff changeset
1779
kono
parents:
diff changeset
1780 ptr = option_value;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1781 if (pos_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1782 *pos_p = NULL;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1783
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1784 /* Retain "user-facing" and "internals" messages, but filter out
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1785 those from an opt_problem being re-emitted at the top level
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1786 (MSG_PRIORITY_REEMITTED), so as to avoid duplicate messages
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1787 messing up scan-tree-dump-times" in DejaGnu tests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1788 flags = MSG_PRIORITY_USER_FACING | MSG_PRIORITY_INTERNALS;
111
kono
parents:
diff changeset
1789
kono
parents:
diff changeset
1790 while (*ptr)
kono
parents:
diff changeset
1791 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1792 const struct kv_pair<dump_flags_t> *option_ptr;
111
kono
parents:
diff changeset
1793 const char *end_ptr;
kono
parents:
diff changeset
1794 const char *eq_ptr;
kono
parents:
diff changeset
1795 unsigned length;
kono
parents:
diff changeset
1796 while (*ptr == '-')
kono
parents:
diff changeset
1797 ptr++;
kono
parents:
diff changeset
1798 end_ptr = strchr (ptr, '-');
kono
parents:
diff changeset
1799 eq_ptr = strchr (ptr, '=');
kono
parents:
diff changeset
1800
kono
parents:
diff changeset
1801 if (eq_ptr && !end_ptr)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1802 end_ptr = eq_ptr;
111
kono
parents:
diff changeset
1803
kono
parents:
diff changeset
1804 if (!end_ptr)
kono
parents:
diff changeset
1805 end_ptr = ptr + strlen (ptr);
kono
parents:
diff changeset
1806 length = end_ptr - ptr;
kono
parents:
diff changeset
1807
kono
parents:
diff changeset
1808 for (option_ptr = dump_options; option_ptr->name; option_ptr++)
kono
parents:
diff changeset
1809 if (strlen (option_ptr->name) == length
kono
parents:
diff changeset
1810 && !memcmp (option_ptr->name, ptr, length))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1811 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1812 flags |= option_ptr->value;
111
kono
parents:
diff changeset
1813 goto found;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1814 }
111
kono
parents:
diff changeset
1815
kono
parents:
diff changeset
1816 if (*ptr == '=')
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1817 {
111
kono
parents:
diff changeset
1818 /* Interpret rest of the argument as a dump filename. This
kono
parents:
diff changeset
1819 filename overrides other command line filenames. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1820 if (pos_p)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1821 *pos_p = ptr + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1822 break;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1823 }
111
kono
parents:
diff changeset
1824 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1825 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1826 warning (0, "ignoring unknown option %q.*s",
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1827 length, ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1828 flags = TDF_ERROR;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1829 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1830 found:
111
kono
parents:
diff changeset
1831 ptr = end_ptr;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1832 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1833
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1834 return flags;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1835 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1836
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1837 /* Parse ARG as a dump switch. Return nonzero if it is, and store the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1838 relevant details in the dump_files array. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1839
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1840 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1841 gcc::dump_manager::
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1842 dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1843 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1844 const char *option_value;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1845 dump_flags_t flags = TDF_NONE;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1846
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1847 if (doglob && !dfi->glob)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1848 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1849
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1850 option_value = skip_leading_substring (arg, doglob ? dfi->glob : dfi->swtch);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1851 if (!option_value)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1852 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1853
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1854 if (*option_value && *option_value != '-' && *option_value != '=')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1855 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1856
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1857 const char *filename;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1858 flags = parse_dump_option (option_value, &filename);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1859 if (filename)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1860 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1861 if (dfi->pfilename)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1862 free (CONST_CAST (char *, dfi->pfilename));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1863 dfi->pfilename = xstrdup (filename);
111
kono
parents:
diff changeset
1864 }
kono
parents:
diff changeset
1865
kono
parents:
diff changeset
1866 dfi->pstate = -1;
kono
parents:
diff changeset
1867 dfi->pflags |= flags;
kono
parents:
diff changeset
1868
kono
parents:
diff changeset
1869 /* Process -fdump-tree-all and -fdump-rtl-all, by enabling all the
kono
parents:
diff changeset
1870 known dumps. */
kono
parents:
diff changeset
1871 if (dfi->suffix == NULL)
kono
parents:
diff changeset
1872 dump_enable_all (dfi->dkind, dfi->pflags, dfi->pfilename);
kono
parents:
diff changeset
1873
kono
parents:
diff changeset
1874 return 1;
kono
parents:
diff changeset
1875 }
kono
parents:
diff changeset
1876
kono
parents:
diff changeset
1877 int
kono
parents:
diff changeset
1878 gcc::dump_manager::
kono
parents:
diff changeset
1879 dump_switch_p (const char *arg)
kono
parents:
diff changeset
1880 {
kono
parents:
diff changeset
1881 size_t i;
kono
parents:
diff changeset
1882 int any = 0;
kono
parents:
diff changeset
1883
kono
parents:
diff changeset
1884 for (i = TDI_none + 1; i != TDI_end; i++)
kono
parents:
diff changeset
1885 any |= dump_switch_p_1 (arg, &dump_files[i], false);
kono
parents:
diff changeset
1886
kono
parents:
diff changeset
1887 /* Don't glob if we got a hit already */
kono
parents:
diff changeset
1888 if (!any)
kono
parents:
diff changeset
1889 for (i = TDI_none + 1; i != TDI_end; i++)
kono
parents:
diff changeset
1890 any |= dump_switch_p_1 (arg, &dump_files[i], true);
kono
parents:
diff changeset
1891
kono
parents:
diff changeset
1892 for (i = 0; i < m_extra_dump_files_in_use; i++)
kono
parents:
diff changeset
1893 any |= dump_switch_p_1 (arg, &m_extra_dump_files[i], false);
kono
parents:
diff changeset
1894
kono
parents:
diff changeset
1895 if (!any)
kono
parents:
diff changeset
1896 for (i = 0; i < m_extra_dump_files_in_use; i++)
kono
parents:
diff changeset
1897 any |= dump_switch_p_1 (arg, &m_extra_dump_files[i], true);
kono
parents:
diff changeset
1898
kono
parents:
diff changeset
1899
kono
parents:
diff changeset
1900 return any;
kono
parents:
diff changeset
1901 }
kono
parents:
diff changeset
1902
kono
parents:
diff changeset
1903 /* Parse ARG as a -fopt-info switch and store flags, optgroup_flags
kono
parents:
diff changeset
1904 and filename. Return non-zero if it is a recognized switch. */
kono
parents:
diff changeset
1905
kono
parents:
diff changeset
1906 static int
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1907 opt_info_switch_p_1 (const char *arg, dump_flags_t *flags,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1908 optgroup_flags_t *optgroup_flags, char **filename)
111
kono
parents:
diff changeset
1909 {
kono
parents:
diff changeset
1910 const char *option_value;
kono
parents:
diff changeset
1911 const char *ptr;
kono
parents:
diff changeset
1912
kono
parents:
diff changeset
1913 option_value = arg;
kono
parents:
diff changeset
1914 ptr = option_value;
kono
parents:
diff changeset
1915
kono
parents:
diff changeset
1916 *filename = NULL;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1917
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1918 /* Default to filtering out "internals" messages, and retaining
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1919 "user-facing" messages, and those from an opt_problem being
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1920 re-emitted at the top level. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1921 *flags = MSG_PRIORITY_USER_FACING | MSG_PRIORITY_REEMITTED;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1922
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1923 *optgroup_flags = OPTGROUP_NONE;
111
kono
parents:
diff changeset
1924
kono
parents:
diff changeset
1925 if (!ptr)
kono
parents:
diff changeset
1926 return 1; /* Handle '-fopt-info' without any additional options. */
kono
parents:
diff changeset
1927
kono
parents:
diff changeset
1928 while (*ptr)
kono
parents:
diff changeset
1929 {
kono
parents:
diff changeset
1930 const char *end_ptr;
kono
parents:
diff changeset
1931 const char *eq_ptr;
kono
parents:
diff changeset
1932 unsigned length;
kono
parents:
diff changeset
1933
kono
parents:
diff changeset
1934 while (*ptr == '-')
kono
parents:
diff changeset
1935 ptr++;
kono
parents:
diff changeset
1936 end_ptr = strchr (ptr, '-');
kono
parents:
diff changeset
1937 eq_ptr = strchr (ptr, '=');
kono
parents:
diff changeset
1938
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1939 if (eq_ptr && (!end_ptr || eq_ptr < end_ptr))
111
kono
parents:
diff changeset
1940 end_ptr = eq_ptr;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1941 else if (!end_ptr)
111
kono
parents:
diff changeset
1942 end_ptr = ptr + strlen (ptr);
kono
parents:
diff changeset
1943 length = end_ptr - ptr;
kono
parents:
diff changeset
1944
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1945 for (const kv_pair<dump_flags_t> *option_ptr = optinfo_verbosity_options;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1946 option_ptr->name; option_ptr++)
111
kono
parents:
diff changeset
1947 if (strlen (option_ptr->name) == length
kono
parents:
diff changeset
1948 && !memcmp (option_ptr->name, ptr, length))
kono
parents:
diff changeset
1949 {
kono
parents:
diff changeset
1950 *flags |= option_ptr->value;
kono
parents:
diff changeset
1951 goto found;
kono
parents:
diff changeset
1952 }
kono
parents:
diff changeset
1953
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1954 for (const kv_pair<optgroup_flags_t> *option_ptr = optgroup_options;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1955 option_ptr->name; option_ptr++)
111
kono
parents:
diff changeset
1956 if (strlen (option_ptr->name) == length
kono
parents:
diff changeset
1957 && !memcmp (option_ptr->name, ptr, length))
kono
parents:
diff changeset
1958 {
kono
parents:
diff changeset
1959 *optgroup_flags |= option_ptr->value;
kono
parents:
diff changeset
1960 goto found;
kono
parents:
diff changeset
1961 }
kono
parents:
diff changeset
1962
kono
parents:
diff changeset
1963 if (*ptr == '=')
kono
parents:
diff changeset
1964 {
kono
parents:
diff changeset
1965 /* Interpret rest of the argument as a dump filename. This
kono
parents:
diff changeset
1966 filename overrides other command line filenames. */
kono
parents:
diff changeset
1967 *filename = xstrdup (ptr + 1);
kono
parents:
diff changeset
1968 break;
kono
parents:
diff changeset
1969 }
kono
parents:
diff changeset
1970 else
kono
parents:
diff changeset
1971 {
kono
parents:
diff changeset
1972 warning (0, "unknown option %q.*s in %<-fopt-info-%s%>",
kono
parents:
diff changeset
1973 length, ptr, arg);
kono
parents:
diff changeset
1974 return 0;
kono
parents:
diff changeset
1975 }
kono
parents:
diff changeset
1976 found:;
kono
parents:
diff changeset
1977 ptr = end_ptr;
kono
parents:
diff changeset
1978 }
kono
parents:
diff changeset
1979
kono
parents:
diff changeset
1980 return 1;
kono
parents:
diff changeset
1981 }
kono
parents:
diff changeset
1982
kono
parents:
diff changeset
1983 /* Return non-zero if ARG is a recognized switch for
kono
parents:
diff changeset
1984 -fopt-info. Return zero otherwise. */
kono
parents:
diff changeset
1985
kono
parents:
diff changeset
1986 int
kono
parents:
diff changeset
1987 opt_info_switch_p (const char *arg)
kono
parents:
diff changeset
1988 {
kono
parents:
diff changeset
1989 dump_flags_t flags;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1990 optgroup_flags_t optgroup_flags;
111
kono
parents:
diff changeset
1991 char *filename;
kono
parents:
diff changeset
1992 static char *file_seen = NULL;
kono
parents:
diff changeset
1993 gcc::dump_manager *dumps = g->get_dumps ();
kono
parents:
diff changeset
1994
kono
parents:
diff changeset
1995 if (!opt_info_switch_p_1 (arg, &flags, &optgroup_flags, &filename))
kono
parents:
diff changeset
1996 return 0;
kono
parents:
diff changeset
1997
kono
parents:
diff changeset
1998 if (!filename)
kono
parents:
diff changeset
1999 filename = xstrdup ("stderr");
kono
parents:
diff changeset
2000
kono
parents:
diff changeset
2001 /* Bail out if a different filename has been specified. */
kono
parents:
diff changeset
2002 if (file_seen && strcmp (file_seen, filename))
kono
parents:
diff changeset
2003 {
kono
parents:
diff changeset
2004 warning (0, "ignoring possibly conflicting option %<-fopt-info-%s%>",
kono
parents:
diff changeset
2005 arg);
kono
parents:
diff changeset
2006 return 1;
kono
parents:
diff changeset
2007 }
kono
parents:
diff changeset
2008
kono
parents:
diff changeset
2009 file_seen = xstrdup (filename);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2010 if (!(flags & MSG_ALL_KINDS))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2011 flags |= MSG_OPTIMIZED_LOCATIONS;
111
kono
parents:
diff changeset
2012 if (!optgroup_flags)
kono
parents:
diff changeset
2013 optgroup_flags = OPTGROUP_ALL;
kono
parents:
diff changeset
2014
kono
parents:
diff changeset
2015 return dumps->opt_info_enable_passes (optgroup_flags, flags, filename);
kono
parents:
diff changeset
2016 }
kono
parents:
diff changeset
2017
kono
parents:
diff changeset
2018 /* Print basic block on the dump streams. */
kono
parents:
diff changeset
2019
kono
parents:
diff changeset
2020 void
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2021 dump_basic_block (dump_flags_t dump_kind, basic_block bb, int indent)
111
kono
parents:
diff changeset
2022 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2023 if (dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2024 && dump_context::get ().apply_dump_filter_p (dump_kind, pflags))
111
kono
parents:
diff changeset
2025 dump_bb (dump_file, bb, indent, TDF_DETAILS);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2026 if (alt_dump_file
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2027 && dump_context::get ().apply_dump_filter_p (dump_kind, alt_flags))
111
kono
parents:
diff changeset
2028 dump_bb (alt_dump_file, bb, indent, TDF_DETAILS);
kono
parents:
diff changeset
2029 }
kono
parents:
diff changeset
2030
kono
parents:
diff changeset
2031 /* Dump FUNCTION_DECL FN as tree dump PHASE. */
kono
parents:
diff changeset
2032
kono
parents:
diff changeset
2033 void
kono
parents:
diff changeset
2034 dump_function (int phase, tree fn)
kono
parents:
diff changeset
2035 {
kono
parents:
diff changeset
2036 FILE *stream;
kono
parents:
diff changeset
2037 dump_flags_t flags;
kono
parents:
diff changeset
2038
kono
parents:
diff changeset
2039 stream = dump_begin (phase, &flags);
kono
parents:
diff changeset
2040 if (stream)
kono
parents:
diff changeset
2041 {
kono
parents:
diff changeset
2042 dump_function_to_file (fn, stream, flags);
kono
parents:
diff changeset
2043 dump_end (phase, stream);
kono
parents:
diff changeset
2044 }
kono
parents:
diff changeset
2045 }
kono
parents:
diff changeset
2046
kono
parents:
diff changeset
2047 /* Print information from the combine pass on dump_file. */
kono
parents:
diff changeset
2048
kono
parents:
diff changeset
2049 void
kono
parents:
diff changeset
2050 print_combine_total_stats (void)
kono
parents:
diff changeset
2051 {
kono
parents:
diff changeset
2052 if (dump_file)
kono
parents:
diff changeset
2053 dump_combine_total_stats (dump_file);
kono
parents:
diff changeset
2054 }
kono
parents:
diff changeset
2055
kono
parents:
diff changeset
2056 /* Enable RTL dump for all the RTL passes. */
kono
parents:
diff changeset
2057
kono
parents:
diff changeset
2058 bool
kono
parents:
diff changeset
2059 enable_rtl_dump_file (void)
kono
parents:
diff changeset
2060 {
kono
parents:
diff changeset
2061 gcc::dump_manager *dumps = g->get_dumps ();
kono
parents:
diff changeset
2062 int num_enabled =
kono
parents:
diff changeset
2063 dumps->dump_enable_all (DK_rtl, dump_flags_t (TDF_DETAILS) | TDF_BLOCKS,
kono
parents:
diff changeset
2064 NULL);
kono
parents:
diff changeset
2065 return num_enabled > 0;
kono
parents:
diff changeset
2066 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2067
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2068 #if CHECKING_P
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2069
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2070 namespace selftest {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2071
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2072 /* temp_dump_context's ctor. Temporarily override the dump_context
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2073 (to forcibly enable optinfo-generation). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2074
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2075 temp_dump_context::temp_dump_context (bool forcibly_enable_optinfo,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2076 bool forcibly_enable_dumping,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2077 dump_flags_t test_pp_flags)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2078 : m_context (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2079 m_saved (&dump_context ().get ())
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2080 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2081 dump_context::s_current = &m_context;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2082 if (forcibly_enable_optinfo)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2083 m_context.set_json_writer (new optrecord_json_writer ());
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2084 /* Conditionally enable the test dump, so that we can verify both the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2085 dump_enabled_p and the !dump_enabled_p cases in selftests. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2086 if (forcibly_enable_dumping)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2087 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2088 m_context.m_test_pp = &m_pp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2089 m_context.m_test_pp_flags = test_pp_flags;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2090 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2091
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2092 dump_context::get ().refresh_dumps_are_enabled ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2093 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2094
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2095 /* temp_dump_context's dtor. Restore the saved dump_context. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2096
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2097 temp_dump_context::~temp_dump_context ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2098 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2099 m_context.set_json_writer (NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2100
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2101 dump_context::s_current = m_saved;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2102
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2103 dump_context::get ().refresh_dumps_are_enabled ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2104 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2105
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2106 /* 0-terminate the text dumped so far, and return it. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2107
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2108 const char *
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2109 temp_dump_context::get_dumped_text ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2110 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2111 return pp_formatted_text (&m_pp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2112 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2113
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2114 /* Verify that IMPL_LOC is within EXPECTED_FILE at EXPECTED_LINE,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2115 from EXPECTED_FUNCTION, using LOC for the location of any failure,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2116 provided that the build compiler is sufficiently recent. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2117
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2118 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2119 assert_impl_location_eq (const location &loc ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2120 const dump_impl_location_t &impl_loc ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2121 const char *expected_file ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2122 int expected_line ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2123 const char *expected_function ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2124 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2125 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2126 ASSERT_STR_CONTAINS_AT (loc, impl_loc.m_file, expected_file);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2127 ASSERT_EQ_AT (loc, impl_loc.m_line, expected_line);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2128 ASSERT_STR_CONTAINS_AT (loc, impl_loc.m_function, expected_function);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2129 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2130 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2131
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2132 /* Verify that IMPL_LOC is within EXPECTED_FILE at EXPECTED_LINE,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2133 from EXPECTED_FUNCTION, provided that the build compiler is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2134 sufficiently recent. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2135
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2136 #define ASSERT_IMPL_LOCATION_EQ(IMPL_LOC, EXPECTED_FILE, EXPECTED_LINE, \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2137 EXPECTED_FUNCTION) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2138 SELFTEST_BEGIN_STMT \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2139 assert_impl_location_eq (SELFTEST_LOCATION, IMPL_LOC, \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2140 EXPECTED_FILE, EXPECTED_LINE, \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2141 EXPECTED_FUNCTION); \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2142 SELFTEST_END_STMT
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2143
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2144 /* Verify that the dump_location_t constructors capture the source location
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2145 at which they were called (provided that the build compiler is sufficiently
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2146 recent). */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2147
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2148 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2149 test_impl_location ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2150 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2151 /* Default ctor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2152 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2153 dump_location_t loc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2154 const int expected_line = __LINE__ - 1;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2155 ASSERT_IMPL_LOCATION_EQ (loc.get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2156 "dumpfile.c", expected_line, "test_impl_location");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2157 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2158
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2159 /* Constructing from a gimple. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2160 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2161 dump_location_t loc ((gimple *)NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2162 const int expected_line = __LINE__ - 1;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2163 ASSERT_IMPL_LOCATION_EQ (loc.get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2164 "dumpfile.c", expected_line, "test_impl_location");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2165 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2166
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2167 /* Constructing from an rtx_insn. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2168 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2169 dump_location_t loc ((rtx_insn *)NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2170 const int expected_line = __LINE__ - 1;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2171 ASSERT_IMPL_LOCATION_EQ (loc.get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2172 "dumpfile.c", expected_line, "test_impl_location");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2173 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2174 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2175
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2176 /* Verify that the text dumped so far in CONTEXT equals
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2177 EXPECTED_TEXT, using LOC for the location of any failure.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2178 As a side-effect, the internal buffer is 0-terminated. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2179
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2180 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2181 verify_dumped_text (const location &loc,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2182 temp_dump_context *context,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2183 const char *expected_text)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2184 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2185 gcc_assert (context);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2186 ASSERT_STREQ_AT (loc, context->get_dumped_text (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2187 expected_text);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2188 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2189
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2190 /* Verify that ITEM has the expected values. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2191
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2192 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2193 verify_item (const location &loc,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2194 const optinfo_item *item,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2195 enum optinfo_item_kind expected_kind,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2196 location_t expected_location,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2197 const char *expected_text)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2198 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2199 ASSERT_EQ_AT (loc, item->get_kind (), expected_kind);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2200 ASSERT_EQ_AT (loc, item->get_location (), expected_location);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2201 ASSERT_STREQ_AT (loc, item->get_text (), expected_text);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2202 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2203
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2204 /* Verify that calls to the dump_* API are captured and consolidated into
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2205 optimization records. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2206
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2207 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2208 test_capture_of_dump_calls (const line_table_case &case_)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2209 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2210 /* Generate a location_t for testing. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2211 line_table_test ltt (case_);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2212 linemap_add (line_table, LC_ENTER, false, "test.txt", 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2213 linemap_line_start (line_table, 5, 100);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2214 linemap_add (line_table, LC_LEAVE, false, NULL, 0);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2215 location_t decl_loc = linemap_position_for_column (line_table, 8);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2216 location_t stmt_loc = linemap_position_for_column (line_table, 10);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2217 if (stmt_loc > LINE_MAP_MAX_LOCATION_WITH_COLS)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2218 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2219
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2220 dump_user_location_t loc = dump_user_location_t::from_location_t (stmt_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2221
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2222 gimple *stmt = gimple_build_return (NULL);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2223 gimple_set_location (stmt, stmt_loc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2224
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2225 tree test_decl = build_decl (decl_loc, FUNCTION_DECL,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2226 get_identifier ("test_decl"),
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2227 build_function_type_list (void_type_node,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2228 NULL_TREE));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2229
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2230 symbol_table_test tmp_symtab;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2231
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2232 cgraph_node *node = cgraph_node::get_create (test_decl);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2233 gcc_assert (node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2234
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2235 /* Run all tests twice, with and then without optinfo enabled, to ensure
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2236 that immediate destinations vs optinfo-based destinations both
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2237 work, independently of each other, with no leaks. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2238 for (int i = 0 ; i < 2; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2239 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2240 bool with_optinfo = (i == 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2241
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2242 /* Test of dump_printf. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2243 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2244 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2245 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2246 dump_printf (MSG_NOTE, "int: %i str: %s", 42, "foo");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2247 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2248
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2249 ASSERT_DUMPED_TEXT_EQ (tmp, "int: 42 str: foo");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2250 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2251 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2252 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2253 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2254 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2255 ASSERT_EQ (info->num_items (), 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2256 ASSERT_IS_TEXT (info->get_item (0), "int: 42 str: foo");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2257 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2258 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2259 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2260 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2261 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2262
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2263 /* Test of dump_printf with %T. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2264 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2265 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2266 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2267 dump_printf (MSG_NOTE, "tree: %T", integer_zero_node);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2268 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2269
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2270 ASSERT_DUMPED_TEXT_EQ (tmp, "tree: 0");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2271 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2272 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2273 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2274 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2275 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2276 ASSERT_EQ (info->num_items (), 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2277 ASSERT_IS_TEXT (info->get_item (0), "tree: ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2278 ASSERT_IS_TREE (info->get_item (1), UNKNOWN_LOCATION, "0");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2279 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2280 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2281 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2282 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2283 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2284
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2285 /* Test of dump_printf with %E. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2286 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2287 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2288 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2289 dump_printf (MSG_NOTE, "gimple: %E", stmt);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2290 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2291
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2292 ASSERT_DUMPED_TEXT_EQ (tmp, "gimple: return;");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2293 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2294 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2295 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2296 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2297 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2298 ASSERT_EQ (info->num_items (), 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2299 ASSERT_IS_TEXT (info->get_item (0), "gimple: ");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2300 ASSERT_IS_GIMPLE (info->get_item (1), stmt_loc, "return;");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2301 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2302 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2303 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2304 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2305 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2306
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2307 /* Test of dump_printf with %G. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2308 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2309 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2310 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2311 dump_printf (MSG_NOTE, "gimple: %G", stmt);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2312 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2313
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2314 ASSERT_DUMPED_TEXT_EQ (tmp, "gimple: return;\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2315 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2316 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2317 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2318 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2319 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2320 ASSERT_EQ (info->num_items (), 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2321 ASSERT_IS_TEXT (info->get_item (0), "gimple: ");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2322 ASSERT_IS_GIMPLE (info->get_item (1), stmt_loc, "return;\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2323 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2324 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2325 "test_capture_of_dump_calls");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2326 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2327 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2328
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2329 /* Test of dump_printf with %C. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2330 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2331 temp_dump_context tmp (with_optinfo, true,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2332 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2333 dump_printf (MSG_NOTE, "node: %C", node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2334 const int expected_impl_line = __LINE__ - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2335
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2336 ASSERT_DUMPED_TEXT_EQ (tmp, "node: test_decl/0");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2337 if (with_optinfo)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2338 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2339 optinfo *info = tmp.get_pending_optinfo ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2340 ASSERT_TRUE (info != NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2341 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2342 ASSERT_EQ (info->num_items (), 2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2343 ASSERT_IS_TEXT (info->get_item (0), "node: ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2344 ASSERT_IS_SYMTAB_NODE (info->get_item (1), decl_loc, "test_decl/0");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2345 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2346 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2347 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2348 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2349 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2350
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2351 /* dump_print_loc with multiple format codes. This tests various
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2352 things:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2353 - intermingling of text, format codes handled by the base
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2354 pretty_printer, and dump-specific format codes
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2355 - multiple dump-specific format codes: some consecutive, others
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2356 separated by text, trailing text after the final one. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2357 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2358 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2359 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2360 dump_printf_loc (MSG_NOTE, loc, "before %T and %T"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2361 " %i consecutive %E%E after\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2362 integer_zero_node, test_decl, 42, stmt, stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2363
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2364 ASSERT_DUMPED_TEXT_EQ (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2365 "test.txt:5:10: note: before 0 and test_decl"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2366 " 42 consecutive return;return; after\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2367 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2368 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2369 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2370 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2371 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2372 ASSERT_EQ (info->num_items (), 8);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2373 ASSERT_IS_TEXT (info->get_item (0), "before ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2374 ASSERT_IS_TREE (info->get_item (1), UNKNOWN_LOCATION, "0");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2375 ASSERT_IS_TEXT (info->get_item (2), " and ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2376 ASSERT_IS_TREE (info->get_item (3), UNKNOWN_LOCATION, "test_decl");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2377 ASSERT_IS_TEXT (info->get_item (4), " 42 consecutive ");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2378 ASSERT_IS_GIMPLE (info->get_item (5), stmt_loc, "return;");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2379 ASSERT_IS_GIMPLE (info->get_item (6), stmt_loc, "return;");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2380 ASSERT_IS_TEXT (info->get_item (7), " after\n");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2381 /* We don't ASSERT_IMPL_LOCATION_EQ here, to avoid having to
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2382 enforce at which exact line the multiline dump_printf_loc
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2383 occurred. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2384 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2385 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2386
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2387 /* Tree, via dump_generic_expr. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2388 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2389 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2390 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2391 dump_printf_loc (MSG_NOTE, loc, "test of tree: ");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2392 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2393 dump_generic_expr (MSG_NOTE, TDF_SLIM, integer_zero_node);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2394
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2395 ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: note: test of tree: 0");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2396 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2397 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2398 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2399 ASSERT_TRUE (info != NULL);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2400 ASSERT_EQ (info->get_location_t (), stmt_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2401 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2402 ASSERT_EQ (info->num_items (), 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2403 ASSERT_IS_TEXT (info->get_item (0), "test of tree: ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2404 ASSERT_IS_TREE (info->get_item (1), UNKNOWN_LOCATION, "0");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2405 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2406 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2407 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2408 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2409 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2410
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2411 /* Tree, via dump_generic_expr_loc. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2412 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2413 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2414 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2415 dump_generic_expr_loc (MSG_NOTE, loc, TDF_SLIM, integer_one_node);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2416 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2417
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2418 ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: note: 1");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2419 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2420 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2421 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2422 ASSERT_TRUE (info != NULL);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2423 ASSERT_EQ (info->get_location_t (), stmt_loc);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2424 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2425 ASSERT_EQ (info->num_items (), 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2426 ASSERT_IS_TREE (info->get_item (0), UNKNOWN_LOCATION, "1");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2427 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2428 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2429 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2430 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2431 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2432
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2433 /* Gimple. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2434 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2435 /* dump_gimple_stmt_loc. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2436 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2437 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2438 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2439 dump_gimple_stmt_loc (MSG_NOTE, loc, TDF_SLIM, stmt, 2);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2440 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2441
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2442 ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: note: return;\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2443 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2444 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2445 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2446 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2447 ASSERT_EQ (info->num_items (), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2448 ASSERT_IS_GIMPLE (info->get_item (0), stmt_loc, "return;\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2449 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2450 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2451 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2452 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2453 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2454
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2455 /* dump_gimple_stmt. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2456 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2457 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2458 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2459 dump_gimple_stmt (MSG_NOTE, TDF_SLIM, stmt, 2);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2460 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2461
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2462 ASSERT_DUMPED_TEXT_EQ (tmp, "return;\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2463 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2464 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2465 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2466 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2467 ASSERT_EQ (info->num_items (), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2468 ASSERT_IS_GIMPLE (info->get_item (0), stmt_loc, "return;\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2469 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2470 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2471 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2472 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2473 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2474
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2475 /* dump_gimple_expr_loc. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2476 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2477 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2478 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2479 dump_gimple_expr_loc (MSG_NOTE, loc, TDF_SLIM, stmt, 2);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2480 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2481
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2482 ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: note: return;");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2483 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2484 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2485 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2486 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2487 ASSERT_EQ (info->num_items (), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2488 ASSERT_IS_GIMPLE (info->get_item (0), stmt_loc, "return;");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2489 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2490 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2491 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2492 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2493 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2494
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2495 /* dump_gimple_expr. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2496 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2497 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2498 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2499 dump_gimple_expr (MSG_NOTE, TDF_SLIM, stmt, 2);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2500 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2501
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2502 ASSERT_DUMPED_TEXT_EQ (tmp, "return;");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2503 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2504 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2505 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2506 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2507 ASSERT_EQ (info->num_items (), 1);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2508 ASSERT_IS_GIMPLE (info->get_item (0), stmt_loc, "return;");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2509 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2510 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2511 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2512 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2513 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2514 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2515
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2516 /* symtab_node. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2517 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2518 temp_dump_context tmp (with_optinfo, true,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2519 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2520 dump_symtab_node (MSG_NOTE, node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2521 const int expected_impl_line = __LINE__ - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2522
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2523 ASSERT_DUMPED_TEXT_EQ (tmp, "test_decl/0");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2524 if (with_optinfo)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2525 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2526 optinfo *info = tmp.get_pending_optinfo ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2527 ASSERT_TRUE (info != NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2528 ASSERT_EQ (info->get_kind (), OPTINFO_KIND_NOTE);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2529 ASSERT_EQ (info->num_items (), 1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2530 ASSERT_IS_SYMTAB_NODE (info->get_item (0), decl_loc, "test_decl/0");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2531 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2532 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2533 "test_capture_of_dump_calls");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2534 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2535 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2536
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2537 /* poly_int. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2538 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2539 temp_dump_context tmp (with_optinfo, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2540 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2541 dump_dec (MSG_NOTE, poly_int64 (42));
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2542 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2543
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2544 ASSERT_DUMPED_TEXT_EQ (tmp, "42");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2545 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2546 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2547 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2548 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2549 ASSERT_EQ (info->num_items (), 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2550 ASSERT_IS_TEXT (info->get_item (0), "42");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2551 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2552 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2553 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2554 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2555 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2556
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2557 /* Scopes. Test with all 4 combinations of
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2558 filtering by MSG_PRIORITY_USER_FACING
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2559 and/or filtering by MSG_PRIORITY_INTERNALS. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2560 for (int j = 0; j < 3; j++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2561 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2562 dump_flags_t dump_filter = MSG_ALL_KINDS;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2563 if (j % 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2564 dump_filter |= MSG_PRIORITY_USER_FACING;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2565 if (j / 2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2566 dump_filter |= MSG_PRIORITY_INTERNALS;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2567
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2568 temp_dump_context tmp (with_optinfo, true, dump_filter);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2569 /* Emit various messages, mostly with implicit priority. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2570 dump_printf_loc (MSG_NOTE, stmt, "msg 1\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2571 dump_printf_loc (MSG_NOTE | MSG_PRIORITY_INTERNALS, stmt,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2572 "explicitly internal msg\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2573 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2574 AUTO_DUMP_SCOPE ("outer scope", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2575 dump_printf_loc (MSG_NOTE, stmt, "msg 2\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2576 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2577 AUTO_DUMP_SCOPE ("middle scope", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2578 dump_printf_loc (MSG_NOTE, stmt, "msg 3\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2579 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2580 AUTO_DUMP_SCOPE ("inner scope", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2581 dump_printf_loc (MSG_NOTE, stmt, "msg 4\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2582 dump_printf_loc (MSG_NOTE | MSG_PRIORITY_USER_FACING, stmt,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2583 "explicitly user-facing msg\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2584 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2585 dump_printf_loc (MSG_NOTE, stmt, "msg 5\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2586 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2587 dump_printf_loc (MSG_NOTE, stmt, "msg 6\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2588 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2589 dump_printf_loc (MSG_NOTE, stmt, "msg 7\n");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2590 const int expected_impl_line = __LINE__ - 1;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2591
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2592 switch (dump_filter & MSG_ALL_PRIORITIES)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2593 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2594 default:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2595 gcc_unreachable ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2596 case 0:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2597 ASSERT_DUMPED_TEXT_EQ (tmp, "");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2598 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2599 case MSG_PRIORITY_USER_FACING:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2600 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2601 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2602 "test.txt:5:10: note: msg 1\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2603 "test.txt:5:10: note: explicitly user-facing msg\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2604 "test.txt:5:10: note: msg 7\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2605 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2606 case MSG_PRIORITY_INTERNALS:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2607 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2608 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2609 "test.txt:5:10: note: explicitly internal msg\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2610 "test.txt:5:10: note: === outer scope ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2611 "test.txt:5:10: note: msg 2\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2612 "test.txt:5:10: note: === middle scope ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2613 "test.txt:5:10: note: msg 3\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2614 "test.txt:5:10: note: === inner scope ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2615 "test.txt:5:10: note: msg 4\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2616 "test.txt:5:10: note: msg 5\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2617 "test.txt:5:10: note: msg 6\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2618 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2619 case MSG_ALL_PRIORITIES:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2620 ASSERT_DUMPED_TEXT_EQ
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2621 (tmp,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2622 "test.txt:5:10: note: msg 1\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2623 "test.txt:5:10: note: explicitly internal msg\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2624 "test.txt:5:10: note: === outer scope ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2625 "test.txt:5:10: note: msg 2\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2626 "test.txt:5:10: note: === middle scope ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2627 "test.txt:5:10: note: msg 3\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2628 "test.txt:5:10: note: === inner scope ===\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2629 "test.txt:5:10: note: msg 4\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2630 "test.txt:5:10: note: explicitly user-facing msg\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2631 "test.txt:5:10: note: msg 5\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2632 "test.txt:5:10: note: msg 6\n"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2633 "test.txt:5:10: note: msg 7\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2634 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2635 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2636 if (with_optinfo)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2637 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2638 optinfo *info = tmp.get_pending_optinfo ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2639 ASSERT_TRUE (info != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2640 ASSERT_EQ (info->num_items (), 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2641 ASSERT_IS_TEXT (info->get_item (0), "msg 7\n");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2642 ASSERT_IMPL_LOCATION_EQ (info->get_impl_location (),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2643 "dumpfile.c", expected_impl_line,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2644 "test_capture_of_dump_calls");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2645 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2646 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2647 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2648
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2649 /* Verify that MSG_* affects optinfo->get_kind (); we tested MSG_NOTE
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2650 above. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2651 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2652 /* MSG_OPTIMIZED_LOCATIONS. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2653 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2654 temp_dump_context tmp (true, true, MSG_ALL_KINDS);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2655 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc, "test");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2656 ASSERT_EQ (tmp.get_pending_optinfo ()->get_kind (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2657 OPTINFO_KIND_SUCCESS);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2658 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2659
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2660 /* MSG_MISSED_OPTIMIZATION. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2661 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2662 temp_dump_context tmp (true, true, MSG_ALL_KINDS);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2663 dump_printf_loc (MSG_MISSED_OPTIMIZATION, loc, "test");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2664 ASSERT_EQ (tmp.get_pending_optinfo ()->get_kind (),
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2665 OPTINFO_KIND_FAILURE);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2666 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2667 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2668
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2669 /* Verify that MSG_* affect AUTO_DUMP_SCOPE and the dump calls. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2670 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2671 temp_dump_context tmp (false, true,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2672 MSG_OPTIMIZED_LOCATIONS | MSG_ALL_PRIORITIES);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2673 dump_printf_loc (MSG_NOTE, stmt, "msg 1\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2674 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2675 AUTO_DUMP_SCOPE ("outer scope", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2676 dump_printf_loc (MSG_NOTE, stmt, "msg 2\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2677 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2678 AUTO_DUMP_SCOPE ("middle scope", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2679 dump_printf_loc (MSG_NOTE, stmt, "msg 3\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2680 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2681 AUTO_DUMP_SCOPE ("inner scope", stmt);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2682 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, stmt, "msg 4\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2683 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2684 dump_printf_loc (MSG_NOTE, stmt, "msg 5\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2685 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2686 dump_printf_loc (MSG_NOTE, stmt, "msg 6\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2687 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2688 dump_printf_loc (MSG_NOTE, stmt, "msg 7\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2689
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2690 ASSERT_DUMPED_TEXT_EQ (tmp, "test.txt:5:10: optimized: msg 4\n");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2691 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2692 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2693
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2694 static void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2695 test_pr87025 ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2696 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2697 dump_user_location_t loc
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2698 = dump_user_location_t::from_location_t (UNKNOWN_LOCATION);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2699
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2700 temp_dump_context tmp (true, true,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2701 MSG_ALL_KINDS | MSG_PRIORITY_USER_FACING);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2702 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2703 AUTO_DUMP_SCOPE ("outer scope", loc);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2704 dump_printf (MSG_NOTE, "msg1\n");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2705 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2706 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2707
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2708 /* Run all of the selftests within this file. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2709
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2710 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2711 dumpfile_c_tests ()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2712 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2713 test_impl_location ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2714 for_each_line_table_case (test_capture_of_dump_calls);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2715 test_pr87025 ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2716 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2717
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2718 } // namespace selftest
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2719
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2720 #endif /* CHECKING_P */