LCOV - code coverage report
Current view: top level - gcc - diagnostic-path.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 12 12 100.0 %
Date: 2020-04-04 11:58:09 Functions: 4 4 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /* Paths through the code associated with a diagnostic.
       2                 :            :    Copyright (C) 2019-2020 Free Software Foundation, Inc.
       3                 :            :    Contributed by David Malcolm <dmalcolm@redhat.com>
       4                 :            : 
       5                 :            : This file is part of GCC.
       6                 :            : 
       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 3, or (at your option) any later
      10                 :            : version.
      11                 :            : 
      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.
      16                 :            : 
      17                 :            : You should have received a copy of the GNU General Public License
      18                 :            : along with GCC; see the file COPYING3.  If not see
      19                 :            : <http://www.gnu.org/licenses/>.  */
      20                 :            : 
      21                 :            : #ifndef GCC_DIAGNOSTIC_PATH_H
      22                 :            : #define GCC_DIAGNOSTIC_PATH_H
      23                 :            : 
      24                 :            : #include "diagnostic.h" /* for ATTRIBUTE_GCC_DIAG.  */
      25                 :            : #include "diagnostic-event-id.h"
      26                 :            : 
      27                 :            : /* A diagnostic_path is an optional additional piece of metadata associated
      28                 :            :    with a diagnostic (via its rich_location).
      29                 :            : 
      30                 :            :    It describes a sequence of events predicted by the compiler that
      31                 :            :    lead to the problem occurring, with their locations in the user's source,
      32                 :            :    and text descriptions.
      33                 :            : 
      34                 :            :    For example, the following error has a 3-event path:
      35                 :            : 
      36                 :            :      test.c: In function 'demo':
      37                 :            :      test.c:29:5: error: passing NULL as argument 1 to 'PyList_Append' which
      38                 :            :        requires a non-NULL parameter
      39                 :            :         29 |     PyList_Append(list, item);
      40                 :            :            |     ^~~~~~~~~~~~~~~~~~~~~~~~~
      41                 :            :        'demo': events 1-3
      42                 :            :           |
      43                 :            :           |   25 |   list = PyList_New(0);
      44                 :            :           |      |          ^~~~~~~~~~~~~
      45                 :            :           |      |          |
      46                 :            :           |      |          (1) when 'PyList_New' fails, returning NULL
      47                 :            :           |   26 |
      48                 :            :           |   27 |   for (i = 0; i < count; i++) {
      49                 :            :           |      |   ~~~
      50                 :            :           |      |   |
      51                 :            :           |      |   (2) when 'i < count'
      52                 :            :           |   28 |     item = PyLong_FromLong(random());
      53                 :            :           |   29 |     PyList_Append(list, item);
      54                 :            :           |      |     ~~~~~~~~~~~~~~~~~~~~~~~~~
      55                 :            :           |      |     |
      56                 :            :           |      |     (3) when calling 'PyList_Append', passing NULL from (1) as argument 1
      57                 :            :           |
      58                 :            : 
      59                 :            :     The diagnostic-printing code has consolidated the path into a single
      60                 :            :     run of events, since all the events are near each other and within the same
      61                 :            :     function; more complicated examples (such as interprocedural paths)
      62                 :            :     might be printed as multiple runs of events.  */
      63                 :            : 
      64                 :            : /* Abstract base classes, describing events within a path, and the paths
      65                 :            :    themselves.  */
      66                 :            : 
      67                 :            : /* One event within a diagnostic_path.  */
      68                 :            : 
      69                 :       3073 : class diagnostic_event
      70                 :            : {
      71                 :            :  public:
      72                 :        194 :   virtual ~diagnostic_event () {}
      73                 :            : 
      74                 :            :   virtual location_t get_location () const = 0;
      75                 :            : 
      76                 :            :   virtual tree get_fndecl () const = 0;
      77                 :            : 
      78                 :            :   /* Stack depth, so that consumers can visualizes the interprocedural
      79                 :            :      calls, returns, and frame nesting.  */
      80                 :            :   virtual int get_stack_depth () const = 0;
      81                 :            : 
      82                 :            :   /* Get a localized (and possibly colorized) description of this event.  */
      83                 :            :   virtual label_text get_desc (bool can_colorize) const = 0;
      84                 :            : };
      85                 :            : 
      86                 :            : /* Abstract base class for getting at a sequence of events.  */
      87                 :            : 
      88                 :        323 : class diagnostic_path
      89                 :            : {
      90                 :            :  public:
      91                 :        323 :   virtual ~diagnostic_path () {}
      92                 :            :   virtual unsigned num_events () const = 0;
      93                 :            :   virtual const diagnostic_event & get_event (int idx) const = 0;
      94                 :            : 
      95                 :            :   bool interprocedural_p () const;
      96                 :            : };
      97                 :            : 
      98                 :            : /* Concrete subclasses.  */
      99                 :            : 
     100                 :            : /* A simple implementation of diagnostic_event.  */
     101                 :            : 
     102                 :            : class simple_diagnostic_event : public diagnostic_event
     103                 :            : {
     104                 :            :  public:
     105                 :            :   simple_diagnostic_event (location_t loc, tree fndecl, int depth,
     106                 :            :                            const char *desc);
     107                 :            :   ~simple_diagnostic_event ();
     108                 :            : 
     109                 :        295 :   location_t get_location () const FINAL OVERRIDE { return m_loc; }
     110                 :        397 :   tree get_fndecl () const FINAL OVERRIDE { return m_fndecl; }
     111                 :        269 :   int get_stack_depth () const FINAL OVERRIDE { return m_depth; }
     112                 :        170 :   label_text get_desc (bool) const FINAL OVERRIDE
     113                 :            :   {
     114                 :        170 :     return label_text::borrow (m_desc);
     115                 :            :   }
     116                 :            : 
     117                 :            :  private:
     118                 :            :   location_t m_loc;
     119                 :            :   tree m_fndecl;
     120                 :            :   int m_depth;
     121                 :            :   char *m_desc; // has been i18n-ed and formatted
     122                 :            : };
     123                 :            : 
     124                 :            : /* A simple implementation of diagnostic_path, as a vector of
     125                 :            :    simple_diagnostic_event instances.  */
     126                 :            : 
     127                 :         10 : class simple_diagnostic_path : public diagnostic_path
     128                 :            : {
     129                 :            :  public:
     130                 :         10 :   simple_diagnostic_path (pretty_printer *event_pp)
     131                 :         10 :   : m_event_pp (event_pp) {}
     132                 :            : 
     133                 :            :   unsigned num_events () const FINAL OVERRIDE;
     134                 :            :   const diagnostic_event & get_event (int idx) const FINAL OVERRIDE;
     135                 :            : 
     136                 :            :   diagnostic_event_id_t add_event (location_t loc, tree fndecl, int depth,
     137                 :            :                                    const char *fmt, ...)
     138                 :            :     ATTRIBUTE_GCC_DIAG(5,6);
     139                 :            : 
     140                 :            :  private:
     141                 :            :   auto_delete_vec<simple_diagnostic_event> m_events;
     142                 :            : 
     143                 :            :   /* (for use by add_event).  */
     144                 :            :   pretty_printer *m_event_pp;
     145                 :            : };
     146                 :            : 
     147                 :            : extern void debug (diagnostic_path *path);
     148                 :            : 
     149                 :            : #endif /* ! GCC_DIAGNOSTIC_PATH_H */

Generated by: LCOV version 1.0

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto --enable-host-shared. GCC test suite is run with the built compiler.