PR target/85993
[official-gcc.git] / gcc / dumpfile.h
blob40e3332217ea6b653ca17b82f11c3ebefcb1323a
1 /* Definitions for the shared dumpfile.
2 Copyright (C) 2004-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
11 GCC is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
21 #ifndef GCC_DUMPFILE_H
22 #define GCC_DUMPFILE_H 1
24 #include "profile-count.h"
26 /* Different tree dump places. When you add new tree dump places,
27 extend the DUMP_FILES array in dumpfile.c. */
28 enum tree_dump_index
30 TDI_none, /* No dump */
31 TDI_cgraph, /* dump function call graph. */
32 TDI_inheritance, /* dump type inheritance graph. */
33 TDI_clones, /* dump IPA cloning decisions. */
34 TDI_original, /* dump each function before optimizing it */
35 TDI_gimple, /* dump each function after gimplifying it */
36 TDI_nested, /* dump each function after unnesting it */
37 TDI_lto_stream_out, /* dump information about lto streaming */
39 TDI_lang_all, /* enable all the language dumps. */
40 TDI_tree_all, /* enable all the GENERIC/GIMPLE dumps. */
41 TDI_rtl_all, /* enable all the RTL dumps. */
42 TDI_ipa_all, /* enable all the IPA dumps. */
44 TDI_end
47 /* Enum used to distinguish dump files to types. */
49 enum dump_kind
51 DK_none,
52 DK_lang,
53 DK_tree,
54 DK_rtl,
55 DK_ipa
58 /* Bit masks to control dumping. Not all values are applicable to all
59 dumps. Add new ones at the end. When you define new values, extend
60 the DUMP_OPTIONS array in dumpfile.c. The TDF_* flags coexist with
61 MSG_* flags (for -fopt-info) and the bit values must be chosen to
62 allow that. */
63 enum dump_flag
65 /* Value of TDF_NONE is used just for bits filtered by TDF_KIND_MASK. */
66 TDF_NONE = 0,
68 /* Dump node addresses. */
69 TDF_ADDRESS = (1 << 0),
71 /* Don't go wild following links. */
72 TDF_SLIM = (1 << 1),
74 /* Don't unparse the function. */
75 TDF_RAW = (1 << 2),
77 /* Show more detailed info about each pass. */
78 TDF_DETAILS = (1 << 3),
80 /* Dump various statistics about each pass. */
81 TDF_STATS = (1 << 4),
83 /* Display basic block boundaries. */
84 TDF_BLOCKS = (1 << 5),
86 /* Display virtual operands. */
87 TDF_VOPS = (1 << 6),
89 /* Display statement line numbers. */
90 TDF_LINENO = (1 << 7),
92 /* Display decl UIDs. */
93 TDF_UID = (1 << 8),
95 /* Address of stmt. */
96 TDF_STMTADDR = (1 << 9),
98 /* A graph dump is being emitted. */
99 TDF_GRAPH = (1 << 10),
101 /* Display memory symbols in expr.
102 Implies TDF_VOPS. */
103 TDF_MEMSYMS = (1 << 11),
105 /* A flag to only print the RHS of a gimple stmt. */
106 TDF_RHS_ONLY = (1 << 12),
108 /* Display asm names of decls. */
109 TDF_ASMNAME = (1 << 13),
111 /* Display EH region number holding this gimple statement. */
112 TDF_EH = (1 << 14),
114 /* Omit UIDs from dumps. */
115 TDF_NOUID = (1 << 15),
117 /* Display alias information. */
118 TDF_ALIAS = (1 << 16),
120 /* Enumerate locals by uid. */
121 TDF_ENUMERATE_LOCALS = (1 << 17),
123 /* Dump cselib details. */
124 TDF_CSELIB = (1 << 18),
126 /* Dump SCEV details. */
127 TDF_SCEV = (1 << 19),
129 /* Dump in GIMPLE FE syntax */
130 TDF_GIMPLE = (1 << 20),
132 /* Dump folding details. */
133 TDF_FOLDING = (1 << 21),
135 /* -fopt-info optimized sources. */
136 MSG_OPTIMIZED_LOCATIONS = (1 << 22),
138 /* Missed opportunities. */
139 MSG_MISSED_OPTIMIZATION = (1 << 23),
141 /* General optimization info. */
142 MSG_NOTE = (1 << 24),
144 MSG_ALL = (MSG_OPTIMIZED_LOCATIONS
145 | MSG_MISSED_OPTIMIZATION
146 | MSG_NOTE),
148 /* Dumping for -fcompare-debug. */
149 TDF_COMPARE_DEBUG = (1 << 25)
152 /* Dump flags type. */
154 typedef enum dump_flag dump_flags_t;
156 static inline dump_flags_t
157 operator| (dump_flags_t lhs, dump_flags_t rhs)
159 return (dump_flags_t)((int)lhs | (int)rhs);
162 static inline dump_flags_t
163 operator& (dump_flags_t lhs, dump_flags_t rhs)
165 return (dump_flags_t)((int)lhs & (int)rhs);
168 static inline dump_flags_t
169 operator~ (dump_flags_t flags)
171 return (dump_flags_t)~((int)flags);
174 static inline dump_flags_t &
175 operator|= (dump_flags_t &lhs, dump_flags_t rhs)
177 lhs = (dump_flags_t)((int)lhs | (int)rhs);
178 return lhs;
181 static inline dump_flags_t &
182 operator&= (dump_flags_t &lhs, dump_flags_t rhs)
184 lhs = (dump_flags_t)((int)lhs & (int)rhs);
185 return lhs;
188 /* Flags to control high-level -fopt-info dumps. Usually these flags
189 define a group of passes. An optimization pass can be part of
190 multiple groups. */
192 enum optgroup_flag
194 OPTGROUP_NONE = 0,
196 /* IPA optimization passes */
197 OPTGROUP_IPA = (1 << 1),
199 /* Loop optimization passes */
200 OPTGROUP_LOOP = (1 << 2),
202 /* Inlining passes */
203 OPTGROUP_INLINE = (1 << 3),
205 /* OMP (Offloading and Multi Processing) transformations */
206 OPTGROUP_OMP = (1 << 4),
208 /* Vectorization passes */
209 OPTGROUP_VEC = (1 << 5),
211 /* All other passes */
212 OPTGROUP_OTHER = (1 << 6),
214 OPTGROUP_ALL = (OPTGROUP_IPA | OPTGROUP_LOOP | OPTGROUP_INLINE
215 | OPTGROUP_OMP | OPTGROUP_VEC | OPTGROUP_OTHER)
218 typedef enum optgroup_flag optgroup_flags_t;
220 static inline optgroup_flags_t
221 operator| (optgroup_flags_t lhs, optgroup_flags_t rhs)
223 return (optgroup_flags_t)((int)lhs | (int)rhs);
226 static inline optgroup_flags_t &
227 operator|= (optgroup_flags_t &lhs, optgroup_flags_t rhs)
229 lhs = (optgroup_flags_t)((int)lhs | (int)rhs);
230 return lhs;
233 /* Define a tree dump switch. */
234 struct dump_file_info
236 /* Suffix to give output file. */
237 const char *suffix;
238 /* Command line dump switch. */
239 const char *swtch;
240 /* Command line glob. */
241 const char *glob;
242 /* Filename for the pass-specific stream. */
243 const char *pfilename;
244 /* Filename for the -fopt-info stream. */
245 const char *alt_filename;
246 /* Pass-specific dump stream. */
247 FILE *pstream;
248 /* -fopt-info stream. */
249 FILE *alt_stream;
250 /* Dump kind. */
251 dump_kind dkind;
252 /* Dump flags. */
253 dump_flags_t pflags;
254 /* A pass flags for -fopt-info. */
255 dump_flags_t alt_flags;
256 /* Flags for -fopt-info given by a user. */
257 optgroup_flags_t optgroup_flags;
258 /* State of pass-specific stream. */
259 int pstate;
260 /* State of the -fopt-info stream. */
261 int alt_state;
262 /* Dump file number. */
263 int num;
264 /* Fields "suffix", "swtch", "glob" can be const strings,
265 or can be dynamically allocated, needing free. */
266 bool owns_strings;
267 /* When a given dump file is being initialized, this flag is set to true
268 if the corresponding TDF_graph dump file has also been initialized. */
269 bool graph_dump_initialized;
272 /* A class for describing where in the user's source that a dump message
273 relates to, with various constructors for convenience.
274 In particular, this lets us associate dump messages
275 with hotness information (e.g. from PGO), allowing them to
276 be prioritized by code hotness. */
278 class dump_user_location_t
280 public:
281 /* Default constructor, analogous to UNKNOWN_LOCATION. */
282 dump_user_location_t () : m_count (), m_loc (UNKNOWN_LOCATION) {}
284 /* Construct from a gimple statement (using its location and hotness). */
285 dump_user_location_t (gimple *stmt);
287 /* Construct from an RTL instruction (using its location and hotness). */
288 dump_user_location_t (rtx_insn *insn);
290 /* Construct from a location_t. This one is deprecated (since it doesn't
291 capture hotness information); it thus needs to be spelled out. */
292 static dump_user_location_t
293 from_location_t (location_t loc)
295 return dump_user_location_t (profile_count (), loc);
298 /* Construct from a function declaration. This one requires spelling out
299 to avoid accidentally constructing from other kinds of tree. */
300 static dump_user_location_t
301 from_function_decl (tree fndecl);
303 profile_count get_count () const { return m_count; }
304 location_t get_location_t () const { return m_loc; }
306 private:
307 /* Private ctor from count and location, for use by from_location_t. */
308 dump_user_location_t (profile_count count, location_t loc)
309 : m_count (count), m_loc (loc)
312 profile_count m_count;
313 location_t m_loc;
316 /* A class for identifying where in the compiler's own source
317 (or a plugin) that a dump message is being emitted from. */
319 struct dump_impl_location_t
321 dump_impl_location_t (
322 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
323 const char *file = __builtin_FILE (),
324 int line = __builtin_LINE (),
325 const char *function = __builtin_FUNCTION ()
326 #else
327 const char *file = __FILE__,
328 int line = __LINE__,
329 const char *function = NULL
330 #endif
332 : m_file (file), m_line (line), m_function (function)
335 const char *m_file;
336 int m_line;
337 const char *m_function;
340 /* A bundle of information for describing the location of a dump message:
341 (a) the source location and hotness within the user's code, together with
342 (b) the source location within the compiler/plugin.
344 The constructors use default parameters so that (b) gets sets up
345 automatically.
347 The upshot is that you can pass in e.g. a gimple * to dump_printf_loc,
348 and the dump call will automatically record where in GCC's source
349 code the dump was emitted from. */
351 class dump_location_t
353 public:
354 /* Default constructor, analogous to UNKNOWN_LOCATION. */
355 dump_location_t (const dump_impl_location_t &impl_location
356 = dump_impl_location_t ())
357 : m_user_location (dump_user_location_t ()),
358 m_impl_location (impl_location)
362 /* Construct from a gimple statement (using its location and hotness). */
363 dump_location_t (gimple *stmt,
364 const dump_impl_location_t &impl_location
365 = dump_impl_location_t ())
366 : m_user_location (dump_user_location_t (stmt)),
367 m_impl_location (impl_location)
371 /* Construct from an RTL instruction (using its location and hotness). */
372 dump_location_t (rtx_insn *insn,
373 const dump_impl_location_t &impl_location
374 = dump_impl_location_t ())
375 : m_user_location (dump_user_location_t (insn)),
376 m_impl_location (impl_location)
380 /* Construct from a dump_user_location_t. */
381 dump_location_t (const dump_user_location_t &user_location,
382 const dump_impl_location_t &impl_location
383 = dump_impl_location_t ())
384 : m_user_location (user_location),
385 m_impl_location (impl_location)
389 /* Construct from a location_t. This one is deprecated (since it doesn't
390 capture hotness information), and thus requires spelling out. */
391 static dump_location_t
392 from_location_t (location_t loc,
393 const dump_impl_location_t &impl_location
394 = dump_impl_location_t ())
396 return dump_location_t (dump_user_location_t::from_location_t (loc),
397 impl_location);
400 const dump_user_location_t &
401 get_user_location () const { return m_user_location; }
403 const dump_impl_location_t &
404 get_impl_location () const { return m_impl_location; }
406 location_t get_location_t () const
408 return m_user_location.get_location_t ();
411 profile_count get_count () const { return m_user_location.get_count (); }
413 private:
414 dump_user_location_t m_user_location;
415 dump_impl_location_t m_impl_location;
418 /* In dumpfile.c */
419 extern FILE *dump_begin (int, dump_flags_t *, int part=-1);
420 extern void dump_end (int, FILE *);
421 extern int opt_info_switch_p (const char *);
422 extern const char *dump_flag_name (int);
423 extern void dump_printf (dump_flags_t, const char *, ...) ATTRIBUTE_PRINTF_2;
424 extern void dump_printf_loc (dump_flags_t, const dump_location_t &,
425 const char *, ...) ATTRIBUTE_PRINTF_3;
426 extern void dump_function (int phase, tree fn);
427 extern void dump_basic_block (dump_flags_t, basic_block, int);
428 extern void dump_generic_expr_loc (dump_flags_t, const dump_location_t &,
429 dump_flags_t, tree);
430 extern void dump_generic_expr (dump_flags_t, dump_flags_t, tree);
431 extern void dump_gimple_stmt_loc (dump_flags_t, const dump_location_t &,
432 dump_flags_t, gimple *, int);
433 extern void dump_gimple_stmt (dump_flags_t, dump_flags_t, gimple *, int);
434 extern void dump_gimple_expr_loc (dump_flags_t, const dump_location_t &,
435 dump_flags_t, gimple *, int);
436 extern void dump_gimple_expr (dump_flags_t, dump_flags_t, gimple *, int);
437 extern void print_combine_total_stats (void);
438 extern bool enable_rtl_dump_file (void);
440 template<unsigned int N, typename C>
441 void dump_dec (dump_flags_t, const poly_int<N, C> &);
442 extern void dump_dec (dump_flags_t, const poly_wide_int &, signop);
443 extern void dump_hex (dump_flags_t, const poly_wide_int &);
445 /* In tree-dump.c */
446 extern void dump_node (const_tree, dump_flags_t, FILE *);
448 /* In combine.c */
449 extern void dump_combine_total_stats (FILE *);
450 /* In cfghooks.c */
451 extern void dump_bb (FILE *, basic_block, int, dump_flags_t);
453 /* Global variables used to communicate with passes. */
454 extern FILE *dump_file;
455 extern dump_flags_t dump_flags;
456 extern const char *dump_file_name;
458 extern bool dumps_are_enabled;
460 extern void set_dump_file (FILE *new_dump_file);
462 /* Return true if any of the dumps is enabled, false otherwise. */
463 static inline bool
464 dump_enabled_p (void)
466 return dumps_are_enabled;
469 /* Managing nested scopes, so that dumps can express the call chain
470 leading to a dump message. */
472 extern unsigned int get_dump_scope_depth ();
473 extern void dump_begin_scope (const char *name, const dump_location_t &loc);
474 extern void dump_end_scope ();
476 /* Implementation detail of the AUTO_DUMP_SCOPE macro below.
478 A RAII-style class intended to make it easy to emit dump
479 information about entering and exiting a collection of nested
480 function calls. */
482 class auto_dump_scope
484 public:
485 auto_dump_scope (const char *name, dump_location_t loc)
487 if (dump_enabled_p ())
488 dump_begin_scope (name, loc);
490 ~auto_dump_scope ()
492 if (dump_enabled_p ())
493 dump_end_scope ();
497 /* A macro for calling:
498 dump_begin_scope (NAME, LOC);
499 via an RAII object, thus printing "=== MSG ===\n" to the dumpfile etc,
500 and then calling
501 dump_end_scope ();
502 once the object goes out of scope, thus capturing the nesting of
503 the scopes. */
505 #define AUTO_DUMP_SCOPE(NAME, LOC) \
506 auto_dump_scope scope (NAME, LOC)
508 namespace gcc {
510 class dump_manager
512 public:
514 dump_manager ();
515 ~dump_manager ();
517 /* Register a dumpfile.
519 TAKE_OWNERSHIP determines whether callee takes ownership of strings
520 SUFFIX, SWTCH, and GLOB. */
521 unsigned int
522 dump_register (const char *suffix, const char *swtch, const char *glob,
523 dump_kind dkind, optgroup_flags_t optgroup_flags,
524 bool take_ownership);
526 /* Allow languages and middle-end to register their dumps before the
527 optimization passes. */
528 void
529 register_dumps ();
531 /* Return the dump_file_info for the given phase. */
532 struct dump_file_info *
533 get_dump_file_info (int phase) const;
535 struct dump_file_info *
536 get_dump_file_info_by_switch (const char *swtch) const;
538 /* Return the name of the dump file for the given phase.
539 If the dump is not enabled, returns NULL. */
540 char *
541 get_dump_file_name (int phase, int part = -1) const;
543 char *
544 get_dump_file_name (struct dump_file_info *dfi, int part = -1) const;
547 dump_switch_p (const char *arg);
549 /* Start a dump for PHASE. Store user-supplied dump flags in
550 *FLAG_PTR. Return the number of streams opened. Set globals
551 DUMP_FILE, and ALT_DUMP_FILE to point to the opened streams, and
552 set dump_flags appropriately for both pass dump stream and
553 -fopt-info stream. */
555 dump_start (int phase, dump_flags_t *flag_ptr);
557 /* Finish a tree dump for PHASE and close associated dump streams. Also
558 reset the globals DUMP_FILE, ALT_DUMP_FILE, and DUMP_FLAGS. */
559 void
560 dump_finish (int phase);
562 FILE *
563 dump_begin (int phase, dump_flags_t *flag_ptr, int part);
565 /* Returns nonzero if tree dump PHASE has been initialized. */
567 dump_initialized_p (int phase) const;
569 /* Returns the switch name of PHASE. */
570 const char *
571 dump_flag_name (int phase) const;
573 private:
576 dump_phase_enabled_p (int phase) const;
579 dump_switch_p_1 (const char *arg, struct dump_file_info *dfi, bool doglob);
582 dump_enable_all (dump_kind dkind, dump_flags_t flags, const char *filename);
585 opt_info_enable_passes (optgroup_flags_t optgroup_flags, dump_flags_t flags,
586 const char *filename);
588 private:
590 /* Dynamically registered dump files and switches. */
591 int m_next_dump;
592 struct dump_file_info *m_extra_dump_files;
593 size_t m_extra_dump_files_in_use;
594 size_t m_extra_dump_files_alloced;
596 /* Grant access to dump_enable_all. */
597 friend bool ::enable_rtl_dump_file (void);
599 /* Grant access to opt_info_enable_passes. */
600 friend int ::opt_info_switch_p (const char *arg);
602 }; // class dump_manager
604 } // namespace gcc
606 #endif /* GCC_DUMPFILE_H */