jit-logging.h revision 1.1.1.1.4.2 1 1.1 mrg /* Internals of libgccjit: logging
2 1.1.1.1.4.2 martin Copyright (C) 2014-2017 Free Software Foundation, Inc.
3 1.1 mrg Contributed by David Malcolm <dmalcolm (at) redhat.com>.
4 1.1 mrg
5 1.1 mrg This file is part of GCC.
6 1.1 mrg
7 1.1 mrg GCC is free software; you can redistribute it and/or modify it
8 1.1 mrg under the terms of the GNU General Public License as published by
9 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
10 1.1 mrg any later version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but
13 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 1.1 mrg General Public License for more details.
16 1.1 mrg
17 1.1 mrg You should have received a copy of the GNU General Public License
18 1.1 mrg along with GCC; see the file COPYING3. If not see
19 1.1 mrg <http://www.gnu.org/licenses/>. */
20 1.1 mrg
21 1.1 mrg #ifndef JIT_LOGGING_H
22 1.1 mrg #define JIT_LOGGING_H
23 1.1 mrg
24 1.1 mrg #include "jit-common.h"
25 1.1 mrg
26 1.1 mrg namespace gcc {
27 1.1 mrg
28 1.1 mrg namespace jit {
29 1.1 mrg
30 1.1 mrg /* A gcc::jit::logger encapsulates a logging stream: a way to send
31 1.1 mrg lines of pertinent information to a FILE *. */
32 1.1 mrg
33 1.1 mrg class logger
34 1.1 mrg {
35 1.1 mrg public:
36 1.1 mrg logger (FILE *f_out, int flags, int verbosity);
37 1.1 mrg ~logger ();
38 1.1 mrg
39 1.1 mrg void incref (const char *reason);
40 1.1 mrg void decref (const char *reason);
41 1.1 mrg
42 1.1 mrg void log (const char *fmt, ...)
43 1.1 mrg GNU_PRINTF(2, 3);
44 1.1 mrg void log_va (const char *fmt, va_list ap)
45 1.1 mrg GNU_PRINTF(2, 0);
46 1.1 mrg
47 1.1 mrg void enter_scope (const char *scope_name);
48 1.1 mrg void exit_scope (const char *scope_name);
49 1.1 mrg
50 1.1 mrg private:
51 1.1 mrg int m_refcount;
52 1.1 mrg FILE *m_f_out;
53 1.1 mrg int m_indent_level;
54 1.1 mrg bool m_log_refcount_changes;
55 1.1 mrg };
56 1.1 mrg
57 1.1 mrg /* The class gcc::jit::log_scope is an RAII-style class intended to make
58 1.1 mrg it easy to notify a logger about entering and exiting the body of a
59 1.1 mrg given function. */
60 1.1 mrg
61 1.1 mrg class log_scope
62 1.1 mrg {
63 1.1 mrg public:
64 1.1 mrg log_scope (logger *logger, const char *name);
65 1.1 mrg ~log_scope ();
66 1.1 mrg
67 1.1 mrg private:
68 1.1 mrg logger *m_logger;
69 1.1 mrg const char *m_name;
70 1.1 mrg };
71 1.1 mrg
72 1.1 mrg /* The constructor for gcc::jit::log_scope.
73 1.1 mrg
74 1.1 mrg The normal case is that the logger is NULL, in which case this should
75 1.1 mrg be largely a no-op.
76 1.1 mrg
77 1.1 mrg If we do have a logger, notify it that we're entering the given scope.
78 1.1 mrg We also need to hold a reference on it, to avoid a use-after-free
79 1.1 mrg when logging the cleanup of the owner of the logger. */
80 1.1 mrg
81 1.1 mrg inline
82 1.1 mrg log_scope::log_scope (logger *logger, const char *name) :
83 1.1 mrg m_logger (logger),
84 1.1 mrg m_name (name)
85 1.1 mrg {
86 1.1 mrg if (m_logger)
87 1.1 mrg {
88 1.1 mrg m_logger->incref ("log_scope ctor");
89 1.1 mrg m_logger->enter_scope (m_name);
90 1.1 mrg }
91 1.1 mrg }
92 1.1 mrg
93 1.1 mrg /* The destructor for gcc::jit::log_scope; essentially the opposite of
94 1.1 mrg the constructor. */
95 1.1 mrg
96 1.1 mrg inline
97 1.1 mrg log_scope::~log_scope ()
98 1.1 mrg {
99 1.1 mrg if (m_logger)
100 1.1 mrg {
101 1.1 mrg m_logger->exit_scope (m_name);
102 1.1 mrg m_logger->decref ("log_scope dtor");
103 1.1 mrg }
104 1.1 mrg }
105 1.1 mrg
106 1.1 mrg /* A gcc::jit::log_user is something that potentially uses a
107 1.1 mrg gcc::jit::logger (which could be NULL).
108 1.1 mrg
109 1.1 mrg It is the base class for each of:
110 1.1 mrg
111 1.1 mrg - class gcc::jit::recording::context
112 1.1 mrg
113 1.1 mrg - class gcc::jit::playback::context
114 1.1 mrg
115 1.1 mrg - class gcc::jit::tempdir
116 1.1 mrg
117 1.1 mrg - class gcc::jit::result
118 1.1 mrg
119 1.1 mrg The log_user class keeps the reference-count of a logger up-to-date. */
120 1.1 mrg
121 1.1 mrg class log_user
122 1.1 mrg {
123 1.1 mrg public:
124 1.1 mrg log_user (logger *logger);
125 1.1 mrg ~log_user ();
126 1.1 mrg
127 1.1 mrg logger * get_logger () const { return m_logger; }
128 1.1 mrg void set_logger (logger * logger);
129 1.1 mrg
130 1.1 mrg void log (const char *fmt, ...) const
131 1.1 mrg GNU_PRINTF(2, 3);
132 1.1 mrg
133 1.1 mrg void enter_scope (const char *scope_name);
134 1.1 mrg void exit_scope (const char *scope_name);
135 1.1 mrg
136 1.1 mrg private:
137 1.1 mrg logger *m_logger;
138 1.1 mrg };
139 1.1 mrg
140 1.1 mrg /* A shortcut for calling log from a context/result, handling the common
141 1.1 mrg case where the underlying logger is NULL via a no-op. */
142 1.1 mrg
143 1.1 mrg inline void
144 1.1 mrg log_user::log (const char *fmt, ...) const
145 1.1 mrg {
146 1.1 mrg if (m_logger)
147 1.1 mrg {
148 1.1 mrg va_list ap;
149 1.1 mrg va_start (ap, fmt);
150 1.1 mrg m_logger->log_va (fmt, ap);
151 1.1 mrg va_end (ap);
152 1.1 mrg }
153 1.1 mrg }
154 1.1 mrg
155 1.1 mrg /* A shortcut for recording entry into a scope from a context/result,
156 1.1 mrg handling the common case where the underlying logger is NULL via
157 1.1 mrg a no-op. */
158 1.1 mrg
159 1.1 mrg inline void
160 1.1 mrg log_user::enter_scope (const char *scope_name)
161 1.1 mrg {
162 1.1 mrg if (m_logger)
163 1.1 mrg m_logger->enter_scope (scope_name);
164 1.1 mrg }
165 1.1 mrg
166 1.1 mrg /* A shortcut for recording exit from a scope from a context/result,
167 1.1 mrg handling the common case where the underlying logger is NULL via
168 1.1 mrg a no-op. */
169 1.1 mrg
170 1.1 mrg inline void
171 1.1 mrg log_user::exit_scope (const char *scope_name)
172 1.1 mrg {
173 1.1 mrg if (m_logger)
174 1.1 mrg m_logger->exit_scope (scope_name);
175 1.1 mrg }
176 1.1 mrg
177 1.1 mrg } // namespace gcc::jit
178 1.1 mrg
179 1.1 mrg } // namespace gcc
180 1.1 mrg
181 1.1 mrg /* If the given logger is non-NULL, log entry/exit of this scope to
182 1.1 mrg it, identifying it using __PRETTY_FUNCTION__. */
183 1.1 mrg
184 1.1 mrg #define JIT_LOG_SCOPE(LOGGER) \
185 1.1 mrg gcc::jit::log_scope s (LOGGER, __PRETTY_FUNCTION__)
186 1.1 mrg
187 1.1 mrg /* If the given logger is non-NULL, log entry/exit of this scope to
188 1.1 mrg it, identifying it using __func__. */
189 1.1 mrg
190 1.1 mrg #define JIT_LOG_FUNC(LOGGER) \
191 1.1 mrg gcc::jit::log_scope s (LOGGER, __func__)
192 1.1 mrg
193 1.1 mrg #endif /* JIT_LOGGING_H */
194