Home | History | Annotate | Line # | Download | only in include
      1 /* Map (unsigned int) keys to (source file, line, column) triples.
      2    Copyright (C) 2001-2024 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 
    465   /* Get the location of the expansion point of this macro map.  */
    466 
    467   location_t
    468   get_expansion_point_location () const
    469   {
    470     return m_expansion;
    471   }
    472 
    473   /* Base is 4 bytes.  */
    474 
    475   /* The number of tokens inside the replacement-list of MACRO.  */
    476   unsigned int n_tokens;
    477 
    478   /* Pointer alignment boundary.  */
    479 
    480   /* The cpp macro whose expansion gave birth to this macro map.  */
    481   struct cpp_hashnode *
    482     GTY ((nested_ptr (union tree_node,
    483 		      "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
    484 		      "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL")))
    485     macro;
    486 
    487   /* This array of location is actually an array of pairs of
    488      locations. The elements inside it thus look like:
    489 
    490            x0,y0, x1,y1, x2,y2, ...., xn,yn.
    491 
    492      where n == n_tokens;
    493 
    494      Remember that these xI,yI are collected when libcpp is about to
    495      expand a given macro.
    496 
    497      yI is the location in the macro definition, either of the token
    498      itself or of a macro parameter that it replaces.
    499 
    500      Imagine this:
    501 
    502 	#define PLUS(A, B) A + B  <--- #1
    503 
    504 	int a = PLUS (1,2); <--- #2
    505 
    506      There is a macro map for the expansion of PLUS in #2.  PLUS is
    507      expanded into its expansion-list.  The expansion-list is the
    508      replacement-list of PLUS where the macro parameters are replaced
    509      with their arguments.  So the replacement-list of PLUS is made of
    510      the tokens:
    511 
    512         A, +, B
    513 
    514      and the expansion-list is made of the tokens:
    515 
    516         1, +, 2
    517 
    518      Let's consider the case of token "+".  Its y1 [yI for I == 1] is
    519      its spelling location in #1.
    520 
    521      y0 (thus for token "1") is the spelling location of A in #1.
    522 
    523      And y2 (of token "2") is the spelling location of B in #1.
    524 
    525      When the token is /not/ an argument for a macro, xI is the same
    526      location as yI.  Otherwise, xI is the location of the token
    527      outside this macro expansion.  If this macro was expanded from
    528      another macro expansion, xI is a virtual location representing
    529      the token in that macro expansion; otherwise, it is the spelling
    530      location of the token.
    531 
    532      Note that a virtual location is a location returned by
    533      linemap_add_macro_token.  It encodes the relevant locations (x,y
    534      pairs) of that token across the macro expansions from which it
    535      (the token) might come from.
    536 
    537      In the example above x1 (for token "+") is going to be the same
    538      as y1.  x0 is the spelling location for the argument token "1",
    539      and x2 is the spelling location for the argument token "2".  */
    540   location_t * GTY((atomic)) macro_locations;
    541 
    542   /* This is the location of the expansion point of the current macro
    543      map.  It's the location of the macro name.  That location is held
    544      by the map that was current right before the current one. It
    545      could have been either a macro or an ordinary map, depending on
    546      if we are in a nested expansion context not.  */
    547   location_t m_expansion;
    548 
    549   /* Size is 20 or 32 (4 bytes padding on 64-bit).  */
    550 };
    551 
    552 #if CHECKING_P && (GCC_VERSION >= 2007)
    553 
    554 /* Assertion macro to be used in line-map code.  */
    555 #define linemap_assert(EXPR)                  \
    556   do {                                                \
    557     if (! (EXPR))                             \
    558       abort ();                                       \
    559   } while (0)
    560 
    561 /* Assert that becomes a conditional expression when checking is disabled at
    562    compilation time.  Use this for conditions that should not happen but if
    563    they happen, it is better to handle them gracefully rather than crash
    564    randomly later.
    565    Usage:
    566 
    567    if (linemap_assert_fails(EXPR)) handle_error(); */
    568 #define linemap_assert_fails(EXPR) __extension__ \
    569   ({linemap_assert (EXPR); false;})
    570 
    571 #else
    572 /* Include EXPR, so that unused variable warnings do not occur.  */
    573 #define linemap_assert(EXPR) ((void)(0 && (EXPR)))
    574 #define linemap_assert_fails(EXPR) (! (EXPR))
    575 #endif
    576 
    577 /* Get whether location LOC is an ordinary location.  */
    578 
    579 inline bool
    580 IS_ORDINARY_LOC (location_t loc)
    581 {
    582   return loc < LINE_MAP_MAX_LOCATION;
    583 }
    584 
    585 /* Get whether location LOC is an ad-hoc location.  */
    586 
    587 inline bool
    588 IS_ADHOC_LOC (location_t loc)
    589 {
    590   return loc > MAX_LOCATION_T;
    591 }
    592 
    593 /* Categorize line map kinds.  */
    594 
    595 inline bool
    596 MAP_ORDINARY_P (const line_map *map)
    597 {
    598   return IS_ORDINARY_LOC (map->start_location);
    599 }
    600 
    601 /* Return TRUE if MAP encodes locations coming from a macro
    602    replacement-list at macro expansion point.  */
    603 bool
    604 linemap_macro_expansion_map_p (const line_map *);
    605 
    606 /* Assert that MAP encodes locations of tokens that are not part of
    607    the replacement-list of a macro expansion, downcasting from
    608    line_map * to line_map_ordinary *.  */
    609 
    610 inline line_map_ordinary *
    611 linemap_check_ordinary (line_map *map)
    612 {
    613   linemap_assert (MAP_ORDINARY_P (map));
    614   return (line_map_ordinary *)map;
    615 }
    616 
    617 /* Assert that MAP encodes locations of tokens that are not part of
    618    the replacement-list of a macro expansion, downcasting from
    619    const line_map * to const line_map_ordinary *.  */
    620 
    621 inline const line_map_ordinary *
    622 linemap_check_ordinary (const line_map *map)
    623 {
    624   linemap_assert (MAP_ORDINARY_P (map));
    625   return (const line_map_ordinary *)map;
    626 }
    627 
    628 /* Assert that MAP is a macro expansion and downcast to the appropriate
    629    subclass.  */
    630 
    631 inline line_map_macro *linemap_check_macro (line_map *map)
    632 {
    633   linemap_assert (!MAP_ORDINARY_P (map));
    634   return (line_map_macro *)map;
    635 }
    636 
    637 /* Assert that MAP is a macro expansion and downcast to the appropriate
    638    subclass.  */
    639 
    640 inline const line_map_macro *
    641 linemap_check_macro (const line_map *map)
    642 {
    643   linemap_assert (!MAP_ORDINARY_P (map));
    644   return (const line_map_macro *)map;
    645 }
    646 
    647 /* Read the start location of MAP.  */
    648 
    649 inline location_t
    650 MAP_START_LOCATION (const line_map *map)
    651 {
    652   return map->start_location;
    653 }
    654 
    655 /* Get the starting line number of ordinary map MAP.  */
    656 
    657 inline linenum_type
    658 ORDINARY_MAP_STARTING_LINE_NUMBER (const line_map_ordinary *ord_map)
    659 {
    660   return ord_map->to_line;
    661 }
    662 
    663 /* Return a positive value if map encodes locations from a system
    664    header, 0 otherwise. Returns 1 if ordinary map MAP encodes locations
    665    in a system header and 2 if it encodes locations in a C system header
    666    that therefore needs to be extern "C" protected in C++.  */
    667 
    668 inline unsigned char
    669 ORDINARY_MAP_IN_SYSTEM_HEADER_P (const line_map_ordinary *ord_map)
    670 {
    671   return ord_map->sysp;
    672 }
    673 
    674 /* TRUE if this line map is for a module (not a source file).  */
    675 
    676 inline bool
    677 MAP_MODULE_P (const line_map *map)
    678 {
    679   return (MAP_ORDINARY_P (map)
    680 	  && linemap_check_ordinary (map)->reason == LC_MODULE);
    681 }
    682 
    683 /* Get the filename of ordinary map MAP.  */
    684 
    685 inline const char *
    686 ORDINARY_MAP_FILE_NAME (const line_map_ordinary *ord_map)
    687 {
    688   return ord_map->to_file;
    689 }
    690 
    691 /* Get the cpp macro whose expansion gave birth to macro map MAP.  */
    692 
    693 inline cpp_hashnode *
    694 MACRO_MAP_MACRO (const line_map_macro *macro_map)
    695 {
    696   return macro_map->macro;
    697 }
    698 
    699 /* Get the number of tokens inside the replacement-list of the macro
    700    that led to macro map MAP.  */
    701 
    702 inline unsigned int
    703 MACRO_MAP_NUM_MACRO_TOKENS (const line_map_macro *macro_map)
    704 {
    705   return macro_map->n_tokens;
    706 }
    707 
    708 /* Get the array of pairs of locations within macro map MAP.
    709    See the declaration of line_map_macro for more information.  */
    710 
    711 inline location_t *
    712 MACRO_MAP_LOCATIONS (const line_map_macro *macro_map)
    713 {
    714   return macro_map->macro_locations;
    715 }
    716 
    717 /* The abstraction of a set of location maps. There can be several
    718    types of location maps. This abstraction contains the attributes
    719    that are independent from the type of the map.
    720 
    721    Essentially this is just a vector of T_linemap_subclass,
    722    which can only ever grow in size.  */
    723 
    724 struct GTY(()) maps_info_ordinary {
    725   /* This array contains the "ordinary" line maps, for all
    726      events other than macro expansion
    727      (e.g. when a new preprocessing unit starts or ends).  */
    728   line_map_ordinary * GTY ((length ("%h.used"))) maps;
    729 
    730   /* The total number of allocated maps.  */
    731   unsigned int allocated;
    732 
    733   /* The number of elements used in maps. This number is smaller
    734      or equal to ALLOCATED.  */
    735   unsigned int used;
    736 
    737   /* The index of the last ordinary map that was looked up with
    738      linemap_lookup.  */
    739   mutable unsigned int m_cache;
    740 };
    741 
    742 struct GTY(()) maps_info_macro {
    743   /* This array contains the macro line maps.
    744      A macro line map is created whenever a macro expansion occurs.  */
    745   line_map_macro * GTY ((length ("%h.used"))) maps;
    746 
    747   /* The total number of allocated maps.  */
    748   unsigned int allocated;
    749 
    750   /* The number of elements used in maps. This number is smaller
    751      or equal to ALLOCATED.  */
    752   unsigned int used;
    753 
    754   /* The index of the last macro map that was looked up with
    755      linemap_lookup.  */
    756   mutable unsigned int m_cache;
    757 };
    758 
    759 /* Data structure to associate a source_range together with an arbitrary
    760    data pointer with a source location.  */
    761 struct GTY(()) location_adhoc_data {
    762   location_t locus;
    763   source_range src_range;
    764   void * GTY((skip)) data;
    765   unsigned discriminator;
    766 };
    767 
    768 struct htab;
    769 
    770 /* The following data structure encodes a location with some adhoc data
    771    and maps it to a new unsigned integer (called an adhoc location)
    772    that replaces the original location to represent the mapping.
    773 
    774    The new adhoc_loc uses the highest bit as the enabling bit, i.e. if the
    775    highest bit is 1, then the number is adhoc_loc. Otherwise, it serves as
    776    the original location. Once identified as the adhoc_loc, the lower 31
    777    bits of the integer is used to index the location_adhoc_data array,
    778    in which the locus and associated data is stored.  */
    779 
    780 struct GTY(()) location_adhoc_data_map {
    781   struct htab * GTY((skip)) htab;
    782   location_t curr_loc;
    783   unsigned int allocated;
    784   struct location_adhoc_data GTY((length ("%h.allocated"))) *data;
    785 };
    786 
    787 /* A set of chronological line_map structures.  */
    788 class GTY(()) line_maps {
    789 public:
    790 
    791   ~line_maps ();
    792 
    793   bool pure_location_p (location_t loc) const;
    794   location_t get_pure_location (location_t loc) const;
    795 
    796   source_range get_range_from_loc (location_t loc) const;
    797   location_t get_start (location_t loc) const
    798   {
    799     return get_range_from_loc (loc).m_start;
    800   }
    801   location_t
    802   get_finish (location_t loc) const
    803   {
    804     return get_range_from_loc (loc).m_finish;
    805   }
    806 
    807   location_t make_location (location_t caret,
    808 			    location_t start,
    809 			    location_t finish);
    810 
    811   location_t
    812   get_or_create_combined_loc (location_t locus,
    813 			      source_range src_range,
    814 			      void *data,
    815 			      unsigned discriminator);
    816 
    817  private:
    818   bool can_be_stored_compactly_p (location_t locus,
    819 				  source_range src_range,
    820 				  void *data,
    821 				  unsigned discriminator) const;
    822   source_range get_range_from_adhoc_loc (location_t loc) const;
    823 
    824  public:
    825   maps_info_ordinary info_ordinary;
    826 
    827   maps_info_macro info_macro;
    828 
    829   /* Depth of the include stack, including the current file.  */
    830   unsigned int depth;
    831 
    832   /* If true, prints an include trace a la -H.  */
    833   bool trace_includes;
    834 
    835   /* True if we've seen a #line or # 44 "file" directive.  */
    836   bool seen_line_directive;
    837 
    838   /* Highest location_t "given out".  */
    839   location_t highest_location;
    840 
    841   /* Start of line of highest location_t "given out".  */
    842   location_t highest_line;
    843 
    844   /* The maximum column number we can quickly allocate.  Higher numbers
    845      may require allocating a new line_map.  */
    846   unsigned int max_column_hint;
    847 
    848   /* The allocator to use when resizing 'maps', defaults to xrealloc.  */
    849   line_map_realloc GTY((callback)) m_reallocator;
    850 
    851   /* The allocators' function used to know the actual size it
    852      allocated, for a certain allocation size requested.  */
    853   line_map_round_alloc_size_func GTY((callback)) m_round_alloc_size;
    854 
    855   struct location_adhoc_data_map m_location_adhoc_data_map;
    856 
    857   /* The special location value that is used as spelling location for
    858      built-in tokens.  */
    859   location_t builtin_location;
    860 
    861   /* The default value of range_bits in ordinary line maps.  */
    862   unsigned int default_range_bits;
    863 
    864   unsigned int m_num_optimized_ranges;
    865   unsigned int m_num_unoptimized_ranges;
    866 };
    867 
    868 /* Returns the number of allocated maps so far. MAP_KIND shall be TRUE
    869    if we are interested in macro maps, FALSE otherwise.  */
    870 inline unsigned int
    871 LINEMAPS_ALLOCATED (const line_maps *set, bool map_kind)
    872 {
    873   if (map_kind)
    874     return set->info_macro.allocated;
    875   else
    876     return set->info_ordinary.allocated;
    877 }
    878 
    879 /* As above, but by reference (e.g. as an lvalue).  */
    880 
    881 inline unsigned int &
    882 LINEMAPS_ALLOCATED (line_maps *set, bool map_kind)
    883 {
    884   if (map_kind)
    885     return set->info_macro.allocated;
    886   else
    887     return set->info_ordinary.allocated;
    888 }
    889 
    890 /* Returns the number of used maps so far. MAP_KIND shall be TRUE if
    891    we are interested in macro maps, FALSE otherwise.*/
    892 inline unsigned int
    893 LINEMAPS_USED (const line_maps *set, bool map_kind)
    894 {
    895   if (map_kind)
    896     return set->info_macro.used;
    897   else
    898     return set->info_ordinary.used;
    899 }
    900 
    901 /* As above, but by reference (e.g. as an lvalue).  */
    902 
    903 inline unsigned int &
    904 LINEMAPS_USED (line_maps *set, bool map_kind)
    905 {
    906   if (map_kind)
    907     return set->info_macro.used;
    908   else
    909     return set->info_ordinary.used;
    910 }
    911 
    912 /* Return the map at a given index.  */
    913 inline line_map *
    914 LINEMAPS_MAP_AT (const line_maps *set, bool map_kind, int index)
    915 {
    916   if (map_kind)
    917     return &set->info_macro.maps[index];
    918   else
    919     return &set->info_ordinary.maps[index];
    920 }
    921 
    922 /* Returns the last map used in the line table SET. MAP_KIND
    923    shall be TRUE if we are interested in macro maps, FALSE
    924    otherwise.*/
    925 inline line_map *
    926 LINEMAPS_LAST_MAP (const line_maps *set, bool map_kind)
    927 {
    928   return LINEMAPS_MAP_AT (set, map_kind,
    929 			  LINEMAPS_USED (set, map_kind) - 1);
    930 }
    931 
    932 /* Returns the INDEXth ordinary map.  */
    933 inline line_map_ordinary *
    934 LINEMAPS_ORDINARY_MAP_AT (const line_maps *set, int index)
    935 {
    936   linemap_assert (index >= 0
    937 		  && (unsigned int)index < LINEMAPS_USED (set, false));
    938   return (line_map_ordinary *)LINEMAPS_MAP_AT (set, false, index);
    939 }
    940 
    941 /* Return the number of ordinary maps allocated in the line table
    942    SET.  */
    943 inline unsigned int
    944 LINEMAPS_ORDINARY_ALLOCATED (const line_maps *set)
    945 {
    946   return LINEMAPS_ALLOCATED (set, false);
    947 }
    948 
    949 /* Return the number of ordinary maps used in the line table SET.  */
    950 inline unsigned int
    951 LINEMAPS_ORDINARY_USED (const line_maps *set)
    952 {
    953   return LINEMAPS_USED (set, false);
    954 }
    955 
    956 /* Returns a pointer to the last ordinary map used in the line table
    957    SET.  */
    958 inline line_map_ordinary *
    959 LINEMAPS_LAST_ORDINARY_MAP (const line_maps *set)
    960 {
    961   return (line_map_ordinary *)LINEMAPS_LAST_MAP (set, false);
    962 }
    963 
    964 /* Returns the INDEXth macro map.  */
    965 inline line_map_macro *
    966 LINEMAPS_MACRO_MAP_AT (const line_maps *set, int index)
    967 {
    968   linemap_assert (index >= 0
    969 		  && (unsigned int)index < LINEMAPS_USED (set, true));
    970   return (line_map_macro *)LINEMAPS_MAP_AT (set, true, index);
    971 }
    972 
    973 /* Returns the number of macro maps that were allocated in the line
    974    table SET.  */
    975 inline unsigned int
    976 LINEMAPS_MACRO_ALLOCATED (const line_maps *set)
    977 {
    978   return LINEMAPS_ALLOCATED (set, true);
    979 }
    980 
    981 /* Returns the number of macro maps used in the line table SET.  */
    982 inline unsigned int
    983 LINEMAPS_MACRO_USED (const line_maps *set)
    984 {
    985   return LINEMAPS_USED (set, true);
    986 }
    987 
    988 /* Returns the last macro map used in the line table SET.  */
    989 inline line_map_macro *
    990 LINEMAPS_LAST_MACRO_MAP (const line_maps *set)
    991 {
    992   return (line_map_macro *)LINEMAPS_LAST_MAP (set, true);
    993 }
    994 
    995 /* Returns the lowest location [of a token resulting from macro
    996    expansion] encoded in this line table.  */
    997 inline location_t
    998 LINEMAPS_MACRO_LOWEST_LOCATION (const line_maps *set)
    999 {
   1000   return LINEMAPS_MACRO_USED (set)
   1001          ? MAP_START_LOCATION (LINEMAPS_LAST_MACRO_MAP (set))
   1002          : MAX_LOCATION_T + 1;
   1003 }
   1004 
   1005 extern void *get_data_from_adhoc_loc (const line_maps *, location_t);
   1006 extern unsigned get_discriminator_from_adhoc_loc (const line_maps *, location_t);
   1007 extern location_t get_location_from_adhoc_loc (const line_maps *,
   1008 					       location_t);
   1009 
   1010 extern source_range get_range_from_loc (const line_maps *set, location_t loc);
   1011 extern unsigned get_discriminator_from_loc (const line_maps *set, location_t loc);
   1012 
   1013 /* Get whether location LOC is a "pure" location, or
   1014    whether it is an ad-hoc location, or embeds range information.  */
   1015 
   1016 bool
   1017 pure_location_p (const line_maps *set, location_t loc);
   1018 
   1019 /* Given location LOC within SET, strip away any packed range information
   1020    or ad-hoc information.  */
   1021 
   1022 extern location_t get_pure_location (const line_maps *set, location_t loc);
   1023 
   1024 extern void rebuild_location_adhoc_htab (class line_maps *);
   1025 
   1026 /* Initialize a line map set.  SET is the line map set to initialize
   1027    and BUILTIN_LOCATION is the special location value to be used as
   1028    spelling location for built-in tokens.  This BUILTIN_LOCATION has
   1029    to be strictly less than RESERVED_LOCATION_COUNT.  */
   1030 extern void linemap_init (class line_maps *set,
   1031 			  location_t builtin_location);
   1032 
   1033 /* Check for and warn about line_maps entered but not exited.  */
   1034 
   1035 extern void linemap_check_files_exited (const line_maps *);
   1036 
   1037 /* Return a location_t for the start (i.e. column==0) of
   1038    (physical) line TO_LINE in the current source file (as in the
   1039    most recent linemap_add).   MAX_COLUMN_HINT is the highest column
   1040    number we expect to use in this line (but it does not change
   1041    the highest_location).  */
   1042 
   1043 extern location_t linemap_line_start
   1044 (class line_maps *set, linenum_type to_line,  unsigned int max_column_hint);
   1045 
   1046 /* Allocate a raw block of line maps, zero initialized.  */
   1047 extern line_map *line_map_new_raw (line_maps *, bool, unsigned);
   1048 
   1049 /* Add a mapping of logical source line to physical source file and
   1050    line number. This function creates an "ordinary map", which is a
   1051    map that records locations of tokens that are not part of macro
   1052    replacement-lists present at a macro expansion point.
   1053 
   1054    The text pointed to by TO_FILE must have a lifetime
   1055    at least as long as the lifetime of SET.  An empty
   1056    TO_FILE means standard input.  If reason is LC_LEAVE, and
   1057    TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their
   1058    natural values considering the file we are returning to.
   1059 
   1060    A call to this function can relocate the previous set of
   1061    maps, so any stored line_map pointers should not be used.  */
   1062 extern const line_map *linemap_add
   1063   (class line_maps *, enum lc_reason, unsigned int sysp,
   1064    const char *to_file, linenum_type to_line);
   1065 
   1066 /* Create a macro map.  A macro map encodes source locations of tokens
   1067    that are part of a macro replacement-list, at a macro expansion
   1068    point. See the extensive comments of struct line_map and struct
   1069    line_map_macro, in line-map.h.
   1070 
   1071    This map shall be created when the macro is expanded. The map
   1072    encodes the source location of the expansion point of the macro as
   1073    well as the "original" source location of each token that is part
   1074    of the macro replacement-list. If a macro is defined but never
   1075    expanded, it has no macro map.  SET is the set of maps the macro
   1076    map should be part of.  MACRO_NODE is the macro which the new macro
   1077    map should encode source locations for.  EXPANSION is the location
   1078    of the expansion point of MACRO. For function-like macros
   1079    invocations, it's best to make it point to the closing parenthesis
   1080    of the macro, rather than the the location of the first character
   1081    of the macro.  NUM_TOKENS is the number of tokens that are part of
   1082    the replacement-list of MACRO.  */
   1083 const line_map_macro *linemap_enter_macro (line_maps *, cpp_hashnode *,
   1084 					   location_t, unsigned int);
   1085 
   1086 /* Create a source location for a module.  The creator must either do
   1087    this after the TU is tokenized, or deal with saving and restoring
   1088    map state.  */
   1089 
   1090 extern location_t linemap_module_loc
   1091   (line_maps *, location_t from, const char *name);
   1092 extern void linemap_module_reparent
   1093   (line_maps *, location_t loc, location_t new_parent);
   1094 
   1095 /* Restore the linemap state such that the map at LWM-1 continues.
   1096    Return start location of the new map.  */
   1097 extern unsigned linemap_module_restore
   1098   (line_maps *, unsigned lwm);
   1099 
   1100 /* Given a logical source location, returns the map which the
   1101    corresponding (source file, line, column) triplet can be deduced
   1102    from. Since the set is built chronologically, the logical lines are
   1103    monotonic increasing, and so the list is sorted and we can use a
   1104    binary search. If no line map have been allocated yet, this
   1105    function returns NULL.  */
   1106 extern const line_map *linemap_lookup
   1107   (const line_maps *, location_t);
   1108 
   1109 unsigned linemap_lookup_macro_index (const line_maps *, location_t);
   1110 
   1111 /* Returns TRUE if the line table set tracks token locations across
   1112    macro expansion, FALSE otherwise.  */
   1113 bool linemap_tracks_macro_expansion_locs_p (const line_maps *);
   1114 
   1115 /* Return the name of the macro associated to MACRO_MAP.  */
   1116 const char* linemap_map_get_macro_name (const line_map_macro *);
   1117 
   1118 /* Return a positive value if LOCATION is the locus of a token that is
   1119    located in a system header, O otherwise. It returns 1 if LOCATION
   1120    is the locus of a token that is located in a system header, and 2
   1121    if LOCATION is the locus of a token located in a C system header
   1122    that therefore needs to be extern "C" protected in C++.
   1123 
   1124    Note that this function returns 1 if LOCATION belongs to a token
   1125    that is part of a macro replacement-list defined in a system
   1126    header, but expanded in a non-system file.  */
   1127 int linemap_location_in_system_header_p (const line_maps *,
   1128 					 location_t);
   1129 
   1130 /* Return TRUE if LOCATION is a source code location of a token that is part of
   1131    a macro expansion, FALSE otherwise.  */
   1132 bool linemap_location_from_macro_expansion_p (const line_maps *,
   1133 					      location_t);
   1134 
   1135 /* TRUE if LOCATION is a source code location of a token that is part of the
   1136    definition of a macro, FALSE otherwise.  */
   1137 bool linemap_location_from_macro_definition_p (const line_maps *,
   1138 					       location_t);
   1139 
   1140 /* With the precondition that LOCATION is the locus of a token that is
   1141    an argument of a function-like macro MACRO_MAP and appears in the
   1142    expansion of MACRO_MAP, return the locus of that argument in the
   1143    context of the caller of MACRO_MAP.  */
   1144 
   1145 extern location_t
   1146 linemap_macro_map_loc_unwind_toward_spelling (const line_maps *set,
   1147 					      const line_map_macro *macro_map,
   1148 					      location_t location);
   1149 
   1150 /* location_t values from 0 to RESERVED_LOCATION_COUNT-1 will
   1151    be reserved for libcpp user as special values, no token from libcpp
   1152    will contain any of those locations.  */
   1153 const location_t RESERVED_LOCATION_COUNT = 2;
   1154 
   1155 /* Converts a map and a location_t to source line.  */
   1156 inline linenum_type
   1157 SOURCE_LINE (const line_map_ordinary *ord_map, location_t loc)
   1158 {
   1159   return ((loc - ord_map->start_location)
   1160 	  >> ord_map->m_column_and_range_bits) + ord_map->to_line;
   1161 }
   1162 
   1163 /* Convert a map and location_t to source column number.  */
   1164 inline linenum_type
   1165 SOURCE_COLUMN (const line_map_ordinary *ord_map, location_t loc)
   1166 {
   1167   return ((loc - ord_map->start_location)
   1168 	  & ((1 << ord_map->m_column_and_range_bits) - 1)) >> ord_map->m_range_bits;
   1169 }
   1170 
   1171 
   1172 inline location_t
   1173 linemap_included_from (const line_map_ordinary *ord_map)
   1174 {
   1175   return ord_map->included_from;
   1176 }
   1177 
   1178 /* The linemap containing the included-from location of MAP.  */
   1179 const line_map_ordinary *
   1180 linemap_included_from_linemap (const line_maps *set,
   1181 			       const line_map_ordinary *map);
   1182 
   1183 /* True if the map is at the bottom of the include stack.  */
   1184 
   1185 inline bool
   1186 MAIN_FILE_P (const line_map_ordinary *ord_map)
   1187 {
   1188   return ord_map->included_from == 0;
   1189 }
   1190 
   1191 /* Encode and return a location_t from a column number. The
   1192    source line considered is the last source line used to call
   1193    linemap_line_start, i.e, the last source line which a location was
   1194    encoded from.  */
   1195 extern location_t
   1196 linemap_position_for_column (class line_maps *, unsigned int);
   1197 
   1198 /* Encode and return a source location from a given line and
   1199    column.  */
   1200 location_t
   1201 linemap_position_for_line_and_column (line_maps *set,
   1202 				      const line_map_ordinary *,
   1203 				      linenum_type, unsigned int);
   1204 
   1205 /* Encode and return a location_t starting from location LOC and
   1206    shifting it by OFFSET columns.  This function does not support
   1207    virtual locations.  */
   1208 location_t
   1209 linemap_position_for_loc_and_offset (class line_maps *set,
   1210 				     location_t loc,
   1211 				     unsigned int offset);
   1212 
   1213 /* Return the file this map is for.  */
   1214 inline const char *
   1215 LINEMAP_FILE (const line_map_ordinary *ord_map)
   1216 {
   1217   return ord_map->to_file;
   1218 }
   1219 
   1220 /* Return the line number this map started encoding location from.  */
   1221 inline linenum_type
   1222 LINEMAP_LINE (const line_map_ordinary *ord_map)
   1223 {
   1224   return ord_map->to_line;
   1225 }
   1226 
   1227 /* Return a positive value if map encodes locations from a system
   1228    header, 0 otherwise. Returns 1 if MAP encodes locations in a
   1229    system header and 2 if it encodes locations in a C system header
   1230    that therefore needs to be extern "C" protected in C++.  */
   1231 inline unsigned char
   1232 LINEMAP_SYSP (const line_map_ordinary *ord_map)
   1233 {
   1234   return ord_map->sysp;
   1235 }
   1236 
   1237 const struct line_map *first_map_in_common (const line_maps *set,
   1238 					    location_t loc0,
   1239 					    location_t loc1,
   1240 					    location_t *res_loc0,
   1241 					    location_t *res_loc1);
   1242 
   1243 /* Return a positive value if PRE denotes the location of a token that
   1244    comes before the token of POST, 0 if PRE denotes the location of
   1245    the same token as the token for POST, and a negative value
   1246    otherwise.  */
   1247 int linemap_compare_locations (const line_maps *set,
   1248 			       location_t   pre,
   1249 			       location_t   post);
   1250 
   1251 /* Return TRUE if LOC_A denotes the location a token that comes
   1252    topogically before the token denoted by location LOC_B, or if they
   1253    are equal.  */
   1254 inline bool
   1255 linemap_location_before_p (const line_maps *set,
   1256 			   location_t loc_a,
   1257 			   location_t loc_b)
   1258 {
   1259   return linemap_compare_locations (set, loc_a, loc_b) >= 0;
   1260 }
   1261 
   1262 typedef struct
   1263 {
   1264   /* The name of the source file involved.  */
   1265   const char *file;
   1266 
   1267   /* The line-location in the source file.  */
   1268   int line;
   1269 
   1270   int column;
   1271 
   1272   void *data;
   1273 
   1274   /* In a system header?. */
   1275   bool sysp;
   1276 } expanded_location;
   1277 
   1278 /* This is enum is used by the function linemap_resolve_location
   1279    below.  The meaning of the values is explained in the comment of
   1280    that function.  */
   1281 enum location_resolution_kind
   1282 {
   1283   LRK_MACRO_EXPANSION_POINT,
   1284   LRK_SPELLING_LOCATION,
   1285   LRK_MACRO_DEFINITION_LOCATION
   1286 };
   1287 
   1288 /* Resolve a virtual location into either a spelling location, an
   1289    expansion point location or a token argument replacement point
   1290    location.  Return the map that encodes the virtual location as well
   1291    as the resolved location.
   1292 
   1293    If LOC is *NOT* the location of a token resulting from the
   1294    expansion of a macro, then the parameter LRK (which stands for
   1295    Location Resolution Kind) is ignored and the resulting location
   1296    just equals the one given in argument.
   1297 
   1298    Now if LOC *IS* the location of a token resulting from the
   1299    expansion of a macro, this is what happens.
   1300 
   1301    * If LRK is set to LRK_MACRO_EXPANSION_POINT
   1302    -------------------------------
   1303 
   1304    The virtual location is resolved to the first macro expansion point
   1305    that led to this macro expansion.
   1306 
   1307    * If LRK is set to LRK_SPELLING_LOCATION
   1308    -------------------------------------
   1309 
   1310    The virtual location is resolved to the locus where the token has
   1311    been spelled in the source.   This can follow through all the macro
   1312    expansions that led to the token.
   1313 
   1314    * If LRK is set to LRK_MACRO_DEFINITION_LOCATION
   1315    --------------------------------------
   1316 
   1317    The virtual location is resolved to the locus of the token in the
   1318    context of the macro definition.
   1319 
   1320    If LOC is the locus of a token that is an argument of a
   1321    function-like macro [replacing a parameter in the replacement list
   1322    of the macro] the virtual location is resolved to the locus of the
   1323    parameter that is replaced, in the context of the definition of the
   1324    macro.
   1325 
   1326    If LOC is the locus of a token that is not an argument of a
   1327    function-like macro, then the function behaves as if LRK was set to
   1328    LRK_SPELLING_LOCATION.
   1329 
   1330    If LOC_MAP is not NULL, *LOC_MAP is set to the map encoding the
   1331    returned location.  Note that if the returned location wasn't originally
   1332    encoded by a map, the *MAP is set to NULL.  This can happen if LOC
   1333    resolves to a location reserved for the client code, like
   1334    UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC.  */
   1335 
   1336 location_t linemap_resolve_location (const line_maps *,
   1337 				     location_t loc,
   1338 				     enum location_resolution_kind lrk,
   1339 				     const line_map_ordinary **loc_map);
   1340 
   1341 /* Suppose that LOC is the virtual location of a token coming from the
   1342    expansion of a macro M.  This function then steps up to get the
   1343    location L of the point where M got expanded.  If L is a spelling
   1344    location inside a macro expansion M', then this function returns
   1345    the point where M' was expanded.  LOC_MAP is an output parameter.
   1346    When non-NULL, *LOC_MAP is set to the map of the returned
   1347    location.  */
   1348 location_t linemap_unwind_toward_expansion (const line_maps *,
   1349 					    location_t loc,
   1350 					    const line_map **loc_map);
   1351 
   1352 /* If LOC is the virtual location of a token coming from the expansion
   1353    of a macro M and if its spelling location is reserved (e.g, a
   1354    location for a built-in token), then this function unwinds (using
   1355    linemap_unwind_toward_expansion) the location until a location that
   1356    is not reserved and is not in a system header is reached.  In other
   1357    words, this unwinds the reserved location until a location that is
   1358    in real source code is reached.
   1359 
   1360    Otherwise, if the spelling location for LOC is not reserved or if
   1361    LOC doesn't come from the expansion of a macro, the function
   1362    returns LOC as is and *MAP is not touched.
   1363 
   1364    *MAP is set to the map of the returned location if the later is
   1365    different from LOC.  */
   1366 location_t linemap_unwind_to_first_non_reserved_loc (const line_maps *,
   1367 						     location_t loc,
   1368 						     const line_map **map);
   1369 
   1370 /* Expand source code location LOC and return a user readable source
   1371    code location.  LOC must be a spelling (non-virtual) location.  If
   1372    it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
   1373    location is returned.  */
   1374 expanded_location linemap_expand_location (const line_maps *,
   1375 					   const line_map *,
   1376 					   location_t loc);
   1377 
   1378 /* Statistics about maps allocation and usage as returned by
   1379    linemap_get_statistics.  */
   1380 struct linemap_stats
   1381 {
   1382   long num_ordinary_maps_allocated;
   1383   long num_ordinary_maps_used;
   1384   long ordinary_maps_allocated_size;
   1385   long ordinary_maps_used_size;
   1386   long num_expanded_macros;
   1387   long num_macro_tokens;
   1388   long num_macro_maps_used;
   1389   long macro_maps_allocated_size;
   1390   long macro_maps_used_size;
   1391   long macro_maps_locations_size;
   1392   long duplicated_macro_maps_locations_size;
   1393   long adhoc_table_size;
   1394   long adhoc_table_entries_used;
   1395 };
   1396 
   1397 /* Return the highest location emitted for a given file for which
   1398    there is a line map in SET.  FILE_NAME is the file name to
   1399    consider.  If the function returns TRUE, *LOC is set to the highest
   1400    location emitted for that file.  */
   1401 bool linemap_get_file_highest_location (const line_maps * set,
   1402 					const char *file_name,
   1403 					location_t *loc);
   1404 
   1405 /* Compute and return statistics about the memory consumption of some
   1406    parts of the line table SET.  */
   1407 void linemap_get_statistics (const line_maps *, struct linemap_stats *);
   1408 
   1409 /* Dump debugging information about source location LOC into the file
   1410    stream STREAM. SET is the line map set LOC comes from.  */
   1411 void linemap_dump_location (const line_maps *, location_t, FILE *);
   1412 
   1413 /* Dump line map at index IX in line table SET to STREAM.  If STREAM
   1414    is NULL, use stderr.  IS_MACRO is true if the caller wants to
   1415    dump a macro map, false otherwise.  */
   1416 void linemap_dump (FILE *, const line_maps *, unsigned, bool);
   1417 
   1418 /* Dump line table SET to STREAM.  If STREAM is NULL, stderr is used.
   1419    NUM_ORDINARY specifies how many ordinary maps to dump.  NUM_MACRO
   1420    specifies how many macro maps to dump.  */
   1421 void line_table_dump (FILE *, const line_maps *, unsigned int, unsigned int);
   1422 
   1423 /* An enum for distinguishing the various parts within a location_t.  */
   1424 
   1425 enum location_aspect
   1426 {
   1427   LOCATION_ASPECT_CARET,
   1428   LOCATION_ASPECT_START,
   1429   LOCATION_ASPECT_FINISH
   1430 };
   1431 
   1432 /* The rich_location class requires a way to expand location_t instances.
   1433    We would directly use expand_location_to_spelling_point, which is
   1434    implemented in gcc/input.cc, but we also need to use it for rich_location
   1435    within genmatch.cc.
   1436    Hence we require client code of libcpp to implement the following
   1437    symbol.  */
   1438 extern expanded_location
   1439 linemap_client_expand_location_to_spelling_point (const line_maps *,
   1440 						  location_t,
   1441 						  enum location_aspect);
   1442 
   1443 #endif /* !LIBCPP_LINE_MAP_H  */
   1444