]>
Commit | Line | Data |
---|---|---|
345ed1fe | 1 | /* Various declarations for language-independent diagnostics subroutines. |
966e8f4d | 2 | Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
25d8d27d | 3 | Free Software Foundation, Inc. |
345ed1fe GDR |
4 | Contributed by Gabriel Dos Reis <gdr@codesourcery.com> |
5 | ||
1322177d | 6 | This file is part of GCC. |
345ed1fe | 7 | |
1322177d LB |
8 | GCC is free software; you can redistribute it and/or modify it under |
9 | the terms of the GNU General Public License as published by the Free | |
9dcd6f09 | 10 | Software Foundation; either version 3, or (at your option) any later |
1322177d | 11 | version. |
345ed1fe | 12 | |
1322177d LB |
13 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY |
14 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 | for more details. | |
345ed1fe GDR |
17 | |
18 | You should have received a copy of the GNU General Public License | |
9dcd6f09 NC |
19 | along with GCC; see the file COPYING3. If not see |
20 | <http://www.gnu.org/licenses/>. */ | |
345ed1fe | 21 | |
88657302 RH |
22 | #ifndef GCC_DIAGNOSTIC_H |
23 | #define GCC_DIAGNOSTIC_H | |
345ed1fe | 24 | |
b6fe0bb8 | 25 | #include "pretty-print.h" |
e79b9d54 | 26 | #include "options.h" |
345ed1fe | 27 | |
4d6922ee | 28 | /* Constants used to discriminate diagnostics. */ |
d0e66dbb GDR |
29 | typedef enum |
30 | { | |
687d688e | 31 | #define DEFINE_DIAGNOSTIC_KIND(K, msgid) K, |
d0e66dbb GDR |
32 | #include "diagnostic.def" |
33 | #undef DEFINE_DIAGNOSTIC_KIND | |
34 | DK_LAST_DIAGNOSTIC_KIND | |
35 | } diagnostic_t; | |
36 | ||
47b69537 GDR |
37 | /* A diagnostic is described by the MESSAGE to send, the FILE and LINE of |
38 | its context and its KIND (ice, error, warning, note, ...) See complete | |
39 | list in diagnostic.def. */ | |
c94ed7a1 | 40 | typedef struct diagnostic_info |
47b69537 GDR |
41 | { |
42 | text_info message; | |
43 | location_t location; | |
c94ed7a1 JJ |
44 | /* TREE_BLOCK if the diagnostic is to be reported in some inline |
45 | function inlined into other function, otherwise NULL. */ | |
46 | tree abstract_origin; | |
47b69537 GDR |
47 | /* The kind of diagnostic it is about. */ |
48 | diagnostic_t kind; | |
ccf08a6e DD |
49 | /* Which OPT_* directly controls this diagnostic. */ |
50 | int option_index; | |
47b69537 GDR |
51 | } diagnostic_info; |
52 | ||
393eda6a MLI |
53 | #define pedantic_warning_kind() (flag_pedantic_errors ? DK_ERROR : DK_WARNING) |
54 | #define permissive_error_kind() (flag_permissive ? DK_WARNING : DK_ERROR) | |
d0e66dbb | 55 | |
f63c45ec | 56 | |
47b69537 GDR |
57 | /* Forward declarations. */ |
58 | typedef struct diagnostic_context diagnostic_context; | |
79a490a9 AJ |
59 | typedef void (*diagnostic_starter_fn) (diagnostic_context *, |
60 | diagnostic_info *); | |
47b69537 GDR |
61 | typedef diagnostic_starter_fn diagnostic_finalizer_fn; |
62 | ||
c4765d18 | 63 | /* This data structure bundles altogether any information relevant to |
e2840263 GDR |
64 | the context of a diagnostic message. */ |
65 | struct diagnostic_context | |
66 | { | |
2b72593e | 67 | /* Where most of the diagnostic formatting work is done. */ |
b6fe0bb8 | 68 | pretty_printer *printer; |
f68fc4db | 69 | |
4fcc2065 GDR |
70 | /* The number of times we have issued diagnostics. */ |
71 | int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND]; | |
72 | ||
13f0d49c GDR |
73 | /* True if we should display the "warnings are being tread as error" |
74 | message, usually displayed once per compiler run. */ | |
7783b402 GDR |
75 | bool issue_warnings_are_errors_message; |
76 | ||
77 | /* True if it has been requested that warnings be treated as errors. */ | |
78 | bool warning_as_error_requested; | |
13f0d49c | 79 | |
79cf5994 DD |
80 | /* For each option index that can be passed to warning() et all |
81 | (OPT_* from options.h), this array may contain a new kind that | |
82 | the diagnostic should be changed to before reporting, or | |
83 | DK_UNSPECIFIED to leave it as the reported kind, or DK_IGNORED to | |
84 | not report it at all. N_OPTS is from <options.h>. */ | |
85 | char classify_diagnostic[N_OPTS]; | |
86 | ||
2098fe9e DD |
87 | /* True if we should print the command line option which controls |
88 | each diagnostic, if known. */ | |
89 | bool show_option_requested; | |
90 | ||
886e0865 GK |
91 | /* True if we should raise a SIGABRT on errors. */ |
92 | bool abort_on_error; | |
93 | ||
e2840263 | 94 | /* This function is called before any message is printed out. It is |
c4765d18 | 95 | responsible for preparing message prefix and such. For example, it |
e2840263 GDR |
96 | might say: |
97 | In file included from "/usr/local/include/curses.h:5: | |
98 | from "/home/gdr/src/nifty_printer.h:56: | |
99 | ... | |
100 | */ | |
47b69537 | 101 | diagnostic_starter_fn begin_diagnostic; |
e2840263 | 102 | |
eebedaa5 | 103 | /* This function is called after the diagnostic message is printed. */ |
47b69537 | 104 | diagnostic_finalizer_fn end_diagnostic; |
e2840263 | 105 | |
27e511e0 | 106 | /* Client hook to report an internal error. */ |
79a490a9 | 107 | void (*internal_error) (const char *, va_list *); |
27e511e0 | 108 | |
47b69537 GDR |
109 | /* Function of last diagnostic message; more generally, function such that |
110 | if next diagnostic message is in it then we don't have to mention the | |
111 | function name. */ | |
112 | tree last_function; | |
113 | ||
966e8f4d TT |
114 | /* Used to detect when the input file stack has changed since last |
115 | described. */ | |
116 | const struct line_map *last_module; | |
47b69537 GDR |
117 | |
118 | int lock; | |
e2840263 GDR |
119 | }; |
120 | ||
6b67c26e | 121 | /* Client supplied function to announce a diagnostic. */ |
e2840263 | 122 | #define diagnostic_starter(DC) (DC)->begin_diagnostic |
6b67c26e GDR |
123 | |
124 | /* Client supplied function called after a diagnostic message is | |
125 | displayed. */ | |
e2840263 | 126 | #define diagnostic_finalizer(DC) (DC)->end_diagnostic |
6b67c26e | 127 | |
f63d1bf7 | 128 | /* Extension hook for client. */ |
e2840263 | 129 | #define diagnostic_auxiliary_data(DC) (DC)->x_data |
6b67c26e | 130 | |
b6fe0bb8 | 131 | /* Same as pp_format_decoder. Works on 'diagnostic_context *'. */ |
e1a4dd13 | 132 | #define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder) |
6b67c26e | 133 | |
bd6bec6b | 134 | /* Same as output_prefixing_rule. Works on 'diagnostic_context *'. */ |
39ce81c9 | 135 | #define diagnostic_prefixing_rule(DC) ((DC)->printer->wrapping.rule) |
e2840263 | 136 | |
9596ddd6 | 137 | /* Maximum characters per line in automatic line wrapping mode. |
2ba84f36 | 138 | Zero means don't wrap lines. */ |
39ce81c9 | 139 | #define diagnostic_line_cutoff(DC) ((DC)->printer->wrapping.line_cutoff) |
b6fe0bb8 | 140 | |
e1a4dd13 | 141 | #define diagnostic_flush_buffer(DC) pp_base_flush ((DC)->printer) |
bd6bec6b | 142 | |
47b69537 GDR |
143 | /* True if the last function in which a diagnostic was reported is |
144 | different from the current one. */ | |
c94ed7a1 JJ |
145 | #define diagnostic_last_function_changed(DC, DI) \ |
146 | ((DC)->last_function != ((DI)->abstract_origin \ | |
147 | ? (DI)->abstract_origin : current_function_decl)) | |
47b69537 GDR |
148 | |
149 | /* Remember the current function as being the last one in which we report | |
150 | a diagnostic. */ | |
c94ed7a1 JJ |
151 | #define diagnostic_set_last_function(DC, DI) \ |
152 | (DC)->last_function = (((DI) && (DI)->abstract_origin) \ | |
153 | ? (DI)->abstract_origin : current_function_decl) | |
47b69537 GDR |
154 | |
155 | /* True if the last module or file in which a diagnostic was reported is | |
156 | different from the current one. */ | |
966e8f4d TT |
157 | #define diagnostic_last_module_changed(DC, MAP) \ |
158 | ((DC)->last_module != MAP) | |
bd6bec6b | 159 | |
47b69537 GDR |
160 | /* Remember the current module or file as being the last one in which we |
161 | report a diagnostic. */ | |
966e8f4d TT |
162 | #define diagnostic_set_last_module(DC, MAP) \ |
163 | (DC)->last_module = MAP | |
764dbbf2 | 164 | |
886e0865 GK |
165 | /* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher. */ |
166 | #define diagnostic_abort_on_error(DC) \ | |
167 | (DC)->abort_on_error = true | |
168 | ||
4fcc2065 | 169 | /* This diagnostic_context is used by front-ends that directly output |
764dbbf2 | 170 | diagnostic messages without going through `error', `warning', |
6b67c26e | 171 | and similar functions. */ |
f68fc4db | 172 | extern diagnostic_context *global_dc; |
764dbbf2 | 173 | |
886e0865 | 174 | /* The total count of a KIND of diagnostics emitted so far. */ |
4fcc2065 | 175 | #define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)] |
2a2b2d43 GDR |
176 | |
177 | /* The number of errors that have been issued so far. Ideally, these | |
4fcc2065 | 178 | would take a diagnostic_context as an argument. */ |
6b67c26e | 179 | #define errorcount diagnostic_kind_count (global_dc, DK_ERROR) |
2a2b2d43 | 180 | /* Similarly, but for warnings. */ |
6b67c26e | 181 | #define warningcount diagnostic_kind_count (global_dc, DK_WARNING) |
2a2b2d43 | 182 | /* Similarly, but for sorrys. */ |
6b67c26e | 183 | #define sorrycount diagnostic_kind_count (global_dc, DK_SORRY) |
2a2b2d43 | 184 | |
cc2902df | 185 | /* Returns nonzero if warnings should be emitted. */ |
aa14403d | 186 | #define diagnostic_report_warnings_p(LOC) \ |
2a2b2d43 | 187 | (!inhibit_warnings \ |
aa14403d | 188 | && !(in_system_header_at (LOC) && !warn_system_headers)) |
2a2b2d43 | 189 | |
47b69537 | 190 | #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D) |
2a2b2d43 | 191 | |
95bd1dd7 | 192 | /* Diagnostic related functions. */ |
79a490a9 AJ |
193 | extern void diagnostic_initialize (diagnostic_context *); |
194 | extern void diagnostic_report_current_module (diagnostic_context *); | |
c94ed7a1 JJ |
195 | extern void diagnostic_report_current_function (diagnostic_context *, |
196 | diagnostic_info *); | |
79cf5994 DD |
197 | |
198 | /* Force diagnostics controlled by OPTIDX to be kind KIND. */ | |
199 | extern diagnostic_t diagnostic_classify_diagnostic (diagnostic_context *, | |
200 | int /* optidx */, | |
201 | diagnostic_t /* kind */); | |
79a490a9 AJ |
202 | extern void diagnostic_report_diagnostic (diagnostic_context *, |
203 | diagnostic_info *); | |
db857e7d | 204 | #ifdef ATTRIBUTE_GCC_DIAG |
79a490a9 | 205 | extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *, |
db857e7d | 206 | location_t, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0); |
178b58b5 JM |
207 | extern void diagnostic_set_info_translated (diagnostic_info *, const char *, |
208 | va_list *, location_t, | |
209 | diagnostic_t) | |
210 | ATTRIBUTE_GCC_DIAG(2,0); | |
db857e7d | 211 | #endif |
79a490a9 | 212 | extern char *diagnostic_build_prefix (diagnostic_info *); |
47b69537 GDR |
213 | |
214 | /* Pure text formatting support functions. */ | |
79a490a9 | 215 | extern char *file_name_as_prefix (const char *); |
345ed1fe | 216 | |
6de9cd9a | 217 | /* In tree-pretty-print.c */ |
726a989a | 218 | extern void print_declaration (pretty_printer *, tree, int, int); |
6de9cd9a DN |
219 | extern int dump_generic_node (pretty_printer *, tree, int, int, bool); |
220 | extern void print_generic_stmt (FILE *, tree, int); | |
221 | extern void print_generic_stmt_indented (FILE *, tree, int, int); | |
222 | extern void print_generic_expr (FILE *, tree, int); | |
223 | extern void print_generic_decl (FILE *, tree, int); | |
726a989a RB |
224 | extern void debug_c_tree (tree); |
225 | extern void dump_omp_clauses (pretty_printer *, tree, int, int); | |
6de9cd9a | 226 | |
726a989a | 227 | /* In gimple-pretty-print.c */ |
6de9cd9a DN |
228 | extern void debug_generic_expr (tree); |
229 | extern void debug_generic_stmt (tree); | |
953ff289 | 230 | extern void debug_tree_chain (tree); |
726a989a RB |
231 | extern void debug_gimple_stmt (gimple); |
232 | extern void debug_gimple_seq (gimple_seq); | |
233 | extern void print_gimple_seq (FILE *, gimple_seq, int, int); | |
234 | extern void print_gimple_stmt (FILE *, gimple, int, int); | |
235 | extern void print_gimple_expr (FILE *, gimple, int, int); | |
236 | extern void dump_gimple_stmt (pretty_printer *, gimple, int, int); | |
237 | ||
88657302 | 238 | #endif /* ! GCC_DIAGNOSTIC_H */ |