]>
Commit | Line | Data |
---|---|---|
345ed1fe | 1 | /* Various declarations for language-independent diagnostics subroutines. |
0ea5865c | 2 | Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. |
345ed1fe GDR |
3 | Contributed by Gabriel Dos Reis <gdr@codesourcery.com> |
4 | ||
1322177d | 5 | This file is part of GCC. |
345ed1fe | 6 | |
1322177d LB |
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 2, or (at your option) any later | |
10 | version. | |
345ed1fe | 11 | |
1322177d LB |
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. | |
345ed1fe GDR |
16 | |
17 | You should have received a copy of the GNU General Public License | |
1322177d LB |
18 | along with GCC; see the file COPYING. If not, write to the Free |
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA | |
20 | 02111-1307, USA. */ | |
345ed1fe | 21 | |
88657302 RH |
22 | #ifndef GCC_DIAGNOSTIC_H |
23 | #define GCC_DIAGNOSTIC_H | |
345ed1fe | 24 | |
b6fe0bb8 | 25 | #include "pretty-print.h" |
345ed1fe | 26 | |
4d6922ee | 27 | /* Constants used to discriminate diagnostics. */ |
d0e66dbb GDR |
28 | typedef enum |
29 | { | |
687d688e | 30 | #define DEFINE_DIAGNOSTIC_KIND(K, msgid) K, |
d0e66dbb GDR |
31 | #include "diagnostic.def" |
32 | #undef DEFINE_DIAGNOSTIC_KIND | |
33 | DK_LAST_DIAGNOSTIC_KIND | |
34 | } diagnostic_t; | |
35 | ||
47b69537 GDR |
36 | /* A diagnostic is described by the MESSAGE to send, the FILE and LINE of |
37 | its context and its KIND (ice, error, warning, note, ...) See complete | |
38 | list in diagnostic.def. */ | |
39 | typedef struct | |
40 | { | |
41 | text_info message; | |
42 | location_t location; | |
43 | /* The kind of diagnostic it is about. */ | |
44 | diagnostic_t kind; | |
45 | } diagnostic_info; | |
46 | ||
d0e66dbb GDR |
47 | #define pedantic_error_kind() (flag_pedantic_errors ? DK_ERROR : DK_WARNING) |
48 | ||
f63c45ec | 49 | |
47b69537 GDR |
50 | /* Forward declarations. */ |
51 | typedef struct diagnostic_context diagnostic_context; | |
79a490a9 AJ |
52 | typedef void (*diagnostic_starter_fn) (diagnostic_context *, |
53 | diagnostic_info *); | |
47b69537 GDR |
54 | typedef diagnostic_starter_fn diagnostic_finalizer_fn; |
55 | ||
c4765d18 | 56 | /* This data structure bundles altogether any information relevant to |
e2840263 GDR |
57 | the context of a diagnostic message. */ |
58 | struct diagnostic_context | |
59 | { | |
2b72593e | 60 | /* Where most of the diagnostic formatting work is done. */ |
b6fe0bb8 | 61 | pretty_printer *printer; |
f68fc4db | 62 | |
4fcc2065 GDR |
63 | /* The number of times we have issued diagnostics. */ |
64 | int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND]; | |
65 | ||
13f0d49c GDR |
66 | /* True if we should display the "warnings are being tread as error" |
67 | message, usually displayed once per compiler run. */ | |
68 | bool warnings_are_errors_message; | |
69 | ||
886e0865 GK |
70 | /* True if we should raise a SIGABRT on errors. */ |
71 | bool abort_on_error; | |
72 | ||
e2840263 | 73 | /* This function is called before any message is printed out. It is |
c4765d18 | 74 | responsible for preparing message prefix and such. For example, it |
e2840263 GDR |
75 | might say: |
76 | In file included from "/usr/local/include/curses.h:5: | |
77 | from "/home/gdr/src/nifty_printer.h:56: | |
78 | ... | |
79 | */ | |
47b69537 | 80 | diagnostic_starter_fn begin_diagnostic; |
e2840263 | 81 | |
eebedaa5 | 82 | /* This function is called after the diagnostic message is printed. */ |
47b69537 | 83 | diagnostic_finalizer_fn end_diagnostic; |
e2840263 | 84 | |
27e511e0 | 85 | /* Client hook to report an internal error. */ |
79a490a9 | 86 | void (*internal_error) (const char *, va_list *); |
27e511e0 | 87 | |
47b69537 GDR |
88 | /* Function of last diagnostic message; more generally, function such that |
89 | if next diagnostic message is in it then we don't have to mention the | |
90 | function name. */ | |
91 | tree last_function; | |
92 | ||
93 | /* Used to detect when input_file_stack has changed since last described. */ | |
94 | int last_module; | |
95 | ||
96 | int lock; | |
97 | ||
e2840263 GDR |
98 | /* Hook for front-end extensions. */ |
99 | void *x_data; | |
100 | }; | |
101 | ||
6b67c26e | 102 | /* Client supplied function to announce a diagnostic. */ |
e2840263 | 103 | #define diagnostic_starter(DC) (DC)->begin_diagnostic |
6b67c26e GDR |
104 | |
105 | /* Client supplied function called after a diagnostic message is | |
106 | displayed. */ | |
e2840263 | 107 | #define diagnostic_finalizer(DC) (DC)->end_diagnostic |
6b67c26e | 108 | |
f63d1bf7 | 109 | /* Extension hook for client. */ |
e2840263 | 110 | #define diagnostic_auxiliary_data(DC) (DC)->x_data |
6b67c26e | 111 | |
b6fe0bb8 | 112 | /* Same as pp_format_decoder. Works on 'diagnostic_context *'. */ |
e1a4dd13 | 113 | #define diagnostic_format_decoder(DC) ((DC)->printer->format_decoder) |
6b67c26e | 114 | |
bd6bec6b | 115 | /* Same as output_prefixing_rule. Works on 'diagnostic_context *'. */ |
b6fe0bb8 | 116 | #define diagnostic_prefixing_rule(DC) ((DC)->printer->prefixing_rule) |
e2840263 | 117 | |
9596ddd6 | 118 | /* Maximum characters per line in automatic line wrapping mode. |
2ba84f36 | 119 | Zero means don't wrap lines. */ |
b6fe0bb8 GDR |
120 | #define diagnostic_line_cutoff(DC) ((DC)->printer->ideal_maximum_length) |
121 | ||
e1a4dd13 | 122 | #define diagnostic_flush_buffer(DC) pp_base_flush ((DC)->printer) |
bd6bec6b | 123 | |
47b69537 GDR |
124 | /* True if the last function in which a diagnostic was reported is |
125 | different from the current one. */ | |
126 | #define diagnostic_last_function_changed(DC) \ | |
127 | ((DC)->last_function != current_function_decl) | |
128 | ||
129 | /* Remember the current function as being the last one in which we report | |
130 | a diagnostic. */ | |
131 | #define diagnostic_set_last_function(DC) \ | |
132 | (DC)->last_function = current_function_decl | |
133 | ||
134 | /* True if the last module or file in which a diagnostic was reported is | |
135 | different from the current one. */ | |
136 | #define diagnostic_last_module_changed(DC) \ | |
137 | ((DC)->last_module != input_file_stack_tick) | |
bd6bec6b | 138 | |
47b69537 GDR |
139 | /* Remember the current module or file as being the last one in which we |
140 | report a diagnostic. */ | |
141 | #define diagnostic_set_last_module(DC) \ | |
142 | (DC)->last_module = input_file_stack_tick | |
764dbbf2 | 143 | |
886e0865 GK |
144 | /* Raise SIGABRT on any diagnostic of severity DK_ERROR or higher. */ |
145 | #define diagnostic_abort_on_error(DC) \ | |
146 | (DC)->abort_on_error = true | |
147 | ||
4fcc2065 | 148 | /* This diagnostic_context is used by front-ends that directly output |
764dbbf2 | 149 | diagnostic messages without going through `error', `warning', |
6b67c26e | 150 | and similar functions. */ |
f68fc4db | 151 | extern diagnostic_context *global_dc; |
764dbbf2 | 152 | |
886e0865 | 153 | /* The total count of a KIND of diagnostics emitted so far. */ |
4fcc2065 | 154 | #define diagnostic_kind_count(DC, DK) (DC)->diagnostic_count[(int) (DK)] |
2a2b2d43 GDR |
155 | |
156 | /* The number of errors that have been issued so far. Ideally, these | |
4fcc2065 | 157 | would take a diagnostic_context as an argument. */ |
6b67c26e | 158 | #define errorcount diagnostic_kind_count (global_dc, DK_ERROR) |
2a2b2d43 | 159 | /* Similarly, but for warnings. */ |
6b67c26e | 160 | #define warningcount diagnostic_kind_count (global_dc, DK_WARNING) |
2a2b2d43 | 161 | /* Similarly, but for sorrys. */ |
6b67c26e | 162 | #define sorrycount diagnostic_kind_count (global_dc, DK_SORRY) |
2a2b2d43 | 163 | |
cc2902df | 164 | /* Returns nonzero if warnings should be emitted. */ |
2a2b2d43 GDR |
165 | #define diagnostic_report_warnings_p() \ |
166 | (!inhibit_warnings \ | |
167 | && !(in_system_header && !warn_system_headers)) | |
168 | ||
47b69537 | 169 | #define report_diagnostic(D) diagnostic_report_diagnostic (global_dc, D) |
2a2b2d43 | 170 | |
95bd1dd7 | 171 | /* Diagnostic related functions. */ |
79a490a9 AJ |
172 | extern void diagnostic_initialize (diagnostic_context *); |
173 | extern void diagnostic_report_current_module (diagnostic_context *); | |
174 | extern void diagnostic_report_current_function (diagnostic_context *); | |
79a490a9 AJ |
175 | extern void diagnostic_report_diagnostic (diagnostic_context *, |
176 | diagnostic_info *); | |
177 | extern void diagnostic_set_info (diagnostic_info *, const char *, va_list *, | |
9a472a42 | 178 | location_t, diagnostic_t); |
79a490a9 | 179 | extern char *diagnostic_build_prefix (diagnostic_info *); |
47b69537 GDR |
180 | |
181 | /* Pure text formatting support functions. */ | |
d576d043 | 182 | extern void verbatim (const char *, ...); |
79a490a9 | 183 | extern char *file_name_as_prefix (const char *); |
345ed1fe | 184 | |
88657302 | 185 | #endif /* ! GCC_DIAGNOSTIC_H */ |