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