xref: /dragonfly/contrib/gcc-8.0/libcpp/line-map.c (revision 3851e4b8)
1 /* Map (unsigned int) keys to (source file, line, column) triples.
2    Copyright (C) 2001-2018 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 #include "config.h"
23 #include "system.h"
24 #include "line-map.h"
25 #include "cpplib.h"
26 #include "internal.h"
27 #include "hashtab.h"
28 
29 /* Highest possible source location encoded within an ordinary or
30    macro map.  */
31 const source_location LINE_MAP_MAX_SOURCE_LOCATION = 0x70000000;
32 
33 static void trace_include (const struct line_maps *, const line_map_ordinary *);
34 static const line_map_ordinary * linemap_ordinary_map_lookup (struct line_maps *,
35 							      source_location);
36 static const line_map_macro* linemap_macro_map_lookup (struct line_maps *,
37 						       source_location);
38 static source_location linemap_macro_map_loc_to_def_point
39 (const line_map_macro *, source_location);
40 static source_location linemap_macro_map_loc_to_exp_point
41 (const line_map_macro *, source_location);
42 static source_location linemap_macro_loc_to_spelling_point
43 (struct line_maps *, source_location, const line_map_ordinary **);
44 static source_location linemap_macro_loc_to_def_point (struct line_maps *,
45 						       source_location,
46 						       const line_map_ordinary **);
47 static source_location linemap_macro_loc_to_exp_point (struct line_maps *,
48 						       source_location,
49 						       const line_map_ordinary **);
50 
51 /* Counters defined in macro.c.  */
52 extern unsigned num_expanded_macros_counter;
53 extern unsigned num_macro_tokens_counter;
54 
55 /* Destructor for class line_maps.
56    Ensure non-GC-managed memory is released.  */
57 
58 line_maps::~line_maps ()
59 {
60   if (location_adhoc_data_map.htab)
61     htab_delete (location_adhoc_data_map.htab);
62 }
63 
64 /* Hash function for location_adhoc_data hashtable.  */
65 
66 static hashval_t
67 location_adhoc_data_hash (const void *l)
68 {
69   const struct location_adhoc_data *lb =
70       (const struct location_adhoc_data *) l;
71   return ((hashval_t) lb->locus
72 	  + (hashval_t) lb->src_range.m_start
73 	  + (hashval_t) lb->src_range.m_finish
74 	  + (size_t) lb->data);
75 }
76 
77 /* Compare function for location_adhoc_data hashtable.  */
78 
79 static int
80 location_adhoc_data_eq (const void *l1, const void *l2)
81 {
82   const struct location_adhoc_data *lb1 =
83       (const struct location_adhoc_data *) l1;
84   const struct location_adhoc_data *lb2 =
85       (const struct location_adhoc_data *) l2;
86   return (lb1->locus == lb2->locus
87 	  && lb1->src_range.m_start == lb2->src_range.m_start
88 	  && lb1->src_range.m_finish == lb2->src_range.m_finish
89 	  && lb1->data == lb2->data);
90 }
91 
92 /* Update the hashtable when location_adhoc_data is reallocated.  */
93 
94 static int
95 location_adhoc_data_update (void **slot, void *data)
96 {
97   *((char **) slot)
98     = (char *) ((uintptr_t) *((char **) slot) + *((ptrdiff_t *) data));
99   return 1;
100 }
101 
102 /* Rebuild the hash table from the location adhoc data.  */
103 
104 void
105 rebuild_location_adhoc_htab (struct line_maps *set)
106 {
107   unsigned i;
108   set->location_adhoc_data_map.htab =
109       htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL);
110   for (i = 0; i < set->location_adhoc_data_map.curr_loc; i++)
111     htab_find_slot (set->location_adhoc_data_map.htab,
112 		    set->location_adhoc_data_map.data + i, INSERT);
113 }
114 
115 /* Helper function for get_combined_adhoc_loc.
116    Can the given LOCUS + SRC_RANGE and DATA pointer be stored compactly
117    within a source_location, without needing to use an ad-hoc location.  */
118 
119 static bool
120 can_be_stored_compactly_p (struct line_maps *set,
121 			   source_location locus,
122 			   source_range src_range,
123 			   void *data)
124 {
125   /* If there's an ad-hoc pointer, we can't store it directly in the
126      source_location, we need the lookaside.  */
127   if (data)
128     return false;
129 
130   /* We only store ranges that begin at the locus and that are sufficiently
131      "sane".  */
132   if (src_range.m_start != locus)
133     return false;
134 
135   if (src_range.m_finish < src_range.m_start)
136     return false;
137 
138   if (src_range.m_start < RESERVED_LOCATION_COUNT)
139     return false;
140 
141   if (locus >= LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES)
142     return false;
143 
144   /* All 3 locations must be within ordinary maps, typically, the same
145      ordinary map.  */
146   source_location lowest_macro_loc = LINEMAPS_MACRO_LOWEST_LOCATION (set);
147   if (locus >= lowest_macro_loc)
148     return false;
149   if (src_range.m_start >= lowest_macro_loc)
150     return false;
151   if (src_range.m_finish >= lowest_macro_loc)
152     return false;
153 
154   /* Passed all tests.  */
155   return true;
156 }
157 
158 /* Combine LOCUS and DATA to a combined adhoc loc.  */
159 
160 source_location
161 get_combined_adhoc_loc (struct line_maps *set,
162 			source_location locus,
163 			source_range src_range,
164 			void *data)
165 {
166   struct location_adhoc_data lb;
167   struct location_adhoc_data **slot;
168 
169   if (IS_ADHOC_LOC (locus))
170     locus
171       = set->location_adhoc_data_map.data[locus & MAX_SOURCE_LOCATION].locus;
172   if (locus == 0 && data == NULL)
173     return 0;
174 
175   /* Any ordinary locations ought to be "pure" at this point: no
176      compressed ranges.  */
177   linemap_assert (locus < RESERVED_LOCATION_COUNT
178 		  || locus >= LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES
179 		  || locus >= LINEMAPS_MACRO_LOWEST_LOCATION (set)
180 		  || pure_location_p (set, locus));
181 
182   /* Consider short-range optimization.  */
183   if (can_be_stored_compactly_p (set, locus, src_range, data))
184     {
185       /* The low bits ought to be clear.  */
186       linemap_assert (pure_location_p (set, locus));
187       const line_map *map = linemap_lookup (set, locus);
188       const line_map_ordinary *ordmap = linemap_check_ordinary (map);
189       unsigned int int_diff = src_range.m_finish - src_range.m_start;
190       unsigned int col_diff = (int_diff >> ordmap->m_range_bits);
191       if (col_diff < (1U << ordmap->m_range_bits))
192 	{
193 	  source_location packed = locus | col_diff;
194 	  set->num_optimized_ranges++;
195 	  return packed;
196 	}
197     }
198 
199   /* We can also compactly store locations
200      when locus == start == finish (and data is NULL).  */
201   if (locus == src_range.m_start
202       && locus == src_range.m_finish
203       && !data)
204     return locus;
205 
206   if (!data)
207     set->num_unoptimized_ranges++;
208 
209   lb.locus = locus;
210   lb.src_range = src_range;
211   lb.data = data;
212   slot = (struct location_adhoc_data **)
213       htab_find_slot (set->location_adhoc_data_map.htab, &lb, INSERT);
214   if (*slot == NULL)
215     {
216       if (set->location_adhoc_data_map.curr_loc >=
217 	  set->location_adhoc_data_map.allocated)
218 	{
219 	  char *orig_data = (char *) set->location_adhoc_data_map.data;
220 	  ptrdiff_t offset;
221 	  /* Cast away extern "C" from the type of xrealloc.  */
222 	  line_map_realloc reallocator = (set->reallocator
223 					  ? set->reallocator
224 					  : (line_map_realloc) xrealloc);
225 
226 	  if (set->location_adhoc_data_map.allocated == 0)
227 	    set->location_adhoc_data_map.allocated = 128;
228 	  else
229 	    set->location_adhoc_data_map.allocated *= 2;
230 	  set->location_adhoc_data_map.data = (struct location_adhoc_data *)
231 	      reallocator (set->location_adhoc_data_map.data,
232 			   set->location_adhoc_data_map.allocated
233 			   * sizeof (struct location_adhoc_data));
234 	  offset = (char *) (set->location_adhoc_data_map.data) - orig_data;
235 	  if (set->location_adhoc_data_map.allocated > 128)
236 	    htab_traverse (set->location_adhoc_data_map.htab,
237 			   location_adhoc_data_update, &offset);
238 	}
239       *slot = set->location_adhoc_data_map.data
240 	      + set->location_adhoc_data_map.curr_loc;
241       set->location_adhoc_data_map.data[set->location_adhoc_data_map.curr_loc++]
242 	= lb;
243     }
244   return ((*slot) - set->location_adhoc_data_map.data) | 0x80000000;
245 }
246 
247 /* Return the data for the adhoc loc.  */
248 
249 void *
250 get_data_from_adhoc_loc (struct line_maps *set, source_location loc)
251 {
252   linemap_assert (IS_ADHOC_LOC (loc));
253   return set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].data;
254 }
255 
256 /* Return the location for the adhoc loc.  */
257 
258 source_location
259 get_location_from_adhoc_loc (struct line_maps *set, source_location loc)
260 {
261   linemap_assert (IS_ADHOC_LOC (loc));
262   return set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
263 }
264 
265 /* Return the source_range for adhoc location LOC.  */
266 
267 static source_range
268 get_range_from_adhoc_loc (struct line_maps *set, source_location loc)
269 {
270   linemap_assert (IS_ADHOC_LOC (loc));
271   return set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].src_range;
272 }
273 
274 /* Get the source_range of location LOC, either from the ad-hoc
275    lookaside table, or embedded inside LOC itself.  */
276 
277 source_range
278 get_range_from_loc (struct line_maps *set,
279 		    source_location loc)
280 {
281   if (IS_ADHOC_LOC (loc))
282     return get_range_from_adhoc_loc (set, loc);
283 
284   /* For ordinary maps, extract packed range.  */
285   if (loc >= RESERVED_LOCATION_COUNT
286       && loc < LINEMAPS_MACRO_LOWEST_LOCATION (set)
287       && loc <= LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES)
288     {
289       const line_map *map = linemap_lookup (set, loc);
290       const line_map_ordinary *ordmap = linemap_check_ordinary (map);
291       source_range result;
292       int offset = loc & ((1 << ordmap->m_range_bits) - 1);
293       result.m_start = loc - offset;
294       result.m_finish = result.m_start + (offset << ordmap->m_range_bits);
295       return result;
296     }
297 
298   return source_range::from_location (loc);
299 }
300 
301 /* Get whether location LOC is a "pure" location, or
302    whether it is an ad-hoc location, or embeds range information.  */
303 
304 bool
305 pure_location_p (line_maps *set, source_location loc)
306 {
307   if (IS_ADHOC_LOC (loc))
308     return false;
309 
310   const line_map *map = linemap_lookup (set, loc);
311   const line_map_ordinary *ordmap = linemap_check_ordinary (map);
312 
313   if (loc & ((1U << ordmap->m_range_bits) - 1))
314     return false;
315 
316   return true;
317 }
318 
319 /* Given location LOC within SET, strip away any packed range information
320    or ad-hoc information.  */
321 
322 source_location
323 get_pure_location (line_maps *set, source_location loc)
324 {
325   if (IS_ADHOC_LOC (loc))
326     loc
327       = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
328 
329   if (loc >= LINEMAPS_MACRO_LOWEST_LOCATION (set))
330     return loc;
331 
332   if (loc < RESERVED_LOCATION_COUNT)
333     return loc;
334 
335   const line_map *map = linemap_lookup (set, loc);
336   const line_map_ordinary *ordmap = linemap_check_ordinary (map);
337 
338   return loc & ~((1 << ordmap->m_range_bits) - 1);
339 }
340 
341 /* Initialize a line map set.  */
342 
343 void
344 linemap_init (struct line_maps *set,
345 	      source_location builtin_location)
346 {
347 #if __GNUC__ == 4 && __GNUC_MINOR__ == 2 && !defined (__clang__)
348   /* PR33916, needed to fix PR82939.  */
349   memset (set, 0, sizeof (struct line_maps));
350 #else
351   *set = line_maps ();
352 #endif
353   set->highest_location = RESERVED_LOCATION_COUNT - 1;
354   set->highest_line = RESERVED_LOCATION_COUNT - 1;
355   set->location_adhoc_data_map.htab =
356       htab_create (100, location_adhoc_data_hash, location_adhoc_data_eq, NULL);
357   set->builtin_location = builtin_location;
358 }
359 
360 /* Check for and warn about line_maps entered but not exited.  */
361 
362 void
363 linemap_check_files_exited (struct line_maps *set)
364 {
365   const line_map_ordinary *map;
366   /* Depending upon whether we are handling preprocessed input or
367      not, this can be a user error or an ICE.  */
368   for (map = LINEMAPS_LAST_ORDINARY_MAP (set);
369        ! MAIN_FILE_P (map);
370        map = INCLUDED_FROM (set, map))
371     fprintf (stderr, "line-map.c: file \"%s\" entered but not left\n",
372 	     ORDINARY_MAP_FILE_NAME (map));
373 }
374 
375 /* Create a new line map in the line map set SET, and return it.
376    REASON is the reason of creating the map. It determines the type
377    of map created (ordinary or macro map). Note that ordinary maps and
378    macro maps are allocated in different memory location.  */
379 
380 static struct line_map *
381 new_linemap (struct line_maps *set,
382 	     enum lc_reason reason)
383 {
384   /* Depending on this variable, a macro map would be allocated in a
385      different memory location than an ordinary map.  */
386   bool macro_map_p = (reason == LC_ENTER_MACRO);
387   struct line_map *result;
388 
389   if (LINEMAPS_USED (set, macro_map_p) == LINEMAPS_ALLOCATED (set, macro_map_p))
390     {
391       /* We ran out of allocated line maps. Let's allocate more.  */
392       size_t alloc_size;
393 
394       /* Cast away extern "C" from the type of xrealloc.  */
395       line_map_realloc reallocator = (set->reallocator
396 				      ? set->reallocator
397 				      : (line_map_realloc) xrealloc);
398       line_map_round_alloc_size_func round_alloc_size =
399 	set->round_alloc_size;
400 
401       size_t map_size = (macro_map_p
402 			 ? sizeof (line_map_macro)
403 			 : sizeof (line_map_ordinary));
404 
405       /* We are going to execute some dance to try to reduce the
406 	 overhead of the memory allocator, in case we are using the
407 	 ggc-page.c one.
408 
409 	 The actual size of memory we are going to get back from the
410 	 allocator is the smallest power of 2 that is greater than the
411 	 size we requested.  So let's consider that size then.  */
412 
413       alloc_size =
414 	(2 * LINEMAPS_ALLOCATED (set, macro_map_p) +  256)
415 	* map_size;
416 
417       /* Get the actual size of memory that is going to be allocated
418 	 by the allocator.  */
419       alloc_size = round_alloc_size (alloc_size);
420 
421       /* Now alloc_size contains the exact memory size we would get if
422 	 we have asked for the initial alloc_size amount of memory.
423 	 Let's get back to the number of macro map that amounts
424 	 to.  */
425       LINEMAPS_ALLOCATED (set, macro_map_p) =
426 	alloc_size / map_size;
427 
428       /* And now let's really do the re-allocation.  */
429       if (macro_map_p)
430 	{
431 	  set->info_macro.maps
432 	    = (line_map_macro *) (*reallocator) (set->info_macro.maps,
433 						 (LINEMAPS_ALLOCATED (set, macro_map_p)
434 						  * map_size));
435 	  result = &set->info_macro.maps[LINEMAPS_USED (set, macro_map_p)];
436 	}
437       else
438 	{
439 	  set->info_ordinary.maps =
440 	    (line_map_ordinary *) (*reallocator) (set->info_ordinary.maps,
441 						  (LINEMAPS_ALLOCATED (set, macro_map_p)
442 						   * map_size));
443 	  result = &set->info_ordinary.maps[LINEMAPS_USED (set, macro_map_p)];
444 	}
445       memset (result, 0,
446 	      ((LINEMAPS_ALLOCATED (set, macro_map_p)
447 		- LINEMAPS_USED (set, macro_map_p))
448 	       * map_size));
449     }
450   else
451     {
452       if (macro_map_p)
453 	result = &set->info_macro.maps[LINEMAPS_USED (set, macro_map_p)];
454       else
455 	result = &set->info_ordinary.maps[LINEMAPS_USED (set, macro_map_p)];
456     }
457 
458   LINEMAPS_USED (set, macro_map_p)++;
459 
460   result->reason = reason;
461   return result;
462 }
463 
464 /* Add a mapping of logical source line to physical source file and
465    line number.
466 
467    The text pointed to by TO_FILE must have a lifetime
468    at least as long as the final call to lookup_line ().  An empty
469    TO_FILE means standard input.  If reason is LC_LEAVE, and
470    TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their
471    natural values considering the file we are returning to.
472 
473    FROM_LINE should be monotonic increasing across calls to this
474    function.  A call to this function can relocate the previous set of
475    maps, so any stored line_map pointers should not be used.  */
476 
477 const struct line_map *
478 linemap_add (struct line_maps *set, enum lc_reason reason,
479 	     unsigned int sysp, const char *to_file, linenum_type to_line)
480 {
481   /* Generate a start_location above the current highest_location.
482      If possible, make the low range bits be zero.  */
483   source_location start_location;
484   if (set->highest_location < LINE_MAP_MAX_LOCATION_WITH_COLS)
485     {
486       start_location = set->highest_location + (1 << set->default_range_bits);
487       if (set->default_range_bits)
488 	start_location &= ~((1 << set->default_range_bits) - 1);
489       linemap_assert (0 == (start_location
490 			    & ((1 << set->default_range_bits) - 1)));
491     }
492   else
493     start_location = set->highest_location + 1;
494 
495   linemap_assert (!(LINEMAPS_ORDINARY_USED (set)
496 		    && (start_location
497 			< MAP_START_LOCATION (LINEMAPS_LAST_ORDINARY_MAP (set)))));
498 
499   /* When we enter the file for the first time reason cannot be
500      LC_RENAME.  */
501   linemap_assert (!(set->depth == 0 && reason == LC_RENAME));
502 
503   /* If we are leaving the main file, return a NULL map.  */
504   if (reason == LC_LEAVE
505       && MAIN_FILE_P (LINEMAPS_LAST_ORDINARY_MAP (set))
506       && to_file == NULL)
507     {
508       set->depth--;
509       return NULL;
510     }
511 
512   linemap_assert (reason != LC_ENTER_MACRO);
513   line_map_ordinary *map = linemap_check_ordinary (new_linemap (set, reason));
514 
515   if (to_file && *to_file == '\0' && reason != LC_RENAME_VERBATIM)
516     to_file = "<stdin>";
517 
518   if (reason == LC_RENAME_VERBATIM)
519     reason = LC_RENAME;
520 
521   if (reason == LC_LEAVE)
522     {
523       /* When we are just leaving an "included" file, and jump to the next
524 	 location inside the "includer" right after the #include
525 	 "included", this variable points the map in use right before the
526 	 #include "included", inside the same "includer" file.  */
527       line_map_ordinary *from;
528 
529       linemap_assert (!MAIN_FILE_P (map - 1));
530       /* (MAP - 1) points to the map we are leaving. The
531 	 map from which (MAP - 1) got included should be the map
532 	 that comes right before MAP in the same file.  */
533       from = INCLUDED_FROM (set, map - 1);
534 
535       /* A TO_FILE of NULL is special - we use the natural values.  */
536       if (to_file == NULL)
537 	{
538 	  to_file = ORDINARY_MAP_FILE_NAME (from);
539 	  to_line = SOURCE_LINE (from, from[1].start_location);
540 	  sysp = ORDINARY_MAP_IN_SYSTEM_HEADER_P (from);
541 	}
542       else
543 	linemap_assert (filename_cmp (ORDINARY_MAP_FILE_NAME (from),
544 				      to_file) == 0);
545     }
546 
547   map->sysp = sysp;
548   map->start_location = start_location;
549   map->to_file = to_file;
550   map->to_line = to_line;
551   LINEMAPS_ORDINARY_CACHE (set) = LINEMAPS_ORDINARY_USED (set) - 1;
552   map->m_column_and_range_bits = 0;
553   map->m_range_bits = 0;
554   set->highest_location = start_location;
555   set->highest_line = start_location;
556   set->max_column_hint = 0;
557 
558   /* This assertion is placed after set->highest_location has
559      been updated, since the latter affects
560      linemap_location_from_macro_expansion_p, which ultimately affects
561      pure_location_p.  */
562   linemap_assert (pure_location_p (set, start_location));
563 
564   if (reason == LC_ENTER)
565     {
566       map->included_from =
567 	set->depth == 0 ? -1 : (int) (LINEMAPS_ORDINARY_USED (set) - 2);
568       set->depth++;
569       if (set->trace_includes)
570 	trace_include (set, map);
571     }
572   else if (reason == LC_RENAME)
573     map->included_from = ORDINARY_MAP_INCLUDER_FILE_INDEX (&map[-1]);
574   else if (reason == LC_LEAVE)
575     {
576       set->depth--;
577       map->included_from =
578 	ORDINARY_MAP_INCLUDER_FILE_INDEX (INCLUDED_FROM (set, map - 1));
579     }
580 
581   return map;
582 }
583 
584 /* Returns TRUE if the line table set tracks token locations across
585    macro expansion, FALSE otherwise.  */
586 
587 bool
588 linemap_tracks_macro_expansion_locs_p (struct line_maps *set)
589 {
590   return LINEMAPS_MACRO_MAPS (set) != NULL;
591 }
592 
593 /* Create a macro map.  A macro map encodes source locations of tokens
594    that are part of a macro replacement-list, at a macro expansion
595    point.  See the extensive comments of struct line_map and struct
596    line_map_macro, in line-map.h.
597 
598    This map shall be created when the macro is expanded.  The map
599    encodes the source location of the expansion point of the macro as
600    well as the "original" source location of each token that is part
601    of the macro replacement-list.  If a macro is defined but never
602    expanded, it has no macro map.  SET is the set of maps the macro
603    map should be part of.  MACRO_NODE is the macro which the new macro
604    map should encode source locations for.  EXPANSION is the location
605    of the expansion point of MACRO. For function-like macros
606    invocations, it's best to make it point to the closing parenthesis
607    of the macro, rather than the the location of the first character
608    of the macro.  NUM_TOKENS is the number of tokens that are part of
609    the replacement-list of MACRO.
610 
611    Note that when we run out of the integer space available for source
612    locations, this function returns NULL.  In that case, callers of
613    this function cannot encode {line,column} pairs into locations of
614    macro tokens anymore.  */
615 
616 const line_map_macro *
617 linemap_enter_macro (struct line_maps *set, struct cpp_hashnode *macro_node,
618 		     source_location expansion, unsigned int num_tokens)
619 {
620   line_map_macro *map;
621   source_location start_location;
622   /* Cast away extern "C" from the type of xrealloc.  */
623   line_map_realloc reallocator = (set->reallocator
624 				  ? set->reallocator
625 				  : (line_map_realloc) xrealloc);
626 
627   start_location = LINEMAPS_MACRO_LOWEST_LOCATION (set) - num_tokens;
628 
629   if (start_location <= set->highest_line
630       || start_location > LINEMAPS_MACRO_LOWEST_LOCATION (set))
631     /* We ran out of macro map space.   */
632     return NULL;
633 
634   map = linemap_check_macro (new_linemap (set, LC_ENTER_MACRO));
635 
636   map->start_location = start_location;
637   map->macro = macro_node;
638   map->n_tokens = num_tokens;
639   map->macro_locations
640     = (source_location*) reallocator (NULL,
641 				      2 * num_tokens
642 				      * sizeof (source_location));
643   map->expansion = expansion;
644   memset (MACRO_MAP_LOCATIONS (map), 0,
645 	  num_tokens * sizeof (source_location));
646 
647   LINEMAPS_MACRO_CACHE (set) = LINEMAPS_MACRO_USED (set) - 1;
648 
649   return map;
650 }
651 
652 /* Create and return a virtual location for a token that is part of a
653    macro expansion-list at a macro expansion point.  See the comment
654    inside struct line_map_macro to see what an expansion-list exactly
655    is.
656 
657    A call to this function must come after a call to
658    linemap_enter_macro.
659 
660    MAP is the map into which the source location is created.  TOKEN_NO
661    is the index of the token in the macro replacement-list, starting
662    at number 0.
663 
664    ORIG_LOC is the location of the token outside of this macro
665    expansion.  If the token comes originally from the macro
666    definition, it is the locus in the macro definition; otherwise it
667    is a location in the context of the caller of this macro expansion
668    (which is a virtual location or a source location if the caller is
669    itself a macro expansion or not).
670 
671    ORIG_PARM_REPLACEMENT_LOC is the location in the macro definition,
672    either of the token itself or of a macro parameter that it
673    replaces.  */
674 
675 source_location
676 linemap_add_macro_token (const line_map_macro *map,
677 			 unsigned int token_no,
678 			 source_location orig_loc,
679 			 source_location orig_parm_replacement_loc)
680 {
681   source_location result;
682 
683   linemap_assert (linemap_macro_expansion_map_p (map));
684   linemap_assert (token_no < MACRO_MAP_NUM_MACRO_TOKENS (map));
685 
686   MACRO_MAP_LOCATIONS (map)[2 * token_no] = orig_loc;
687   MACRO_MAP_LOCATIONS (map)[2 * token_no + 1] = orig_parm_replacement_loc;
688 
689   result = MAP_START_LOCATION (map) + token_no;
690   return result;
691 }
692 
693 /* Return a source_location for the start (i.e. column==0) of
694    (physical) line TO_LINE in the current source file (as in the
695    most recent linemap_add).   MAX_COLUMN_HINT is the highest column
696    number we expect to use in this line (but it does not change
697    the highest_location).  */
698 
699 source_location
700 linemap_line_start (struct line_maps *set, linenum_type to_line,
701 		    unsigned int max_column_hint)
702 {
703   line_map_ordinary *map = LINEMAPS_LAST_ORDINARY_MAP (set);
704   source_location highest = set->highest_location;
705   source_location r;
706   linenum_type last_line =
707     SOURCE_LINE (map, set->highest_line);
708   int line_delta = to_line - last_line;
709   bool add_map = false;
710   linemap_assert (map->m_column_and_range_bits >= map->m_range_bits);
711   int effective_column_bits = map->m_column_and_range_bits - map->m_range_bits;
712 
713   if (line_delta < 0
714       || (line_delta > 10
715 	  && line_delta * map->m_column_and_range_bits > 1000)
716       || (max_column_hint >= (1U << effective_column_bits))
717       || (max_column_hint <= 80 && effective_column_bits >= 10)
718       || (highest > LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES
719 	  && map->m_range_bits > 0)
720       || (highest > LINE_MAP_MAX_LOCATION_WITH_COLS
721 	  && (set->max_column_hint || highest >= LINE_MAP_MAX_SOURCE_LOCATION)))
722     add_map = true;
723   else
724     max_column_hint = set->max_column_hint;
725   if (add_map)
726     {
727       int column_bits;
728       int range_bits;
729       if (max_column_hint > LINE_MAP_MAX_COLUMN_NUMBER
730 	  || highest > LINE_MAP_MAX_LOCATION_WITH_COLS)
731 	{
732 	  /* If the column number is ridiculous or we've allocated a huge
733 	     number of source_locations, give up on column numbers
734 	     (and on packed ranges).  */
735 	  max_column_hint = 0;
736 	  column_bits = 0;
737 	  range_bits = 0;
738 	  if (highest > LINE_MAP_MAX_SOURCE_LOCATION)
739 	    return 0;
740 	}
741       else
742 	{
743 	  column_bits = 7;
744 	  if (highest <= LINE_MAP_MAX_LOCATION_WITH_PACKED_RANGES)
745 	    range_bits = set->default_range_bits;
746 	  else
747 	    range_bits = 0;
748 	  while (max_column_hint >= (1U << column_bits))
749 	    column_bits++;
750 	  max_column_hint = 1U << column_bits;
751 	  column_bits += range_bits;
752 	}
753       /* Allocate the new line_map.  However, if the current map only has a
754 	 single line we can sometimes just increase its column_bits instead. */
755       if (line_delta < 0
756 	  || last_line != ORDINARY_MAP_STARTING_LINE_NUMBER (map)
757 	  || SOURCE_COLUMN (map, highest) >= (1U << (column_bits - range_bits))
758 	  || range_bits < map->m_range_bits)
759 	map = linemap_check_ordinary
760 	        (const_cast <line_map *>
761 		  (linemap_add (set, LC_RENAME,
762 				ORDINARY_MAP_IN_SYSTEM_HEADER_P (map),
763 				ORDINARY_MAP_FILE_NAME (map),
764 				to_line)));
765       map->m_column_and_range_bits = column_bits;
766       map->m_range_bits = range_bits;
767       r = (MAP_START_LOCATION (map)
768 	   + ((to_line - ORDINARY_MAP_STARTING_LINE_NUMBER (map))
769 	      << column_bits));
770     }
771   else
772     r = set->highest_line + (line_delta << map->m_column_and_range_bits);
773 
774   /* Locations of ordinary tokens are always lower than locations of
775      macro tokens.  */
776   if (r >= LINEMAPS_MACRO_LOWEST_LOCATION (set))
777     return 0;
778 
779   set->highest_line = r;
780   if (r > set->highest_location)
781     set->highest_location = r;
782   set->max_column_hint = max_column_hint;
783 
784   /* At this point, we expect one of:
785      (a) the normal case: a "pure" location with 0 range bits, or
786      (b) we've gone past LINE_MAP_MAX_LOCATION_WITH_COLS so can't track
787         columns anymore (or ranges), or
788      (c) we're in a region with a column hint exceeding
789         LINE_MAP_MAX_COLUMN_NUMBER, so column-tracking is off,
790 	with column_bits == 0.  */
791   linemap_assert (pure_location_p (set, r)
792 		  || r >= LINE_MAP_MAX_LOCATION_WITH_COLS
793 		  || map->m_column_and_range_bits == 0);
794   linemap_assert (SOURCE_LINE (map, r) == to_line);
795   return r;
796 }
797 
798 /* Encode and return a source_location from a column number. The
799    source line considered is the last source line used to call
800    linemap_line_start, i.e, the last source line which a location was
801    encoded from.  */
802 
803 source_location
804 linemap_position_for_column (struct line_maps *set, unsigned int to_column)
805 {
806   source_location r = set->highest_line;
807 
808   linemap_assert
809     (!linemap_macro_expansion_map_p (LINEMAPS_LAST_ORDINARY_MAP (set)));
810 
811   if (to_column >= set->max_column_hint)
812     {
813       if (r > LINE_MAP_MAX_LOCATION_WITH_COLS
814 	  || to_column > LINE_MAP_MAX_COLUMN_NUMBER)
815 	{
816 	  /* Running low on source_locations - disable column numbers.  */
817 	  return r;
818 	}
819       else
820 	{
821 	  /* Otherwise, attempt to start a new line that can hold TO_COLUMN,
822 	     with some space to spare.  This may or may not lead to a new
823 	     linemap being created.  */
824 	  line_map_ordinary *map = LINEMAPS_LAST_ORDINARY_MAP (set);
825 	  r = linemap_line_start (set, SOURCE_LINE (map, r), to_column + 50);
826 	  map = LINEMAPS_LAST_ORDINARY_MAP (set);
827 	  if (map->m_column_and_range_bits == 0)
828 	    {
829 	      /* ...then the linemap has column-tracking disabled,
830 		 presumably due to exceeding either
831 		 LINE_MAP_MAX_LOCATION_WITH_COLS (overall) or
832 		 LINE_MAP_MAX_COLUMN_NUMBER (within this line).
833 		 Return the start of the linemap, which encodes column 0, for
834 		 the whole line.  */
835 	      return r;
836 	    }
837 	}
838     }
839   line_map_ordinary *map = LINEMAPS_LAST_ORDINARY_MAP (set);
840   r = r + (to_column << map->m_range_bits);
841   if (r >= set->highest_location)
842     set->highest_location = r;
843   return r;
844 }
845 
846 /* Encode and return a source location from a given line and
847    column.  */
848 
849 source_location
850 linemap_position_for_line_and_column (line_maps *set,
851 				      const line_map_ordinary *ord_map,
852 				      linenum_type line,
853 				      unsigned column)
854 {
855   linemap_assert (ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map) <= line);
856 
857   source_location r = MAP_START_LOCATION (ord_map);
858   r += ((line - ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map))
859 	<< ord_map->m_column_and_range_bits);
860   if (r <= LINE_MAP_MAX_LOCATION_WITH_COLS)
861     r += ((column & ((1 << ord_map->m_column_and_range_bits) - 1))
862 	  << ord_map->m_range_bits);
863   source_location upper_limit = LINEMAPS_MACRO_LOWEST_LOCATION (set);
864   if (r >= upper_limit)
865     r = upper_limit - 1;
866   if (r > set->highest_location)
867     set->highest_location = r;
868   return r;
869 }
870 
871 /* Encode and return a source_location starting from location LOC and
872    shifting it by COLUMN_OFFSET columns.  This function does not support
873    virtual locations.  */
874 
875 source_location
876 linemap_position_for_loc_and_offset (struct line_maps *set,
877 				     source_location loc,
878 				     unsigned int column_offset)
879 {
880   const line_map_ordinary * map = NULL;
881 
882   if (IS_ADHOC_LOC (loc))
883     loc = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
884 
885   /* This function does not support virtual locations yet.  */
886   if (linemap_location_from_macro_expansion_p (set, loc))
887     return loc;
888 
889   if (column_offset == 0
890       /* Adding an offset to a reserved location (like
891 	 UNKNOWN_LOCATION for the C/C++ FEs) does not really make
892 	 sense.  So let's leave the location intact in that case.  */
893       || loc < RESERVED_LOCATION_COUNT)
894     return loc;
895 
896   /* We find the real location and shift it.  */
897   loc = linemap_resolve_location (set, loc, LRK_SPELLING_LOCATION, &map);
898   /* The new location (loc + offset) should be higher than the first
899      location encoded by MAP.  This can fail if the line information
900      is messed up because of line directives (see PR66415).  */
901   if (MAP_START_LOCATION (map) >= loc + (column_offset << map->m_range_bits))
902     return loc;
903 
904   linenum_type line = SOURCE_LINE (map, loc);
905   unsigned int column = SOURCE_COLUMN (map, loc);
906 
907   /* If MAP is not the last line map of its set, then the new location
908      (loc + offset) should be less than the first location encoded by
909      the next line map of the set.  Otherwise, we try to encode the
910      location in the next map.  */
911   while (map != LINEMAPS_LAST_ORDINARY_MAP (set)
912 	 && (loc + (column_offset << map->m_range_bits)
913 	     >= MAP_START_LOCATION (&map[1])))
914     {
915       map = &map[1];
916       /* If the next map starts in a higher line, we cannot encode the
917 	 location there.  */
918       if (line < ORDINARY_MAP_STARTING_LINE_NUMBER (map))
919 	return loc;
920     }
921 
922   column += column_offset;
923 
924   /* Bail out if the column is not representable within the existing
925      linemap.  */
926   if (column >= (1u << (map->m_column_and_range_bits - map->m_range_bits)))
927     return loc;
928 
929   source_location r =
930     linemap_position_for_line_and_column (set, map, line, column);
931   if (linemap_assert_fails (r <= set->highest_location)
932       || linemap_assert_fails (map == linemap_lookup (set, r)))
933     return loc;
934 
935   return r;
936 }
937 
938 /* Given a virtual source location yielded by a map (either an
939    ordinary or a macro map), returns that map.  */
940 
941 const struct line_map*
942 linemap_lookup (struct line_maps *set, source_location line)
943 {
944   if (IS_ADHOC_LOC (line))
945     line = set->location_adhoc_data_map.data[line & MAX_SOURCE_LOCATION].locus;
946   if (linemap_location_from_macro_expansion_p (set, line))
947     return linemap_macro_map_lookup (set, line);
948   return linemap_ordinary_map_lookup (set, line);
949 }
950 
951 /* Given a source location yielded by an ordinary map, returns that
952    map.  Since the set is built chronologically, the logical lines are
953    monotonic increasing, and so the list is sorted and we can use a
954    binary search.  */
955 
956 static const line_map_ordinary *
957 linemap_ordinary_map_lookup (struct line_maps *set, source_location line)
958 {
959   unsigned int md, mn, mx;
960   const line_map_ordinary *cached, *result;
961 
962   if (IS_ADHOC_LOC (line))
963     line = set->location_adhoc_data_map.data[line & MAX_SOURCE_LOCATION].locus;
964 
965   if (set ==  NULL || line < RESERVED_LOCATION_COUNT)
966     return NULL;
967 
968   mn = LINEMAPS_ORDINARY_CACHE (set);
969   mx = LINEMAPS_ORDINARY_USED (set);
970 
971   cached = LINEMAPS_ORDINARY_MAP_AT (set, mn);
972   /* We should get a segfault if no line_maps have been added yet.  */
973   if (line >= MAP_START_LOCATION (cached))
974     {
975       if (mn + 1 == mx || line < MAP_START_LOCATION (&cached[1]))
976 	return cached;
977     }
978   else
979     {
980       mx = mn;
981       mn = 0;
982     }
983 
984   while (mx - mn > 1)
985     {
986       md = (mn + mx) / 2;
987       if (MAP_START_LOCATION (LINEMAPS_ORDINARY_MAP_AT (set, md)) > line)
988 	mx = md;
989       else
990 	mn = md;
991     }
992 
993   LINEMAPS_ORDINARY_CACHE (set) = mn;
994   result = LINEMAPS_ORDINARY_MAP_AT (set, mn);
995   linemap_assert (line >= MAP_START_LOCATION (result));
996   return result;
997 }
998 
999 /* Given a source location yielded by a macro map, returns that map.
1000    Since the set is built chronologically, the logical lines are
1001    monotonic decreasing, and so the list is sorted and we can use a
1002    binary search.  */
1003 
1004 static const line_map_macro *
1005 linemap_macro_map_lookup (struct line_maps *set, source_location line)
1006 {
1007   unsigned int md, mn, mx;
1008   const struct line_map_macro *cached, *result;
1009 
1010   if (IS_ADHOC_LOC (line))
1011     line = set->location_adhoc_data_map.data[line & MAX_SOURCE_LOCATION].locus;
1012 
1013   linemap_assert (line >= LINEMAPS_MACRO_LOWEST_LOCATION (set));
1014 
1015   if (set ==  NULL)
1016     return NULL;
1017 
1018   mn = LINEMAPS_MACRO_CACHE (set);
1019   mx = LINEMAPS_MACRO_USED (set);
1020   cached = LINEMAPS_MACRO_MAP_AT (set, mn);
1021 
1022   if (line >= MAP_START_LOCATION (cached))
1023     {
1024       if (mn == 0 || line < MAP_START_LOCATION (&cached[-1]))
1025 	return cached;
1026       mx = mn - 1;
1027       mn = 0;
1028     }
1029 
1030   while (mn < mx)
1031     {
1032       md = (mx + mn) / 2;
1033       if (MAP_START_LOCATION (LINEMAPS_MACRO_MAP_AT (set, md)) > line)
1034 	mn = md + 1;
1035       else
1036 	mx = md;
1037     }
1038 
1039   LINEMAPS_MACRO_CACHE (set) = mx;
1040   result = LINEMAPS_MACRO_MAP_AT (set, LINEMAPS_MACRO_CACHE (set));
1041   linemap_assert (MAP_START_LOCATION (result) <= line);
1042 
1043   return result;
1044 }
1045 
1046 /* Return TRUE if MAP encodes locations coming from a macro
1047    replacement-list at macro expansion point.  */
1048 
1049 bool
1050 linemap_macro_expansion_map_p (const struct line_map *map)
1051 {
1052   if (!map)
1053     return false;
1054   return (map->reason == LC_ENTER_MACRO);
1055 }
1056 
1057 /* If LOCATION is the locus of a token in a replacement-list of a
1058    macro expansion return the location of the macro expansion point.
1059 
1060    Read the comments of struct line_map and struct line_map_macro in
1061    line-map.h to understand what a macro expansion point is.  */
1062 
1063 static source_location
1064 linemap_macro_map_loc_to_exp_point (const line_map_macro *map,
1065 				    source_location location ATTRIBUTE_UNUSED)
1066 {
1067   linemap_assert (linemap_macro_expansion_map_p (map)
1068 		  && location >= MAP_START_LOCATION (map));
1069 
1070   /* Make sure LOCATION is correct.  */
1071   linemap_assert ((location - MAP_START_LOCATION (map))
1072 		  <  MACRO_MAP_NUM_MACRO_TOKENS (map));
1073 
1074   return MACRO_MAP_EXPANSION_POINT_LOCATION (map);
1075 }
1076 
1077 /* LOCATION is the source location of a token that belongs to a macro
1078    replacement-list as part of the macro expansion denoted by MAP.
1079 
1080    Return the location of the token at the definition point of the
1081    macro.  */
1082 
1083 static source_location
1084 linemap_macro_map_loc_to_def_point (const line_map_macro *map,
1085 				    source_location location)
1086 {
1087   unsigned token_no;
1088 
1089   linemap_assert (linemap_macro_expansion_map_p (map)
1090 		  && location >= MAP_START_LOCATION (map));
1091   linemap_assert (location >= RESERVED_LOCATION_COUNT);
1092 
1093   token_no = location - MAP_START_LOCATION (map);
1094   linemap_assert (token_no < MACRO_MAP_NUM_MACRO_TOKENS (map));
1095 
1096   location = MACRO_MAP_LOCATIONS (map)[2 * token_no + 1];
1097 
1098   return location;
1099 }
1100 
1101 /* If LOCATION is the locus of a token that is an argument of a
1102    function-like macro M and appears in the expansion of M, return the
1103    locus of that argument in the context of the caller of M.
1104 
1105    In other words, this returns the xI location presented in the
1106    comments of line_map_macro above.  */
1107 source_location
1108 linemap_macro_map_loc_unwind_toward_spelling (line_maps *set,
1109 					      const line_map_macro* map,
1110 					      source_location location)
1111 {
1112   unsigned token_no;
1113 
1114   if (IS_ADHOC_LOC (location))
1115     location = get_location_from_adhoc_loc (set, location);
1116 
1117   linemap_assert (linemap_macro_expansion_map_p (map)
1118 		  && location >= MAP_START_LOCATION (map));
1119   linemap_assert (location >= RESERVED_LOCATION_COUNT);
1120   linemap_assert (!IS_ADHOC_LOC (location));
1121 
1122   token_no = location - MAP_START_LOCATION (map);
1123   linemap_assert (token_no < MACRO_MAP_NUM_MACRO_TOKENS (map));
1124 
1125   location = MACRO_MAP_LOCATIONS (map)[2 * token_no];
1126 
1127   return location;
1128 }
1129 
1130 /* Return the source line number corresponding to source location
1131    LOCATION.  SET is the line map set LOCATION comes from.  If
1132    LOCATION is the source location of token that is part of the
1133    replacement-list of a macro expansion return the line number of the
1134    macro expansion point.  */
1135 
1136 int
1137 linemap_get_expansion_line (struct line_maps *set,
1138 			    source_location location)
1139 {
1140   const line_map_ordinary *map = NULL;
1141 
1142   if (IS_ADHOC_LOC (location))
1143     location = set->location_adhoc_data_map.data[location
1144 						 & MAX_SOURCE_LOCATION].locus;
1145 
1146   if (location < RESERVED_LOCATION_COUNT)
1147     return 0;
1148 
1149   location =
1150     linemap_macro_loc_to_exp_point (set, location, &map);
1151 
1152   return SOURCE_LINE (map, location);
1153 }
1154 
1155 /* Return the path of the file corresponding to source code location
1156    LOCATION.
1157 
1158    If LOCATION is the source location of token that is part of the
1159    replacement-list of a macro expansion return the file path of the
1160    macro expansion point.
1161 
1162    SET is the line map set LOCATION comes from.  */
1163 
1164 const char*
1165 linemap_get_expansion_filename (struct line_maps *set,
1166 				source_location location)
1167 {
1168   const struct line_map_ordinary *map = NULL;
1169 
1170   if (IS_ADHOC_LOC (location))
1171     location = set->location_adhoc_data_map.data[location
1172 						 & MAX_SOURCE_LOCATION].locus;
1173 
1174   if (location < RESERVED_LOCATION_COUNT)
1175     return NULL;
1176 
1177   location =
1178     linemap_macro_loc_to_exp_point (set, location, &map);
1179 
1180   return LINEMAP_FILE (map);
1181 }
1182 
1183 /* Return the name of the macro associated to MACRO_MAP.  */
1184 
1185 const char*
1186 linemap_map_get_macro_name (const line_map_macro *macro_map)
1187 {
1188   linemap_assert (macro_map && linemap_macro_expansion_map_p (macro_map));
1189   return (const char*) NODE_NAME (MACRO_MAP_MACRO (macro_map));
1190 }
1191 
1192 /* Return a positive value if LOCATION is the locus of a token that is
1193    located in a system header, O otherwise. It returns 1 if LOCATION
1194    is the locus of a token that is located in a system header, and 2
1195    if LOCATION is the locus of a token located in a C system header
1196    that therefore needs to be extern "C" protected in C++.
1197 
1198    Note that this function returns 1 if LOCATION belongs to a token
1199    that is part of a macro replacement-list defined in a system
1200    header, but expanded in a non-system file.  */
1201 
1202 int
1203 linemap_location_in_system_header_p (struct line_maps *set,
1204 				     source_location location)
1205 {
1206   const struct line_map *map = NULL;
1207 
1208   if (IS_ADHOC_LOC (location))
1209     location = set->location_adhoc_data_map.data[location
1210 						 & MAX_SOURCE_LOCATION].locus;
1211 
1212   if (location < RESERVED_LOCATION_COUNT)
1213     return false;
1214 
1215   /* Let's look at where the token for LOCATION comes from.  */
1216   while (true)
1217     {
1218       map = linemap_lookup (set, location);
1219       if (map != NULL)
1220 	{
1221 	  if (!linemap_macro_expansion_map_p (map))
1222 	    /* It's a normal token.  */
1223 	    return LINEMAP_SYSP (linemap_check_ordinary (map));
1224 	  else
1225 	    {
1226 	      const line_map_macro *macro_map = linemap_check_macro (map);
1227 
1228 	      /* It's a token resulting from a macro expansion.  */
1229 	      source_location loc =
1230 		linemap_macro_map_loc_unwind_toward_spelling (set, macro_map, location);
1231 	      if (loc < RESERVED_LOCATION_COUNT)
1232 		/* This token might come from a built-in macro.  Let's
1233 		   look at where that macro got expanded.  */
1234 		location = linemap_macro_map_loc_to_exp_point (macro_map, location);
1235 	      else
1236 		location = loc;
1237 	    }
1238 	}
1239       else
1240 	break;
1241     }
1242   return false;
1243 }
1244 
1245 /* Return TRUE if LOCATION is a source code location of a token that is part of
1246    a macro expansion, FALSE otherwise.  */
1247 
1248 bool
1249 linemap_location_from_macro_expansion_p (const struct line_maps *set,
1250 					 source_location location)
1251 {
1252   if (IS_ADHOC_LOC (location))
1253     location = set->location_adhoc_data_map.data[location
1254 						 & MAX_SOURCE_LOCATION].locus;
1255 
1256   linemap_assert (location <= MAX_SOURCE_LOCATION
1257 		  && (set->highest_location
1258 		      < LINEMAPS_MACRO_LOWEST_LOCATION (set)));
1259   if (set == NULL)
1260     return false;
1261   return (location > set->highest_location);
1262 }
1263 
1264 /* Given two virtual locations *LOC0 and *LOC1, return the first
1265    common macro map in their macro expansion histories.  Return NULL
1266    if no common macro was found.  *LOC0 (resp. *LOC1) is set to the
1267    virtual location of the token inside the resulting macro.  */
1268 
1269 static const struct line_map*
1270 first_map_in_common_1 (struct line_maps *set,
1271 		       source_location *loc0,
1272 		       source_location *loc1)
1273 {
1274   source_location l0 = *loc0, l1 = *loc1;
1275   const struct line_map *map0 = linemap_lookup (set, l0),
1276     *map1 = linemap_lookup (set, l1);
1277 
1278   while (linemap_macro_expansion_map_p (map0)
1279 	 && linemap_macro_expansion_map_p (map1)
1280 	 && (map0 != map1))
1281     {
1282       if (MAP_START_LOCATION (map0) < MAP_START_LOCATION (map1))
1283 	{
1284 	  l0 = linemap_macro_map_loc_to_exp_point (linemap_check_macro (map0),
1285 						   l0);
1286 	  map0 = linemap_lookup (set, l0);
1287 	}
1288       else
1289 	{
1290 	  l1 = linemap_macro_map_loc_to_exp_point (linemap_check_macro (map1),
1291 						   l1);
1292 	  map1 = linemap_lookup (set, l1);
1293 	}
1294     }
1295 
1296   if (map0 == map1)
1297     {
1298       *loc0 = l0;
1299       *loc1 = l1;
1300       return map0;
1301     }
1302   return NULL;
1303 }
1304 
1305 /* Given two virtual locations LOC0 and LOC1, return the first common
1306    macro map in their macro expansion histories.  Return NULL if no
1307    common macro was found.  *RES_LOC0 (resp. *RES_LOC1) is set to the
1308    virtual location of the token inside the resulting macro, upon
1309    return of a non-NULL result.  */
1310 
1311 static const struct line_map*
1312 first_map_in_common (struct line_maps *set,
1313 		     source_location loc0,
1314 		     source_location loc1,
1315 		     source_location  *res_loc0,
1316 		     source_location  *res_loc1)
1317 {
1318   *res_loc0 = loc0;
1319   *res_loc1 = loc1;
1320 
1321   return first_map_in_common_1 (set, res_loc0, res_loc1);
1322 }
1323 
1324 /* Return a positive value if PRE denotes the location of a token that
1325    comes before the token of POST, 0 if PRE denotes the location of
1326    the same token as the token for POST, and a negative value
1327    otherwise.  */
1328 
1329 int
1330 linemap_compare_locations (struct line_maps *set,
1331 			   source_location  pre,
1332 			   source_location post)
1333 {
1334   bool pre_virtual_p, post_virtual_p;
1335   source_location l0 = pre, l1 = post;
1336 
1337   if (IS_ADHOC_LOC (l0))
1338     l0 = get_location_from_adhoc_loc (set, l0);
1339   if (IS_ADHOC_LOC (l1))
1340     l1 = get_location_from_adhoc_loc (set, l1);
1341 
1342   if (l0 == l1)
1343     return 0;
1344 
1345   if ((pre_virtual_p = linemap_location_from_macro_expansion_p (set, l0)))
1346     l0 = linemap_resolve_location (set, l0,
1347 				   LRK_MACRO_EXPANSION_POINT,
1348 				   NULL);
1349 
1350   if ((post_virtual_p = linemap_location_from_macro_expansion_p (set, l1)))
1351     l1 = linemap_resolve_location (set, l1,
1352 				   LRK_MACRO_EXPANSION_POINT,
1353 				   NULL);
1354 
1355   if (l0 == l1
1356       && pre_virtual_p
1357       && post_virtual_p)
1358     {
1359       /* So pre and post represent two tokens that are present in a
1360 	 same macro expansion.  Let's see if the token for pre was
1361 	 before the token for post in that expansion.  */
1362       unsigned i0, i1;
1363       const struct line_map *map =
1364 	first_map_in_common (set, pre, post, &l0, &l1);
1365 
1366       if (map == NULL)
1367 	/* This should not be possible.  */
1368 	abort ();
1369 
1370       i0 = l0 - MAP_START_LOCATION (map);
1371       i1 = l1 - MAP_START_LOCATION (map);
1372       return i1 - i0;
1373     }
1374 
1375   if (IS_ADHOC_LOC (l0))
1376     l0 = get_location_from_adhoc_loc (set, l0);
1377   if (IS_ADHOC_LOC (l1))
1378     l1 = get_location_from_adhoc_loc (set, l1);
1379 
1380   return l1 - l0;
1381 }
1382 
1383 /* Print an include trace, for e.g. the -H option of the preprocessor.  */
1384 
1385 static void
1386 trace_include (const struct line_maps *set, const line_map_ordinary *map)
1387 {
1388   unsigned int i = set->depth;
1389 
1390   while (--i)
1391     putc ('.', stderr);
1392 
1393   fprintf (stderr, " %s\n", ORDINARY_MAP_FILE_NAME (map));
1394 }
1395 
1396 /* Return the spelling location of the token wherever it comes from,
1397    whether part of a macro definition or not.
1398 
1399    This is a subroutine for linemap_resolve_location.  */
1400 
1401 static source_location
1402 linemap_macro_loc_to_spelling_point (struct line_maps *set,
1403 				     source_location location,
1404 				     const line_map_ordinary **original_map)
1405 {
1406   struct line_map *map;
1407   linemap_assert (set && location >= RESERVED_LOCATION_COUNT);
1408 
1409   while (true)
1410     {
1411       map = const_cast <line_map *> (linemap_lookup (set, location));
1412       if (!linemap_macro_expansion_map_p (map))
1413 	break;
1414 
1415       location
1416 	= linemap_macro_map_loc_unwind_toward_spelling
1417 	    (set, linemap_check_macro (map),
1418 	     location);
1419     }
1420 
1421   if (original_map)
1422     *original_map = linemap_check_ordinary (map);
1423   return location;
1424 }
1425 
1426 /* If LOCATION is the source location of a token that belongs to a
1427    macro replacement-list -- as part of a macro expansion -- then
1428    return the location of the token at the definition point of the
1429    macro.  Otherwise, return LOCATION.  SET is the set of maps
1430    location come from.  ORIGINAL_MAP is an output parm. If non NULL,
1431    the function sets *ORIGINAL_MAP to the ordinary (non-macro) map the
1432    returned location comes from.
1433 
1434    This is a subroutine of linemap_resolve_location.  */
1435 
1436 static source_location
1437 linemap_macro_loc_to_def_point (struct line_maps *set,
1438 				source_location location,
1439 				const line_map_ordinary **original_map)
1440 {
1441   struct line_map *map;
1442 
1443   linemap_assert (set && location >= RESERVED_LOCATION_COUNT);
1444 
1445   while (true)
1446     {
1447       source_location caret_loc;
1448       if (IS_ADHOC_LOC (location))
1449 	caret_loc = get_location_from_adhoc_loc (set, location);
1450       else
1451 	caret_loc = location;
1452 
1453       map = const_cast <line_map *> (linemap_lookup (set, caret_loc));
1454       if (!linemap_macro_expansion_map_p (map))
1455 	break;
1456 
1457       location =
1458 	linemap_macro_map_loc_to_def_point (linemap_check_macro (map),
1459 					    caret_loc);
1460     }
1461 
1462   if (original_map)
1463     *original_map = linemap_check_ordinary (map);
1464   return location;
1465 }
1466 
1467 /* If LOCATION is the source location of a token that belongs to a
1468    macro replacement-list -- at a macro expansion point -- then return
1469    the location of the topmost expansion point of the macro.  We say
1470    topmost because if we are in the context of a nested macro
1471    expansion, the function returns the source location of the first
1472    macro expansion that triggered the nested expansions.
1473 
1474    Otherwise, return LOCATION.  SET is the set of maps location come
1475    from.  ORIGINAL_MAP is an output parm. If non NULL, the function
1476    sets *ORIGINAL_MAP to the ordinary (non-macro) map the returned
1477    location comes from.
1478 
1479    This is a subroutine of linemap_resolve_location.  */
1480 
1481 static source_location
1482 linemap_macro_loc_to_exp_point (struct line_maps *set,
1483 				source_location location,
1484 				const line_map_ordinary **original_map)
1485 {
1486   struct line_map *map;
1487 
1488   if (IS_ADHOC_LOC (location))
1489     location = set->location_adhoc_data_map.data[location
1490 						 & MAX_SOURCE_LOCATION].locus;
1491 
1492   linemap_assert (set && location >= RESERVED_LOCATION_COUNT);
1493 
1494   while (true)
1495     {
1496       map = const_cast <line_map *> (linemap_lookup (set, location));
1497       if (!linemap_macro_expansion_map_p (map))
1498 	break;
1499       location = linemap_macro_map_loc_to_exp_point (linemap_check_macro (map),
1500 						     location);
1501     }
1502 
1503   if (original_map)
1504     *original_map = linemap_check_ordinary (map);
1505   return location;
1506 }
1507 
1508 /* Resolve a virtual location into either a spelling location, an
1509    expansion point location or a token argument replacement point
1510    location.  Return the map that encodes the virtual location as well
1511    as the resolved location.
1512 
1513    If LOC is *NOT* the location of a token resulting from the
1514    expansion of a macro, then the parameter LRK (which stands for
1515    Location Resolution Kind) is ignored and the resulting location
1516    just equals the one given in argument.
1517 
1518    Now if LOC *IS* the location of a token resulting from the
1519    expansion of a macro, this is what happens.
1520 
1521    * If LRK is set to LRK_MACRO_EXPANSION_POINT
1522    -------------------------------
1523 
1524    The virtual location is resolved to the first macro expansion point
1525    that led to this macro expansion.
1526 
1527    * If LRK is set to LRK_SPELLING_LOCATION
1528    -------------------------------------
1529 
1530    The virtual location is resolved to the locus where the token has
1531    been spelled in the source.   This can follow through all the macro
1532    expansions that led to the token.
1533 
1534    * If LRK is set to LRK_MACRO_DEFINITION_LOCATION
1535    --------------------------------------
1536 
1537    The virtual location is resolved to the locus of the token in the
1538    context of the macro definition.
1539 
1540    If LOC is the locus of a token that is an argument of a
1541    function-like macro [replacing a parameter in the replacement list
1542    of the macro] the virtual location is resolved to the locus of the
1543    parameter that is replaced, in the context of the definition of the
1544    macro.
1545 
1546    If LOC is the locus of a token that is not an argument of a
1547    function-like macro, then the function behaves as if LRK was set to
1548    LRK_SPELLING_LOCATION.
1549 
1550    If MAP is not NULL, *MAP is set to the map encoding the
1551    returned location.  Note that if the returned location wasn't originally
1552    encoded by a map, then *MAP is set to NULL.  This can happen if LOC
1553    resolves to a location reserved for the client code, like
1554    UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC.  */
1555 
1556 source_location
1557 linemap_resolve_location (struct line_maps *set,
1558 			  source_location loc,
1559 			  enum location_resolution_kind lrk,
1560 			  const line_map_ordinary **map)
1561 {
1562   source_location locus = loc;
1563   if (IS_ADHOC_LOC (loc))
1564     locus = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
1565 
1566   if (locus < RESERVED_LOCATION_COUNT)
1567     {
1568       /* A reserved location wasn't encoded in a map.  Let's return a
1569 	 NULL map here, just like what linemap_ordinary_map_lookup
1570 	 does.  */
1571       if (map)
1572 	*map = NULL;
1573       return loc;
1574     }
1575 
1576   switch (lrk)
1577     {
1578     case LRK_MACRO_EXPANSION_POINT:
1579       loc = linemap_macro_loc_to_exp_point (set, loc, map);
1580       break;
1581     case LRK_SPELLING_LOCATION:
1582       loc = linemap_macro_loc_to_spelling_point (set, loc, map);
1583       break;
1584     case LRK_MACRO_DEFINITION_LOCATION:
1585       loc = linemap_macro_loc_to_def_point (set, loc, map);
1586       break;
1587     default:
1588       abort ();
1589     }
1590   return loc;
1591 }
1592 
1593 /* TRUE if LOCATION is a source code location of a token that is part of the
1594    definition of a macro, FALSE otherwise.  */
1595 
1596 bool
1597 linemap_location_from_macro_definition_p (struct line_maps *set,
1598 					  source_location loc)
1599 {
1600   if (IS_ADHOC_LOC (loc))
1601     loc = get_location_from_adhoc_loc (set, loc);
1602 
1603   if (!linemap_location_from_macro_expansion_p (set, loc))
1604     return false;
1605 
1606   while (true)
1607     {
1608       const struct line_map_macro *map
1609 	= linemap_check_macro (linemap_lookup (set, loc));
1610 
1611       source_location s_loc
1612 	= linemap_macro_map_loc_unwind_toward_spelling (set, map, loc);
1613       if (linemap_location_from_macro_expansion_p (set, s_loc))
1614 	loc = s_loc;
1615       else
1616 	{
1617 	  source_location def_loc
1618 	    = linemap_macro_map_loc_to_def_point (map, loc);
1619 	  return s_loc == def_loc;
1620 	}
1621     }
1622 }
1623 
1624 /*
1625    Suppose that LOC is the virtual location of a token T coming from
1626    the expansion of a macro M.  This function then steps up to get the
1627    location L of the point where M got expanded.  If L is a spelling
1628    location inside a macro expansion M', then this function returns
1629    the locus of the point where M' was expanded.  Said otherwise, this
1630    function returns the location of T in the context that triggered
1631    the expansion of M.
1632 
1633    *LOC_MAP must be set to the map of LOC.  This function then sets it
1634    to the map of the returned location.  */
1635 
1636 source_location
1637 linemap_unwind_toward_expansion (struct line_maps *set,
1638 				 source_location loc,
1639 				 const struct line_map **map)
1640 {
1641   source_location resolved_location;
1642   const line_map_macro *macro_map = linemap_check_macro (*map);
1643   const struct line_map *resolved_map;
1644 
1645   if (IS_ADHOC_LOC (loc))
1646     loc = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
1647 
1648   resolved_location =
1649     linemap_macro_map_loc_unwind_toward_spelling (set, macro_map, loc);
1650   resolved_map = linemap_lookup (set, resolved_location);
1651 
1652   if (!linemap_macro_expansion_map_p (resolved_map))
1653     {
1654       resolved_location = linemap_macro_map_loc_to_exp_point (macro_map, loc);
1655       resolved_map = linemap_lookup (set, resolved_location);
1656     }
1657 
1658   *map = resolved_map;
1659   return resolved_location;
1660 }
1661 
1662 /* If LOC is the virtual location of a token coming from the expansion
1663    of a macro M and if its spelling location is reserved (e.g, a
1664    location for a built-in token), then this function unwinds (using
1665    linemap_unwind_toward_expansion) the location until a location that
1666    is not reserved and is not in a system header is reached.  In other
1667    words, this unwinds the reserved location until a location that is
1668    in real source code is reached.
1669 
1670    Otherwise, if the spelling location for LOC is not reserved or if
1671    LOC doesn't come from the expansion of a macro, the function
1672    returns LOC as is and *MAP is not touched.
1673 
1674    *MAP is set to the map of the returned location if the later is
1675    different from LOC.  */
1676 source_location
1677 linemap_unwind_to_first_non_reserved_loc (struct line_maps *set,
1678 					  source_location loc,
1679 					  const struct line_map **map)
1680 {
1681   source_location resolved_loc;
1682   const struct line_map *map0 = NULL;
1683   const line_map_ordinary *map1 = NULL;
1684 
1685   if (IS_ADHOC_LOC (loc))
1686     loc = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
1687 
1688   map0 = linemap_lookup (set, loc);
1689   if (!linemap_macro_expansion_map_p (map0))
1690     return loc;
1691 
1692   resolved_loc = linemap_resolve_location (set, loc,
1693 					   LRK_SPELLING_LOCATION,
1694 					   &map1);
1695 
1696   if (resolved_loc >= RESERVED_LOCATION_COUNT
1697       && !LINEMAP_SYSP (map1))
1698     return loc;
1699 
1700   while (linemap_macro_expansion_map_p (map0)
1701 	 && (resolved_loc < RESERVED_LOCATION_COUNT
1702 	     || LINEMAP_SYSP (map1)))
1703     {
1704       loc = linemap_unwind_toward_expansion (set, loc, &map0);
1705       resolved_loc = linemap_resolve_location (set, loc,
1706 					       LRK_SPELLING_LOCATION,
1707 					       &map1);
1708     }
1709 
1710   if (map != NULL)
1711     *map = map0;
1712   return loc;
1713 }
1714 
1715 /* Expand source code location LOC and return a user readable source
1716    code location.  LOC must be a spelling (non-virtual) location.  If
1717    it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
1718    location is returned.  */
1719 
1720 expanded_location
1721 linemap_expand_location (struct line_maps *set,
1722 			 const struct line_map *map,
1723 			 source_location loc)
1724 
1725 {
1726   expanded_location xloc;
1727 
1728   memset (&xloc, 0, sizeof (xloc));
1729   if (IS_ADHOC_LOC (loc))
1730     {
1731       xloc.data
1732 	= set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].data;
1733       loc = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
1734     }
1735 
1736   if (loc < RESERVED_LOCATION_COUNT)
1737     /* The location for this token wasn't generated from a line map.
1738        It was probably a location for a builtin token, chosen by some
1739        client code.  Let's not try to expand the location in that
1740        case.  */;
1741   else if (map == NULL)
1742     /* We shouldn't be getting a NULL map with a location that is not
1743        reserved by the client code.  */
1744     abort ();
1745   else
1746     {
1747       /* MAP must be an ordinary map and LOC must be non-virtual,
1748 	 encoded into this map, obviously; the accessors used on MAP
1749 	 below ensure it is ordinary.  Let's just assert the
1750 	 non-virtualness of LOC here.  */
1751       if (linemap_location_from_macro_expansion_p (set, loc))
1752 	abort ();
1753 
1754       const line_map_ordinary *ord_map = linemap_check_ordinary (map);
1755 
1756       xloc.file = LINEMAP_FILE (ord_map);
1757       xloc.line = SOURCE_LINE (ord_map, loc);
1758       xloc.column = SOURCE_COLUMN (ord_map, loc);
1759       xloc.sysp = LINEMAP_SYSP (ord_map) != 0;
1760     }
1761 
1762   return xloc;
1763 }
1764 
1765 
1766 /* Dump line map at index IX in line table SET to STREAM.  If STREAM
1767    is NULL, use stderr.  IS_MACRO is true if the caller wants to
1768    dump a macro map, false otherwise.  */
1769 
1770 void
1771 linemap_dump (FILE *stream, struct line_maps *set, unsigned ix, bool is_macro)
1772 {
1773   const char *lc_reasons_v[LC_ENTER_MACRO + 1]
1774       = { "LC_ENTER", "LC_LEAVE", "LC_RENAME", "LC_RENAME_VERBATIM",
1775 	  "LC_ENTER_MACRO" };
1776   const char *reason;
1777   const line_map *map;
1778 
1779   if (stream == NULL)
1780     stream = stderr;
1781 
1782   if (!is_macro)
1783     map = LINEMAPS_ORDINARY_MAP_AT (set, ix);
1784   else
1785     map = LINEMAPS_MACRO_MAP_AT (set, ix);
1786 
1787   reason = (map->reason <= LC_ENTER_MACRO) ? lc_reasons_v[map->reason] : "???";
1788 
1789   fprintf (stream, "Map #%u [%p] - LOC: %u - REASON: %s - SYSP: %s\n",
1790 	   ix, (void *) map, map->start_location, reason,
1791 	   ((!is_macro
1792 	     && ORDINARY_MAP_IN_SYSTEM_HEADER_P (linemap_check_ordinary (map)))
1793 	    ? "yes" : "no"));
1794   if (!is_macro)
1795     {
1796       const line_map_ordinary *ord_map = linemap_check_ordinary (map);
1797       unsigned includer_ix;
1798       const line_map_ordinary *includer_map;
1799 
1800       includer_ix = ORDINARY_MAP_INCLUDER_FILE_INDEX (ord_map);
1801       includer_map = includer_ix < LINEMAPS_ORDINARY_USED (set)
1802 		     ? LINEMAPS_ORDINARY_MAP_AT (set, includer_ix)
1803 		     : NULL;
1804 
1805       fprintf (stream, "File: %s:%d\n", ORDINARY_MAP_FILE_NAME (ord_map),
1806 	       ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map));
1807       fprintf (stream, "Included from: [%d] %s\n", includer_ix,
1808 	       includer_map ? ORDINARY_MAP_FILE_NAME (includer_map) : "None");
1809     }
1810   else
1811     {
1812       const line_map_macro *macro_map = linemap_check_macro (map);
1813       fprintf (stream, "Macro: %s (%u tokens)\n",
1814 	       linemap_map_get_macro_name (macro_map),
1815 	       MACRO_MAP_NUM_MACRO_TOKENS (macro_map));
1816     }
1817 
1818   fprintf (stream, "\n");
1819 }
1820 
1821 
1822 /* Dump debugging information about source location LOC into the file
1823    stream STREAM. SET is the line map set LOC comes from.  */
1824 
1825 void
1826 linemap_dump_location (struct line_maps *set,
1827 		       source_location loc,
1828 		       FILE *stream)
1829 {
1830   const line_map_ordinary *map;
1831   source_location location;
1832   const char *path = "", *from = "";
1833   int l = -1, c = -1, s = -1, e = -1;
1834 
1835   if (IS_ADHOC_LOC (loc))
1836     loc = set->location_adhoc_data_map.data[loc & MAX_SOURCE_LOCATION].locus;
1837 
1838   if (loc == 0)
1839     return;
1840 
1841   location =
1842     linemap_resolve_location (set, loc, LRK_MACRO_DEFINITION_LOCATION, &map);
1843 
1844   if (map == NULL)
1845     /* Only reserved locations can be tolerated in this case.  */
1846     linemap_assert (location < RESERVED_LOCATION_COUNT);
1847   else
1848     {
1849       path = LINEMAP_FILE (map);
1850       l = SOURCE_LINE (map, location);
1851       c = SOURCE_COLUMN (map, location);
1852       s = LINEMAP_SYSP (map) != 0;
1853       e = location != loc;
1854       if (e)
1855 	from = "N/A";
1856       else
1857 	from = (INCLUDED_FROM (set, map))
1858 	  ? LINEMAP_FILE (INCLUDED_FROM (set, map))
1859 	  : "<NULL>";
1860     }
1861 
1862   /* P: path, L: line, C: column, S: in-system-header, M: map address,
1863      E: macro expansion?, LOC: original location, R: resolved location   */
1864   fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d,R:%d}",
1865 	   path, from, l, c, s, (void*)map, e, loc, location);
1866 }
1867 
1868 /* Return the highest location emitted for a given file for which
1869    there is a line map in SET.  FILE_NAME is the file name to
1870    consider.  If the function returns TRUE, *LOC is set to the highest
1871    location emitted for that file.  */
1872 
1873 bool
1874 linemap_get_file_highest_location (struct line_maps *set,
1875 				   const char *file_name,
1876 				   source_location *loc)
1877 {
1878   /* If the set is empty or no ordinary map has been created then
1879      there is no file to look for ...  */
1880   if (set == NULL || set->info_ordinary.used == 0)
1881     return false;
1882 
1883   /* Now look for the last ordinary map created for FILE_NAME.  */
1884   int i;
1885   for (i = set->info_ordinary.used - 1; i >= 0; --i)
1886     {
1887       const char *fname = set->info_ordinary.maps[i].to_file;
1888       if (fname && !filename_cmp (fname, file_name))
1889 	break;
1890     }
1891 
1892   if (i < 0)
1893     return false;
1894 
1895   /* The highest location for a given map is either the starting
1896      location of the next map minus one, or -- if the map is the
1897      latest one -- the highest location of the set.  */
1898   source_location result;
1899   if (i == (int) set->info_ordinary.used - 1)
1900     result = set->highest_location;
1901   else
1902     result = set->info_ordinary.maps[i + 1].start_location - 1;
1903 
1904   *loc = result;
1905   return true;
1906 }
1907 
1908 /* Compute and return statistics about the memory consumption of some
1909    parts of the line table SET.  */
1910 
1911 void
1912 linemap_get_statistics (struct line_maps *set,
1913 			struct linemap_stats *s)
1914 {
1915   long ordinary_maps_allocated_size, ordinary_maps_used_size,
1916     macro_maps_allocated_size, macro_maps_used_size,
1917     macro_maps_locations_size = 0, duplicated_macro_maps_locations_size = 0;
1918 
1919   const line_map_macro *cur_map;
1920 
1921   ordinary_maps_allocated_size =
1922     LINEMAPS_ORDINARY_ALLOCATED (set) * sizeof (struct line_map_ordinary);
1923 
1924   ordinary_maps_used_size =
1925     LINEMAPS_ORDINARY_USED (set) * sizeof (struct line_map_ordinary);
1926 
1927   macro_maps_allocated_size =
1928     LINEMAPS_MACRO_ALLOCATED (set) * sizeof (struct line_map_macro);
1929 
1930   for (cur_map = LINEMAPS_MACRO_MAPS (set);
1931        cur_map && cur_map <= LINEMAPS_LAST_MACRO_MAP (set);
1932        ++cur_map)
1933     {
1934       unsigned i;
1935 
1936       linemap_assert (linemap_macro_expansion_map_p (cur_map));
1937 
1938       macro_maps_locations_size +=
1939 	2 * MACRO_MAP_NUM_MACRO_TOKENS (cur_map) * sizeof (source_location);
1940 
1941       for (i = 0; i < 2 * MACRO_MAP_NUM_MACRO_TOKENS (cur_map); i += 2)
1942 	{
1943 	  if (MACRO_MAP_LOCATIONS (cur_map)[i] ==
1944 	      MACRO_MAP_LOCATIONS (cur_map)[i + 1])
1945 	    duplicated_macro_maps_locations_size +=
1946 	      sizeof (source_location);
1947 	}
1948     }
1949 
1950   macro_maps_used_size =
1951     LINEMAPS_MACRO_USED (set) * sizeof (struct line_map_macro);
1952 
1953   s->num_ordinary_maps_allocated = LINEMAPS_ORDINARY_ALLOCATED (set);
1954   s->num_ordinary_maps_used = LINEMAPS_ORDINARY_USED (set);
1955   s->ordinary_maps_allocated_size = ordinary_maps_allocated_size;
1956   s->ordinary_maps_used_size = ordinary_maps_used_size;
1957   s->num_expanded_macros = num_expanded_macros_counter;
1958   s->num_macro_tokens = num_macro_tokens_counter;
1959   s->num_macro_maps_used = LINEMAPS_MACRO_USED (set);
1960   s->macro_maps_allocated_size = macro_maps_allocated_size;
1961   s->macro_maps_locations_size = macro_maps_locations_size;
1962   s->macro_maps_used_size = macro_maps_used_size;
1963   s->duplicated_macro_maps_locations_size =
1964     duplicated_macro_maps_locations_size;
1965   s->adhoc_table_size = (set->location_adhoc_data_map.allocated
1966 			 * sizeof (struct location_adhoc_data));
1967   s->adhoc_table_entries_used = set->location_adhoc_data_map.curr_loc;
1968 }
1969 
1970 
1971 /* Dump line table SET to STREAM.  If STREAM is NULL, stderr is used.
1972    NUM_ORDINARY specifies how many ordinary maps to dump.  NUM_MACRO
1973    specifies how many macro maps to dump.  */
1974 
1975 void
1976 line_table_dump (FILE *stream, struct line_maps *set, unsigned int num_ordinary,
1977 		 unsigned int num_macro)
1978 {
1979   unsigned int i;
1980 
1981   if (set == NULL)
1982     return;
1983 
1984   if (stream == NULL)
1985     stream = stderr;
1986 
1987   fprintf (stream, "# of ordinary maps:  %d\n", LINEMAPS_ORDINARY_USED (set));
1988   fprintf (stream, "# of macro maps:     %d\n", LINEMAPS_MACRO_USED (set));
1989   fprintf (stream, "Include stack depth: %d\n", set->depth);
1990   fprintf (stream, "Highest location:    %u\n", set->highest_location);
1991 
1992   if (num_ordinary)
1993     {
1994       fprintf (stream, "\nOrdinary line maps\n");
1995       for (i = 0; i < num_ordinary && i < LINEMAPS_ORDINARY_USED (set); i++)
1996 	linemap_dump (stream, set, i, false);
1997       fprintf (stream, "\n");
1998     }
1999 
2000   if (num_macro)
2001     {
2002       fprintf (stream, "\nMacro line maps\n");
2003       for (i = 0; i < num_macro && i < LINEMAPS_MACRO_USED (set); i++)
2004 	linemap_dump (stream, set, i, true);
2005       fprintf (stream, "\n");
2006     }
2007 }
2008 
2009 /* class rich_location.  */
2010 
2011 /* Construct a rich_location with location LOC as its initial range.  */
2012 
2013 rich_location::rich_location (line_maps *set, source_location loc) :
2014   m_line_table (set),
2015   m_ranges (),
2016   m_column_override (0),
2017   m_have_expanded_location (false),
2018   m_fixit_hints (),
2019   m_seen_impossible_fixit (false),
2020   m_fixits_cannot_be_auto_applied (false)
2021 {
2022   add_range (loc, true);
2023 }
2024 
2025 /* The destructor for class rich_location.  */
2026 
2027 rich_location::~rich_location ()
2028 {
2029   for (unsigned int i = 0; i < m_fixit_hints.count (); i++)
2030     delete get_fixit_hint (i);
2031 }
2032 
2033 /* Get location IDX within this rich_location.  */
2034 
2035 source_location
2036 rich_location::get_loc (unsigned int idx) const
2037 {
2038   const location_range *locrange = get_range (idx);
2039   return locrange->m_loc;
2040 }
2041 
2042 /* Get range IDX within this rich_location.  */
2043 
2044 const location_range *
2045 rich_location::get_range (unsigned int idx) const
2046 {
2047   return &m_ranges[idx];
2048 }
2049 
2050 /* Mutable access to range IDX within this rich_location.  */
2051 
2052 location_range *
2053 rich_location::get_range (unsigned int idx)
2054 {
2055   return &m_ranges[idx];
2056 }
2057 
2058 /* Expand location IDX within this rich_location.  */
2059 /* Get an expanded_location for this rich_location's primary
2060    location.  */
2061 
2062 expanded_location
2063 rich_location::get_expanded_location (unsigned int idx)
2064 {
2065   if (idx == 0)
2066    {
2067      /* Cache the expansion of the primary location.  */
2068      if (!m_have_expanded_location)
2069        {
2070 	  m_expanded_location
2071 	    = linemap_client_expand_location_to_spelling_point
2072 		(get_loc (0), LOCATION_ASPECT_CARET);
2073 	  if (m_column_override)
2074 	    m_expanded_location.column = m_column_override;
2075 	  m_have_expanded_location = true;
2076        }
2077 
2078      return m_expanded_location;
2079    }
2080   else
2081     return linemap_client_expand_location_to_spelling_point
2082 	     (get_loc (idx), LOCATION_ASPECT_CARET);
2083 }
2084 
2085 /* Set the column of the primary location, with 0 meaning
2086    "don't override it".  */
2087 
2088 void
2089 rich_location::override_column (int column)
2090 {
2091   m_column_override = column;
2092   m_have_expanded_location = false;
2093 }
2094 
2095 /* Add the given range.  */
2096 
2097 void
2098 rich_location::add_range (source_location loc, bool show_caret_p)
2099 {
2100   location_range range;
2101   range.m_loc = loc;
2102   range.m_show_caret_p = show_caret_p;
2103   m_ranges.push (range);
2104 }
2105 
2106 /* Add or overwrite the location given by IDX, setting its location to LOC,
2107    and setting its "should my caret be printed" flag to SHOW_CARET_P.
2108 
2109    It must either overwrite an existing location, or add one *exactly* on
2110    the end of the array.
2111 
2112    This is primarily for use by gcc when implementing diagnostic format
2113    decoders e.g.
2114    - the "+" in the C/C++ frontends, for handling format codes like "%q+D"
2115      (which writes the source location of a tree back into location 0 of
2116      the rich_location), and
2117    - the "%C" and "%L" format codes in the Fortran frontend.  */
2118 
2119 void
2120 rich_location::set_range (line_maps * /*set*/, unsigned int idx,
2121 			  source_location loc, bool show_caret_p)
2122 {
2123   /* We can either overwrite an existing range, or add one exactly
2124      on the end of the array.  */
2125   linemap_assert (idx <= m_ranges.count ());
2126 
2127   if (idx == m_ranges.count ())
2128     add_range (loc,  show_caret_p);
2129   else
2130     {
2131       location_range *locrange = get_range (idx);
2132       locrange->m_loc = loc;
2133       locrange->m_show_caret_p = show_caret_p;
2134     }
2135 
2136   if (idx == 0)
2137     /* Mark any cached value here as dirty.  */
2138     m_have_expanded_location = false;
2139 }
2140 
2141 /* Methods for adding insertion fix-it hints.  */
2142 
2143 /* Add a fixit-hint, suggesting insertion of NEW_CONTENT
2144    immediately before the primary range's start location.  */
2145 
2146 void
2147 rich_location::add_fixit_insert_before (const char *new_content)
2148 {
2149   add_fixit_insert_before (get_loc (), new_content);
2150 }
2151 
2152 /* Add a fixit-hint, suggesting insertion of NEW_CONTENT
2153    immediately before the start of WHERE.  */
2154 
2155 void
2156 rich_location::add_fixit_insert_before (source_location where,
2157 					const char *new_content)
2158 {
2159   source_location start = get_range_from_loc (m_line_table, where).m_start;
2160   maybe_add_fixit (start, start, new_content);
2161 }
2162 
2163 /* Add a fixit-hint, suggesting insertion of NEW_CONTENT
2164    immediately after the primary range's end-point.  */
2165 
2166 void
2167 rich_location::add_fixit_insert_after (const char *new_content)
2168 {
2169   add_fixit_insert_after (get_loc (), new_content);
2170 }
2171 
2172 /* Add a fixit-hint, suggesting insertion of NEW_CONTENT
2173    immediately after the end-point of WHERE.  */
2174 
2175 void
2176 rich_location::add_fixit_insert_after (source_location where,
2177 				       const char *new_content)
2178 {
2179   source_location finish = get_range_from_loc (m_line_table, where).m_finish;
2180   source_location next_loc
2181     = linemap_position_for_loc_and_offset (m_line_table, finish, 1);
2182 
2183   /* linemap_position_for_loc_and_offset can fail, if so, it returns
2184      its input value.  */
2185   if (next_loc == finish)
2186     {
2187       stop_supporting_fixits ();
2188       return;
2189     }
2190 
2191   maybe_add_fixit (next_loc, next_loc, new_content);
2192 }
2193 
2194 /* Methods for adding removal fix-it hints.  */
2195 
2196 /* Add a fixit-hint, suggesting removal of the content covered
2197    by range 0.  */
2198 
2199 void
2200 rich_location::add_fixit_remove ()
2201 {
2202   add_fixit_remove (get_loc ());
2203 }
2204 
2205 /* Add a fixit-hint, suggesting removal of the content between
2206    the start and finish of WHERE.  */
2207 
2208 void
2209 rich_location::add_fixit_remove (source_location where)
2210 {
2211   source_range range = get_range_from_loc (m_line_table, where);
2212   add_fixit_remove (range);
2213 }
2214 
2215 /* Add a fixit-hint, suggesting removal of the content at
2216    SRC_RANGE.  */
2217 
2218 void
2219 rich_location::add_fixit_remove (source_range src_range)
2220 {
2221   add_fixit_replace (src_range, "");
2222 }
2223 
2224 /* Add a fixit-hint, suggesting replacement of the content covered
2225    by range 0 with NEW_CONTENT.  */
2226 
2227 void
2228 rich_location::add_fixit_replace (const char *new_content)
2229 {
2230   add_fixit_replace (get_loc (), new_content);
2231 }
2232 
2233 /* Methods for adding "replace" fix-it hints.  */
2234 
2235 /* Add a fixit-hint, suggesting replacement of the content between
2236    the start and finish of WHERE with NEW_CONTENT.  */
2237 
2238 void
2239 rich_location::add_fixit_replace (source_location where,
2240 				  const char *new_content)
2241 {
2242   source_range range = get_range_from_loc (m_line_table, where);
2243   add_fixit_replace (range, new_content);
2244 }
2245 
2246 /* Add a fixit-hint, suggesting replacement of the content at
2247    SRC_RANGE with NEW_CONTENT.  */
2248 
2249 void
2250 rich_location::add_fixit_replace (source_range src_range,
2251 				  const char *new_content)
2252 {
2253   source_location start = get_pure_location (m_line_table, src_range.m_start);
2254   source_location finish = get_pure_location (m_line_table, src_range.m_finish);
2255 
2256   /* Fix-it hints use half-closed ranges, so attempt to offset the endpoint.  */
2257   source_location next_loc
2258     = linemap_position_for_loc_and_offset (m_line_table, finish, 1);
2259   /* linemap_position_for_loc_and_offset can fail, if so, it returns
2260      its input value.  */
2261   if (next_loc == finish)
2262     {
2263       stop_supporting_fixits ();
2264       return;
2265     }
2266   finish = next_loc;
2267 
2268   maybe_add_fixit (start, finish, new_content);
2269 }
2270 
2271 /* Get the last fix-it hint within this rich_location, or NULL if none.  */
2272 
2273 fixit_hint *
2274 rich_location::get_last_fixit_hint () const
2275 {
2276   if (m_fixit_hints.count () > 0)
2277     return get_fixit_hint (m_fixit_hints.count () - 1);
2278   else
2279     return NULL;
2280 }
2281 
2282 /* If WHERE is an "awkward" location, then mark this rich_location as not
2283    supporting fixits, purging any thay were already added, and return true.
2284 
2285    Otherwise (the common case), return false.  */
2286 
2287 bool
2288 rich_location::reject_impossible_fixit (source_location where)
2289 {
2290   /* Fix-its within a rich_location should either all be suggested, or
2291      none of them should be suggested.
2292      Once we've rejected a fixit, we reject any more, even those
2293      with reasonable locations.  */
2294   if (m_seen_impossible_fixit)
2295     return true;
2296 
2297   if (where <= LINE_MAP_MAX_LOCATION_WITH_COLS)
2298     /* WHERE is a reasonable location for a fix-it; don't reject it.  */
2299     return false;
2300 
2301   /* Otherwise we have an attempt to add a fix-it with an "awkward"
2302      location: either one that we can't obtain column information
2303      for (within an ordinary map), or one within a macro expansion.  */
2304   stop_supporting_fixits ();
2305   return true;
2306 }
2307 
2308 /* Mark this rich_location as not supporting fixits, purging any that were
2309    already added.  */
2310 
2311 void
2312 rich_location::stop_supporting_fixits ()
2313 {
2314   m_seen_impossible_fixit = true;
2315 
2316   /* Purge the rich_location of any fix-its that were already added. */
2317   for (unsigned int i = 0; i < m_fixit_hints.count (); i++)
2318     delete get_fixit_hint (i);
2319   m_fixit_hints.truncate (0);
2320 }
2321 
2322 /* Add HINT to the fix-it hints in this rich_location,
2323    consolidating into the prior fixit if possible.  */
2324 
2325 void
2326 rich_location::maybe_add_fixit (source_location start,
2327 				source_location next_loc,
2328 				const char *new_content)
2329 {
2330   if (reject_impossible_fixit (start))
2331     return;
2332   if (reject_impossible_fixit (next_loc))
2333     return;
2334 
2335   /* Only allow fix-it hints that affect a single line in one file.
2336      Compare the end-points.  */
2337   expanded_location exploc_start
2338     = linemap_client_expand_location_to_spelling_point (start,
2339 							LOCATION_ASPECT_START);
2340   expanded_location exploc_next_loc
2341     = linemap_client_expand_location_to_spelling_point (next_loc,
2342 							LOCATION_ASPECT_START);
2343   /* They must be within the same file...  */
2344   if (exploc_start.file != exploc_next_loc.file)
2345     {
2346       stop_supporting_fixits ();
2347       return;
2348     }
2349   /* ...and on the same line.  */
2350   if (exploc_start.line != exploc_next_loc.line)
2351     {
2352       stop_supporting_fixits ();
2353       return;
2354     }
2355   /* The columns must be in the correct order.  This can fail if the
2356      endpoints straddle the boundary for which the linemap can represent
2357      columns (PR c/82050).  */
2358   if (exploc_start.column > exploc_next_loc.column)
2359     {
2360       stop_supporting_fixits ();
2361       return;
2362     }
2363 
2364   const char *newline = strchr (new_content, '\n');
2365   if (newline)
2366     {
2367       /* For now, we can only support insertion of whole lines
2368 	 i.e. starts at start of line, and the newline is at the end of
2369 	 the insertion point.  */
2370 
2371       /* It must be an insertion, not a replacement/deletion.  */
2372       if (start != next_loc)
2373 	{
2374 	  stop_supporting_fixits ();
2375 	  return;
2376 	}
2377 
2378       /* The insertion must be at the start of a line.  */
2379       if (exploc_start.column != 1)
2380 	{
2381 	  stop_supporting_fixits ();
2382 	  return;
2383 	}
2384 
2385       /* The newline must be at end of NEW_CONTENT.
2386 	 We could eventually split up fix-its at newlines if we wanted
2387 	 to allow more generality (e.g. to allow adding multiple lines
2388 	 with one add_fixit call.  */
2389       if (newline[1] != '\0')
2390 	{
2391 	  stop_supporting_fixits ();
2392 	  return;
2393 	}
2394     }
2395 
2396   /* Consolidate neighboring fixits.
2397      Don't consolidate into newline-insertion fixits.  */
2398   fixit_hint *prev = get_last_fixit_hint ();
2399   if (prev && !prev->ends_with_newline_p ())
2400     if (prev->maybe_append (start, next_loc, new_content))
2401       return;
2402 
2403   m_fixit_hints.push (new fixit_hint (start, next_loc, new_content));
2404 }
2405 
2406 /* class fixit_hint.  */
2407 
2408 fixit_hint::fixit_hint (source_location start,
2409 			source_location next_loc,
2410 			const char *new_content)
2411 : m_start (start),
2412   m_next_loc (next_loc),
2413   m_bytes (xstrdup (new_content)),
2414   m_len (strlen (new_content))
2415 {
2416 }
2417 
2418 /* Does this fix-it hint affect the given line?  */
2419 
2420 bool
2421 fixit_hint::affects_line_p (const char *file, int line) const
2422 {
2423   expanded_location exploc_start
2424     = linemap_client_expand_location_to_spelling_point (m_start,
2425 							LOCATION_ASPECT_START);
2426   if (file != exploc_start.file)
2427     return false;
2428   if (line < exploc_start.line)
2429       return false;
2430   expanded_location exploc_next_loc
2431     = linemap_client_expand_location_to_spelling_point (m_next_loc,
2432 							LOCATION_ASPECT_START);
2433   if (file != exploc_next_loc.file)
2434     return false;
2435   if (line > exploc_next_loc.line)
2436       return false;
2437   return true;
2438 }
2439 
2440 /* Method for consolidating fix-it hints, for use by
2441    rich_location::maybe_add_fixit.
2442    If possible, merge a pending fix-it hint with the given params
2443    into this one and return true.
2444    Otherwise return false.  */
2445 
2446 bool
2447 fixit_hint::maybe_append (source_location start,
2448 			  source_location next_loc,
2449 			  const char *new_content)
2450 {
2451   /* For consolidation to be possible, START must be at this hint's
2452      m_next_loc.  */
2453   if (start != m_next_loc)
2454     return false;
2455 
2456   /* If so, we have neighboring replacements; merge them.  */
2457   m_next_loc = next_loc;
2458   size_t extra_len = strlen (new_content);
2459   m_bytes = (char *)xrealloc (m_bytes, m_len + extra_len + 1);
2460   memcpy (m_bytes + m_len, new_content, extra_len);
2461   m_len += extra_len;
2462   m_bytes[m_len] = '\0';
2463   return true;
2464 }
2465 
2466 /* Return true iff this hint's content ends with a newline.  */
2467 
2468 bool
2469 fixit_hint::ends_with_newline_p () const
2470 {
2471   if (m_len == 0)
2472     return false;
2473   return m_bytes[m_len - 1] == '\n';
2474 }
2475