aboutsummaryrefslogtreecommitdiff
path: root/gcc/dump-context.h
blob: f40ea14d2dccedbb69ade1b0a689a0fff315fe6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/* Support code for handling the various dump_* calls in dumpfile.h
   Copyright (C) 2018 Free Software Foundation, Inc.
   Contributed by David Malcolm <dmalcolm@redhat.com>.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */


#ifndef GCC_DUMP_CONTEXT_H
#define GCC_DUMP_CONTEXT_H 1

#include "pretty-print.h"

/* A class for handling the various dump_* calls.

   In particular, this class has responsibility for consolidating
   the "dump_*" calls into optinfo instances (delimited by "dump_*_loc"
   calls), and emitting them.

   Putting this in a class (rather than as global state) allows
   for selftesting of this code.  */

class dump_context
{
  friend class temp_dump_context;
 public:
  static dump_context &get () { return *s_current; }

  ~dump_context ();

  void refresh_dumps_are_enabled ();

  void dump_loc (dump_flags_t dump_kind, const dump_location_t &loc);

  void dump_gimple_stmt (dump_flags_t dump_kind, dump_flags_t extra_dump_flags,
			 gimple *gs, int spc);

  void dump_gimple_stmt_loc (dump_flags_t dump_kind,
			     const dump_location_t &loc,
			     dump_flags_t extra_dump_flags,
			     gimple *gs, int spc);

  void dump_gimple_expr (dump_flags_t dump_kind,
			 dump_flags_t extra_dump_flags,
			 gimple *gs, int spc);

  void dump_gimple_expr_loc (dump_flags_t dump_kind,
			    const dump_location_t &loc,
			    dump_flags_t extra_dump_flags,
			    gimple *gs,
			    int spc);

  void dump_generic_expr (dump_flags_t dump_kind,
			  dump_flags_t extra_dump_flags,
			  tree t);

  void dump_generic_expr_loc (dump_flags_t dump_kind,
			      const dump_location_t &loc,
			      dump_flags_t extra_dump_flags,
			      tree t);

  void dump_printf_va (dump_flags_t dump_kind, const char *format,
		       va_list ap) ATTRIBUTE_PRINTF (3, 0);

  void dump_printf_loc_va (dump_flags_t dump_kind, const dump_location_t &loc,
			   const char *format, va_list ap)
    ATTRIBUTE_PRINTF (4, 0);

  template<unsigned int N, typename C>
  void dump_dec (dump_flags_t dump_kind, const poly_int<N, C> &value);

  void dump_symtab_node (dump_flags_t dump_kind, symtab_node *node);

  /* Managing nested scopes.  */
  unsigned int get_scope_depth () const;
  void begin_scope (const char *name, const dump_location_t &loc);
  void end_scope ();

  /* For use in selftests; if true then optinfo_enabled_p is true.  */
  bool forcibly_enable_optinfo_p () const
  {
    return m_forcibly_enable_optinfo;
  }

  void end_any_optinfo ();

  void emit_item (optinfo_item *item, dump_flags_t dump_kind);

 private:
  optinfo &ensure_pending_optinfo ();
  optinfo &begin_next_optinfo (const dump_location_t &loc);

  /* For use in selftests; if true then optinfo_enabled_p is true.  */
  bool m_forcibly_enable_optinfo;

  /* The current nesting depth of dump scopes, for showing nesting
     via indentation).  */
  unsigned int m_scope_depth;

  /* The optinfo currently being accumulated since the last dump_*_loc call,
     if any.  */
  optinfo *m_pending;

  /* For use in selftests: if non-NULL, then items are to be printed
     to this, using the given flags.  */
  pretty_printer *m_test_pp;
  dump_flags_t m_test_pp_flags;

  /* The currently active dump_context, for use by the dump_* API calls.  */
  static dump_context *s_current;

  /* The default active context.  */
  static dump_context s_default;
};

#if CHECKING_P

/* An RAII-style class for use in selftests for temporarily using a different
   dump_context.  */

class temp_dump_context
{
 public:
  temp_dump_context (bool forcibly_enable_optinfo,
		     dump_flags_t test_pp_flags);
  ~temp_dump_context ();

  /* Support for selftests.  */
  optinfo *get_pending_optinfo () const { return m_context.m_pending; }
  const char *get_dumped_text ();

 private:
  pretty_printer m_pp;
  dump_context m_context;
  dump_context *m_saved;
  bool m_saved_flag_remarks;
};

#endif /* CHECKING_P */

#endif /* GCC_DUMP_CONTEXT_H */