annotate gcc/dumpfile.c @ 131:84e7813d76e9

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