]>
Commit | Line | Data |
---|---|---|
345ed1fe | 1 | /* Various declarations for language-independent diagnostics subroutines. |
25d8d27d KH |
2 | Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 |
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 | |
10 | Software Foundation; either version 2, or (at your option) any later | |
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 | |
1322177d | 19 | along with GCC; see the file COPYING. If not, write to the Free |
366ccddb KC |
20 | Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA |
21 | 02110-1301, USA. */ | |
345ed1fe | 22 | |
88657302 RH |
23 | #ifndef GCC_DIAGNOSTIC_H |
24 | #define GCC_DIAGNOSTIC_H | |
345ed1fe | 25 | |
b6fe0bb8 | 26 | #include "pretty-print.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. */ | |
40 | typedef struct | |
41 | { | |
42 | text_info message; | |
43 | location_t location; | |
44 | /* The kind of diagnostic it is about. */ | |
45 | diagnostic_t kind; | |
ccf08a6e DD |
46 | /* Which OPT_* directly controls this diagnostic. */ |
47 | int option_index; | |
47b69537 GDR |
48 | } diagnostic_info; |
49 | ||
d0e66dbb GDR |
50 | #define pedantic_error_kind() (flag_pedantic_errors ? DK_ERROR : DK_WARNING) |
51 | ||
f63c45ec | 52 | |
47b69537 GDR |
53 | /* Forward declarations. */ |
54 | typedef struct diagnostic_context diagnostic_context; | |
79a490a9 AJ |
55 | typedef void (*diagnostic_starter_fn) (diagnostic_context *, |
56 | diagnostic_info *); | |
47b69537 GDR |
57 | typedef diagnostic_starter_fn diagnostic_finalizer_fn; |
58 | ||
c4765d18 | 59 | /* This data structure bundles altogether any information relevant to |
e2840263 GDR |
60 | the context of a diagnostic message. */ |
61 | struct diagnostic_context | |
62 | { | |
2b72593e | 63 | /* Where most of the diagnostic formatting work is done. */ |
b6fe0bb8 | 64 | pretty_printer *printer; |
f68fc4db | 65 | |
4fcc2065 GDR |
66 | /* The number of times we have issued diagnostics. */ |
67 | int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND]; | |
68 | ||
13f0d49c GDR |
69 | /* True if we should display the "warnings are being tread as error" |
70 | message, usually displayed once per compiler run. */ | |
7783b402 GDR |
71 | bool issue_warnings_are_errors_message; |
72 | ||
73 | /* True if it has been requested that warnings be treated as errors. */ | |
74 | bool warning_as_error_requested; | |
13f0d49c | 75 | |
2098fe9e DD |
76 | /* True if we should print the command line option which controls |
77 | each diagnostic, if known. */ | |
78 | bool show_option_requested; | |
79 | ||
886e0865 GK |
80 | /* True if we should raise a SIGABRT on errors. */ |
81 | bool abort_on_error; | |
82 | ||
e2840263 | 83 | /* This function is called before any message is printed out. It is |
c4765d18 | 84 | responsible for preparing message prefix and such. For example, it |
e2840263 GDR |
85 | might say: |
86 | In file included from "/usr/local/include/curses.h:5: | |
87 | from "/home/gdr/src/nifty_printer.h:56: | |
88 | ... | |
89 | */ | |
47b69537 | 90 | diagnostic_starter_fn begin_diagnostic; |
e2840263 | 91 | |
eebedaa5 | 92 | /* This function is called after the diagnostic message is printed. */ |
47b69537 | 93 | diagnostic_finalizer_fn end_diagnostic; |
e2840263 | 94 | |
27e511e0 | 95 | /* Client hook to report an internal error. */ |
79a490a9 | 96 | void (*internal_error) (const char *, va_list *); |
27e511e0 | 97 | |
47b69537 GDR |
98 | /* Function of last diagnostic message; more generally, function such that |
99 | if next diagnostic message is in it then we don't have to mention the | |
100 | function name. */ | |
101 | tree last_function; | |
102 | ||
103 | /* Used to detect when input_file_stack has changed since last described. */ | |
104 | int last_module; | |
105 | ||
106 | int lock; | |
e2840263 GDR |
107 | }; |
108 | ||
6b67c26e | 109 | /* Client supplied function to announce a diagnostic. */ |
e2840263 | 110 | #define diagnostic_starter(DC) (DC)->begin_diagnostic |
6b67c26e GDR |
111 | |
112 | /* Client supplied function called after a diagnostic message is | |
113 | displayed. */ | |
e2840263 | 114 | #define diagnostic_finalizer(DC) (DC)->end_diagnostic |
6b67c26e | 115 | |
f63d1bf7 | 116 | /* Extension hook for client. */ |
e2840263 | 117 | #define diagnostic_auxiliary_data(DC) (DC)->x_data |
6b67c26e | 118 | |
b6fe0bb8 | 119 | /* Same as pp_format_decoder. Works on 'diagnostic_context *'. */ |
e1a4dd13 | 120 | #define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder) |
6b67c26e | 121 | |
bd6bec6b | 122 | /* Same as output_prefixing_rule. Works on 'diagnostic_context *'. */ |
39ce81c9 | 123 | #define diagnostic_prefixing_rule(DC) ((DC)->printer->wrapping.rule) |
e2840263 | 124 | |
9596ddd6 | 125 | /* Maximum characters per line in automatic line wrapping mode. |
2ba84f36 | 126 | Zero means don't wrap lines. */ |
39ce81c9 | 127 | #define diagnostic_line_cutoff(DC) ((DC)->printer->wrapping.line_cutoff) |
b6fe0bb8 | 128 | |
e1a4dd13 | 129 | #define diagnostic_flush_buffer(DC) pp_base_flush ((DC)->printer) |
bd6bec6b | 130 | |
47b69537 GDR |
131 | /* True if the last function in which a diagnostic was reported is |
132 | different from the current one. */ | |
133 | #define diagnostic_last_function_changed(DC) \ | |
134 | ((DC)->last_function != current_function_decl) | |
135 | ||
136 | /* Remember the current function as being the last one in which we report | |
137 | a diagnostic. */ | |
138 | #define diagnostic_set_last_function(DC) \ | |
139 | (DC)->last_function = current_function_decl | |
140 | ||
141 | /* True if the last module or file in which a diagnostic was reported is | |
142 | different from the current one. */ | |
143 | #define diagnostic_last_module_changed(DC) \ | |
144 | ((DC)->last_module != input_file_stack_tick) | |
bd6bec6b | 145 | |
47b69537 GDR |
146 | /* Remember the current module or file as being the last one in which we |
147 | report a diagnostic. */ | |
148 | #define diagnostic_set_last_module(DC) \ | |
149 | (DC)->last_module = input_file_stack_tick | |
764dbbf2 | 150 | |
886e0865 GK |
151 | /* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher. */ |
152 | #define diagnostic_abort_on_error(DC) \ | |
153 | (DC)->abort_on_error = true | |
154 | ||
4fcc2065 | 155 | /* This diagnostic_context is used by front-ends that directly output |
764dbbf2 | 156 | diagnostic messages without going through `error', `warning', |
6b67c26e | 157 | and similar functions. */ |
f68fc4db | 158 | extern diagnostic_context *global_dc; |
764dbbf2 | 159 | |
886e0865 | 160 | /* The total count of a KIND of diagnostics emitted so far. */ |
4fcc2065 | 161 | #define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)] |
2a2b2d43 GDR |
162 | |
163 | /* The number of errors that have been issued so far. Ideally, these | |
4fcc2065 | 164 | would take a diagnostic_context as an argument. */ |
6b67c26e | 165 | #define errorcount diagnostic_kind_count (global_dc, DK_ERROR) |
2a2b2d43 | 166 | /* Similarly, but for warnings. */ |
6b67c26e | 167 | #define warningcount diagnostic_kind_count (global_dc, DK_WARNING) |
2a2b2d43 | 168 | /* Similarly, but for sorrys. */ |
6b67c26e | 169 | #define sorrycount diagnostic_kind_count (global_dc, DK_SORRY) |
2a2b2d43 | 170 | |
cc2902df | 171 | /* Returns nonzero if warnings should be emitted. */ |
2a2b2d43 GDR |
172 | #define diagnostic_report_warnings_p() \ |
173 | (!inhibit_warnings \ | |
174 | && !(in_system_header && !warn_system_headers)) | |
175 | ||
47b69537 | 176 | #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D) |
2a2b2d43 | 177 | |
95bd1dd7 | 178 | /* Diagnostic related functions. */ |
79a490a9 AJ |
179 | extern void diagnostic_initialize (diagnostic_context *); |
180 | extern void diagnostic_report_current_module (diagnostic_context *); | |
181 | extern void diagnostic_report_current_function (diagnostic_context *); | |
79a490a9 AJ |
182 | extern void diagnostic_report_diagnostic (diagnostic_context *, |
183 | diagnostic_info *); | |
db857e7d | 184 | #ifdef ATTRIBUTE_GCC_DIAG |
79a490a9 | 185 | extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *, |
db857e7d | 186 | location_t, diagnostic_t) ATTRIBUTE_GCC_DIAG(2,0); |
178b58b5 JM |
187 | extern void diagnostic_set_info_translated (diagnostic_info *, const char *, |
188 | va_list *, location_t, | |
189 | diagnostic_t) | |
190 | ATTRIBUTE_GCC_DIAG(2,0); | |
db857e7d | 191 | #endif |
79a490a9 | 192 | extern char *diagnostic_build_prefix (diagnostic_info *); |
47b69537 GDR |
193 | |
194 | /* Pure text formatting support functions. */ | |
79a490a9 | 195 | extern char *file_name_as_prefix (const char *); |
345ed1fe | 196 | |
6de9cd9a DN |
197 | /* In tree-pretty-print.c */ |
198 | extern int dump_generic_node (pretty_printer *, tree, int, int, bool); | |
199 | extern void print_generic_stmt (FILE *, tree, int); | |
200 | extern void print_generic_stmt_indented (FILE *, tree, int, int); | |
201 | extern void print_generic_expr (FILE *, tree, int); | |
202 | extern void print_generic_decl (FILE *, tree, int); | |
203 | ||
204 | extern void debug_generic_expr (tree); | |
205 | extern void debug_generic_stmt (tree); | |
206 | extern void debug_c_tree (tree); | |
88657302 | 207 | #endif /* ! GCC_DIAGNOSTIC_H */ |