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