LCOV - code coverage report
Current view: top level - libcpp/include - line-map.h (source / functions) Hit Total Coverage
Test: gcc.info Lines: 58 60 96.7 %
Date: 2023-07-19 08:18:47 Functions: 4 4 100.0 %

          Line data    Source code
       1             : /* Map (unsigned int) keys to (source file, line, column) triples.
       2             :    Copyright (C) 2001-2023 Free Software Foundation, Inc.
       3             : 
       4             : This program is free software; you can redistribute it and/or modify it
       5             : under the terms of the GNU General Public License as published by the
       6             : Free Software Foundation; either version 3, or (at your option) any
       7             : later version.
       8             : 
       9             : This program is distributed in the hope that it will be useful,
      10             : but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             : GNU General Public License for more details.
      13             : 
      14             : You should have received a copy of the GNU General Public License
      15             : along with this program; see the file COPYING3.  If not see
      16             : <http://www.gnu.org/licenses/>.
      17             : 
      18             :  In other words, you are welcome to use, share and improve this program.
      19             :  You are forbidden to forbid anyone else to use, share and improve
      20             :  what you give them.   Help stamp out software-hoarding!  */
      21             : 
      22             : #ifndef LIBCPP_LINE_MAP_H
      23             : #define LIBCPP_LINE_MAP_H
      24             : 
      25             : #include <utility>
      26             : 
      27             : #ifndef GTY
      28             : #define GTY(x) /* nothing */
      29             : #endif
      30             : 
      31             : /* Both gcc and emacs number source *lines* starting at 1, but
      32             :    they have differing conventions for *columns*.
      33             : 
      34             :    GCC uses a 1-based convention for source columns,
      35             :    whereas Emacs's M-x column-number-mode uses a 0-based convention.
      36             : 
      37             :    For example, an error in the initial, left-hand
      38             :    column of source line 3 is reported by GCC as:
      39             : 
      40             :       some-file.c:3:1: error: ...etc...
      41             : 
      42             :    On navigating to the location of that error in Emacs
      43             :    (e.g. via "next-error"),
      44             :    the locus is reported in the Mode Line
      45             :    (assuming M-x column-number-mode) as:
      46             : 
      47             :      some-file.c   10%   (3, 0)
      48             : 
      49             :    i.e. "3:1:" in GCC corresponds to "(3, 0)" in Emacs.  */
      50             : 
      51             : /* The type of line numbers.  */
      52             : typedef unsigned int linenum_type;
      53             : 
      54             : /* A type for doing arithmetic on line numbers.  */
      55             : typedef long long linenum_arith_t;
      56             : 
      57             : /* A function for for use by qsort for comparing line numbers.  */
      58             : 
      59             : inline int compare (linenum_type lhs, linenum_type rhs)
      60             : {
      61             :   /* Avoid truncation issues by using linenum_arith_t for the comparison,
      62             :      and only consider the sign of the result.  */
      63             :   linenum_arith_t diff = (linenum_arith_t)lhs - (linenum_arith_t)rhs;
      64             :   if (diff)
      65             :     return diff > 0 ? 1 : -1;
      66             :   return 0;
      67             : }
      68             : 
      69             : /* Reason for creating a new line map with linemap_add.  */
      70             : enum lc_reason
      71             : {
      72             :   LC_ENTER = 0,         /* Begin #include.  */
      73             :   LC_LEAVE,             /* Return to including file.  */
      74             :   LC_RENAME,            /* Other reason for name change.  */
      75             :   LC_RENAME_VERBATIM,   /* Likewise, but "" != stdin.  */
      76             :   LC_ENTER_MACRO,       /* Begin macro expansion.  */
      77             :   LC_MODULE,            /* A (C++) Module.  */
      78             :   /* FIXME: add support for stringize and paste.  */
      79             :   LC_HWM /* High Water Mark.  */
      80             : };
      81             : 
      82             : /* The typedef "location_t" is a key within the location database,
      83             :    identifying a source location or macro expansion, along with range
      84             :    information, and (optionally) a pointer for use by gcc.
      85             : 
      86             :    This key only has meaning in relation to a line_maps instance.  Within
      87             :    gcc there is a single line_maps instance: "line_table", declared in
      88             :    gcc/input.h and defined in gcc/input.cc.
      89             : 
      90             :    The values of the keys are intended to be internal to libcpp,
      91             :    but for ease-of-understanding the implementation, they are currently
      92             :    assigned as follows:
      93             : 
      94             :   Actual     | Value                         | Meaning
      95             :   -----------+-------------------------------+-------------------------------
      96             :   0x00000000 | UNKNOWN_LOCATION (gcc/input.h)| Unknown/invalid location.
      97             :   -----------+-------------------------------+-------------------------------
      98             :   0x00000001 | BUILTINS_LOCATION             | The location for declarations
      99             :              |   (gcc/input.h)               | in "<built-in>"
     100             :   -----------+-------------------------------+-------------------------------
     101             :   0x00000002 | RESERVED_LOCATION_COUNT       | The first location to be
     102             :              | (also                         | handed out, and the
     103             :              |  ordmap[0]->start_location)   | first line in ordmap 0
     104             :   -----------+-------------------------------+-------------------------------
     105             :              | ordmap[1]->start_location     | First line in ordmap 1
     106             :              | ordmap[1]->start_location+32  | First column in that line
     107             :              |   (assuming range_bits == 5)  |
     108             :              | ordmap[1]->start_location+64  | 2nd column in that line
     109             :              | ordmap[1]->start_location+4096| Second line in ordmap 1
     110             :              |   (assuming column_bits == 12)
     111             :              |
     112             :              |   Subsequent lines are offset by (1 << column_bits),
     113             :              |   e.g. 4096 for 12 bits, with a column value of 0 representing
     114             :              |   "the whole line".
     115             :              |
     116             :              |   Within a line, the low "range_bits" (typically 5) are used for
     117             :              |   storing short ranges, so that there's an offset of
     118             :              |     (1 << range_bits) between individual columns within a line,
     119             :              |   typically 32.
     120             :              |   The low range_bits store the offset of the end point from the
     121             :              |   start point, and the start point is found by masking away
     122             :              |   the range bits.
     123             :              |
     124             :              |   For example:
     125             :              |      ordmap[1]->start_location+64    "2nd column in that line"
     126             :              |   above means a caret at that location, with a range
     127             :              |   starting and finishing at the same place (the range bits
     128             :              |   are 0), a range of length 1.
     129             :              |
     130             :              |   By contrast:
     131             :              |      ordmap[1]->start_location+68
     132             :              |   has range bits 0x4, meaning a caret with a range starting at
     133             :              |   that location, but with endpoint 4 columns further on: a range
     134             :              |   of length 5.
     135             :              |
     136             :              |   Ranges that have caret != start, or have an endpoint too
     137             :              |   far away to fit in range_bits are instead stored as ad-hoc
     138             :              |   locations.  Hence for range_bits == 5 we can compactly store
     139             :              |   tokens of length <= 32 without needing to use the ad-hoc
     140             :              |   table.
     141             :              |
     142             :              |   This packing scheme means we effectively have
     143             :              |     (column_bits - range_bits)
     144             :              |   of bits for the columns, typically (12 - 5) = 7, for 128
     145             :              |   columns; longer line widths are accomodated by starting a
     146             :              |   new ordmap with a higher column_bits.
     147             :              |
     148             :              | ordmap[2]->start_location-1   | Final location in ordmap 1
     149             :   -----------+-------------------------------+-------------------------------
     150             :              | ordmap[2]->start_location     | First line in ordmap 2
     151             :              | ordmap[3]->start_location-1   | Final location in ordmap 2
     152             :   -----------+-------------------------------+-------------------------------
     153             :              |                               | (etc)
     154             :   -----------+-------------------------------+-------------------------------
     155             :              | ordmap[n-1]->start_location   | First line in final ord map
     156             :              |                               | (etc)
     157             :              | set->highest_location - 1     | Final location in that ordmap
     158             :   -----------+-------------------------------+-------------------------------
     159             :              | set->highest_location         | Location of the where the next
     160             :              |                               | ordinary linemap would start
     161             :   -----------+-------------------------------+-------------------------------
     162             :              |                               |
     163             :              |                  VVVVVVVVVVVVVVVVVVVVVVVVVVV
     164             :              |                  Ordinary maps grow this way
     165             :              |
     166             :              |                    (unallocated integers)
     167             :              |
     168             :   0x60000000 | LINE_MAP_MAX_LOCATION_WITH_COLS
     169             :              |   Beyond this point, ordinary linemaps have 0 bits per column:
     170             :              |   each increment of the value corresponds to a new source line.
     171             :              |
     172             :   0x70000000 | LINE_MAP_MAX_LOCATION
     173             :              |   Beyond the point, we give up on ordinary maps; attempts to
     174             :              |   create locations in them lead to UNKNOWN_LOCATION (0).
     175             :              |
     176             :              |                    (unallocated integers)
     177             :              |
     178             :              |                   Macro maps grow this way
     179             :              |                   ^^^^^^^^^^^^^^^^^^^^^^^^
     180             :              |                               |
     181             :   -----------+-------------------------------+-------------------------------
     182             :              | LINEMAPS_MACRO_LOWEST_LOCATION| Locations within macro maps
     183             :              | macromap[m-1]->start_location | Start of last macro map
     184             :              |                               |
     185             :   -----------+-------------------------------+-------------------------------
     186             :              | macromap[m-2]->start_location | Start of penultimate macro map
     187             :   -----------+-------------------------------+-------------------------------
     188             :              | macromap[1]->start_location   | Start of macro map 1
     189             :   -----------+-------------------------------+-------------------------------
     190             :              | macromap[0]->start_location   | Start of macro map 0
     191             :   0x7fffffff | MAX_LOCATION_T                | Also used as a mask for
     192             :              |                               | accessing the ad-hoc data table
     193             :   -----------+-------------------------------+-------------------------------
     194             :   0x80000000 | Start of ad-hoc values; the lower 31 bits are used as an index
     195             :   ...        | into the line_table->location_adhoc_data_map.data array.
     196             :   0xffffffff | UINT_MAX                      |
     197             :   -----------+-------------------------------+-------------------------------
     198             : 
     199             :    Examples of location encoding.
     200             : 
     201             :    Packed ranges
     202             :    =============
     203             : 
     204             :    Consider encoding the location of a token "foo", seen underlined here
     205             :    on line 523, within an ordinary line_map that starts at line 500:
     206             : 
     207             :                  11111111112
     208             :         12345678901234567890
     209             :      522
     210             :      523   return foo + bar;
     211             :                   ^~~
     212             :      524
     213             : 
     214             :    The location's caret and start are both at line 523, column 11; the
     215             :    location's finish is on the same line, at column 13 (an offset of 2
     216             :    columns, for length 3).
     217             : 
     218             :    Line 523 is offset 23 from the starting line of the ordinary line_map.
     219             : 
     220             :    caret == start, and the offset of the finish fits within 5 bits, so
     221             :    this can be stored as a packed range.
     222             : 
     223             :    This is encoded as:
     224             :       ordmap->start
     225             :          + (line_offset << ordmap->m_column_and_range_bits)
     226             :          + (column << ordmap->m_range_bits)
     227             :          + (range_offset);
     228             :    i.e. (for line offset 23, column 11, range offset 2):
     229             :       ordmap->start
     230             :          + (23 << 12)
     231             :          + (11 << 5)
     232             :          + 2;
     233             :    i.e.:
     234             :       ordmap->start + 0x17162
     235             :    assuming that the line_map uses the default of 7 bits for columns and
     236             :    5 bits for packed range (giving 12 bits for m_column_and_range_bits).
     237             : 
     238             : 
     239             :    "Pure" locations
     240             :    ================
     241             : 
     242             :    These are a special case of the above, where
     243             :       caret == start == finish
     244             :    They are stored as packed ranges with offset == 0.
     245             :    For example, the location of the "f" of "foo" could be stored
     246             :    as above, but with range offset 0, giving:
     247             :       ordmap->start
     248             :          + (23 << 12)
     249             :          + (11 << 5)
     250             :          + 0;
     251             :    i.e.:
     252             :       ordmap->start + 0x17160
     253             : 
     254             : 
     255             :    Unoptimized ranges
     256             :    ==================
     257             : 
     258             :    Consider encoding the location of the binary expression
     259             :    below:
     260             : 
     261             :                  11111111112
     262             :         12345678901234567890
     263             :      522
     264             :      523   return foo + bar;
     265             :                   ~~~~^~~~~
     266             :      524
     267             : 
     268             :    The location's caret is at the "+", line 523 column 15, but starts
     269             :    earlier, at the "f" of "foo" at column 11.  The finish is at the "r"
     270             :    of "bar" at column 19.
     271             : 
     272             :    This can't be stored as a packed range since start != caret.
     273             :    Hence it is stored as an ad-hoc location e.g. 0x80000003.
     274             : 
     275             :    Stripping off the top bit gives us an index into the ad-hoc
     276             :    lookaside table:
     277             : 
     278             :      line_table->location_adhoc_data_map.data[0x3]
     279             : 
     280             :    from which the caret, start and finish can be looked up,
     281             :    encoded as "pure" locations:
     282             : 
     283             :      start  == ordmap->start + (23 << 12) + (11 << 5)
     284             :             == ordmap->start + 0x17160  (as above; the "f" of "foo")
     285             : 
     286             :      caret  == ordmap->start + (23 << 12) + (15 << 5)
     287             :             == ordmap->start + 0x171e0
     288             : 
     289             :      finish == ordmap->start + (23 << 12) + (19 << 5)
     290             :             == ordmap->start + 0x17260
     291             : 
     292             :    To further see how location_t works in practice, see the
     293             :    worked example in libcpp/location-example.txt.  */
     294             : typedef unsigned int location_t;
     295             : 
     296             : /* Do not track column numbers higher than this one.  As a result, the
     297             :    range of column_bits is [12, 18] (or 0 if column numbers are
     298             :    disabled).  */
     299             : const unsigned int LINE_MAP_MAX_COLUMN_NUMBER = (1U << 12);
     300             : 
     301             : /* Do not pack ranges if locations get higher than this.
     302             :    If you change this, update:
     303             :      gcc.dg/plugin/location-overflow-test-*.c.  */
     304             : const location_t LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES = 0x50000000;
     305             : 
     306             : /* Do not track column numbers if locations get higher than this.
     307             :    If you change this, update:
     308             :      gcc.dg/plugin/location-overflow-test-*.c.  */
     309             : const location_t LINE_MAP_MAX_LOCATION_WITH_COLS = 0x60000000;
     310             : 
     311             : /* Highest possible source location encoded within an ordinary map.  */
     312             : const location_t LINE_MAP_MAX_LOCATION = 0x70000000;
     313             : 
     314             : /* A range of source locations.
     315             : 
     316             :    Ranges are closed:
     317             :    m_start is the first location within the range,
     318             :    m_finish is the last location within the range.
     319             : 
     320             :    We may need a more compact way to store these, but for now,
     321             :    let's do it the simple way, as a pair.  */
     322             : struct GTY(()) source_range
     323             : {
     324             :   location_t m_start;
     325             :   location_t m_finish;
     326             : 
     327             :   /* We avoid using constructors, since various structs that
     328             :      don't yet have constructors will embed instances of
     329             :      source_range.  */
     330             : 
     331             :   /* Make a source_range from a location_t.  */
     332             :   static source_range from_location (location_t loc)
     333             :   {
     334             :     source_range result;
     335             :     result.m_start = loc;
     336             :     result.m_finish = loc;
     337             :     return result;
     338             :   }
     339             : 
     340             :   /* Make a source_range from a pair of location_t.  */
     341             :   static source_range from_locations (location_t start,
     342             :                                       location_t finish)
     343             :   {
     344             :     source_range result;
     345             :     result.m_start = start;
     346             :     result.m_finish = finish;
     347             :     return result;
     348             :   }
     349             : };
     350             : 
     351             : /* Memory allocation function typedef.  Works like xrealloc.  */
     352             : typedef void *(*line_map_realloc) (void *, size_t);
     353             : 
     354             : /* Memory allocator function that returns the actual allocated size,
     355             :    for a given requested allocation.  */
     356             : typedef size_t (*line_map_round_alloc_size_func) (size_t);
     357             : 
     358             : /* A line_map encodes a sequence of locations.
     359             :    There are two kinds of maps. Ordinary maps and macro expansion
     360             :    maps, a.k.a macro maps.
     361             : 
     362             :    A macro map encodes source locations of tokens that are part of a
     363             :    macro replacement-list, at a macro expansion point. E.g, in:
     364             : 
     365             :             #define PLUS(A,B) A + B
     366             : 
     367             :    No macro map is going to be created there, because we are not at a
     368             :    macro expansion point. We are at a macro /definition/ point. So the
     369             :    locations of the tokens of the macro replacement-list (i.e, A + B)
     370             :    will be locations in an ordinary map, not a macro map.
     371             : 
     372             :    On the other hand, if we later do:
     373             : 
     374             :         int a = PLUS (1,2);
     375             : 
     376             :    The invocation of PLUS here is a macro expansion. So we are at a
     377             :    macro expansion point. The preprocessor expands PLUS (1,2) and
     378             :    replaces it with the tokens of its replacement-list: 1 + 2. A macro
     379             :    map is going to be created to hold (or rather to map, haha ...) the
     380             :    locations of the tokens 1, + and 2. The macro map also records the
     381             :    location of the expansion point of PLUS. That location is mapped in
     382             :    the map that is active right before the location of the invocation
     383             :    of PLUS.  */
     384             : 
     385             : /* This contains GTY mark-up to support precompiled headers.
     386             :    line_map is an abstract class, only derived objects exist.  */
     387             : struct GTY((tag ("0"), desc ("MAP_ORDINARY_P (&%h) ? 1 : 2"))) line_map {
     388             :   location_t start_location;
     389             : 
     390             :   /* Size and alignment is (usually) 4 bytes.  */
     391             : };
     392             : 
     393             : /* An ordinary line map encodes physical source locations. Those
     394             :    physical source locations are called "spelling locations".
     395             :    
     396             :    Physical source file TO_FILE at line TO_LINE at column 0 is represented
     397             :    by the logical START_LOCATION.  TO_LINE+L at column C is represented by
     398             :    START_LOCATION+(L*(1<<m_column_and_range_bits))+(C*1<<m_range_bits), as
     399             :    long as C<(1<<effective range bits), and the result_location is less than
     400             :    the next line_map's start_location.
     401             :    (The top line is line 1 and the leftmost column is column 1; line/column 0
     402             :    means "entire file/line" or "unknown line/column" or "not applicable".)
     403             : 
     404             :    The highest possible source location is MAX_LOCATION_T.  */
     405             : struct GTY((tag ("1"))) line_map_ordinary : public line_map {
     406             :   /* Base class is 4 bytes.  */
     407             : 
     408             :   /* 4 bytes of integers, each 1 byte for easy extraction/insertion.  */
     409             : 
     410             :   /* The reason for creation of this line map.  */
     411             :   ENUM_BITFIELD (lc_reason) reason : 8;
     412             : 
     413             :   /* SYSP is one for a system header, two for a C system header file
     414             :      that therefore needs to be extern "C" protected in C++, and zero
     415             :      otherwise.  This field isn't really needed now that it's in
     416             :      cpp_buffer.  */
     417             :   unsigned char sysp;
     418             : 
     419             :   /* Number of the low-order location_t bits used for column numbers
     420             :      and ranges.  */
     421             :   unsigned int m_column_and_range_bits : 8;
     422             : 
     423             :   /* Number of the low-order "column" bits used for storing short ranges
     424             :      inline, rather than in the ad-hoc table.
     425             :      MSB                                                                 LSB
     426             :      31                                                                    0
     427             :      +-------------------------+-------------------------------------------+
     428             :      |                         |<---map->column_and_range_bits (e.g. 12)-->|
     429             :      +-------------------------+-----------------------+-------------------+
     430             :      |                         | column_and_range_bits | map->range_bits   |
     431             :      |                         |   - range_bits        |                   |
     432             :      +-------------------------+-----------------------+-------------------+
     433             :      | row bits                | effective column bits | short range bits  |
     434             :      |                         |    (e.g. 7)           |   (e.g. 5)        |
     435             :      +-------------------------+-----------------------+-------------------+ */
     436             :   unsigned int m_range_bits : 8;
     437             : 
     438             :   /* Pointer alignment boundary on both 32 and 64-bit systems.  */
     439             : 
     440             :   const char *to_file;
     441             :   linenum_type to_line;
     442             : 
     443             :   /* Location from whence this line map was included.  For regular
     444             :      #includes, this location will be the last location of a map.  For
     445             :      outermost file, this is 0.  For modules it could be anywhere
     446             :      within a map.  */
     447             :   location_t included_from;
     448             : 
     449             :   /* Size is 20 or 24 bytes, no padding  */
     450             : };
     451             : 
     452             : /* This is the highest possible source location encoded within an
     453             :    ordinary or macro map.  */
     454             : const location_t MAX_LOCATION_T = 0x7FFFFFFF;
     455             : 
     456             : struct cpp_hashnode;
     457             : 
     458             : /* A macro line map encodes location of tokens coming from a macro
     459             :    expansion.
     460             :    
     461             :    The offset from START_LOCATION is used to index into
     462             :    MACRO_LOCATIONS; this holds the original location of the token.  */
     463             : struct GTY((tag ("2"))) line_map_macro : public line_map {
     464             :   /* Base is 4 bytes.  */
     465             : 
     466             :   /* The number of tokens inside the replacement-list of MACRO.  */
     467             :   unsigned int n_tokens;
     468             : 
     469             :   /* Pointer alignment boundary.  */
     470             : 
     471             :   /* The cpp macro whose expansion gave birth to this macro map.  */
     472             :   struct cpp_hashnode *
     473             :     GTY ((nested_ptr (union tree_node,
     474             :                       "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
     475             :                       "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
     476             :     macro;
     477             : 
     478             :   /* This array of location is actually an array of pairs of
     479             :      locations. The elements inside it thus look like:
     480             : 
     481             :            x0,y0, x1,y1, x2,y2, ...., xn,yn.
     482             : 
     483             :      where n == n_tokens;
     484             : 
     485             :      Remember that these xI,yI are collected when libcpp is about to
     486             :      expand a given macro.
     487             : 
     488             :      yI is the location in the macro definition, either of the token
     489             :      itself or of a macro parameter that it replaces.
     490             : 
     491             :      Imagine this:
     492             : 
     493             :         #define PLUS(A, B) A + B  <--- #1
     494             : 
     495             :         int a = PLUS (1,2); <--- #2
     496             : 
     497             :      There is a macro map for the expansion of PLUS in #2.  PLUS is
     498             :      expanded into its expansion-list.  The expansion-list is the
     499             :      replacement-list of PLUS where the macro parameters are replaced
     500             :      with their arguments.  So the replacement-list of PLUS is made of
     501             :      the tokens:
     502             : 
     503             :         A, +, B
     504             : 
     505             :      and the expansion-list is made of the tokens:
     506             : 
     507             :         1, +, 2
     508             : 
     509             :      Let's consider the case of token "+".  Its y1 [yI for I == 1] is
     510             :      its spelling location in #1.
     511             : 
     512             :      y0 (thus for token "1") is the spelling location of A in #1.
     513             : 
     514             :      And y2 (of token "2") is the spelling location of B in #1.
     515             : 
     516             :      When the token is /not/ an argument for a macro, xI is the same
     517             :      location as yI.  Otherwise, xI is the location of the token
     518             :      outside this macro expansion.  If this macro was expanded from
     519             :      another macro expansion, xI is a virtual location representing
     520             :      the token in that macro expansion; otherwise, it is the spelling
     521             :      location of the token.
     522             : 
     523             :      Note that a virtual location is a location returned by
     524             :      linemap_add_macro_token.  It encodes the relevant locations (x,y
     525             :      pairs) of that token across the macro expansions from which it
     526             :      (the token) might come from.
     527             : 
     528             :      In the example above x1 (for token "+") is going to be the same
     529             :      as y1.  x0 is the spelling location for the argument token "1",
     530             :      and x2 is the spelling location for the argument token "2".  */
     531             :   location_t * GTY((atomic)) macro_locations;
     532             : 
     533             :   /* This is the location of the expansion point of the current macro
     534             :      map.  It's the location of the macro name.  That location is held
     535             :      by the map that was current right before the current one. It
     536             :      could have been either a macro or an ordinary map, depending on
     537             :      if we are in a nested expansion context not.  */
     538             :   location_t expansion;
     539             : 
     540             :   /* Size is 20 or 32 (4 bytes padding on 64-bit).  */
     541             : };
     542             : 
     543             : #if CHECKING_P && (GCC_VERSION >= 2007)
     544             : 
     545             : /* Assertion macro to be used in line-map code.  */
     546             : #define linemap_assert(EXPR)                  \
     547             :   do {                                                \
     548             :     if (! (EXPR))                             \
     549             :       abort ();                                       \
     550             :   } while (0)
     551             : 
     552             : /* Assert that becomes a conditional expression when checking is disabled at
     553             :    compilation time.  Use this for conditions that should not happen but if
     554             :    they happen, it is better to handle them gracefully rather than crash
     555             :    randomly later.
     556             :    Usage:
     557             : 
     558             :    if (linemap_assert_fails(EXPR)) handle_error(); */
     559             : #define linemap_assert_fails(EXPR) __extension__ \
     560             :   ({linemap_assert (EXPR); false;})
     561             : 
     562             : #else
     563             : /* Include EXPR, so that unused variable warnings do not occur.  */
     564             : #define linemap_assert(EXPR) ((void)(0 && (EXPR)))
     565             : #define linemap_assert_fails(EXPR) (! (EXPR))
     566             : #endif
     567             : 
     568             : /* Get whether location LOC is an ordinary location.  */
     569             : 
     570             : inline bool
     571             : IS_ORDINARY_LOC (location_t loc)
     572             : {
     573             :   return loc < LINE_MAP_MAX_LOCATION;
     574             : }
     575             : 
     576             : /* Get whether location LOC is an ad-hoc location.  */
     577             : 
     578             : inline bool
     579   673950299 : IS_ADHOC_LOC (location_t loc)
     580             : {
     581   673950299 :   return loc > MAX_LOCATION_T;
     582             : }
     583             : 
     584             : /* Categorize line map kinds.  */
     585             : 
     586             : inline bool
     587    16632936 : MAP_ORDINARY_P (const line_map *map)
     588             : {
     589    16632936 :   return IS_ORDINARY_LOC (map->start_location);
     590             : }
     591             : 
     592             : /* Return TRUE if MAP encodes locations coming from a macro
     593             :    replacement-list at macro expansion point.  */
     594             : bool
     595             : linemap_macro_expansion_map_p (const line_map *);
     596             : 
     597             : /* Assert that MAP encodes locations of tokens that are not part of
     598             :    the replacement-list of a macro expansion, downcasting from
     599             :    line_map * to line_map_ordinary *.  */
     600             : 
     601             : inline line_map_ordinary *
     602             : linemap_check_ordinary (line_map *map)
     603             : {
     604             :   linemap_assert (MAP_ORDINARY_P (map));
     605             :   return (line_map_ordinary *)map;
     606             : }
     607             : 
     608             : /* Assert that MAP encodes locations of tokens that are not part of
     609             :    the replacement-list of a macro expansion, downcasting from
     610             :    const line_map * to const line_map_ordinary *.  */
     611             : 
     612             : inline const line_map_ordinary *
     613    15048888 : linemap_check_ordinary (const line_map *map)
     614             : {
     615    15048888 :   linemap_assert (MAP_ORDINARY_P (map));
     616    15048888 :   return (const line_map_ordinary *)map;
     617             : }
     618             : 
     619             : /* Assert that MAP is a macro expansion and downcast to the appropriate
     620             :    subclass.  */
     621             : 
     622             : inline line_map_macro *linemap_check_macro (line_map *map)
     623             : {
     624             :   linemap_assert (!MAP_ORDINARY_P (map));
     625             :   return (line_map_macro *)map;
     626             : }
     627             : 
     628             : /* Assert that MAP is a macro expansion and downcast to the appropriate
     629             :    subclass.  */
     630             : 
     631             : inline const line_map_macro *
     632     1554108 : linemap_check_macro (const line_map *map)
     633             : {
     634     1554108 :   linemap_assert (!MAP_ORDINARY_P (map));
     635     1554108 :   return (const line_map_macro *)map;
     636             : }
     637             : 
     638             : /* Read the start location of MAP.  */
     639             : 
     640             : inline location_t
     641   275196730 : MAP_START_LOCATION (const line_map *map)
     642             : {
     643   242528772 :   return map->start_location;
     644             : }
     645             : 
     646             : /* Get the starting line number of ordinary map MAP.  */
     647             : 
     648             : inline linenum_type
     649       28975 : ORDINARY_MAP_STARTING_LINE_NUMBER (const line_map_ordinary *ord_map)
     650             : {
     651       28975 :   return ord_map->to_line;
     652             : }
     653             : 
     654             : /* Return a positive value if map encodes locations from a system
     655             :    header, 0 otherwise. Returns 1 if ordinary map MAP encodes locations
     656             :    in a system header and 2 if it encodes locations in a C system header
     657             :    that therefore needs to be extern "C" protected in C++.  */
     658             : 
     659             : inline unsigned char
     660             : ORDINARY_MAP_IN_SYSTEM_HEADER_P (const line_map_ordinary *ord_map)
     661             : {
     662             :   return ord_map->sysp;
     663             : }
     664             : 
     665             : /* TRUE if this line map is for a module (not a source file).  */
     666             : 
     667             : inline bool
     668       29940 : MAP_MODULE_P (const line_map *map)
     669             : {
     670       29940 :   return (MAP_ORDINARY_P (map)
     671       29940 :           && linemap_check_ordinary (map)->reason == LC_MODULE);
     672             : }
     673             : 
     674             : /* Get the filename of ordinary map MAP.  */
     675             : 
     676             : inline const char *
     677       57950 : ORDINARY_MAP_FILE_NAME (const line_map_ordinary *ord_map)
     678             : {
     679       57950 :   return ord_map->to_file;
     680             : }
     681             : 
     682             : /* Get the cpp macro whose expansion gave birth to macro map MAP.  */
     683             : 
     684             : inline cpp_hashnode *
     685             : MACRO_MAP_MACRO (const line_map_macro *macro_map)
     686             : {
     687             :   return macro_map->macro;
     688             : }
     689             : 
     690             : /* Get the number of tokens inside the replacement-list of the macro
     691             :    that led to macro map MAP.  */
     692             : 
     693             : inline unsigned int
     694             : MACRO_MAP_NUM_MACRO_TOKENS (const line_map_macro *macro_map)
     695             : {
     696             :   return macro_map->n_tokens;
     697             : }
     698             : 
     699             : /* Get the array of pairs of locations within macro map MAP.
     700             :    See the declaration of line_map_macro for more information.  */
     701             : 
     702             : inline location_t *
     703             : MACRO_MAP_LOCATIONS (const line_map_macro *macro_map)
     704             : {
     705             :   return macro_map->macro_locations;
     706             : }
     707             : 
     708             : /* Get the location of the expansion point of the macro map MAP.  */
     709             : 
     710             : inline location_t
     711           0 : MACRO_MAP_EXPANSION_POINT_LOCATION (const line_map_macro *macro_map)
     712             : {
     713           0 :   return macro_map->expansion;
     714             : }
     715             : 
     716             : /* The abstraction of a set of location maps. There can be several
     717             :    types of location maps. This abstraction contains the attributes
     718             :    that are independent from the type of the map.
     719             : 
     720             :    Essentially this is just a vector of T_linemap_subclass,
     721             :    which can only ever grow in size.  */
     722             : 
     723             : struct GTY(()) maps_info_ordinary {
     724             :   /* This array contains the "ordinary" line maps, for all
     725             :      events other than macro expansion
     726             :      (e.g. when a new preprocessing unit starts or ends).  */
     727             :   line_map_ordinary * GTY ((length ("%h.used"))) maps;
     728             : 
     729             :   /* The total number of allocated maps.  */
     730             :   unsigned int allocated;
     731             : 
     732             :   /* The number of elements used in maps. This number is smaller
     733             :      or equal to ALLOCATED.  */
     734             :   unsigned int used;
     735             : 
     736             :   mutable unsigned int cache;
     737             : };
     738             : 
     739             : struct GTY(()) maps_info_macro {
     740             :   /* This array contains the macro line maps.
     741             :      A macro line map is created whenever a macro expansion occurs.  */
     742             :   line_map_macro * GTY ((length ("%h.used"))) maps;
     743             : 
     744             :   /* The total number of allocated maps.  */
     745             :   unsigned int allocated;
     746             : 
     747             :   /* The number of elements used in maps. This number is smaller
     748             :      or equal to ALLOCATED.  */
     749             :   unsigned int used;
     750             : 
     751             :   mutable unsigned int cache;
     752             : };
     753             : 
     754             : /* Data structure to associate a source_range together with an arbitrary
     755             :    data pointer with a source location.  */
     756             : struct GTY(()) location_adhoc_data {
     757             :   location_t locus;
     758             :   source_range src_range;
     759             :   void * GTY((skip)) data;
     760             :   unsigned discriminator;
     761             : };
     762             : 
     763             : struct htab;
     764             : 
     765             : /* The following data structure encodes a location with some adhoc data
     766             :    and maps it to a new unsigned integer (called an adhoc location)
     767             :    that replaces the original location to represent the mapping.
     768             : 
     769             :    The new adhoc_loc uses the highest bit as the enabling bit, i.e. if the
     770             :    highest bit is 1, then the number is adhoc_loc. Otherwise, it serves as
     771             :    the original location. Once identified as the adhoc_loc, the lower 31
     772             :    bits of the integer is used to index the location_adhoc_data array,
     773             :    in which the locus and associated data is stored.  */
     774             : 
     775             : struct GTY(()) location_adhoc_data_map {
     776             :   struct htab * GTY((skip)) htab;
     777             :   location_t curr_loc;
     778             :   unsigned int allocated;
     779             :   struct location_adhoc_data GTY((length ("%h.allocated"))) *data;
     780             : };
     781             : 
     782             : /* A set of chronological line_map structures.  */
     783             : class GTY(()) line_maps {
     784             : public:
     785             : 
     786             :   ~line_maps ();
     787             :   
     788             :   maps_info_ordinary info_ordinary;
     789             : 
     790             :   maps_info_macro info_macro;
     791             : 
     792             :   /* Depth of the include stack, including the current file.  */
     793             :   unsigned int depth;
     794             : 
     795             :   /* If true, prints an include trace a la -H.  */
     796             :   bool trace_includes;
     797             : 
     798             :   /* True if we've seen a #line or # 44 "file" directive.  */
     799             :   bool seen_line_directive;
     800             : 
     801             :   /* Highest location_t "given out".  */
     802             :   location_t highest_location;
     803             : 
     804             :   /* Start of line of highest location_t "given out".  */
     805             :   location_t highest_line;
     806             : 
     807             :   /* The maximum column number we can quickly allocate.  Higher numbers
     808             :      may require allocating a new line_map.  */
     809             :   unsigned int max_column_hint;
     810             : 
     811             :   /* The allocator to use when resizing 'maps', defaults to xrealloc.  */
     812             :   line_map_realloc GTY((callback)) reallocator;
     813             : 
     814             :   /* The allocators' function used to know the actual size it
     815             :      allocated, for a certain allocation size requested.  */
     816             :   line_map_round_alloc_size_func GTY((callback)) round_alloc_size;
     817             : 
     818             :   struct location_adhoc_data_map location_adhoc_data_map;
     819             : 
     820             :   /* The special location value that is used as spelling location for
     821             :      built-in tokens.  */
     822             :   location_t builtin_location;
     823             : 
     824             :   /* The default value of range_bits in ordinary line maps.  */
     825             :   unsigned int default_range_bits;
     826             : 
     827             :   unsigned int num_optimized_ranges;
     828             :   unsigned int num_unoptimized_ranges;
     829             : };
     830             : 
     831             : /* Returns the number of allocated maps so far. MAP_KIND shall be TRUE
     832             :    if we are interested in macro maps, FALSE otherwise.  */
     833             : inline unsigned int
     834             : LINEMAPS_ALLOCATED (const line_maps *set, bool map_kind)
     835             : {
     836             :   if (map_kind)
     837             :     return set->info_macro.allocated;
     838             :   else
     839             :     return set->info_ordinary.allocated;
     840             : }
     841             : 
     842             : /* As above, but by reference (e.g. as an lvalue).  */
     843             : 
     844             : inline unsigned int &
     845             : LINEMAPS_ALLOCATED (line_maps *set, bool map_kind)
     846             : {
     847             :   if (map_kind)
     848             :     return set->info_macro.allocated;
     849             :   else
     850             :     return set->info_ordinary.allocated;
     851             : }
     852             : 
     853             : /* Returns the number of used maps so far. MAP_KIND shall be TRUE if
     854             :    we are interested in macro maps, FALSE otherwise.*/
     855             : inline unsigned int
     856    32748918 : LINEMAPS_USED (const line_maps *set, bool map_kind)
     857             : {
     858    32748918 :   if (map_kind)
     859    32668189 :     return set->info_macro.used;
     860             :   else
     861       80729 :     return set->info_ordinary.used;
     862             : }
     863             : 
     864             : /* As above, but by reference (e.g. as an lvalue).  */
     865             : 
     866             : inline unsigned int &
     867             : LINEMAPS_USED (line_maps *set, bool map_kind)
     868             : {
     869             :   if (map_kind)
     870             :     return set->info_macro.used;
     871             :   else
     872             :     return set->info_ordinary.used;
     873             : }
     874             : 
     875             : /* Returns the index of the last map that was looked up with
     876             :    linemap_lookup. MAP_KIND shall be TRUE if we are interested in
     877             :    macro maps, FALSE otherwise.  */
     878             : inline unsigned int &
     879             : LINEMAPS_CACHE (const line_maps *set, bool map_kind)
     880             : {
     881             :   if (map_kind)
     882             :     return set->info_macro.cache;
     883             :   else
     884             :     return set->info_ordinary.cache;
     885             : }
     886             : 
     887             : /* Return the map at a given index.  */
     888             : inline line_map *
     889    32748033 : LINEMAPS_MAP_AT (const line_maps *set, bool map_kind, int index)
     890             : {
     891    32748033 :   if (map_kind)
     892    32667958 :     return &set->info_macro.maps[index];
     893             :   else
     894       80075 :     return &set->info_ordinary.maps[index];
     895             : }
     896             : 
     897             : /* Returns the last map used in the line table SET. MAP_KIND
     898             :    shall be TRUE if we are interested in macro maps, FALSE
     899             :    otherwise.*/
     900             : inline line_map *
     901    32667958 : LINEMAPS_LAST_MAP (const line_maps *set, bool map_kind)
     902             : {
     903    32667958 :   return LINEMAPS_MAP_AT (set, map_kind,
     904    32667958 :                           LINEMAPS_USED (set, map_kind) - 1);
     905             : }
     906             : 
     907             : /* Returns the last map that was allocated in the line table SET.
     908             :    MAP_KIND shall be TRUE if we are interested in macro maps, FALSE
     909             :    otherwise.*/
     910             : inline line_map *
     911             : LINEMAPS_LAST_ALLOCATED_MAP (const line_maps *set, bool map_kind)
     912             : {
     913             :   return LINEMAPS_MAP_AT (set, map_kind,
     914             :                           LINEMAPS_ALLOCATED (set, map_kind) - 1);
     915             : }
     916             : 
     917             : /* Returns a pointer to the memory region where ordinary maps are
     918             :    allocated in the line table SET.  */
     919             : inline line_map_ordinary *
     920             : LINEMAPS_ORDINARY_MAPS (const line_maps *set)
     921             : {
     922             :   return set->info_ordinary.maps;
     923             : }
     924             : 
     925             : /* Returns the INDEXth ordinary map.  */
     926             : inline line_map_ordinary *
     927       80075 : LINEMAPS_ORDINARY_MAP_AT (const line_maps *set, int index)
     928             : {
     929       80075 :   linemap_assert (index >= 0
     930             :                   && (unsigned int)index < LINEMAPS_USED (set, false));
     931       80075 :   return (line_map_ordinary *)LINEMAPS_MAP_AT (set, false, index);
     932             : }
     933             : 
     934             : /* Return the number of ordinary maps allocated in the line table
     935             :    SET.  */
     936             : inline unsigned int
     937             : LINEMAPS_ORDINARY_ALLOCATED (const line_maps *set)
     938             : {
     939             :   return LINEMAPS_ALLOCATED (set, false);
     940             : }
     941             : 
     942             : /* Return the number of ordinary maps used in the line table SET.  */
     943             : inline unsigned int
     944         654 : LINEMAPS_ORDINARY_USED (const line_maps *set)
     945             : {
     946         654 :   return LINEMAPS_USED (set, false);
     947             : }
     948             : 
     949             : /* Return the index of the last ordinary map that was looked up with
     950             :    linemap_lookup.  */
     951             : inline unsigned int &
     952             : LINEMAPS_ORDINARY_CACHE (const line_maps *set)
     953             : {
     954             :   return LINEMAPS_CACHE (set, false);
     955             : }
     956             : 
     957             : /* Returns a pointer to the last ordinary map used in the line table
     958             :    SET.  */
     959             : inline line_map_ordinary *
     960             : LINEMAPS_LAST_ORDINARY_MAP (const line_maps *set)
     961             : {
     962             :   return (line_map_ordinary *)LINEMAPS_LAST_MAP (set, false);
     963             : }
     964             : 
     965             : /* Returns a pointer to the last ordinary map allocated the line table
     966             :    SET.  */
     967             : inline line_map_ordinary *
     968             : LINEMAPS_LAST_ALLOCATED_ORDINARY_MAP (const line_maps *set)
     969             : {
     970             :   return (line_map_ordinary *)LINEMAPS_LAST_ALLOCATED_MAP (set, false);
     971             : }
     972             : 
     973             : /* Returns a pointer to the beginning of the region where macro maps
     974             :    are allocated.  */
     975             : inline line_map_macro *
     976             : LINEMAPS_MACRO_MAPS (const line_maps *set)
     977             : {
     978             :   return set->info_macro.maps;
     979             : }
     980             : 
     981             : /* Returns the INDEXth macro map.  */
     982             : inline line_map_macro *
     983             : LINEMAPS_MACRO_MAP_AT (const line_maps *set, int index)
     984             : {
     985             :   linemap_assert (index >= 0
     986             :                   && (unsigned int)index < LINEMAPS_USED (set, true));
     987             :   return (line_map_macro *)LINEMAPS_MAP_AT (set, true, index);
     988             : }
     989             : 
     990             : /* Returns the number of macro maps that were allocated in the line
     991             :    table SET.  */
     992             : inline unsigned int
     993             : LINEMAPS_MACRO_ALLOCATED (const line_maps *set)
     994             : {
     995             :   return LINEMAPS_ALLOCATED (set, true);
     996             : }
     997             : 
     998             : /* Returns the number of macro maps used in the line table SET.  */
     999             : inline unsigned int
    1000    32668189 : LINEMAPS_MACRO_USED (const line_maps *set)
    1001             : {
    1002    32668189 :   return LINEMAPS_USED (set, true);
    1003             : }
    1004             : 
    1005             : /* Return the index of the last macro map that was looked up with
    1006             :    linemap_lookup.  */
    1007             : inline unsigned int &
    1008             : LINEMAPS_MACRO_CACHE (const line_maps *set)
    1009             : {
    1010             :   return LINEMAPS_CACHE (set, true);
    1011             : }
    1012             : 
    1013             : /* Returns the last macro map used in the line table SET.  */
    1014             : inline line_map_macro *
    1015    32667958 : LINEMAPS_LAST_MACRO_MAP (const line_maps *set)
    1016             : {
    1017    32667958 :   return (line_map_macro *)LINEMAPS_LAST_MAP (set, true);
    1018             : }
    1019             : 
    1020             : /* Returns the lowest location [of a token resulting from macro
    1021             :    expansion] encoded in this line table.  */
    1022             : inline location_t
    1023    32668189 : LINEMAPS_MACRO_LOWEST_LOCATION (const line_maps *set)
    1024             : {
    1025    32668189 :   return LINEMAPS_MACRO_USED (set)
    1026    32668189 :          ? MAP_START_LOCATION (LINEMAPS_LAST_MACRO_MAP (set))
    1027             :          : MAX_LOCATION_T + 1;
    1028             : }
    1029             : 
    1030             : /* Returns the last macro map allocated in the line table SET.  */
    1031             : inline line_map_macro *
    1032             : LINEMAPS_LAST_ALLOCATED_MACRO_MAP (const line_maps *set)
    1033             : {
    1034             :   return (line_map_macro *)LINEMAPS_LAST_ALLOCATED_MAP (set, true);
    1035             : }
    1036             : 
    1037             : extern location_t get_combined_adhoc_loc (line_maps *, location_t,
    1038             :                                           source_range, void *, unsigned);
    1039             : extern void *get_data_from_adhoc_loc (const line_maps *, location_t);
    1040             : extern unsigned get_discriminator_from_adhoc_loc (const line_maps *, location_t);
    1041             : extern location_t get_location_from_adhoc_loc (const line_maps *,
    1042             :                                                location_t);
    1043             : 
    1044             : extern source_range get_range_from_loc (line_maps *set, location_t loc);
    1045             : extern unsigned get_discriminator_from_loc (line_maps *set, location_t loc);
    1046             : 
    1047             : /* Get whether location LOC is a "pure" location, or
    1048             :    whether it is an ad-hoc location, or embeds range information.  */
    1049             : 
    1050             : bool
    1051             : pure_location_p (line_maps *set, location_t loc);
    1052             : 
    1053             : /* Given location LOC within SET, strip away any packed range information
    1054             :    or ad-hoc information.  */
    1055             : 
    1056             : extern location_t get_pure_location (line_maps *set, location_t loc);
    1057             : 
    1058             : /* Combine LOC and BLOCK, giving a combined adhoc location.  */
    1059             : 
    1060             : inline location_t
    1061             : COMBINE_LOCATION_DATA (class line_maps *set,
    1062             :                        location_t loc,
    1063             :                        source_range src_range,
    1064             :                        void *block,
    1065             :                        unsigned discriminator)
    1066             : {
    1067             :   return get_combined_adhoc_loc (set, loc, src_range, block, discriminator);
    1068             : }
    1069             : 
    1070             : extern void rebuild_location_adhoc_htab (class line_maps *);
    1071             : 
    1072             : /* Initialize a line map set.  SET is the line map set to initialize
    1073             :    and BUILTIN_LOCATION is the special location value to be used as
    1074             :    spelling location for built-in tokens.  This BUILTIN_LOCATION has
    1075             :    to be strictly less than RESERVED_LOCATION_COUNT.  */
    1076             : extern void linemap_init (class line_maps *set,
    1077             :                           location_t builtin_location);
    1078             : 
    1079             : /* Check for and warn about line_maps entered but not exited.  */
    1080             : 
    1081             : extern void linemap_check_files_exited (class line_maps *);
    1082             : 
    1083             : /* Return a location_t for the start (i.e. column==0) of
    1084             :    (physical) line TO_LINE in the current source file (as in the
    1085             :    most recent linemap_add).   MAX_COLUMN_HINT is the highest column
    1086             :    number we expect to use in this line (but it does not change
    1087             :    the highest_location).  */
    1088             : 
    1089             : extern location_t linemap_line_start
    1090             : (class line_maps *set, linenum_type to_line,  unsigned int max_column_hint);
    1091             : 
    1092             : /* Allocate a raw block of line maps, zero initialized.  */
    1093             : extern line_map *line_map_new_raw (line_maps *, bool, unsigned);
    1094             : 
    1095             : /* Add a mapping of logical source line to physical source file and
    1096             :    line number. This function creates an "ordinary map", which is a
    1097             :    map that records locations of tokens that are not part of macro
    1098             :    replacement-lists present at a macro expansion point.
    1099             : 
    1100             :    The text pointed to by TO_FILE must have a lifetime
    1101             :    at least as long as the lifetime of SET.  An empty
    1102             :    TO_FILE means standard input.  If reason is LC_LEAVE, and
    1103             :    TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their
    1104             :    natural values considering the file we are returning to.
    1105             : 
    1106             :    A call to this function can relocate the previous set of
    1107             :    maps, so any stored line_map pointers should not be used.  */
    1108             : extern const line_map *linemap_add
    1109             :   (class line_maps *, enum lc_reason, unsigned int sysp,
    1110             :    const char *to_file, linenum_type to_line);
    1111             : 
    1112             : /* Create a macro map.  A macro map encodes source locations of tokens
    1113             :    that are part of a macro replacement-list, at a macro expansion
    1114             :    point. See the extensive comments of struct line_map and struct
    1115             :    line_map_macro, in line-map.h.
    1116             : 
    1117             :    This map shall be created when the macro is expanded. The map
    1118             :    encodes the source location of the expansion point of the macro as
    1119             :    well as the "original" source location of each token that is part
    1120             :    of the macro replacement-list. If a macro is defined but never
    1121             :    expanded, it has no macro map.  SET is the set of maps the macro
    1122             :    map should be part of.  MACRO_NODE is the macro which the new macro
    1123             :    map should encode source locations for.  EXPANSION is the location
    1124             :    of the expansion point of MACRO. For function-like macros
    1125             :    invocations, it's best to make it point to the closing parenthesis
    1126             :    of the macro, rather than the the location of the first character
    1127             :    of the macro.  NUM_TOKENS is the number of tokens that are part of
    1128             :    the replacement-list of MACRO.  */
    1129             : const line_map_macro *linemap_enter_macro (line_maps *, cpp_hashnode *,
    1130             :                                            location_t, unsigned int);
    1131             : 
    1132             : /* Create a source location for a module.  The creator must either do
    1133             :    this after the TU is tokenized, or deal with saving and restoring
    1134             :    map state.  */
    1135             : 
    1136             : extern location_t linemap_module_loc
    1137             :   (line_maps *, location_t from, const char *name);
    1138             : extern void linemap_module_reparent
    1139             :   (line_maps *, location_t loc, location_t new_parent);
    1140             : 
    1141             : /* Restore the linemap state such that the map at LWM-1 continues.
    1142             :    Return start location of the new map.  */
    1143             : extern unsigned linemap_module_restore
    1144             :   (line_maps *, unsigned lwm);
    1145             : 
    1146             : /* Given a logical source location, returns the map which the
    1147             :    corresponding (source file, line, column) triplet can be deduced
    1148             :    from. Since the set is built chronologically, the logical lines are
    1149             :    monotonic increasing, and so the list is sorted and we can use a
    1150             :    binary search. If no line map have been allocated yet, this
    1151             :    function returns NULL.  */
    1152             : extern const line_map *linemap_lookup
    1153             :   (const line_maps *, location_t);
    1154             : 
    1155             : unsigned linemap_lookup_macro_index (const line_maps *, location_t);
    1156             : 
    1157             : /* Returns TRUE if the line table set tracks token locations across
    1158             :    macro expansion, FALSE otherwise.  */
    1159             : bool linemap_tracks_macro_expansion_locs_p (class line_maps *);
    1160             : 
    1161             : /* Return the name of the macro associated to MACRO_MAP.  */
    1162             : const char* linemap_map_get_macro_name (const line_map_macro *);
    1163             : 
    1164             : /* Return a positive value if LOCATION is the locus of a token that is
    1165             :    located in a system header, O otherwise. It returns 1 if LOCATION
    1166             :    is the locus of a token that is located in a system header, and 2
    1167             :    if LOCATION is the locus of a token located in a C system header
    1168             :    that therefore needs to be extern "C" protected in C++.
    1169             : 
    1170             :    Note that this function returns 1 if LOCATION belongs to a token
    1171             :    that is part of a macro replacement-list defined in a system
    1172             :    header, but expanded in a non-system file.  */
    1173             : int linemap_location_in_system_header_p (class line_maps *,
    1174             :                                          location_t);
    1175             : 
    1176             : /* Return TRUE if LOCATION is a source code location of a token that is part of
    1177             :    a macro expansion, FALSE otherwise.  */
    1178             : bool linemap_location_from_macro_expansion_p (const line_maps *,
    1179             :                                               location_t);
    1180             : 
    1181             : /* TRUE if LOCATION is a source code location of a token that is part of the
    1182             :    definition of a macro, FALSE otherwise.  */
    1183             : bool linemap_location_from_macro_definition_p (class line_maps *,
    1184             :                                                location_t);
    1185             : 
    1186             : /* With the precondition that LOCATION is the locus of a token that is
    1187             :    an argument of a function-like macro MACRO_MAP and appears in the
    1188             :    expansion of MACRO_MAP, return the locus of that argument in the
    1189             :    context of the caller of MACRO_MAP.  */
    1190             : 
    1191             : extern location_t linemap_macro_map_loc_unwind_toward_spelling
    1192             :   (line_maps *set, const line_map_macro *macro_map, location_t location);
    1193             : 
    1194             : /* location_t values from 0 to RESERVED_LOCATION_COUNT-1 will
    1195             :    be reserved for libcpp user as special values, no token from libcpp
    1196             :    will contain any of those locations.  */
    1197             : const location_t RESERVED_LOCATION_COUNT = 2;
    1198             : 
    1199             : /* Converts a map and a location_t to source line.  */
    1200             : inline linenum_type
    1201             : SOURCE_LINE (const line_map_ordinary *ord_map, location_t loc)
    1202             : {
    1203             :   return ((loc - ord_map->start_location)
    1204             :           >> ord_map->m_column_and_range_bits) + ord_map->to_line;
    1205             : }
    1206             : 
    1207             : /* Convert a map and location_t to source column number.  */
    1208             : inline linenum_type
    1209          28 : SOURCE_COLUMN (const line_map_ordinary *ord_map, location_t loc)
    1210             : {
    1211          28 :   return ((loc - ord_map->start_location)
    1212          28 :           & ((1 << ord_map->m_column_and_range_bits) - 1)) >> ord_map->m_range_bits;
    1213             : }
    1214             : 
    1215             : 
    1216             : inline location_t
    1217       62366 : linemap_included_from (const line_map_ordinary *ord_map)
    1218             : {
    1219       62366 :   return ord_map->included_from;
    1220             : }
    1221             : 
    1222             : /* The linemap containing the included-from location of MAP.  */
    1223             : const line_map_ordinary *linemap_included_from_linemap
    1224             :   (line_maps *set, const line_map_ordinary *map);
    1225             : 
    1226             : /* True if the map is at the bottom of the include stack.  */
    1227             : 
    1228             : inline bool
    1229          96 : MAIN_FILE_P (const line_map_ordinary *ord_map)
    1230             : {
    1231          96 :   return ord_map->included_from == 0;
    1232             : }
    1233             : 
    1234             : /* Encode and return a location_t from a column number. The
    1235             :    source line considered is the last source line used to call
    1236             :    linemap_line_start, i.e, the last source line which a location was
    1237             :    encoded from.  */
    1238             : extern location_t
    1239             : linemap_position_for_column (class line_maps *, unsigned int);
    1240             : 
    1241             : /* Encode and return a source location from a given line and
    1242             :    column.  */
    1243             : location_t
    1244             : linemap_position_for_line_and_column (line_maps *set,
    1245             :                                       const line_map_ordinary *,
    1246             :                                       linenum_type, unsigned int);
    1247             : 
    1248             : /* Encode and return a location_t starting from location LOC and
    1249             :    shifting it by OFFSET columns.  This function does not support
    1250             :    virtual locations.  */
    1251             : location_t
    1252             : linemap_position_for_loc_and_offset (class line_maps *set,
    1253             :                                      location_t loc,
    1254             :                                      unsigned int offset);
    1255             : 
    1256             : /* Return the file this map is for.  */
    1257             : inline const char *
    1258             : LINEMAP_FILE (const line_map_ordinary *ord_map)
    1259             : {
    1260             :   return ord_map->to_file;
    1261             : }
    1262             : 
    1263             : /* Return the line number this map started encoding location from.  */
    1264             : inline linenum_type
    1265             : LINEMAP_LINE (const line_map_ordinary *ord_map)
    1266             : {
    1267             :   return ord_map->to_line;
    1268             : }
    1269             : 
    1270             : /* Return a positive value if map encodes locations from a system
    1271             :    header, 0 otherwise. Returns 1 if MAP encodes locations in a
    1272             :    system header and 2 if it encodes locations in a C system header
    1273             :    that therefore needs to be extern "C" protected in C++.  */
    1274             : inline unsigned char
    1275             : LINEMAP_SYSP (const line_map_ordinary *ord_map)
    1276             : {
    1277             :   return ord_map->sysp;
    1278             : }
    1279             : 
    1280             : const struct line_map *first_map_in_common (line_maps *set,
    1281             :                                             location_t loc0,
    1282             :                                             location_t loc1,
    1283             :                                             location_t *res_loc0,
    1284             :                                             location_t *res_loc1);
    1285             : 
    1286             : /* Return a positive value if PRE denotes the location of a token that
    1287             :    comes before the token of POST, 0 if PRE denotes the location of
    1288             :    the same token as the token for POST, and a negative value
    1289             :    otherwise.  */
    1290             : int linemap_compare_locations (class line_maps *set,
    1291             :                                location_t   pre,
    1292             :                                location_t   post);
    1293             : 
    1294             : /* Return TRUE if LOC_A denotes the location a token that comes
    1295             :    topogically before the token denoted by location LOC_B, or if they
    1296             :    are equal.  */
    1297             : inline bool
    1298    68114486 : linemap_location_before_p (class line_maps *set,
    1299             :                            location_t loc_a,
    1300             :                            location_t loc_b)
    1301             : {
    1302    68114486 :   return linemap_compare_locations (set, loc_a, loc_b) >= 0;
    1303             : }
    1304             : 
    1305             : typedef struct
    1306             : {
    1307             :   /* The name of the source file involved.  */
    1308             :   const char *file;
    1309             : 
    1310             :   /* The line-location in the source file.  */
    1311             :   int line;
    1312             : 
    1313             :   int column;
    1314             : 
    1315             :   void *data;
    1316             : 
    1317             :   /* In a system header?. */
    1318             :   bool sysp;
    1319             : } expanded_location;
    1320             : 
    1321             : class range_label;
    1322             : 
    1323             : /* A hint to diagnostic_show_locus on how to print a source range within a
    1324             :    rich_location.
    1325             : 
    1326             :    Typically this is SHOW_RANGE_WITH_CARET for the 0th range, and
    1327             :    SHOW_RANGE_WITHOUT_CARET for subsequent ranges,
    1328             :    but the Fortran frontend uses SHOW_RANGE_WITH_CARET repeatedly for
    1329             :    printing things like:
    1330             : 
    1331             :        x = x + y
    1332             :            1   2
    1333             :        Error: Shapes for operands at (1) and (2) are not conformable
    1334             : 
    1335             :    where "1" and "2" are notionally carets.  */
    1336             : 
    1337             : enum range_display_kind
    1338             : {
    1339             :   /* Show the pertinent source line(s), the caret, and underline(s).  */
    1340             :   SHOW_RANGE_WITH_CARET,
    1341             : 
    1342             :   /* Show the pertinent source line(s) and underline(s), but don't
    1343             :      show the caret (just an underline).  */
    1344             :   SHOW_RANGE_WITHOUT_CARET,
    1345             : 
    1346             :   /* Just show the source lines; don't show the range itself.
    1347             :      This is for use when displaying some line-insertion fix-it hints (for
    1348             :      showing the user context on the change, for when it doesn't make sense
    1349             :      to highlight the first column on the next line).  */
    1350             :   SHOW_LINES_WITHOUT_RANGE
    1351             : };
    1352             : 
    1353             : /* A location within a rich_location: a caret&range, with
    1354             :    the caret potentially flagged for display, and an optional
    1355             :    label.  */
    1356             : 
    1357             : struct location_range
    1358             : {
    1359             :   location_t m_loc;
    1360             : 
    1361             :   enum range_display_kind m_range_display_kind;
    1362             : 
    1363             :   /* If non-NULL, the label for this range.  */
    1364             :   const range_label *m_label;
    1365             : };
    1366             : 
    1367             : /* A partially-embedded vec for use within rich_location for storing
    1368             :    ranges and fix-it hints.
    1369             : 
    1370             :    Elements [0..NUM_EMBEDDED) are allocated within m_embed, after
    1371             :    that they are within the dynamically-allocated m_extra.
    1372             : 
    1373             :    This allows for static allocation in the common case, whilst
    1374             :    supporting the rarer case of an arbitrary number of elements.
    1375             : 
    1376             :    Dynamic allocation is not performed unless it's needed.  */
    1377             : 
    1378             : template <typename T, int NUM_EMBEDDED>
    1379             : class semi_embedded_vec
    1380             : {
    1381             :  public:
    1382             :   semi_embedded_vec ();
    1383             :   ~semi_embedded_vec ();
    1384             : 
    1385             :   unsigned int count () const { return m_num; }
    1386             :   T& operator[] (int idx);
    1387             :   const T& operator[] (int idx) const;
    1388             : 
    1389             :   void push (const T&);
    1390             :   void truncate (int len);
    1391             : 
    1392             :  private:
    1393             :   int m_num;
    1394             :   T m_embedded[NUM_EMBEDDED];
    1395             :   int m_alloc;
    1396             :   T *m_extra;
    1397             : };
    1398             : 
    1399             : /* Constructor for semi_embedded_vec.  In particular, no dynamic allocation
    1400             :    is done.  */
    1401             : 
    1402             : template <typename T, int NUM_EMBEDDED>
    1403             : semi_embedded_vec<T, NUM_EMBEDDED>::semi_embedded_vec ()
    1404             : : m_num (0), m_alloc (0), m_extra (NULL)
    1405             : {
    1406             : }
    1407             : 
    1408             : /* semi_embedded_vec's dtor.  Release any dynamically-allocated memory.  */
    1409             : 
    1410             : template <typename T, int NUM_EMBEDDED>
    1411             : semi_embedded_vec<T, NUM_EMBEDDED>::~semi_embedded_vec ()
    1412             : {
    1413             :   XDELETEVEC (m_extra);
    1414             : }
    1415             : 
    1416             : /* Look up element IDX, mutably.  */
    1417             : 
    1418             : template <typename T, int NUM_EMBEDDED>
    1419             : T&
    1420             : semi_embedded_vec<T, NUM_EMBEDDED>::operator[] (int idx)
    1421             : {
    1422             :   linemap_assert (idx < m_num);
    1423             :   if (idx < NUM_EMBEDDED)
    1424             :     return m_embedded[idx];
    1425             :   else
    1426             :     {
    1427             :       linemap_assert (m_extra != NULL);
    1428             :       return m_extra[idx - NUM_EMBEDDED];
    1429             :     }
    1430             : }
    1431             : 
    1432             : /* Look up element IDX (const).  */
    1433             : 
    1434             : template <typename T, int NUM_EMBEDDED>
    1435             : const T&
    1436             : semi_embedded_vec<T, NUM_EMBEDDED>::operator[] (int idx) const
    1437             : {
    1438             :   linemap_assert (idx < m_num);
    1439             :   if (idx < NUM_EMBEDDED)
    1440             :     return m_embedded[idx];
    1441             :   else
    1442             :     {
    1443             :       linemap_assert (m_extra != NULL);
    1444             :       return m_extra[idx - NUM_EMBEDDED];
    1445             :     }
    1446             : }
    1447             : 
    1448             : /* Append VALUE to the end of the semi_embedded_vec.  */
    1449             : 
    1450             : template <typename T, int NUM_EMBEDDED>
    1451             : void
    1452             : semi_embedded_vec<T, NUM_EMBEDDED>::push (const T& value)
    1453             : {
    1454             :   int idx = m_num++;
    1455             :   if (idx < NUM_EMBEDDED)
    1456             :     m_embedded[idx] = value;
    1457             :   else
    1458             :     {
    1459             :       /* Offset "idx" to be an index within m_extra.  */
    1460             :       idx -= NUM_EMBEDDED;
    1461             :       if (NULL == m_extra)
    1462             :         {
    1463             :           linemap_assert (m_alloc == 0);
    1464             :           m_alloc = 16;
    1465             :           m_extra = XNEWVEC (T, m_alloc);
    1466             :         }
    1467             :       else if (idx >= m_alloc)
    1468             :         {
    1469             :           linemap_assert (m_alloc > 0);
    1470             :           m_alloc *= 2;
    1471             :           m_extra = XRESIZEVEC (T, m_extra, m_alloc);
    1472             :         }
    1473             :       linemap_assert (m_extra);
    1474             :       linemap_assert (idx < m_alloc);
    1475             :       m_extra[idx] = value;
    1476             :     }
    1477             : }
    1478             : 
    1479             : /* Truncate to length LEN.  No deallocation is performed.  */
    1480             : 
    1481             : template <typename T, int NUM_EMBEDDED>
    1482             : void
    1483             : semi_embedded_vec<T, NUM_EMBEDDED>::truncate (int len)
    1484             : {
    1485             :   linemap_assert (len <= m_num);
    1486             :   m_num = len;
    1487             : }
    1488             : 
    1489             : class fixit_hint;
    1490             : class diagnostic_path;
    1491             : 
    1492             : /* A "rich" source code location, for use when printing diagnostics.
    1493             :    A rich_location has one or more carets&ranges, where the carets
    1494             :    are optional.  These are referred to as "ranges" from here.
    1495             :    Typically the zeroth range has a caret; other ranges sometimes
    1496             :    have carets.
    1497             : 
    1498             :    The "primary" location of a rich_location is the caret of range 0,
    1499             :    used for determining the line/column when printing diagnostic
    1500             :    text, such as:
    1501             : 
    1502             :       some-file.c:3:1: error: ...etc...
    1503             : 
    1504             :    Additional ranges may be added to help the user identify other
    1505             :    pertinent clauses in a diagnostic.
    1506             : 
    1507             :    Ranges can (optionally) be given labels via class range_label.
    1508             : 
    1509             :    rich_location instances are intended to be allocated on the stack
    1510             :    when generating diagnostics, and to be short-lived.
    1511             : 
    1512             :    Examples of rich locations
    1513             :    --------------------------
    1514             : 
    1515             :    Example A
    1516             :    *********
    1517             :       int i = "foo";
    1518             :               ^
    1519             :    This "rich" location is simply a single range (range 0), with
    1520             :    caret = start = finish at the given point.
    1521             : 
    1522             :    Example B
    1523             :    *********
    1524             :       a = (foo && bar)
    1525             :           ~~~~~^~~~~~~
    1526             :    This rich location has a single range (range 0), with the caret
    1527             :    at the first "&", and the start/finish at the parentheses.
    1528             :    Compare with example C below.
    1529             : 
    1530             :    Example C
    1531             :    *********
    1532             :       a = (foo && bar)
    1533             :            ~~~ ^~ ~~~
    1534             :    This rich location has three ranges:
    1535             :    - Range 0 has its caret and start location at the first "&" and
    1536             :      end at the second "&.
    1537             :    - Range 1 has its start and finish at the "f" and "o" of "foo";
    1538             :      the caret is not flagged for display, but is perhaps at the "f"
    1539             :      of "foo".
    1540             :    - Similarly, range 2 has its start and finish at the "b" and "r" of
    1541             :      "bar"; the caret is not flagged for display, but is perhaps at the
    1542             :      "b" of "bar".
    1543             :    Compare with example B above.
    1544             : 
    1545             :    Example D (Fortran frontend)
    1546             :    ****************************
    1547             :        x = x + y
    1548             :            1   2
    1549             :    This rich location has range 0 at "1", and range 1 at "2".
    1550             :    Both are flagged for caret display.  Both ranges have start/finish
    1551             :    equal to their caret point.  The frontend overrides the diagnostic
    1552             :    context's default caret character for these ranges.
    1553             : 
    1554             :    Example E (range labels)
    1555             :    ************************
    1556             :       printf ("arg0: %i  arg1: %s arg2: %i",
    1557             :                                ^~
    1558             :                                |
    1559             :                                const char *
    1560             :               100, 101, 102);
    1561             :                    ~~~
    1562             :                    |
    1563             :                    int
    1564             :    This rich location has two ranges:
    1565             :    - range 0 is at the "%s" with start = caret = "%" and finish at
    1566             :      the "s".  It has a range_label ("const char *").
    1567             :    - range 1 has start/finish covering the "101" and is not flagged for
    1568             :      caret printing.  The caret is at the start of "101", where its
    1569             :      range_label is printed ("int").
    1570             : 
    1571             :    Fix-it hints
    1572             :    ------------
    1573             : 
    1574             :    Rich locations can also contain "fix-it hints", giving suggestions
    1575             :    for the user on how to edit their code to fix a problem.  These
    1576             :    can be expressed as insertions, replacements, and removals of text.
    1577             :    The edits by default are relative to the zeroth range within the
    1578             :    rich_location, but optionally they can be expressed relative to
    1579             :    other locations (using various overloaded methods of the form
    1580             :    rich_location::add_fixit_*).
    1581             : 
    1582             :    For example:
    1583             : 
    1584             :    Example F: fix-it hint: insert_before
    1585             :    *************************************
    1586             :       ptr = arr[0];
    1587             :             ^~~~~~
    1588             :             &
    1589             :    This rich location has a single range (range 0) covering "arr[0]",
    1590             :    with the caret at the start.  The rich location has a single
    1591             :    insertion fix-it hint, inserted before range 0, added via
    1592             :      richloc.add_fixit_insert_before ("&");
    1593             : 
    1594             :    Example G: multiple fix-it hints: insert_before and insert_after
    1595             :    ****************************************************************
    1596             :       #define FN(ARG0, ARG1, ARG2) fn(ARG0, ARG1, ARG2)
    1597             :                                       ^~~~  ^~~~  ^~~~
    1598             :                                       (   ) (   ) (   )
    1599             :    This rich location has three ranges, covering "arg0", "arg1",
    1600             :    and "arg2", all with caret-printing enabled.
    1601             :    The rich location has 6 insertion fix-it hints: each arg
    1602             :    has a pair of insertion fix-it hints, suggesting wrapping
    1603             :    them with parentheses: one a '(' inserted before,
    1604             :    the other a ')' inserted after, added via
    1605             :      richloc.add_fixit_insert_before (LOC, "(");
    1606             :    and
    1607             :      richloc.add_fixit_insert_after (LOC, ")");
    1608             : 
    1609             :    Example H: fix-it hint: removal
    1610             :    *******************************
    1611             :      struct s {int i};;
    1612             :                       ^
    1613             :                       -
    1614             :    This rich location has a single range at the stray trailing
    1615             :    semicolon, along with a single removal fix-it hint, covering
    1616             :    the same range, added via:
    1617             :      richloc.add_fixit_remove ();
    1618             : 
    1619             :    Example I: fix-it hint: replace
    1620             :    *******************************
    1621             :       c = s.colour;
    1622             :             ^~~~~~
    1623             :             color
    1624             :    This rich location has a single range (range 0) covering "colour",
    1625             :    and a single "replace" fix-it hint, covering the same range,
    1626             :    added via
    1627             :      richloc.add_fixit_replace ("color");
    1628             : 
    1629             :    Example J: fix-it hint: line insertion
    1630             :    **************************************
    1631             : 
    1632             :      3 | #include <stddef.h>
    1633             :      + |+#include <stdio.h>
    1634             :      4 | int the_next_line;
    1635             : 
    1636             :    This rich location has a single range at line 4 column 1, marked
    1637             :    with SHOW_LINES_WITHOUT_RANGE (to avoid printing a meaningless caret
    1638             :    on the "i" of int).  It has a insertion fix-it hint of the string
    1639             :    "#include <stdio.h>\n".
    1640             : 
    1641             :    Adding a fix-it hint can fail: for example, attempts to insert content
    1642             :    at the transition between two line maps may fail due to there being no
    1643             :    location_t value to express the new location.
    1644             : 
    1645             :    Attempts to add a fix-it hint within a macro expansion will fail.
    1646             : 
    1647             :    There is only limited support for newline characters in fix-it hints:
    1648             :    only hints with newlines which insert an entire new line are permitted,
    1649             :    inserting at the start of a line, and finishing with a newline
    1650             :    (with no interior newline characters).  Other attempts to add
    1651             :    fix-it hints containing newline characters will fail.
    1652             :    Similarly, attempts to delete or replace a range *affecting* multiple
    1653             :    lines will fail.
    1654             : 
    1655             :    The rich_location API handles these failures gracefully, so that
    1656             :    diagnostics can attempt to add fix-it hints without each needing
    1657             :    extensive checking.
    1658             : 
    1659             :    Fix-it hints within a rich_location are "atomic": if any hints can't
    1660             :    be applied, none of them will be (tracked by the m_seen_impossible_fixit
    1661             :    flag), and no fix-its hints will be displayed for that rich_location.
    1662             :    This implies that diagnostic messages need to be worded in such a way
    1663             :    that they make sense whether or not the fix-it hints are displayed,
    1664             :    or that richloc.seen_impossible_fixit_p () should be checked before
    1665             :    issuing the diagnostics.  */
    1666             : 
    1667             : class rich_location
    1668             : {
    1669             :  public:
    1670             :   /* Constructors.  */
    1671             : 
    1672             :   /* Constructing from a location.  */
    1673             :   rich_location (line_maps *set, location_t loc,
    1674             :                  const range_label *label = NULL);
    1675             : 
    1676             :   /* Destructor.  */
    1677             :   ~rich_location ();
    1678             : 
    1679             :   /* The class manages the memory pointed to by the elements of
    1680             :      the M_FIXIT_HINTS vector and is not meant to be copied or
    1681             :      assigned.  */
    1682             :   rich_location (const rich_location &) = delete;
    1683             :   void operator= (const rich_location &) = delete;
    1684             : 
    1685             :   /* Accessors.  */
    1686          24 :   location_t get_loc () const { return get_loc (0); }
    1687             :   location_t get_loc (unsigned int idx) const;
    1688             : 
    1689             :   void
    1690             :   add_range (location_t loc,
    1691             :              enum range_display_kind range_display_kind
    1692             :                = SHOW_RANGE_WITHOUT_CARET,
    1693             :              const range_label *label = NULL);
    1694             : 
    1695             :   void
    1696             :   set_range (unsigned int idx, location_t loc,
    1697             :              enum range_display_kind range_display_kind);
    1698             : 
    1699             :   unsigned int get_num_locations () const { return m_ranges.count (); }
    1700             : 
    1701             :   const location_range *get_range (unsigned int idx) const;
    1702             :   location_range *get_range (unsigned int idx);
    1703             : 
    1704             :   expanded_location get_expanded_location (unsigned int idx);
    1705             : 
    1706             :   void
    1707             :   override_column (int column);
    1708             : 
    1709             :   /* Fix-it hints.  */
    1710             : 
    1711             :   /* Methods for adding insertion fix-it hints.  */
    1712             : 
    1713             :   /* Suggest inserting NEW_CONTENT immediately before the primary
    1714             :      range's start.  */
    1715             :   void
    1716             :   add_fixit_insert_before (const char *new_content);
    1717             : 
    1718             :   /* Suggest inserting NEW_CONTENT immediately before the start of WHERE.  */
    1719             :   void
    1720             :   add_fixit_insert_before (location_t where,
    1721             :                            const char *new_content);
    1722             : 
    1723             :   /* Suggest inserting NEW_CONTENT immediately after the end of the primary
    1724             :      range.  */
    1725             :   void
    1726             :   add_fixit_insert_after (const char *new_content);
    1727             : 
    1728             :   /* Suggest inserting NEW_CONTENT immediately after the end of WHERE.  */
    1729             :   void
    1730             :   add_fixit_insert_after (location_t where,
    1731             :                           const char *new_content);
    1732             : 
    1733             :   /* Methods for adding removal fix-it hints.  */
    1734             : 
    1735             :   /* Suggest removing the content covered by range 0.  */
    1736             :   void
    1737             :   add_fixit_remove ();
    1738             : 
    1739             :   /* Suggest removing the content covered between the start and finish
    1740             :      of WHERE.  */
    1741             :   void
    1742             :   add_fixit_remove (location_t where);
    1743             : 
    1744             :   /* Suggest removing the content covered by SRC_RANGE.  */
    1745             :   void
    1746             :   add_fixit_remove (source_range src_range);
    1747             : 
    1748             :   /* Methods for adding "replace" fix-it hints.  */
    1749             : 
    1750             :   /* Suggest replacing the content covered by range 0 with NEW_CONTENT.  */
    1751             :   void
    1752             :   add_fixit_replace (const char *new_content);
    1753             : 
    1754             :   /* Suggest replacing the content between the start and finish of
    1755             :      WHERE with NEW_CONTENT.  */
    1756             :   void
    1757             :   add_fixit_replace (location_t where,
    1758             :                      const char *new_content);
    1759             : 
    1760             :   /* Suggest replacing the content covered by SRC_RANGE with
    1761             :      NEW_CONTENT.  */
    1762             :   void
    1763             :   add_fixit_replace (source_range src_range,
    1764             :                      const char *new_content);
    1765             : 
    1766             :   unsigned int get_num_fixit_hints () const { return m_fixit_hints.count (); }
    1767             :   fixit_hint *get_fixit_hint (int idx) const { return m_fixit_hints[idx]; }
    1768             :   fixit_hint *get_last_fixit_hint () const;
    1769             :   bool seen_impossible_fixit_p () const { return m_seen_impossible_fixit; }
    1770             : 
    1771             :   /* Set this if the fix-it hints are not suitable to be
    1772             :      automatically applied.
    1773             : 
    1774             :      For example, if you are suggesting more than one
    1775             :      mutually exclusive solution to a problem, then
    1776             :      it doesn't make sense to apply all of the solutions;
    1777             :      manual intervention is required.
    1778             : 
    1779             :      If set, then the fix-it hints in the rich_location will
    1780             :      be printed, but will not be added to generated patches,
    1781             :      or affect the modified version of the file.  */
    1782             :   void fixits_cannot_be_auto_applied ()
    1783             :   {
    1784             :     m_fixits_cannot_be_auto_applied = true;
    1785             :   }
    1786             : 
    1787             :   bool fixits_can_be_auto_applied_p () const
    1788             :   {
    1789             :     return !m_fixits_cannot_be_auto_applied;
    1790             :   }
    1791             : 
    1792             :   /* An optional path through the code.  */
    1793             :   const diagnostic_path *get_path () const { return m_path; }
    1794             :   void set_path (const diagnostic_path *path) { m_path = path; }
    1795             : 
    1796             :   /* A flag for hinting that the diagnostic involves character encoding
    1797             :      issues, and thus that it will be helpful to the user if we show some
    1798             :      representation of how the characters in the pertinent source lines
    1799             :      are encoded.
    1800             :      The default is false (i.e. do not escape).
    1801             :      When set to true, non-ASCII bytes in the pertinent source lines will
    1802             :      be escaped in a manner controlled by the user-supplied option
    1803             :      -fdiagnostics-escape-format=, so that the user can better understand
    1804             :      what's going on with the encoding in their source file.  */
    1805             :   bool escape_on_output_p () const { return m_escape_on_output; }
    1806             :   void set_escape_on_output (bool flag) { m_escape_on_output = flag; }
    1807             : 
    1808             : private:
    1809             :   bool reject_impossible_fixit (location_t where);
    1810             :   void stop_supporting_fixits ();
    1811             :   void maybe_add_fixit (location_t start,
    1812             :                         location_t next_loc,
    1813             :                         const char *new_content);
    1814             : 
    1815             : public:
    1816             :   static const int STATICALLY_ALLOCATED_RANGES = 3;
    1817             : 
    1818             : protected:
    1819             :   line_maps *m_line_table;
    1820             :   semi_embedded_vec <location_range, STATICALLY_ALLOCATED_RANGES> m_ranges;
    1821             : 
    1822             :   int m_column_override;
    1823             : 
    1824             :   bool m_have_expanded_location;
    1825             :   bool m_seen_impossible_fixit;
    1826             :   bool m_fixits_cannot_be_auto_applied;
    1827             :   bool m_escape_on_output;
    1828             : 
    1829             :   expanded_location m_expanded_location;
    1830             : 
    1831             :   static const int MAX_STATIC_FIXIT_HINTS = 2;
    1832             :   semi_embedded_vec <fixit_hint *, MAX_STATIC_FIXIT_HINTS> m_fixit_hints;
    1833             : 
    1834             :   const diagnostic_path *m_path;
    1835             : };
    1836             : 
    1837             : /* A struct for the result of range_label::get_text: a NUL-terminated buffer
    1838             :    of localized text, and a flag to determine if the caller should "free" the
    1839             :    buffer.  */
    1840             : 
    1841             : class label_text
    1842             : {
    1843             : public:
    1844             :   label_text ()
    1845             :   : m_buffer (NULL), m_owned (false)
    1846             :   {}
    1847             : 
    1848             :   ~label_text ()
    1849             :   {
    1850             :     if (m_owned)
    1851             :       free (m_buffer);
    1852             :   }
    1853             : 
    1854             :   /* Move ctor.  */
    1855             :   label_text (label_text &&other)
    1856             :   : m_buffer (other.m_buffer), m_owned (other.m_owned)
    1857             :   {
    1858             :     other.release ();
    1859             :   }
    1860             : 
    1861             :   /* Move assignment.  */
    1862             :   label_text & operator= (label_text &&other)
    1863             :   {
    1864             :     if (m_owned)
    1865             :       free (m_buffer);
    1866             :     m_buffer = other.m_buffer;
    1867             :     m_owned = other.m_owned;
    1868             :     other.release ();
    1869             :     return *this;
    1870             :   }
    1871             : 
    1872             :   /* Delete the copy ctor and copy-assignment operator.  */
    1873             :   label_text (const label_text &) = delete;
    1874             :   label_text & operator= (const label_text &) = delete;
    1875             : 
    1876             :   /* Create a label_text instance that borrows BUFFER from a
    1877             :      longer-lived owner.  */
    1878         642 :   static label_text borrow (const char *buffer)
    1879             :   {
    1880         642 :     return label_text (const_cast <char *> (buffer), false);
    1881             :   }
    1882             : 
    1883             :   /* Create a label_text instance that takes ownership of BUFFER.  */
    1884             :   static label_text take (char *buffer)
    1885             :   {
    1886             :     return label_text (buffer, true);
    1887             :   }
    1888             : 
    1889             :   void release ()
    1890             :   {
    1891             :     m_buffer = NULL;
    1892             :     m_owned = false;
    1893             :   }
    1894             : 
    1895             :   const char *get () const
    1896             :   {
    1897             :     return m_buffer;
    1898             :   }
    1899             : 
    1900             :   bool is_owner () const
    1901             :   {
    1902             :     return m_owned;
    1903             :   }
    1904             : 
    1905             : private:
    1906             :   char *m_buffer;
    1907             :   bool m_owned;
    1908             : 
    1909         642 :   label_text (char *buffer, bool owned)
    1910         642 :   : m_buffer (buffer), m_owned (owned)
    1911             :   {}
    1912             : };
    1913             : 
    1914             : /* Abstract base class for labelling a range within a rich_location
    1915             :    (e.g. for labelling expressions with their type).
    1916             : 
    1917             :    Generating the text could require non-trivial work, so this work
    1918             :    is delayed (via the "get_text" virtual function) until the diagnostic
    1919             :    printing code "knows" it needs it, thus avoiding doing it e.g. for
    1920             :    warnings that are filtered by command-line flags.  This virtual
    1921             :    function also isolates libcpp and the diagnostics subsystem from
    1922             :    the front-end and middle-end-specific code for generating the text
    1923             :    for the labels.
    1924             : 
    1925             :    Like the rich_location instances they annotate, range_label instances
    1926             :    are intended to be allocated on the stack when generating diagnostics,
    1927             :    and to be short-lived.  */
    1928             : 
    1929        3138 : class range_label
    1930             : {
    1931             :  public:
    1932        3348 :   virtual ~range_label () {}
    1933             : 
    1934             :   /* Get localized text for the label.
    1935             :      The RANGE_IDX is provided, allowing for range_label instances to be
    1936             :      shared by multiple ranges if need be (the "flyweight" design pattern).  */
    1937             :   virtual label_text get_text (unsigned range_idx) const = 0;
    1938             : };
    1939             : 
    1940             : /* A fix-it hint: a suggested insertion, replacement, or deletion of text.
    1941             :    We handle these three types of edit with one class, by representing
    1942             :    them as replacement of a half-open range:
    1943             :        [start, next_loc)
    1944             :    Insertions have start == next_loc: "replace" the empty string at the
    1945             :    start location with the new string.
    1946             :    Deletions are replacement with the empty string.
    1947             : 
    1948             :    There is only limited support for newline characters in fix-it hints
    1949             :    as noted above in the comment for class rich_location.
    1950             :    A fixit_hint instance can have at most one newline character; if
    1951             :    present, the newline character must be the final character of
    1952             :    the content (preventing e.g. fix-its that split a pre-existing line).  */
    1953             : 
    1954             : class fixit_hint
    1955             : {
    1956             :  public:
    1957             :   fixit_hint (location_t start,
    1958             :               location_t next_loc,
    1959             :               const char *new_content);
    1960             :   ~fixit_hint () { free (m_bytes); }
    1961             : 
    1962             :   bool affects_line_p (const char *file, int line) const;
    1963             :   location_t get_start_loc () const { return m_start; }
    1964             :   location_t get_next_loc () const { return m_next_loc; }
    1965             :   bool maybe_append (location_t start,
    1966             :                      location_t next_loc,
    1967             :                      const char *new_content);
    1968             : 
    1969             :   const char *get_string () const { return m_bytes; }
    1970             :   size_t get_length () const { return m_len; }
    1971             : 
    1972             :   bool insertion_p () const { return m_start == m_next_loc; }
    1973             : 
    1974             :   bool ends_with_newline_p () const;
    1975             : 
    1976             :  private:
    1977             :   /* We don't use source_range here since, unlike most places,
    1978             :      this is a half-open/half-closed range:
    1979             :        [start, next_loc)
    1980             :      so that we can support insertion via start == next_loc.  */
    1981             :   location_t m_start;
    1982             :   location_t m_next_loc;
    1983             :   char *m_bytes;
    1984             :   size_t m_len;
    1985             : };
    1986             : 
    1987             : 
    1988             : /* This is enum is used by the function linemap_resolve_location
    1989             :    below.  The meaning of the values is explained in the comment of
    1990             :    that function.  */
    1991             : enum location_resolution_kind
    1992             : {
    1993             :   LRK_MACRO_EXPANSION_POINT,
    1994             :   LRK_SPELLING_LOCATION,
    1995             :   LRK_MACRO_DEFINITION_LOCATION
    1996             : };
    1997             : 
    1998             : /* Resolve a virtual location into either a spelling location, an
    1999             :    expansion point location or a token argument replacement point
    2000             :    location.  Return the map that encodes the virtual location as well
    2001             :    as the resolved location.
    2002             : 
    2003             :    If LOC is *NOT* the location of a token resulting from the
    2004             :    expansion of a macro, then the parameter LRK (which stands for
    2005             :    Location Resolution Kind) is ignored and the resulting location
    2006             :    just equals the one given in argument.
    2007             : 
    2008             :    Now if LOC *IS* the location of a token resulting from the
    2009             :    expansion of a macro, this is what happens.
    2010             : 
    2011             :    * If LRK is set to LRK_MACRO_EXPANSION_POINT
    2012             :    -------------------------------
    2013             : 
    2014             :    The virtual location is resolved to the first macro expansion point
    2015             :    that led to this macro expansion.
    2016             : 
    2017             :    * If LRK is set to LRK_SPELLING_LOCATION
    2018             :    -------------------------------------
    2019             : 
    2020             :    The virtual location is resolved to the locus where the token has
    2021             :    been spelled in the source.   This can follow through all the macro
    2022             :    expansions that led to the token.
    2023             : 
    2024             :    * If LRK is set to LRK_MACRO_DEFINITION_LOCATION
    2025             :    --------------------------------------
    2026             : 
    2027             :    The virtual location is resolved to the locus of the token in the
    2028             :    context of the macro definition.
    2029             : 
    2030             :    If LOC is the locus of a token that is an argument of a
    2031             :    function-like macro [replacing a parameter in the replacement list
    2032             :    of the macro] the virtual location is resolved to the locus of the
    2033             :    parameter that is replaced, in the context of the definition of the
    2034             :    macro.
    2035             : 
    2036             :    If LOC is the locus of a token that is not an argument of a
    2037             :    function-like macro, then the function behaves as if LRK was set to
    2038             :    LRK_SPELLING_LOCATION.
    2039             : 
    2040             :    If LOC_MAP is not NULL, *LOC_MAP is set to the map encoding the
    2041             :    returned location.  Note that if the returned location wasn't originally
    2042             :    encoded by a map, the *MAP is set to NULL.  This can happen if LOC
    2043             :    resolves to a location reserved for the client code, like
    2044             :    UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC.  */
    2045             : 
    2046             : location_t linemap_resolve_location (class line_maps *,
    2047             :                                      location_t loc,
    2048             :                                      enum location_resolution_kind lrk,
    2049             :                                      const line_map_ordinary **loc_map);
    2050             : 
    2051             : /* Suppose that LOC is the virtual location of a token coming from the
    2052             :    expansion of a macro M.  This function then steps up to get the
    2053             :    location L of the point where M got expanded.  If L is a spelling
    2054             :    location inside a macro expansion M', then this function returns
    2055             :    the point where M' was expanded.  LOC_MAP is an output parameter.
    2056             :    When non-NULL, *LOC_MAP is set to the map of the returned
    2057             :    location.  */
    2058             : location_t linemap_unwind_toward_expansion (class line_maps *,
    2059             :                                             location_t loc,
    2060             :                                             const line_map **loc_map);
    2061             : 
    2062             : /* If LOC is the virtual location of a token coming from the expansion
    2063             :    of a macro M and if its spelling location is reserved (e.g, a
    2064             :    location for a built-in token), then this function unwinds (using
    2065             :    linemap_unwind_toward_expansion) the location until a location that
    2066             :    is not reserved and is not in a system header is reached.  In other
    2067             :    words, this unwinds the reserved location until a location that is
    2068             :    in real source code is reached.
    2069             : 
    2070             :    Otherwise, if the spelling location for LOC is not reserved or if
    2071             :    LOC doesn't come from the expansion of a macro, the function
    2072             :    returns LOC as is and *MAP is not touched.
    2073             : 
    2074             :    *MAP is set to the map of the returned location if the later is
    2075             :    different from LOC.  */
    2076             : location_t linemap_unwind_to_first_non_reserved_loc (class line_maps *,
    2077             :                                                      location_t loc,
    2078             :                                                      const line_map **map);
    2079             : 
    2080             : /* Expand source code location LOC and return a user readable source
    2081             :    code location.  LOC must be a spelling (non-virtual) location.  If
    2082             :    it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
    2083             :    location is returned.  */
    2084             : expanded_location linemap_expand_location (class line_maps *,
    2085             :                                            const line_map *,
    2086             :                                            location_t loc);
    2087             : 
    2088             : /* Statistics about maps allocation and usage as returned by
    2089             :    linemap_get_statistics.  */
    2090             : struct linemap_stats
    2091             : {
    2092             :   long num_ordinary_maps_allocated;
    2093             :   long num_ordinary_maps_used;
    2094             :   long ordinary_maps_allocated_size;
    2095             :   long ordinary_maps_used_size;
    2096             :   long num_expanded_macros;
    2097             :   long num_macro_tokens;
    2098             :   long num_macro_maps_used;
    2099             :   long macro_maps_allocated_size;
    2100             :   long macro_maps_used_size;
    2101             :   long macro_maps_locations_size;
    2102             :   long duplicated_macro_maps_locations_size;
    2103             :   long adhoc_table_size;
    2104             :   long adhoc_table_entries_used;
    2105             : };
    2106             : 
    2107             : /* Return the highest location emitted for a given file for which
    2108             :    there is a line map in SET.  FILE_NAME is the file name to
    2109             :    consider.  If the function returns TRUE, *LOC is set to the highest
    2110             :    location emitted for that file.  */
    2111             : bool linemap_get_file_highest_location (class line_maps * set,
    2112             :                                         const char *file_name,
    2113             :                                         location_t *loc);
    2114             : 
    2115             : /* Compute and return statistics about the memory consumption of some
    2116             :    parts of the line table SET.  */
    2117             : void linemap_get_statistics (line_maps *, struct linemap_stats *);
    2118             : 
    2119             : /* Dump debugging information about source location LOC into the file
    2120             :    stream STREAM. SET is the line map set LOC comes from.  */
    2121             : void linemap_dump_location (line_maps *, location_t, FILE *);
    2122             : 
    2123             : /* Dump line map at index IX in line table SET to STREAM.  If STREAM
    2124             :    is NULL, use stderr.  IS_MACRO is true if the caller wants to
    2125             :    dump a macro map, false otherwise.  */
    2126             : void linemap_dump (FILE *, line_maps *, unsigned, bool);
    2127             : 
    2128             : /* Dump line table SET to STREAM.  If STREAM is NULL, stderr is used.
    2129             :    NUM_ORDINARY specifies how many ordinary maps to dump.  NUM_MACRO
    2130             :    specifies how many macro maps to dump.  */
    2131             : void line_table_dump (FILE *, line_maps *, unsigned int, unsigned int);
    2132             : 
    2133             : /* An enum for distinguishing the various parts within a location_t.  */
    2134             : 
    2135             : enum location_aspect
    2136             : {
    2137             :   LOCATION_ASPECT_CARET,
    2138             :   LOCATION_ASPECT_START,
    2139             :   LOCATION_ASPECT_FINISH
    2140             : };
    2141             : 
    2142             : /* The rich_location class requires a way to expand location_t instances.
    2143             :    We would directly use expand_location_to_spelling_point, which is
    2144             :    implemented in gcc/input.cc, but we also need to use it for rich_location
    2145             :    within genmatch.cc.
    2146             :    Hence we require client code of libcpp to implement the following
    2147             :    symbol.  */
    2148             : extern expanded_location
    2149             : linemap_client_expand_location_to_spelling_point (location_t,
    2150             :                                                   enum location_aspect);
    2151             : 
    2152             : #endif /* !LIBCPP_LINE_MAP_H  */

Generated by: LCOV version 1.16