Branch data Line data Source code
1 : : /* Declare diagnostics::context and related types.
2 : : Copyright (C) 2000-2025 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify it under
7 : : the terms of the GNU General Public License as published by the Free
8 : : Software Foundation; either version 3, or (at your option) any later
9 : : version.
10 : :
11 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : : for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : #ifndef GCC_DIAGNOSTICS_CONTEXT_H
21 : : #define GCC_DIAGNOSTICS_CONTEXT_H
22 : :
23 : : #include "lazily-created.h"
24 : : #include "unique-argv.h"
25 : : #include "diagnostics/option-classifier.h"
26 : : #include "diagnostics/option-id-manager.h"
27 : : #include "diagnostics/context-options.h"
28 : : #include "diagnostics/source-printing-options.h"
29 : : #include "diagnostics/column-options.h"
30 : : #include "diagnostics/counters.h"
31 : : #include "diagnostics/logging.h"
32 : :
33 : : namespace diagnostics {
34 : :
35 : : namespace changes {
36 : : class change_set;
37 : : }
38 : :
39 : : namespace digraphs { class digraph; }
40 : :
41 : : namespace logical_locations {
42 : : class manager;
43 : : }
44 : :
45 : : class buffer;
46 : : class client_data_hooks;
47 : : class diagram;
48 : : class sink;
49 : : class text_sink;
50 : : class metadata;
51 : :
52 : : class source_effect_info;
53 : :
54 : : } // namespace diagnostics
55 : :
56 : : namespace text_art
57 : : {
58 : : class theme;
59 : : } // namespace text_art
60 : :
61 : : namespace xml
62 : : {
63 : : class printer;
64 : : } // namespace xml
65 : :
66 : : namespace diagnostics {
67 : :
68 : : /* Forward declarations. */
69 : : class context;
70 : : class location_print_policy;
71 : : class source_print_policy;
72 : :
73 : : typedef void (*text_starter_fn) (text_sink &,
74 : : const diagnostic_info *);
75 : :
76 : : struct to_text;
77 : : struct to_html;
78 : :
79 : : extern pretty_printer *get_printer (to_text &);
80 : :
81 : : template <typename TextOrHtml>
82 : : using start_span_fn = void (*) (const location_print_policy &,
83 : : TextOrHtml &text_or_html,
84 : : expanded_location);
85 : :
86 : : typedef void (*text_finalizer_fn) (text_sink &,
87 : : const diagnostic_info *,
88 : : enum kind);
89 : :
90 : : /* A bundle of state for determining column numbers in diagnostics
91 : : (tab stops, whether to start at 0 or 1, etc).
92 : : Uses a file_cache to handle tabs. */
93 : :
94 : : class column_policy
95 : : {
96 : : public:
97 : : column_policy (const context &dc);
98 : :
99 : : int converted_column (expanded_location s) const;
100 : :
101 : : label_text get_location_text (const expanded_location &s,
102 : : bool show_column,
103 : : bool colorize) const;
104 : :
105 : 49643 : int get_tabstop () const { return m_column_options.m_tabstop; }
106 : :
107 : : private:
108 : : file_cache &m_file_cache;
109 : : column_options m_column_options;
110 : : };
111 : :
112 : : /* A bundle of state for printing locations within diagnostics
113 : : (e.g. "FILENAME:LINE:COLUMN"), to isolate the interactions between
114 : : context and the start_span callbacks. */
115 : :
116 : : class location_print_policy
117 : : {
118 : : public:
119 : : location_print_policy (const context &dc);
120 : : location_print_policy (const text_sink &);
121 : :
122 : 1206497 : bool show_column_p () const { return m_show_column; }
123 : :
124 : : const column_policy &
125 : 1793 : get_column_policy () const { return m_column_policy; }
126 : :
127 : : void
128 : : print_text_span_start (const context &dc,
129 : : pretty_printer &pp,
130 : : const expanded_location &exploc);
131 : :
132 : : void
133 : : print_html_span_start (const context &dc,
134 : : xml::printer &xp,
135 : : const expanded_location &exploc);
136 : :
137 : : private:
138 : : column_policy m_column_policy;
139 : : bool m_show_column;
140 : : };
141 : :
142 : : /* Abstract base class for optionally supplying extra tags when writing
143 : : out annotation labels in HTML output. */
144 : :
145 : 3 : class html_label_writer
146 : : {
147 : : public:
148 : 3 : virtual ~html_label_writer () {}
149 : : virtual void begin_label () = 0;
150 : : virtual void end_label () = 0;
151 : : };
152 : :
153 : : /* A bundle of state for printing source within a diagnostic,
154 : : to isolate the interactions between context and the
155 : : implementation of diagnostic_show_locus. */
156 : :
157 : : class source_print_policy
158 : : {
159 : : public:
160 : : source_print_policy (const context &);
161 : : source_print_policy (const context &,
162 : : const source_printing_options &);
163 : :
164 : : void
165 : : print (pretty_printer &pp,
166 : : const rich_location &richloc,
167 : : enum kind diagnostic_kind,
168 : : source_effect_info *effect_info) const;
169 : :
170 : : void
171 : : print_as_html (xml::printer &xp,
172 : : const rich_location &richloc,
173 : : enum kind diagnostic_kind,
174 : : source_effect_info *effect_info,
175 : : html_label_writer *label_writer) const;
176 : :
177 : : const source_printing_options &
178 : 49458 : get_options () const { return m_options; }
179 : :
180 : : start_span_fn<to_text>
181 : 1793 : get_text_start_span_fn () const { return m_text_start_span_cb; }
182 : :
183 : : start_span_fn<to_html>
184 : 1 : get_html_start_span_fn () const { return m_html_start_span_cb; }
185 : :
186 : : file_cache &
187 : 49455 : get_file_cache () const { return m_file_cache; }
188 : :
189 : : enum diagnostics_escape_format
190 : 554 : get_escape_format () const
191 : : {
192 : 554 : return m_escape_format;
193 : : }
194 : :
195 : : text_art::theme *
196 : 52106 : get_diagram_theme () const { return m_diagram_theme; }
197 : :
198 : : const column_policy &get_column_policy () const
199 : : {
200 : 49643 : return m_location_policy.get_column_policy ();
201 : : }
202 : :
203 : 463 : const location_print_policy &get_location_policy () const
204 : : {
205 : 463 : return m_location_policy;
206 : : }
207 : :
208 : : private:
209 : : const source_printing_options &m_options;
210 : : location_print_policy m_location_policy;
211 : : start_span_fn<to_text> m_text_start_span_cb;
212 : : start_span_fn<to_html> m_html_start_span_cb;
213 : : file_cache &m_file_cache;
214 : :
215 : : /* Other data copied from context. */
216 : : text_art::theme *m_diagram_theme;
217 : : enum diagnostics_escape_format m_escape_format;
218 : : };
219 : :
220 : : /* This class encapsulates the state of the diagnostics subsystem
221 : : as a whole (either directly, or via owned objects of other classes, to
222 : : avoid global variables).
223 : :
224 : : It has responsibility for:
225 : : - being a central place for clients to report diagnostics
226 : : - reporting those diagnostics to zero or more output sinks
227 : : (e.g. text vs SARIF)
228 : : - providing a "dump" member function for a debug dump of the state of
229 : : the diagnostics subsytem
230 : : - direct vs buffered diagnostics (see class diagnostics::buffer)
231 : : - tracking the original argv of the program (for SARIF output)
232 : : - crash-handling
233 : :
234 : : It delegates responsibility to various other classes:
235 : : - the various output sinks (instances of diagnostics::sink
236 : : subclasses)
237 : : - formatting of messages (class pretty_printer)
238 : : - an optional urlifier to inject URLs into formatted messages
239 : : - counting the number of diagnostics reported of each kind
240 : : (class diagnostics::counters)
241 : : - calling out to a option_id_manager to determine if
242 : : a particular warning is enabled or disabled
243 : : - tracking pragmas that enable/disable warnings in a range of
244 : : source code
245 : : - a cache for use when quoting the user's source code (class file_cache)
246 : : - a text_art::theme
247 : : - a diagnostics::changes::change_set for generating patches from fix-it hints
248 : : - diagnostics::client_data_hooks for metadata.
249 : :
250 : : Try to avoid adding new responsibilities to this class itself, to avoid
251 : : the "blob" anti-pattern. */
252 : :
253 : 38588 : class context
254 : : {
255 : : public:
256 : : /* Give access to m_text_callbacks. */
257 : : // FIXME: these need updating
258 : : friend text_starter_fn &
259 : : text_starter (context *dc);
260 : : friend start_span_fn<to_text> &
261 : : start_span (context *dc);
262 : : friend text_finalizer_fn &
263 : : text_finalizer (context *dc);
264 : :
265 : : friend class source_print_policy;
266 : : friend class text_sink;
267 : : friend class buffer;
268 : :
269 : : typedef void (*set_locations_callback_t) (const context &,
270 : : diagnostic_info *);
271 : :
272 : : void initialize (int n_opts);
273 : : void color_init (int value);
274 : : void urls_init (int value);
275 : : void set_pretty_printer (std::unique_ptr<pretty_printer> pp);
276 : : void refresh_output_sinks ();
277 : :
278 : : void finish ();
279 : :
280 : : void dump (FILE *out, int indent) const;
281 : 0 : void DEBUG_FUNCTION dump () const { dump (stderr, 0); }
282 : :
283 : 194966217 : logging::logger *get_logger () { return m_logger; }
284 : :
285 : : bool execution_failed_p () const;
286 : :
287 : : void set_original_argv (unique_argv original_argv);
288 : 405 : const char * const *get_original_argv ()
289 : : {
290 : 405 : return const_cast<const char * const *> (m_original_argv);
291 : : }
292 : :
293 : 339415 : void set_set_locations_callback (set_locations_callback_t cb)
294 : : {
295 : 339415 : m_set_locations_cb = cb;
296 : : }
297 : :
298 : : void
299 : : initialize_input_context (diagnostic_input_charset_callback ccb,
300 : : bool should_skip_bom);
301 : :
302 : : void begin_group ();
303 : : void end_group ();
304 : :
305 : : void push_nesting_level ();
306 : : void pop_nesting_level ();
307 : : void set_nesting_level (int new_level);
308 : :
309 : : bool warning_enabled_at (location_t loc, option_id opt_id);
310 : :
311 : 1075077 : bool option_unspecified_p (option_id opt_id) const
312 : : {
313 : 1075077 : return m_option_classifier.option_unspecified_p (opt_id);
314 : : }
315 : :
316 : : bool emit_diagnostic_with_group (enum kind kind,
317 : : rich_location &richloc,
318 : : const metadata *metadata,
319 : : option_id opt_id,
320 : : const char *gmsgid, ...)
321 : : ATTRIBUTE_GCC_DIAG(6,7);
322 : : bool emit_diagnostic_with_group_va (enum kind kind,
323 : : rich_location &richloc,
324 : : const metadata *metadata,
325 : : option_id opt_id,
326 : : const char *gmsgid, va_list *ap)
327 : : ATTRIBUTE_GCC_DIAG(6,0);
328 : :
329 : : bool report_diagnostic (diagnostic_info *);
330 : : void report_verbatim (text_info &);
331 : :
332 : : /* Report a directed graph associated with the run as a whole
333 : : to any sinks that support directed graphs. */
334 : : void
335 : : report_global_digraph (const lazily_created<digraphs::digraph> &);
336 : :
337 : : enum kind
338 : 4645984 : classify_diagnostic (option_id opt_id,
339 : : enum kind new_kind,
340 : : location_t where)
341 : : {
342 : 4645984 : logging::log_function_params
343 : 4645984 : (m_logger, "diagnostics::context::classify_diagnostics")
344 : 4645984 : .log_param_option_id ("option_id", opt_id)
345 : 4645984 : .log_param_kind ("new_kind", new_kind)
346 : 4645984 : .log_param_location_t ("where", where);
347 : 4645984 : logging::auto_inc_depth depth_sentinel (m_logger);
348 : :
349 : 4645984 : return m_option_classifier.classify_diagnostic (this,
350 : : opt_id,
351 : : new_kind,
352 : 4645984 : where);
353 : 4645984 : }
354 : :
355 : 3976735 : void push_diagnostics (location_t where)
356 : : {
357 : 3976735 : logging::log_function_params
358 : 3976735 : (m_logger, "diagnostics::context::push_diagnostics")
359 : 3976735 : .log_param_location_t ("where", where);
360 : 3976735 : logging::auto_inc_depth depth_sentinel (m_logger);
361 : :
362 : 3976735 : m_option_classifier.push ();
363 : 3976735 : }
364 : 3976064 : void pop_diagnostics (location_t where)
365 : : {
366 : 3976064 : logging::log_function_params
367 : 3976064 : (m_logger, "diagnostics::context::pop_diagnostics")
368 : 3976064 : .log_param_location_t ("where", where);
369 : 3976064 : logging::auto_inc_depth depth_sentinel (m_logger);
370 : :
371 : 3976064 : m_option_classifier.pop (where);
372 : 3976064 : }
373 : :
374 : : void maybe_show_locus (const rich_location &richloc,
375 : : const source_printing_options &opts,
376 : : enum kind diagnostic_kind,
377 : : pretty_printer &pp,
378 : : source_effect_info *effect_info);
379 : : void maybe_show_locus_as_html (const rich_location &richloc,
380 : : const source_printing_options &opts,
381 : : enum kind diagnostic_kind,
382 : : xml::printer &xp,
383 : : source_effect_info *effect_info,
384 : : html_label_writer *label_writer);
385 : :
386 : : void emit_diagram (const diagram &diag);
387 : :
388 : : /* Various setters for use by option-handling logic. */
389 : : void set_sink (std::unique_ptr<sink> sink_);
390 : : void set_text_art_charset (enum diagnostic_text_art_charset charset);
391 : : void set_client_data_hooks (std::unique_ptr<client_data_hooks> hooks);
392 : :
393 : : void push_owned_urlifier (std::unique_ptr<urlifier>);
394 : : void push_borrowed_urlifier (const urlifier &);
395 : : void pop_urlifier ();
396 : :
397 : : void initialize_fixits_change_set ();
398 : 4406 : void set_warning_as_error_requested (bool val)
399 : : {
400 : 4406 : m_warning_as_error_requested = val;
401 : 4406 : }
402 : 16 : void set_report_bug (bool val) { m_report_bug = val; }
403 : 4 : void set_extra_output_kind (enum diagnostics_extra_output_kind kind)
404 : : {
405 : 4 : m_extra_output_kind = kind;
406 : 4 : }
407 : 285689 : void set_show_cwe (bool val) { m_show_cwe = val; }
408 : 285689 : void set_show_rules (bool val) { m_show_rules = val; }
409 : : void set_show_highlight_colors (bool val);
410 : 582261 : void set_path_format (enum diagnostic_path_format val)
411 : : {
412 : 582261 : m_path_format = val;
413 : 296568 : }
414 : 285765 : void set_show_path_depths (bool val) { m_show_path_depths = val; }
415 : 285743 : void set_show_option_requested (bool val) { m_show_option_requested = val; }
416 : : void set_show_nesting (bool val);
417 : : void set_show_nesting_locations (bool val);
418 : : void set_show_nesting_levels (bool val);
419 : 44 : void set_max_errors (int val) { m_max_errors = val; }
420 : 532 : void set_escape_format (enum diagnostics_escape_format val)
421 : : {
422 : 532 : m_escape_format = val;
423 : 4 : }
424 : :
425 : : void set_format_decoder (printer_fn format_decoder);
426 : : void set_prefixing_rule (diagnostic_prefixing_rule_t rule);
427 : :
428 : : /* Various accessors. */
429 : 30271 : bool warning_as_error_requested_p () const
430 : : {
431 : 30271 : return m_warning_as_error_requested;
432 : : }
433 : 15554 : bool show_path_depths_p () const { return m_show_path_depths; }
434 : : sink &get_sink (size_t idx) const;
435 : 9658 : enum diagnostic_path_format get_path_format () const { return m_path_format; }
436 : 50950 : enum diagnostics_escape_format get_escape_format () const
437 : : {
438 : 50950 : return m_escape_format;
439 : : }
440 : :
441 : : file_cache &
442 : 2916741 : get_file_cache () const
443 : : {
444 : 2916741 : gcc_assert (m_file_cache);
445 : 2916741 : return *m_file_cache;
446 : : }
447 : :
448 : 283669 : changes::change_set *get_fixits_change_set () const
449 : : {
450 : 283669 : return m_fixits_change_set;
451 : : }
452 : 2228 : const client_data_hooks *get_client_data_hooks () const
453 : : {
454 : 2228 : return m_client_data_hooks;
455 : : }
456 : :
457 : : const logical_locations::manager *
458 : : get_logical_location_manager () const;
459 : :
460 : : const urlifier *get_urlifier () const;
461 : :
462 : 53803 : text_art::theme *get_diagram_theme () const { return m_diagrams.m_theme; }
463 : :
464 : 307497 : int &diagnostic_count (enum kind kind)
465 : : {
466 : 307497 : return m_diagnostic_counters.m_count_for_kind[static_cast<size_t> (kind)];
467 : : }
468 : 1082524 : int diagnostic_count (enum kind kind) const
469 : : {
470 : 283966 : return m_diagnostic_counters.get_count (kind);
471 : : }
472 : :
473 : : /* Option-related member functions. */
474 : 93046852 : inline bool option_enabled_p (option_id opt_id) const
475 : : {
476 : 93046852 : if (!m_option_id_mgr)
477 : : return true;
478 : 93046852 : return m_option_id_mgr->option_enabled_p (opt_id);
479 : : }
480 : :
481 : 1532369 : inline char *make_option_name (option_id opt_id,
482 : : enum kind orig_diag_kind,
483 : : enum kind diag_kind) const
484 : : {
485 : 1532369 : if (!m_option_id_mgr)
486 : : return nullptr;
487 : 1532173 : return m_option_id_mgr->make_option_name (opt_id,
488 : : orig_diag_kind,
489 : 1532173 : diag_kind);
490 : : }
491 : :
492 : 118 : inline char *make_option_url (option_id opt_id) const
493 : : {
494 : 118 : if (!m_option_id_mgr)
495 : : return nullptr;
496 : 118 : return m_option_id_mgr->make_option_url (opt_id);
497 : : }
498 : :
499 : : void
500 : : set_option_id_manager (std::unique_ptr<option_id_manager> option_id_mgr,
501 : : unsigned lang_mask);
502 : :
503 : 270340 : unsigned get_lang_mask () const
504 : : {
505 : 270340 : return m_lang_mask;
506 : : }
507 : :
508 : : bool diagnostic_impl (rich_location *, const metadata *,
509 : : option_id, const char *,
510 : : va_list *, enum kind) ATTRIBUTE_GCC_DIAG(5,0);
511 : : bool diagnostic_n_impl (rich_location *, const metadata *,
512 : : option_id, unsigned HOST_WIDE_INT,
513 : : const char *, const char *, va_list *,
514 : : enum kind) ATTRIBUTE_GCC_DIAG(7,0);
515 : :
516 : 369184 : int get_diagnostic_nesting_level () const
517 : : {
518 : 369184 : return m_diagnostic_groups.m_diagnostic_nesting_level;
519 : : }
520 : :
521 : : char *build_indent_prefix () const;
522 : :
523 : : int
524 : 435 : pch_save (FILE *f)
525 : : {
526 : 435 : return m_option_classifier.pch_save (f);
527 : : }
528 : :
529 : : int
530 : 347 : pch_restore (FILE *f)
531 : : {
532 : 347 : return m_option_classifier.pch_restore (f);
533 : : }
534 : :
535 : :
536 : : void set_diagnostic_buffer (buffer *);
537 : 1202358 : buffer *get_diagnostic_buffer () const
538 : : {
539 : 1202358 : return m_diagnostic_buffer;
540 : : }
541 : : void clear_diagnostic_buffer (buffer &);
542 : : void flush_diagnostic_buffer (buffer &);
543 : :
544 : 1246717 : std::unique_ptr<pretty_printer> clone_printer () const
545 : : {
546 : 1246651 : return m_reference_printer->clone ();
547 : : }
548 : :
549 : 3643590 : pretty_printer *get_reference_printer () const
550 : : {
551 : 3641987 : return m_reference_printer;
552 : : }
553 : :
554 : : void
555 : : add_sink (std::unique_ptr<sink>);
556 : :
557 : : void remove_all_output_sinks ();
558 : :
559 : : bool supports_fnotice_on_stderr_p () const;
560 : :
561 : : /* Raise SIGABRT on any diagnostic of severity kind::error or higher. */
562 : : void
563 : 13 : set_abort_on_error (bool val)
564 : : {
565 : 13 : m_abort_on_error = val;
566 : : }
567 : :
568 : : /* Accessor for use in serialization, e.g. by C++ modules. */
569 : : auto &
570 : 2643 : get_classification_history ()
571 : : {
572 : 7494 : return m_option_classifier.m_classification_history;
573 : : }
574 : :
575 : : void set_main_input_filename (const char *filename);
576 : :
577 : : void
578 : 207045 : set_permissive_option (option_id opt_permissive)
579 : : {
580 : 207045 : m_opt_permissive = opt_permissive;
581 : : }
582 : :
583 : : void
584 : 8 : set_fatal_errors (bool fatal_errors)
585 : : {
586 : 8 : m_fatal_errors = fatal_errors;
587 : 8 : }
588 : :
589 : : void
590 : 285740 : set_internal_error_callback (void (*cb) (context *,
591 : : const char *,
592 : : va_list *))
593 : : {
594 : 285740 : m_internal_error = cb;
595 : : }
596 : :
597 : : void
598 : 96985 : set_adjust_diagnostic_info_callback (void (*cb) (const context &,
599 : : diagnostic_info *))
600 : : {
601 : 96985 : m_adjust_diagnostic_info = cb;
602 : : }
603 : :
604 : : void
605 : 619 : inhibit_notes () { m_inhibit_notes_p = true; }
606 : :
607 : : source_printing_options &
608 : 731778 : get_source_printing_options ()
609 : : {
610 : 731778 : return m_source_printing;
611 : : }
612 : : const source_printing_options &
613 : 1570 : get_source_printing_options () const
614 : : {
615 : 1570 : return m_source_printing;
616 : : }
617 : :
618 : 405 : column_options &get_column_options () { return m_column_options; }
619 : 2309736 : const column_options &get_column_options () const { return m_column_options; }
620 : :
621 : : void set_caret_max_width (int value);
622 : :
623 : : private:
624 : : void error_recursion () ATTRIBUTE_NORETURN;
625 : :
626 : : bool diagnostic_enabled (diagnostic_info *diagnostic);
627 : :
628 : : void get_any_inlining_info (diagnostic_info *diagnostic);
629 : :
630 : : void check_max_errors (bool flush);
631 : : void action_after_output (enum kind diag_kind);
632 : :
633 : : /* Data members.
634 : : Ideally, all of these would be private. */
635 : :
636 : : private:
637 : : /* A reference instance of pretty_printer created by the client
638 : : and owned by the context. Used for cloning when creating/adding
639 : : output formats.
640 : : Owned by the context; this would be a std::unique_ptr if
641 : : context had a proper ctor. */
642 : : pretty_printer *m_reference_printer;
643 : :
644 : : /* Cache of source code.
645 : : Owned by the context; this would be a std::unique_ptr if
646 : : context had a proper ctor. */
647 : : file_cache *m_file_cache;
648 : :
649 : : /* The number of times we have issued diagnostics. */
650 : : counters m_diagnostic_counters;
651 : :
652 : : /* True if it has been requested that warnings be treated as errors. */
653 : : bool m_warning_as_error_requested;
654 : :
655 : : /* The number of option indexes that can be passed to warning() et
656 : : al. */
657 : : int m_n_opts;
658 : :
659 : : /* The stack of sets of overridden diagnostic option severities. */
660 : : option_classifier m_option_classifier;
661 : :
662 : : /* True if we should print any CWE identifiers associated with
663 : : diagnostics. */
664 : : bool m_show_cwe;
665 : :
666 : : /* True if we should print any rules associated with diagnostics. */
667 : : bool m_show_rules;
668 : :
669 : : /* How should diagnostics::paths::path objects be printed. */
670 : : enum diagnostic_path_format m_path_format;
671 : :
672 : : /* True if we should print stack depths when printing diagnostic paths. */
673 : : bool m_show_path_depths;
674 : :
675 : : /* True if we should print the command line option which controls
676 : : each diagnostic, if known. */
677 : : bool m_show_option_requested;
678 : :
679 : : /* True if we should raise a SIGABRT on errors. */
680 : : bool m_abort_on_error;
681 : :
682 : : public:
683 : : /* True if we should show the column number on diagnostics. */
684 : : bool m_show_column;
685 : :
686 : : /* True if pedwarns are errors. */
687 : : bool m_pedantic_errors;
688 : :
689 : : /* True if permerrors are warnings. */
690 : : bool m_permissive;
691 : :
692 : : private:
693 : : /* The option to associate with turning permerrors into warnings,
694 : : if any. */
695 : : option_id m_opt_permissive;
696 : :
697 : : /* True if errors are fatal. */
698 : : bool m_fatal_errors;
699 : :
700 : : public:
701 : : /* True if all warnings should be disabled. */
702 : : bool m_inhibit_warnings;
703 : :
704 : : /* True if warnings should be given in system headers. */
705 : : bool m_warn_system_headers;
706 : :
707 : : private:
708 : : /* Maximum number of errors to report. */
709 : : int m_max_errors;
710 : :
711 : : /* Client-supplied callbacks for use in text output. */
712 : : struct {
713 : : /* This function is called before any message is printed out. It is
714 : : responsible for preparing message prefix and such. For example, it
715 : : might say:
716 : : In file included from "/usr/local/include/curses.h:5:
717 : : from "/home/gdr/src/nifty_printer.h:56:
718 : : ...
719 : : */
720 : : text_starter_fn m_begin_diagnostic;
721 : :
722 : : /* This function is called by diagnostic_show_locus in between
723 : : disjoint spans of source code, so that the context can print
724 : : something to indicate that a new span of source code has begun. */
725 : : start_span_fn<to_text> m_text_start_span;
726 : : start_span_fn<to_html> m_html_start_span;
727 : :
728 : : /* This function is called after the diagnostic message is printed. */
729 : : text_finalizer_fn m_end_diagnostic;
730 : : } m_text_callbacks;
731 : :
732 : : /* Client hook to report an internal error. */
733 : : void (*m_internal_error) (context *, const char *, va_list *);
734 : :
735 : : /* Client hook to adjust properties of the given diagnostic that we're
736 : : about to issue, such as its kind. */
737 : : void (*m_adjust_diagnostic_info)(const context &, diagnostic_info *);
738 : :
739 : : /* Owned by the context; this would be a std::unique_ptr if
740 : : context had a proper ctor. */
741 : : option_id_manager *m_option_id_mgr;
742 : : unsigned m_lang_mask;
743 : :
744 : : /* A stack of optional hooks for adding URLs to quoted text strings in
745 : : diagnostics. Only used for the main diagnostic message.
746 : : Typically a single one owner by the context, but can be temporarily
747 : : overridden by a borrowed urlifier (e.g. on-stack). */
748 : : struct urlifier_stack_node
749 : : {
750 : : urlifier *m_urlifier;
751 : : bool m_owned;
752 : : };
753 : : auto_vec<urlifier_stack_node> *m_urlifier_stack;
754 : :
755 : : public:
756 : : /* Auxiliary data for client. */
757 : : void *m_client_aux_data;
758 : :
759 : : /* Used to detect that the last caret was printed at the same location. */
760 : : location_t m_last_location;
761 : :
762 : : private:
763 : : int m_lock;
764 : :
765 : : bool m_inhibit_notes_p;
766 : :
767 : : source_printing_options m_source_printing;
768 : : column_options m_column_options;
769 : :
770 : : /* True if -freport-bug option is used. */
771 : : bool m_report_bug;
772 : :
773 : : /* Used to specify additional diagnostic output to be emitted after the
774 : : rest of the diagnostic. This is for implementing
775 : : -fdiagnostics-parseable-fixits and GCC_EXTRA_DIAGNOSTIC_OUTPUT. */
776 : : enum diagnostics_extra_output_kind m_extra_output_kind;
777 : :
778 : : /* How should non-ASCII/non-printable bytes be escaped when
779 : : a diagnostic suggests escaping the source code on output. */
780 : : enum diagnostics_escape_format m_escape_format;
781 : :
782 : : /* If non-NULL, a diagnostics::changes::change_set to which fix-it hints
783 : : should be applied, for generating patches.
784 : : Owned by the context; this would be a std::unique_ptr if
785 : : context had a proper ctor. */
786 : : changes::change_set *m_fixits_change_set;
787 : :
788 : : /* Fields relating to diagnostic groups. */
789 : : struct {
790 : : /* How many diagnostic_group instances are currently alive. */
791 : : int m_group_nesting_depth;
792 : :
793 : : /* How many nesting levels have been pushed within this group. */
794 : : int m_diagnostic_nesting_level;
795 : :
796 : : /* How many diagnostics have been emitted since the bottommost
797 : : diagnostic_group was pushed. */
798 : : int m_emission_count;
799 : :
800 : : /* The "group+diagnostic" nesting depth from which to inhibit notes. */
801 : : int m_inhibiting_notes_from;
802 : : } m_diagnostic_groups;
803 : :
804 : : void inhibit_notes_in_group (bool inhibit = true);
805 : : bool notes_inhibited_in_group () const;
806 : :
807 : : /* The various sinks to which diagnostics are to be outputted
808 : : (text vs structured formats such as SARIF).
809 : : The sinks are owned by the context; this would be a
810 : : std::vector<std::unique_ptr> if context had a
811 : : proper ctor. */
812 : : auto_vec<sink *> m_sinks;
813 : :
814 : : /* Callback to set the locations of call sites along the inlining
815 : : stack corresponding to a diagnostic location. Needed to traverse
816 : : the BLOCK_SUPERCONTEXT() chain hanging off the LOCATION_BLOCK()
817 : : of a diagnostic's location. */
818 : : set_locations_callback_t m_set_locations_cb;
819 : :
820 : : /* A bundle of hooks for providing data to the context about its client
821 : : e.g. version information, plugins, etc.
822 : : Used by SARIF output to give metadata about the client that's
823 : : producing diagnostics.
824 : : Owned by the context; this would be a std::unique_ptr if
825 : : context had a proper ctor. */
826 : : client_data_hooks *m_client_data_hooks;
827 : :
828 : : /* Support for diagrams. */
829 : : struct
830 : : {
831 : : /* Theme to use when generating diagrams.
832 : : Can be NULL (if text art is disabled).
833 : : Owned by the context; this would be a std::unique_ptr if
834 : : context had a proper ctor. */
835 : : text_art::theme *m_theme;
836 : :
837 : : } m_diagrams;
838 : :
839 : : /* Owned by the context. */
840 : : char **m_original_argv;
841 : :
842 : : /* Borrowed pointer to the active diagnostics::buffer, if any.
843 : : If null (the default), then diagnostics that are reported to the
844 : : context are immediately issued to the output format.
845 : : If non-null, then diagnostics that are reported to the context
846 : : are buffered in the buffer, and may be issued to the output format
847 : : later (if the buffer is flushed), moved to other buffers, or
848 : : discarded (if the buffer is cleared). */
849 : : buffer *m_diagnostic_buffer;
850 : :
851 : : /* Owned by the context.
852 : : Debugging option: if non-NULL, report information to the logger
853 : : on what the context is doing. */
854 : : logging::logger *m_logger;
855 : : };
856 : :
857 : : /* Client supplied function to announce a diagnostic
858 : : (for text-based diagnostic output). */
859 : : inline text_starter_fn &
860 : : text_starter (context *dc)
861 : : {
862 : : return dc->m_text_callbacks.m_begin_diagnostic;
863 : : }
864 : :
865 : : /* Client supplied function called between disjoint spans of source code,
866 : : so that the context can print
867 : : something to indicate that a new span of source code has begun. */
868 : : inline start_span_fn<to_text> &
869 : 18809 : start_span (context *dc)
870 : : {
871 : 18809 : return dc->m_text_callbacks.m_text_start_span;
872 : : }
873 : :
874 : : /* Client supplied function called after a diagnostic message is
875 : : displayed (for text-based diagnostic output). */
876 : : inline text_finalizer_fn &
877 : : text_finalizer (context *dc)
878 : : {
879 : : return dc->m_text_callbacks.m_end_diagnostic;
880 : : }
881 : :
882 : : } // namespace diagnostics
883 : :
884 : : #endif /* ! GCC_DIAGNOSTICS_CONTEXT_H */
|