diagnostic.h revision 1.1.1.2 1 1.1 mrg /* Various declarations for language-independent diagnostics subroutines.
2 1.1.1.2 mrg Copyright (C) 2000-2013 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Gabriel Dos Reis <gdr (at) codesourcery.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 under
8 1.1 mrg the terms of the GNU General Public License as published by the Free
9 1.1 mrg Software Foundation; either version 3, or (at your option) any later
10 1.1 mrg version.
11 1.1 mrg
12 1.1 mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 1.1 mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 1.1 mrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 1.1 mrg 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 GCC_DIAGNOSTIC_H
22 1.1 mrg #define GCC_DIAGNOSTIC_H
23 1.1 mrg
24 1.1 mrg #include "pretty-print.h"
25 1.1.1.2 mrg #include "diagnostic-core.h"
26 1.1 mrg
27 1.1 mrg /* A diagnostic is described by the MESSAGE to send, the FILE and LINE of
28 1.1 mrg its context and its KIND (ice, error, warning, note, ...) See complete
29 1.1 mrg list in diagnostic.def. */
30 1.1 mrg typedef struct diagnostic_info
31 1.1 mrg {
32 1.1 mrg text_info message;
33 1.1 mrg location_t location;
34 1.1 mrg unsigned int override_column;
35 1.1.1.2 mrg /* Auxiliary data for client. */
36 1.1.1.2 mrg void *x_data;
37 1.1 mrg /* The kind of diagnostic it is about. */
38 1.1 mrg diagnostic_t kind;
39 1.1 mrg /* Which OPT_* directly controls this diagnostic. */
40 1.1 mrg int option_index;
41 1.1 mrg } diagnostic_info;
42 1.1 mrg
43 1.1.1.2 mrg /* Each time a diagnostic's classification is changed with a pragma,
44 1.1.1.2 mrg we record the change and the location of the change in an array of
45 1.1.1.2 mrg these structs. */
46 1.1.1.2 mrg typedef struct diagnostic_classification_change_t
47 1.1.1.2 mrg {
48 1.1.1.2 mrg location_t location;
49 1.1.1.2 mrg int option;
50 1.1.1.2 mrg diagnostic_t kind;
51 1.1.1.2 mrg } diagnostic_classification_change_t;
52 1.1.1.2 mrg
53 1.1 mrg /* Forward declarations. */
54 1.1 mrg typedef void (*diagnostic_starter_fn) (diagnostic_context *,
55 1.1 mrg diagnostic_info *);
56 1.1 mrg typedef diagnostic_starter_fn diagnostic_finalizer_fn;
57 1.1 mrg
58 1.1 mrg /* This data structure bundles altogether any information relevant to
59 1.1 mrg the context of a diagnostic message. */
60 1.1 mrg struct diagnostic_context
61 1.1 mrg {
62 1.1 mrg /* Where most of the diagnostic formatting work is done. */
63 1.1 mrg pretty_printer *printer;
64 1.1 mrg
65 1.1 mrg /* The number of times we have issued diagnostics. */
66 1.1 mrg int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND];
67 1.1 mrg
68 1.1 mrg /* True if we should display the "warnings are being tread as error"
69 1.1 mrg message, usually displayed once per compiler run. */
70 1.1.1.2 mrg bool some_warnings_are_errors;
71 1.1 mrg
72 1.1 mrg /* True if it has been requested that warnings be treated as errors. */
73 1.1 mrg bool warning_as_error_requested;
74 1.1 mrg
75 1.1.1.2 mrg /* The number of option indexes that can be passed to warning() et
76 1.1.1.2 mrg al. */
77 1.1.1.2 mrg int n_opts;
78 1.1.1.2 mrg
79 1.1.1.2 mrg /* For each option index that can be passed to warning() et al
80 1.1.1.2 mrg (OPT_* from options.h when using this code with the core GCC
81 1.1.1.2 mrg options), this array may contain a new kind that the diagnostic
82 1.1.1.2 mrg should be changed to before reporting, or DK_UNSPECIFIED to leave
83 1.1.1.2 mrg it as the reported kind, or DK_IGNORED to not report it at
84 1.1.1.2 mrg all. */
85 1.1.1.2 mrg diagnostic_t *classify_diagnostic;
86 1.1.1.2 mrg
87 1.1.1.2 mrg /* History of all changes to the classifications above. This list
88 1.1.1.2 mrg is stored in location-order, so we can search it, either
89 1.1.1.2 mrg binary-wise or end-to-front, to find the most recent
90 1.1.1.2 mrg classification for a given diagnostic, given the location of the
91 1.1.1.2 mrg diagnostic. */
92 1.1.1.2 mrg diagnostic_classification_change_t *classification_history;
93 1.1.1.2 mrg
94 1.1.1.2 mrg /* The size of the above array. */
95 1.1.1.2 mrg int n_classification_history;
96 1.1.1.2 mrg
97 1.1.1.2 mrg /* For pragma push/pop. */
98 1.1.1.2 mrg int *push_list;
99 1.1.1.2 mrg int n_push;
100 1.1.1.2 mrg
101 1.1.1.2 mrg /* True if we should print the source line with a caret indicating
102 1.1.1.2 mrg the location. */
103 1.1.1.2 mrg bool show_caret;
104 1.1.1.2 mrg
105 1.1.1.2 mrg /* Maximum width of the source line printed. */
106 1.1.1.2 mrg int caret_max_width;
107 1.1 mrg
108 1.1 mrg /* True if we should print the command line option which controls
109 1.1 mrg each diagnostic, if known. */
110 1.1 mrg bool show_option_requested;
111 1.1 mrg
112 1.1 mrg /* True if we should raise a SIGABRT on errors. */
113 1.1 mrg bool abort_on_error;
114 1.1 mrg
115 1.1.1.2 mrg /* True if we should show the column number on diagnostics. */
116 1.1.1.2 mrg bool show_column;
117 1.1.1.2 mrg
118 1.1.1.2 mrg /* True if pedwarns are errors. */
119 1.1.1.2 mrg bool pedantic_errors;
120 1.1.1.2 mrg
121 1.1.1.2 mrg /* True if permerrors are warnings. */
122 1.1.1.2 mrg bool permissive;
123 1.1.1.2 mrg
124 1.1.1.2 mrg /* The index of the option to associate with turning permerrors into
125 1.1.1.2 mrg warnings. */
126 1.1.1.2 mrg int opt_permissive;
127 1.1.1.2 mrg
128 1.1.1.2 mrg /* True if errors are fatal. */
129 1.1.1.2 mrg bool fatal_errors;
130 1.1.1.2 mrg
131 1.1.1.2 mrg /* True if all warnings should be disabled. */
132 1.1.1.2 mrg bool dc_inhibit_warnings;
133 1.1.1.2 mrg
134 1.1.1.2 mrg /* True if warnings should be given in system headers. */
135 1.1.1.2 mrg bool dc_warn_system_headers;
136 1.1.1.2 mrg
137 1.1.1.2 mrg /* Maximum number of errors to report. */
138 1.1.1.2 mrg unsigned int max_errors;
139 1.1.1.2 mrg
140 1.1 mrg /* This function is called before any message is printed out. It is
141 1.1 mrg responsible for preparing message prefix and such. For example, it
142 1.1 mrg might say:
143 1.1 mrg In file included from "/usr/local/include/curses.h:5:
144 1.1 mrg from "/home/gdr/src/nifty_printer.h:56:
145 1.1 mrg ...
146 1.1 mrg */
147 1.1 mrg diagnostic_starter_fn begin_diagnostic;
148 1.1 mrg
149 1.1 mrg /* This function is called after the diagnostic message is printed. */
150 1.1 mrg diagnostic_finalizer_fn end_diagnostic;
151 1.1 mrg
152 1.1 mrg /* Client hook to report an internal error. */
153 1.1.1.2 mrg void (*internal_error) (diagnostic_context *, const char *, va_list *);
154 1.1 mrg
155 1.1.1.2 mrg /* Client hook to say whether the option controlling a diagnostic is
156 1.1.1.2 mrg enabled. Returns nonzero if enabled, zero if disabled. */
157 1.1.1.2 mrg int (*option_enabled) (int, void *);
158 1.1.1.2 mrg
159 1.1.1.2 mrg /* Client information to pass as second argument to
160 1.1.1.2 mrg option_enabled. */
161 1.1.1.2 mrg void *option_state;
162 1.1.1.2 mrg
163 1.1.1.2 mrg /* Client hook to return the name of an option that controls a
164 1.1.1.2 mrg diagnostic. Returns malloced memory. The first diagnostic_t
165 1.1.1.2 mrg argument is the kind of diagnostic before any reclassification
166 1.1.1.2 mrg (of warnings as errors, etc.); the second is the kind after any
167 1.1.1.2 mrg reclassification. May return NULL if no name is to be printed.
168 1.1.1.2 mrg May be passed 0 as well as the index of a particular option. */
169 1.1.1.2 mrg char *(*option_name) (diagnostic_context *, int, diagnostic_t, diagnostic_t);
170 1.1.1.2 mrg
171 1.1.1.2 mrg /* Auxiliary data for client. */
172 1.1.1.2 mrg void *x_data;
173 1.1.1.2 mrg
174 1.1.1.2 mrg /* Used to detect that the last caret was printed at the same location. */
175 1.1.1.2 mrg location_t last_location;
176 1.1 mrg
177 1.1 mrg /* Used to detect when the input file stack has changed since last
178 1.1 mrg described. */
179 1.1 mrg const struct line_map *last_module;
180 1.1 mrg
181 1.1 mrg int lock;
182 1.1 mrg
183 1.1 mrg bool inhibit_notes_p;
184 1.1 mrg };
185 1.1 mrg
186 1.1 mrg static inline void
187 1.1 mrg diagnostic_inhibit_notes (diagnostic_context * context)
188 1.1 mrg {
189 1.1 mrg context->inhibit_notes_p = true;
190 1.1 mrg }
191 1.1 mrg
192 1.1 mrg
193 1.1 mrg /* Client supplied function to announce a diagnostic. */
194 1.1 mrg #define diagnostic_starter(DC) (DC)->begin_diagnostic
195 1.1 mrg
196 1.1 mrg /* Client supplied function called after a diagnostic message is
197 1.1 mrg displayed. */
198 1.1 mrg #define diagnostic_finalizer(DC) (DC)->end_diagnostic
199 1.1 mrg
200 1.1.1.2 mrg /* Extension hooks for client. */
201 1.1.1.2 mrg #define diagnostic_context_auxiliary_data(DC) (DC)->x_data
202 1.1.1.2 mrg #define diagnostic_info_auxiliary_data(DI) (DI)->x_data
203 1.1 mrg
204 1.1 mrg /* Same as pp_format_decoder. Works on 'diagnostic_context *'. */
205 1.1 mrg #define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder)
206 1.1 mrg
207 1.1 mrg /* Same as output_prefixing_rule. Works on 'diagnostic_context *'. */
208 1.1 mrg #define diagnostic_prefixing_rule(DC) ((DC)->printer->wrapping.rule)
209 1.1 mrg
210 1.1 mrg /* Maximum characters per line in automatic line wrapping mode.
211 1.1 mrg Zero means don't wrap lines. */
212 1.1 mrg #define diagnostic_line_cutoff(DC) ((DC)->printer->wrapping.line_cutoff)
213 1.1 mrg
214 1.1 mrg #define diagnostic_flush_buffer(DC) pp_base_flush ((DC)->printer)
215 1.1 mrg
216 1.1 mrg /* True if the last module or file in which a diagnostic was reported is
217 1.1 mrg different from the current one. */
218 1.1 mrg #define diagnostic_last_module_changed(DC, MAP) \
219 1.1 mrg ((DC)->last_module != MAP)
220 1.1 mrg
221 1.1 mrg /* Remember the current module or file as being the last one in which we
222 1.1 mrg report a diagnostic. */
223 1.1 mrg #define diagnostic_set_last_module(DC, MAP) \
224 1.1 mrg (DC)->last_module = MAP
225 1.1 mrg
226 1.1 mrg /* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher. */
227 1.1 mrg #define diagnostic_abort_on_error(DC) \
228 1.1 mrg (DC)->abort_on_error = true
229 1.1 mrg
230 1.1 mrg /* This diagnostic_context is used by front-ends that directly output
231 1.1 mrg diagnostic messages without going through `error', `warning',
232 1.1 mrg and similar functions. */
233 1.1 mrg extern diagnostic_context *global_dc;
234 1.1 mrg
235 1.1 mrg /* The total count of a KIND of diagnostics emitted so far. */
236 1.1 mrg #define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)]
237 1.1 mrg
238 1.1 mrg /* The number of errors that have been issued so far. Ideally, these
239 1.1 mrg would take a diagnostic_context as an argument. */
240 1.1 mrg #define errorcount diagnostic_kind_count (global_dc, DK_ERROR)
241 1.1 mrg /* Similarly, but for warnings. */
242 1.1 mrg #define warningcount diagnostic_kind_count (global_dc, DK_WARNING)
243 1.1 mrg /* Similarly, but for sorrys. */
244 1.1 mrg #define sorrycount diagnostic_kind_count (global_dc, DK_SORRY)
245 1.1 mrg
246 1.1 mrg /* Returns nonzero if warnings should be emitted. */
247 1.1.1.2 mrg #define diagnostic_report_warnings_p(DC, LOC) \
248 1.1.1.2 mrg (!(DC)->dc_inhibit_warnings \
249 1.1.1.2 mrg && !(in_system_header_at (LOC) && !(DC)->dc_warn_system_headers))
250 1.1 mrg
251 1.1 mrg #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D)
252 1.1 mrg
253 1.1 mrg /* Override the column number to be used for reporting a
254 1.1 mrg diagnostic. */
255 1.1 mrg #define diagnostic_override_column(DI, COL) (DI)->override_column = (COL)
256 1.1 mrg
257 1.1.1.2 mrg /* Override the option index to be used for reporting a
258 1.1.1.2 mrg diagnostic. */
259 1.1.1.2 mrg #define diagnostic_override_option_index(DI, OPTIDX) \
260 1.1.1.2 mrg ((DI)->option_index = (OPTIDX))
261 1.1.1.2 mrg
262 1.1 mrg /* Diagnostic related functions. */
263 1.1.1.2 mrg extern void diagnostic_initialize (diagnostic_context *, int);
264 1.1.1.2 mrg extern void diagnostic_finish (diagnostic_context *);
265 1.1.1.2 mrg extern void diagnostic_report_current_module (diagnostic_context *, location_t);
266 1.1.1.2 mrg extern void diagnostic_show_locus (diagnostic_context *, const diagnostic_info *);
267 1.1 mrg
268 1.1 mrg /* Force diagnostics controlled by OPTIDX to be kind KIND. */
269 1.1 mrg extern diagnostic_t diagnostic_classify_diagnostic (diagnostic_context *,
270 1.1 mrg int /* optidx */,
271 1.1.1.2 mrg diagnostic_t /* kind */,
272 1.1.1.2 mrg location_t);
273 1.1.1.2 mrg extern void diagnostic_push_diagnostics (diagnostic_context *, location_t);
274 1.1.1.2 mrg extern void diagnostic_pop_diagnostics (diagnostic_context *, location_t);
275 1.1 mrg extern bool diagnostic_report_diagnostic (diagnostic_context *,
276 1.1 mrg diagnostic_info *);
277 1.1 mrg #ifdef ATTRIBUTE_GCC_DIAG
278 1.1 mrg extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *,
279 1.1 mrg location_t, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0);
280 1.1 mrg extern void diagnostic_set_info_translated (diagnostic_info *, const char *,
281 1.1 mrg va_list *, location_t,
282 1.1 mrg diagnostic_t)
283 1.1 mrg ATTRIBUTE_GCC_DIAG(2,0);
284 1.1.1.2 mrg extern void diagnostic_append_note (diagnostic_context *, location_t,
285 1.1.1.2 mrg const char *, ...) ATTRIBUTE_GCC_DIAG(3,4);
286 1.1 mrg #endif
287 1.1.1.2 mrg extern char *diagnostic_build_prefix (diagnostic_context *, const diagnostic_info *);
288 1.1 mrg void default_diagnostic_starter (diagnostic_context *, diagnostic_info *);
289 1.1 mrg void default_diagnostic_finalizer (diagnostic_context *, diagnostic_info *);
290 1.1.1.2 mrg void diagnostic_set_caret_max_width (diagnostic_context *context, int value);
291 1.1.1.2 mrg
292 1.1 mrg
293 1.1 mrg /* Pure text formatting support functions. */
294 1.1 mrg extern char *file_name_as_prefix (const char *);
295 1.1 mrg
296 1.1 mrg #endif /* ! GCC_DIAGNOSTIC_H */
297