1 /* Map (unsigned int) keys to (source file, line, column) triples.
2 Copyright (C) 2001-2015 Free Software Foundation, Inc.
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
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.
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/>.
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! */
29 static void trace_include (const struct line_maps
*, const line_map_ordinary
*);
30 static const line_map_ordinary
* linemap_ordinary_map_lookup (struct line_maps
*,
32 static const line_map_macro
* linemap_macro_map_lookup (struct line_maps
*,
34 static source_location linemap_macro_map_loc_to_def_point
35 (const line_map_macro
*, source_location
);
36 static source_location linemap_macro_map_loc_unwind_toward_spelling
37 (const line_map_macro
*, source_location
);
38 static source_location linemap_macro_map_loc_to_exp_point
39 (const line_map_macro
*, source_location
);
40 static source_location linemap_macro_loc_to_spelling_point
41 (struct line_maps
*, source_location
, const line_map_ordinary
**);
42 static source_location
linemap_macro_loc_to_def_point (struct line_maps
*,
44 const line_map_ordinary
**);
45 static source_location
linemap_macro_loc_to_exp_point (struct line_maps
*,
47 const line_map_ordinary
**);
49 /* Counters defined in macro.c. */
50 extern unsigned num_expanded_macros_counter
;
51 extern unsigned num_macro_tokens_counter
;
53 /* Hash function for location_adhoc_data hashtable. */
56 location_adhoc_data_hash (const void *l
)
58 const struct location_adhoc_data
*lb
=
59 (const struct location_adhoc_data
*) l
;
60 return (hashval_t
) lb
->locus
+ (size_t) lb
->data
;
63 /* Compare function for location_adhoc_data hashtable. */
66 location_adhoc_data_eq (const void *l1
, const void *l2
)
68 const struct location_adhoc_data
*lb1
=
69 (const struct location_adhoc_data
*) l1
;
70 const struct location_adhoc_data
*lb2
=
71 (const struct location_adhoc_data
*) l2
;
72 return lb1
->locus
== lb2
->locus
&& lb1
->data
== lb2
->data
;
75 /* Update the hashtable when location_adhoc_data is reallocated. */
78 location_adhoc_data_update (void **slot
, void *data
)
80 *((char **) slot
) += *((long long *) data
);
84 /* Rebuild the hash table from the location adhoc data. */
87 rebuild_location_adhoc_htab (struct line_maps
*set
)
90 set
->location_adhoc_data_map
.htab
=
91 htab_create (100, location_adhoc_data_hash
, location_adhoc_data_eq
, NULL
);
92 for (i
= 0; i
< set
->location_adhoc_data_map
.curr_loc
; i
++)
93 htab_find_slot (set
->location_adhoc_data_map
.htab
,
94 set
->location_adhoc_data_map
.data
+ i
, INSERT
);
97 /* Combine LOCUS and DATA to a combined adhoc loc. */
100 get_combined_adhoc_loc (struct line_maps
*set
,
101 source_location locus
, void *data
)
103 struct location_adhoc_data lb
;
104 struct location_adhoc_data
**slot
;
106 linemap_assert (data
);
108 if (IS_ADHOC_LOC (locus
))
110 = set
->location_adhoc_data_map
.data
[locus
& MAX_SOURCE_LOCATION
].locus
;
111 if (locus
== 0 && data
== NULL
)
115 slot
= (struct location_adhoc_data
**)
116 htab_find_slot (set
->location_adhoc_data_map
.htab
, &lb
, INSERT
);
119 if (set
->location_adhoc_data_map
.curr_loc
>=
120 set
->location_adhoc_data_map
.allocated
)
122 char *orig_data
= (char *) set
->location_adhoc_data_map
.data
;
124 /* Cast away extern "C" from the type of xrealloc. */
125 line_map_realloc reallocator
= (set
->reallocator
127 : (line_map_realloc
) xrealloc
);
129 if (set
->location_adhoc_data_map
.allocated
== 0)
130 set
->location_adhoc_data_map
.allocated
= 128;
132 set
->location_adhoc_data_map
.allocated
*= 2;
133 set
->location_adhoc_data_map
.data
= (struct location_adhoc_data
*)
134 reallocator (set
->location_adhoc_data_map
.data
,
135 set
->location_adhoc_data_map
.allocated
136 * sizeof (struct location_adhoc_data
));
137 offset
= (char *) (set
->location_adhoc_data_map
.data
) - orig_data
;
138 if (set
->location_adhoc_data_map
.allocated
> 128)
139 htab_traverse (set
->location_adhoc_data_map
.htab
,
140 location_adhoc_data_update
, &offset
);
142 *slot
= set
->location_adhoc_data_map
.data
143 + set
->location_adhoc_data_map
.curr_loc
;
144 set
->location_adhoc_data_map
.data
[set
->location_adhoc_data_map
.curr_loc
++]
147 return ((*slot
) - set
->location_adhoc_data_map
.data
) | 0x80000000;
150 /* Return the data for the adhoc loc. */
153 get_data_from_adhoc_loc (struct line_maps
*set
, source_location loc
)
155 linemap_assert (IS_ADHOC_LOC (loc
));
156 return set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].data
;
159 /* Return the location for the adhoc loc. */
162 get_location_from_adhoc_loc (struct line_maps
*set
, source_location loc
)
164 linemap_assert (IS_ADHOC_LOC (loc
));
165 return set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].locus
;
168 /* Finalize the location_adhoc_data structure. */
170 location_adhoc_data_fini (struct line_maps
*set
)
172 htab_delete (set
->location_adhoc_data_map
.htab
);
175 /* Initialize a line map set. */
178 linemap_init (struct line_maps
*set
,
179 source_location builtin_location
)
181 memset (set
, 0, sizeof (struct line_maps
));
182 set
->highest_location
= RESERVED_LOCATION_COUNT
- 1;
183 set
->highest_line
= RESERVED_LOCATION_COUNT
- 1;
184 set
->location_adhoc_data_map
.htab
=
185 htab_create (100, location_adhoc_data_hash
, location_adhoc_data_eq
, NULL
);
186 set
->builtin_location
= builtin_location
;
189 /* Check for and warn about line_maps entered but not exited. */
192 linemap_check_files_exited (struct line_maps
*set
)
194 const line_map_ordinary
*map
;
195 /* Depending upon whether we are handling preprocessed input or
196 not, this can be a user error or an ICE. */
197 for (map
= LINEMAPS_LAST_ORDINARY_MAP (set
);
199 map
= INCLUDED_FROM (set
, map
))
200 fprintf (stderr
, "line-map.c: file \"%s\" entered but not left\n",
201 ORDINARY_MAP_FILE_NAME (map
));
204 /* Create a new line map in the line map set SET, and return it.
205 REASON is the reason of creating the map. It determines the type
206 of map created (ordinary or macro map). Note that ordinary maps and
207 macro maps are allocated in different memory location. */
209 static struct line_map
*
210 new_linemap (struct line_maps
*set
,
211 enum lc_reason reason
)
213 /* Depending on this variable, a macro map would be allocated in a
214 different memory location than an ordinary map. */
215 bool macro_map_p
= (reason
== LC_ENTER_MACRO
);
216 struct line_map
*result
;
218 if (LINEMAPS_USED (set
, macro_map_p
) == LINEMAPS_ALLOCATED (set
, macro_map_p
))
220 /* We ran out of allocated line maps. Let's allocate more. */
223 /* Cast away extern "C" from the type of xrealloc. */
224 line_map_realloc reallocator
= (set
->reallocator
226 : (line_map_realloc
) xrealloc
);
227 line_map_round_alloc_size_func round_alloc_size
=
228 set
->round_alloc_size
;
230 size_t map_size
= (macro_map_p
231 ? sizeof (line_map_macro
)
232 : sizeof (line_map_ordinary
));
234 /* We are going to execute some dance to try to reduce the
235 overhead of the memory allocator, in case we are using the
238 The actual size of memory we are going to get back from the
239 allocator is the smallest power of 2 that is greater than the
240 size we requested. So let's consider that size then. */
243 (2 * LINEMAPS_ALLOCATED (set
, macro_map_p
) + 256)
246 /* Get the actual size of memory that is going to be allocated
248 alloc_size
= round_alloc_size (alloc_size
);
250 /* Now alloc_size contains the exact memory size we would get if
251 we have asked for the initial alloc_size amount of memory.
252 Let's get back to the number of macro map that amounts
254 LINEMAPS_ALLOCATED (set
, macro_map_p
) =
255 alloc_size
/ map_size
;
257 /* And now let's really do the re-allocation. */
261 = (line_map_macro
*) (*reallocator
) (set
->info_macro
.maps
,
262 (LINEMAPS_ALLOCATED (set
, macro_map_p
)
264 result
= &set
->info_macro
.maps
[LINEMAPS_USED (set
, macro_map_p
)];
268 set
->info_ordinary
.maps
=
269 (line_map_ordinary
*) (*reallocator
) (set
->info_ordinary
.maps
,
270 (LINEMAPS_ALLOCATED (set
, macro_map_p
)
272 result
= &set
->info_ordinary
.maps
[LINEMAPS_USED (set
, macro_map_p
)];
275 ((LINEMAPS_ALLOCATED (set
, macro_map_p
)
276 - LINEMAPS_USED (set
, macro_map_p
))
282 result
= &set
->info_macro
.maps
[LINEMAPS_USED (set
, macro_map_p
)];
284 result
= &set
->info_ordinary
.maps
[LINEMAPS_USED (set
, macro_map_p
)];
287 LINEMAPS_USED (set
, macro_map_p
)++;
289 result
->reason
= reason
;
293 /* Add a mapping of logical source line to physical source file and
296 The text pointed to by TO_FILE must have a lifetime
297 at least as long as the final call to lookup_line (). An empty
298 TO_FILE means standard input. If reason is LC_LEAVE, and
299 TO_FILE is NULL, then TO_FILE, TO_LINE and SYSP are given their
300 natural values considering the file we are returning to.
302 FROM_LINE should be monotonic increasing across calls to this
303 function. A call to this function can relocate the previous set of
304 maps, so any stored line_map pointers should not be used. */
306 const struct line_map
*
307 linemap_add (struct line_maps
*set
, enum lc_reason reason
,
308 unsigned int sysp
, const char *to_file
, linenum_type to_line
)
310 source_location start_location
= set
->highest_location
+ 1;
312 linemap_assert (!(LINEMAPS_ORDINARY_USED (set
)
314 < MAP_START_LOCATION (LINEMAPS_LAST_ORDINARY_MAP (set
)))));
316 /* When we enter the file for the first time reason cannot be
318 linemap_assert (!(set
->depth
== 0 && reason
== LC_RENAME
));
320 /* If we are leaving the main file, return a NULL map. */
321 if (reason
== LC_LEAVE
322 && MAIN_FILE_P (LINEMAPS_LAST_ORDINARY_MAP (set
))
329 linemap_assert (reason
!= LC_ENTER_MACRO
);
330 line_map_ordinary
*map
= linemap_check_ordinary (new_linemap (set
, reason
));
332 if (to_file
&& *to_file
== '\0' && reason
!= LC_RENAME_VERBATIM
)
335 if (reason
== LC_RENAME_VERBATIM
)
338 if (reason
== LC_LEAVE
)
340 /* When we are just leaving an "included" file, and jump to the next
341 location inside the "includer" right after the #include
342 "included", this variable points the map in use right before the
343 #include "included", inside the same "includer" file. */
344 line_map_ordinary
*from
;
347 if (MAIN_FILE_P (map
- 1))
349 /* So this _should_ mean we are leaving the main file --
350 effectively ending the compilation unit. But to_file not
351 being NULL means the caller thinks we are leaving to
352 another file. This is an erroneous behaviour but we'll
353 try to recover from it. Let's pretend we are not leaving
361 /* (MAP - 1) points to the map we are leaving. The
362 map from which (MAP - 1) got included should be the map
363 that comes right before MAP in the same file. */
364 from
= INCLUDED_FROM (set
, map
- 1);
365 error
= to_file
&& filename_cmp (ORDINARY_MAP_FILE_NAME (from
),
369 /* Depending upon whether we are handling preprocessed input or
370 not, this can be a user error or an ICE. */
372 fprintf (stderr
, "line-map.c: file \"%s\" left but not entered\n",
375 /* A TO_FILE of NULL is special - we use the natural values. */
376 if (error
|| to_file
== NULL
)
378 to_file
= ORDINARY_MAP_FILE_NAME (from
);
379 to_line
= SOURCE_LINE (from
, from
[1].start_location
);
380 sysp
= ORDINARY_MAP_IN_SYSTEM_HEADER_P (from
);
385 map
->start_location
= start_location
;
386 map
->to_file
= to_file
;
387 map
->to_line
= to_line
;
388 LINEMAPS_ORDINARY_CACHE (set
) = LINEMAPS_ORDINARY_USED (set
) - 1;
389 map
->column_bits
= 0;
390 set
->highest_location
= start_location
;
391 set
->highest_line
= start_location
;
392 set
->max_column_hint
= 0;
394 if (reason
== LC_ENTER
)
397 set
->depth
== 0 ? -1 : (int) (LINEMAPS_ORDINARY_USED (set
) - 2);
399 if (set
->trace_includes
)
400 trace_include (set
, map
);
402 else if (reason
== LC_RENAME
)
403 map
->included_from
= ORDINARY_MAP_INCLUDER_FILE_INDEX (&map
[-1]);
404 else if (reason
== LC_LEAVE
)
408 ORDINARY_MAP_INCLUDER_FILE_INDEX (INCLUDED_FROM (set
, map
- 1));
414 /* Returns TRUE if the line table set tracks token locations across
415 macro expansion, FALSE otherwise. */
418 linemap_tracks_macro_expansion_locs_p (struct line_maps
*set
)
420 return LINEMAPS_MACRO_MAPS (set
) != NULL
;
423 /* Create a macro map. A macro map encodes source locations of tokens
424 that are part of a macro replacement-list, at a macro expansion
425 point. See the extensive comments of struct line_map and struct
426 line_map_macro, in line-map.h.
428 This map shall be created when the macro is expanded. The map
429 encodes the source location of the expansion point of the macro as
430 well as the "original" source location of each token that is part
431 of the macro replacement-list. If a macro is defined but never
432 expanded, it has no macro map. SET is the set of maps the macro
433 map should be part of. MACRO_NODE is the macro which the new macro
434 map should encode source locations for. EXPANSION is the location
435 of the expansion point of MACRO. For function-like macros
436 invocations, it's best to make it point to the closing parenthesis
437 of the macro, rather than the the location of the first character
438 of the macro. NUM_TOKENS is the number of tokens that are part of
439 the replacement-list of MACRO.
441 Note that when we run out of the integer space available for source
442 locations, this function returns NULL. In that case, callers of
443 this function cannot encode {line,column} pairs into locations of
444 macro tokens anymore. */
446 const line_map_macro
*
447 linemap_enter_macro (struct line_maps
*set
, struct cpp_hashnode
*macro_node
,
448 source_location expansion
, unsigned int num_tokens
)
451 source_location start_location
;
452 /* Cast away extern "C" from the type of xrealloc. */
453 line_map_realloc reallocator
= (set
->reallocator
455 : (line_map_realloc
) xrealloc
);
457 start_location
= LINEMAPS_MACRO_LOWEST_LOCATION (set
) - num_tokens
;
459 if (start_location
<= set
->highest_line
460 || start_location
> LINEMAPS_MACRO_LOWEST_LOCATION (set
))
461 /* We ran out of macro map space. */
464 map
= linemap_check_macro (new_linemap (set
, LC_ENTER_MACRO
));
466 map
->start_location
= start_location
;
467 map
->macro
= macro_node
;
468 map
->n_tokens
= num_tokens
;
470 = (source_location
*) reallocator (NULL
,
472 * sizeof (source_location
));
473 map
->expansion
= expansion
;
474 memset (MACRO_MAP_LOCATIONS (map
), 0,
475 num_tokens
* sizeof (source_location
));
477 LINEMAPS_MACRO_CACHE (set
) = LINEMAPS_MACRO_USED (set
) - 1;
482 /* Create and return a virtual location for a token that is part of a
483 macro expansion-list at a macro expansion point. See the comment
484 inside struct line_map_macro to see what an expansion-list exactly
487 A call to this function must come after a call to
490 MAP is the map into which the source location is created. TOKEN_NO
491 is the index of the token in the macro replacement-list, starting
494 ORIG_LOC is the location of the token outside of this macro
495 expansion. If the token comes originally from the macro
496 definition, it is the locus in the macro definition; otherwise it
497 is a location in the context of the caller of this macro expansion
498 (which is a virtual location or a source location if the caller is
499 itself a macro expansion or not).
501 ORIG_PARM_REPLACEMENT_LOC is the location in the macro definition,
502 either of the token itself or of a macro parameter that it
506 linemap_add_macro_token (const line_map_macro
*map
,
507 unsigned int token_no
,
508 source_location orig_loc
,
509 source_location orig_parm_replacement_loc
)
511 source_location result
;
513 linemap_assert (linemap_macro_expansion_map_p (map
));
514 linemap_assert (token_no
< MACRO_MAP_NUM_MACRO_TOKENS (map
));
516 MACRO_MAP_LOCATIONS (map
)[2 * token_no
] = orig_loc
;
517 MACRO_MAP_LOCATIONS (map
)[2 * token_no
+ 1] = orig_parm_replacement_loc
;
519 result
= MAP_START_LOCATION (map
) + token_no
;
523 /* Return a source_location for the start (i.e. column==0) of
524 (physical) line TO_LINE in the current source file (as in the
525 most recent linemap_add). MAX_COLUMN_HINT is the highest column
526 number we expect to use in this line (but it does not change
527 the highest_location). */
530 linemap_line_start (struct line_maps
*set
, linenum_type to_line
,
531 unsigned int max_column_hint
)
533 line_map_ordinary
*map
= LINEMAPS_LAST_ORDINARY_MAP (set
);
534 source_location highest
= set
->highest_location
;
536 linenum_type last_line
=
537 SOURCE_LINE (map
, set
->highest_line
);
538 int line_delta
= to_line
- last_line
;
539 bool add_map
= false;
543 && line_delta
* ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map
) > 1000)
544 || (max_column_hint
>= (1U << ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map
)))
545 || (max_column_hint
<= 80
546 && ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map
) >= 10)
547 || (highest
> 0x60000000
548 && (set
->max_column_hint
|| highest
> 0x70000000)))
551 max_column_hint
= set
->max_column_hint
;
555 if (max_column_hint
> 100000 || highest
> 0x60000000)
557 /* If the column number is ridiculous or we've allocated a huge
558 number of source_locations, give up on column numbers. */
560 if (highest
> 0x70000000)
567 while (max_column_hint
>= (1U << column_bits
))
569 max_column_hint
= 1U << column_bits
;
571 /* Allocate the new line_map. However, if the current map only has a
572 single line we can sometimes just increase its column_bits instead. */
574 || last_line
!= ORDINARY_MAP_STARTING_LINE_NUMBER (map
)
575 || SOURCE_COLUMN (map
, highest
) >= (1U << column_bits
))
576 map
= linemap_check_ordinary
577 (const_cast <line_map
*>
578 (linemap_add (set
, LC_RENAME
,
579 ORDINARY_MAP_IN_SYSTEM_HEADER_P (map
),
580 ORDINARY_MAP_FILE_NAME (map
),
582 map
->column_bits
= column_bits
;
583 r
= (MAP_START_LOCATION (map
)
584 + ((to_line
- ORDINARY_MAP_STARTING_LINE_NUMBER (map
))
588 r
= highest
- SOURCE_COLUMN (map
, highest
)
589 + (line_delta
<< ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (map
));
591 /* Locations of ordinary tokens are always lower than locations of
593 if (r
>= LINEMAPS_MACRO_LOWEST_LOCATION (set
))
596 set
->highest_line
= r
;
597 if (r
> set
->highest_location
)
598 set
->highest_location
= r
;
599 set
->max_column_hint
= max_column_hint
;
603 /* Encode and return a source_location from a column number. The
604 source line considered is the last source line used to call
605 linemap_line_start, i.e, the last source line which a location was
609 linemap_position_for_column (struct line_maps
*set
, unsigned int to_column
)
611 source_location r
= set
->highest_line
;
614 (!linemap_macro_expansion_map_p (LINEMAPS_LAST_ORDINARY_MAP (set
)));
616 if (to_column
>= set
->max_column_hint
)
618 if (r
>= 0xC000000 || to_column
> 100000)
620 /* Running low on source_locations - disable column numbers. */
625 line_map_ordinary
*map
= LINEMAPS_LAST_ORDINARY_MAP (set
);
626 r
= linemap_line_start (set
, SOURCE_LINE (map
, r
), to_column
+ 50);
630 if (r
>= set
->highest_location
)
631 set
->highest_location
= r
;
635 /* Encode and return a source location from a given line and
639 linemap_position_for_line_and_column (const line_map_ordinary
*ord_map
,
643 linemap_assert (ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map
) <= line
);
645 return (MAP_START_LOCATION (ord_map
)
646 + ((line
- ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map
))
647 << ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (ord_map
))
648 + (column
& ((1 << ORDINARY_MAP_NUMBER_OF_COLUMN_BITS (ord_map
)) - 1)));
651 /* Encode and return a source_location starting from location LOC and
652 shifting it by OFFSET columns. This function does not support
653 virtual locations. */
656 linemap_position_for_loc_and_offset (struct line_maps
*set
,
660 const line_map_ordinary
* map
= NULL
;
662 /* This function does not support virtual locations yet. */
663 if (linemap_assert_fails
664 (!linemap_location_from_macro_expansion_p (set
, loc
)))
668 /* Adding an offset to a reserved location (like
669 UNKNOWN_LOCATION for the C/C++ FEs) does not really make
670 sense. So let's leave the location intact in that case. */
671 || loc
< RESERVED_LOCATION_COUNT
)
674 /* We find the real location and shift it. */
675 loc
= linemap_resolve_location (set
, loc
, LRK_SPELLING_LOCATION
, &map
);
676 /* The new location (loc + offset) should be higher than the first
677 location encoded by MAP. */
678 if (linemap_assert_fails (MAP_START_LOCATION (map
) < loc
+ offset
))
681 /* If MAP is not the last line map of its set, then the new location
682 (loc + offset) should be less than the first location encoded by
683 the next line map of the set. */
684 if (map
!= LINEMAPS_LAST_ORDINARY_MAP (set
))
685 if (linemap_assert_fails (loc
+ offset
< MAP_START_LOCATION (&map
[1])))
688 offset
+= SOURCE_COLUMN (map
, loc
);
689 if (linemap_assert_fails
690 (offset
< (1u << map
->column_bits
)))
694 linemap_position_for_line_and_column (map
,
695 SOURCE_LINE (map
, loc
),
697 if (linemap_assert_fails (r
<= set
->highest_location
)
698 || linemap_assert_fails (map
== linemap_lookup (set
, r
)))
704 /* Given a virtual source location yielded by a map (either an
705 ordinary or a macro map), returns that map. */
707 const struct line_map
*
708 linemap_lookup (struct line_maps
*set
, source_location line
)
710 if (IS_ADHOC_LOC (line
))
711 line
= set
->location_adhoc_data_map
.data
[line
& MAX_SOURCE_LOCATION
].locus
;
712 if (linemap_location_from_macro_expansion_p (set
, line
))
713 return linemap_macro_map_lookup (set
, line
);
714 return linemap_ordinary_map_lookup (set
, line
);
717 /* Given a source location yielded by an ordinary map, returns that
718 map. Since the set is built chronologically, the logical lines are
719 monotonic increasing, and so the list is sorted and we can use a
722 static const line_map_ordinary
*
723 linemap_ordinary_map_lookup (struct line_maps
*set
, source_location line
)
725 unsigned int md
, mn
, mx
;
726 const line_map_ordinary
*cached
, *result
;
728 if (IS_ADHOC_LOC (line
))
729 line
= set
->location_adhoc_data_map
.data
[line
& MAX_SOURCE_LOCATION
].locus
;
731 if (set
== NULL
|| line
< RESERVED_LOCATION_COUNT
)
734 mn
= LINEMAPS_ORDINARY_CACHE (set
);
735 mx
= LINEMAPS_ORDINARY_USED (set
);
737 cached
= LINEMAPS_ORDINARY_MAP_AT (set
, mn
);
738 /* We should get a segfault if no line_maps have been added yet. */
739 if (line
>= MAP_START_LOCATION (cached
))
741 if (mn
+ 1 == mx
|| line
< MAP_START_LOCATION (&cached
[1]))
753 if (MAP_START_LOCATION (LINEMAPS_ORDINARY_MAP_AT (set
, md
)) > line
)
759 LINEMAPS_ORDINARY_CACHE (set
) = mn
;
760 result
= LINEMAPS_ORDINARY_MAP_AT (set
, mn
);
761 linemap_assert (line
>= MAP_START_LOCATION (result
));
765 /* Given a source location yielded by a macro map, returns that map.
766 Since the set is built chronologically, the logical lines are
767 monotonic decreasing, and so the list is sorted and we can use a
770 static const line_map_macro
*
771 linemap_macro_map_lookup (struct line_maps
*set
, source_location line
)
773 unsigned int md
, mn
, mx
;
774 const struct line_map_macro
*cached
, *result
;
776 if (IS_ADHOC_LOC (line
))
777 line
= set
->location_adhoc_data_map
.data
[line
& MAX_SOURCE_LOCATION
].locus
;
779 linemap_assert (line
>= LINEMAPS_MACRO_LOWEST_LOCATION (set
));
784 mn
= LINEMAPS_MACRO_CACHE (set
);
785 mx
= LINEMAPS_MACRO_USED (set
);
786 cached
= LINEMAPS_MACRO_MAP_AT (set
, mn
);
788 if (line
>= MAP_START_LOCATION (cached
))
790 if (mn
== 0 || line
< MAP_START_LOCATION (&cached
[-1]))
799 if (MAP_START_LOCATION (LINEMAPS_MACRO_MAP_AT (set
, md
)) > line
)
805 LINEMAPS_MACRO_CACHE (set
) = mx
;
806 result
= LINEMAPS_MACRO_MAP_AT (set
, LINEMAPS_MACRO_CACHE (set
));
807 linemap_assert (MAP_START_LOCATION (result
) <= line
);
812 /* Return TRUE if MAP encodes locations coming from a macro
813 replacement-list at macro expansion point. */
816 linemap_macro_expansion_map_p (const struct line_map
*map
)
820 return (map
->reason
== LC_ENTER_MACRO
);
823 /* If LOCATION is the locus of a token in a replacement-list of a
824 macro expansion return the location of the macro expansion point.
826 Read the comments of struct line_map and struct line_map_macro in
827 line-map.h to understand what a macro expansion point is. */
829 static source_location
830 linemap_macro_map_loc_to_exp_point (const line_map_macro
*map
,
831 source_location location ATTRIBUTE_UNUSED
)
833 linemap_assert (linemap_macro_expansion_map_p (map
)
834 && location
>= MAP_START_LOCATION (map
));
836 /* Make sure LOCATION is correct. */
837 linemap_assert ((location
- MAP_START_LOCATION (map
))
838 < MACRO_MAP_NUM_MACRO_TOKENS (map
));
840 return MACRO_MAP_EXPANSION_POINT_LOCATION (map
);
843 /* LOCATION is the source location of a token that belongs to a macro
844 replacement-list as part of the macro expansion denoted by MAP.
846 Return the location of the token at the definition point of the
849 static source_location
850 linemap_macro_map_loc_to_def_point (const line_map_macro
*map
,
851 source_location location
)
855 linemap_assert (linemap_macro_expansion_map_p (map
)
856 && location
>= MAP_START_LOCATION (map
));
857 linemap_assert (location
>= RESERVED_LOCATION_COUNT
);
859 token_no
= location
- MAP_START_LOCATION (map
);
860 linemap_assert (token_no
< MACRO_MAP_NUM_MACRO_TOKENS (map
));
862 location
= MACRO_MAP_LOCATIONS (map
)[2 * token_no
+ 1];
867 /* If LOCATION is the locus of a token that is an argument of a
868 function-like macro M and appears in the expansion of M, return the
869 locus of that argument in the context of the caller of M.
871 In other words, this returns the xI location presented in the
872 comments of line_map_macro above. */
874 linemap_macro_map_loc_unwind_toward_spelling (const line_map_macro
* map
,
875 source_location location
)
879 linemap_assert (linemap_macro_expansion_map_p (map
)
880 && location
>= MAP_START_LOCATION (map
));
881 linemap_assert (location
>= RESERVED_LOCATION_COUNT
);
883 token_no
= location
- MAP_START_LOCATION (map
);
884 linemap_assert (token_no
< MACRO_MAP_NUM_MACRO_TOKENS (map
));
886 location
= MACRO_MAP_LOCATIONS (map
)[2 * token_no
];
891 /* Return the source line number corresponding to source location
892 LOCATION. SET is the line map set LOCATION comes from. If
893 LOCATION is the source location of token that is part of the
894 replacement-list of a macro expansion return the line number of the
895 macro expansion point. */
898 linemap_get_expansion_line (struct line_maps
*set
,
899 source_location location
)
901 const line_map_ordinary
*map
= NULL
;
903 if (IS_ADHOC_LOC (location
))
904 location
= set
->location_adhoc_data_map
.data
[location
905 & MAX_SOURCE_LOCATION
].locus
;
907 if (location
< RESERVED_LOCATION_COUNT
)
911 linemap_macro_loc_to_exp_point (set
, location
, &map
);
913 return SOURCE_LINE (map
, location
);
916 /* Return the path of the file corresponding to source code location
919 If LOCATION is the source location of token that is part of the
920 replacement-list of a macro expansion return the file path of the
921 macro expansion point.
923 SET is the line map set LOCATION comes from. */
926 linemap_get_expansion_filename (struct line_maps
*set
,
927 source_location location
)
929 const struct line_map_ordinary
*map
= NULL
;
931 if (IS_ADHOC_LOC (location
))
932 location
= set
->location_adhoc_data_map
.data
[location
933 & MAX_SOURCE_LOCATION
].locus
;
935 if (location
< RESERVED_LOCATION_COUNT
)
939 linemap_macro_loc_to_exp_point (set
, location
, &map
);
941 return LINEMAP_FILE (map
);
944 /* Return the name of the macro associated to MACRO_MAP. */
947 linemap_map_get_macro_name (const line_map_macro
*macro_map
)
949 linemap_assert (macro_map
&& linemap_macro_expansion_map_p (macro_map
));
950 return (const char*) NODE_NAME (MACRO_MAP_MACRO (macro_map
));
953 /* Return a positive value if LOCATION is the locus of a token that is
954 located in a system header, O otherwise. It returns 1 if LOCATION
955 is the locus of a token that is located in a system header, and 2
956 if LOCATION is the locus of a token located in a C system header
957 that therefore needs to be extern "C" protected in C++.
959 Note that this function returns 1 if LOCATION belongs to a token
960 that is part of a macro replacement-list defined in a system
961 header, but expanded in a non-system file. */
964 linemap_location_in_system_header_p (struct line_maps
*set
,
965 source_location location
)
967 const struct line_map
*map
= NULL
;
969 if (IS_ADHOC_LOC (location
))
970 location
= set
->location_adhoc_data_map
.data
[location
971 & MAX_SOURCE_LOCATION
].locus
;
973 if (location
< RESERVED_LOCATION_COUNT
)
976 /* Let's look at where the token for LOCATION comes from. */
979 map
= linemap_lookup (set
, location
);
982 if (!linemap_macro_expansion_map_p (map
))
983 /* It's a normal token. */
984 return LINEMAP_SYSP (linemap_check_ordinary (map
));
987 const line_map_macro
*macro_map
= linemap_check_macro (map
);
989 /* It's a token resulting from a macro expansion. */
990 source_location loc
=
991 linemap_macro_map_loc_unwind_toward_spelling (macro_map
, location
);
992 if (loc
< RESERVED_LOCATION_COUNT
)
993 /* This token might come from a built-in macro. Let's
994 look at where that macro got expanded. */
995 location
= linemap_macro_map_loc_to_exp_point (macro_map
, location
);
1006 /* Return TRUE if LOCATION is a source code location of a token coming
1007 from a macro replacement-list at a macro expansion point, FALSE
1011 linemap_location_from_macro_expansion_p (const struct line_maps
*set
,
1012 source_location location
)
1014 if (IS_ADHOC_LOC (location
))
1015 location
= set
->location_adhoc_data_map
.data
[location
1016 & MAX_SOURCE_LOCATION
].locus
;
1018 linemap_assert (location
<= MAX_SOURCE_LOCATION
1019 && (set
->highest_location
1020 < LINEMAPS_MACRO_LOWEST_LOCATION (set
)));
1023 return (location
> set
->highest_location
);
1026 /* Given two virtual locations *LOC0 and *LOC1, return the first
1027 common macro map in their macro expansion histories. Return NULL
1028 if no common macro was found. *LOC0 (resp. *LOC1) is set to the
1029 virtual location of the token inside the resulting macro. */
1031 static const struct line_map
*
1032 first_map_in_common_1 (struct line_maps
*set
,
1033 source_location
*loc0
,
1034 source_location
*loc1
)
1036 source_location l0
= *loc0
, l1
= *loc1
;
1037 const struct line_map
*map0
= linemap_lookup (set
, l0
),
1038 *map1
= linemap_lookup (set
, l1
);
1040 while (linemap_macro_expansion_map_p (map0
)
1041 && linemap_macro_expansion_map_p (map1
)
1044 if (MAP_START_LOCATION (map0
) < MAP_START_LOCATION (map1
))
1046 l0
= linemap_macro_map_loc_to_exp_point (linemap_check_macro (map0
),
1048 map0
= linemap_lookup (set
, l0
);
1052 l1
= linemap_macro_map_loc_to_exp_point (linemap_check_macro (map1
),
1054 map1
= linemap_lookup (set
, l1
);
1067 /* Given two virtual locations LOC0 and LOC1, return the first common
1068 macro map in their macro expansion histories. Return NULL if no
1069 common macro was found. *RES_LOC0 (resp. *RES_LOC1) is set to the
1070 virtual location of the token inside the resulting macro, upon
1071 return of a non-NULL result. */
1073 static const struct line_map
*
1074 first_map_in_common (struct line_maps
*set
,
1075 source_location loc0
,
1076 source_location loc1
,
1077 source_location
*res_loc0
,
1078 source_location
*res_loc1
)
1083 return first_map_in_common_1 (set
, res_loc0
, res_loc1
);
1086 /* Return a positive value if PRE denotes the location of a token that
1087 comes before the token of POST, 0 if PRE denotes the location of
1088 the same token as the token for POST, and a negative value
1092 linemap_compare_locations (struct line_maps
*set
,
1093 source_location pre
,
1094 source_location post
)
1096 bool pre_virtual_p
, post_virtual_p
;
1097 source_location l0
= pre
, l1
= post
;
1099 if (IS_ADHOC_LOC (l0
))
1100 l0
= set
->location_adhoc_data_map
.data
[l0
& MAX_SOURCE_LOCATION
].locus
;
1101 if (IS_ADHOC_LOC (l1
))
1102 l1
= set
->location_adhoc_data_map
.data
[l1
& MAX_SOURCE_LOCATION
].locus
;
1107 if ((pre_virtual_p
= linemap_location_from_macro_expansion_p (set
, l0
)))
1108 l0
= linemap_resolve_location (set
, l0
,
1109 LRK_MACRO_EXPANSION_POINT
,
1112 if ((post_virtual_p
= linemap_location_from_macro_expansion_p (set
, l1
)))
1113 l1
= linemap_resolve_location (set
, l1
,
1114 LRK_MACRO_EXPANSION_POINT
,
1121 /* So pre and post represent two tokens that are present in a
1122 same macro expansion. Let's see if the token for pre was
1123 before the token for post in that expansion. */
1125 const struct line_map
*map
=
1126 first_map_in_common (set
, pre
, post
, &l0
, &l1
);
1129 /* This should not be possible. */
1132 i0
= l0
- MAP_START_LOCATION (map
);
1133 i1
= l1
- MAP_START_LOCATION (map
);
1140 /* Print an include trace, for e.g. the -H option of the preprocessor. */
1143 trace_include (const struct line_maps
*set
, const line_map_ordinary
*map
)
1145 unsigned int i
= set
->depth
;
1150 fprintf (stderr
, " %s\n", ORDINARY_MAP_FILE_NAME (map
));
1153 /* Return the spelling location of the token wherever it comes from,
1154 whether part of a macro definition or not.
1156 This is a subroutine for linemap_resolve_location. */
1158 static source_location
1159 linemap_macro_loc_to_spelling_point (struct line_maps
*set
,
1160 source_location location
,
1161 const line_map_ordinary
**original_map
)
1163 struct line_map
*map
;
1165 if (IS_ADHOC_LOC (location
))
1166 location
= set
->location_adhoc_data_map
.data
[location
1167 & MAX_SOURCE_LOCATION
].locus
;
1169 linemap_assert (set
&& location
>= RESERVED_LOCATION_COUNT
);
1173 map
= const_cast <line_map
*> (linemap_lookup (set
, location
));
1174 if (!linemap_macro_expansion_map_p (map
))
1178 = linemap_macro_map_loc_unwind_toward_spelling
1179 (linemap_check_macro (map
),
1184 *original_map
= linemap_check_ordinary (map
);
1188 /* If LOCATION is the source location of a token that belongs to a
1189 macro replacement-list -- as part of a macro expansion -- then
1190 return the location of the token at the definition point of the
1191 macro. Otherwise, return LOCATION. SET is the set of maps
1192 location come from. ORIGINAL_MAP is an output parm. If non NULL,
1193 the function sets *ORIGINAL_MAP to the ordinary (non-macro) map the
1194 returned location comes from.
1196 This is a subroutine of linemap_resolve_location. */
1198 static source_location
1199 linemap_macro_loc_to_def_point (struct line_maps
*set
,
1200 source_location location
,
1201 const line_map_ordinary
**original_map
)
1203 struct line_map
*map
;
1205 if (IS_ADHOC_LOC (location
))
1206 location
= set
->location_adhoc_data_map
.data
[location
1207 & MAX_SOURCE_LOCATION
].locus
;
1209 linemap_assert (set
&& location
>= RESERVED_LOCATION_COUNT
);
1213 map
= const_cast <line_map
*> (linemap_lookup (set
, location
));
1214 if (!linemap_macro_expansion_map_p (map
))
1218 linemap_macro_map_loc_to_def_point (linemap_check_macro (map
),
1223 *original_map
= linemap_check_ordinary (map
);
1227 /* If LOCATION is the source location of a token that belongs to a
1228 macro replacement-list -- at a macro expansion point -- then return
1229 the location of the topmost expansion point of the macro. We say
1230 topmost because if we are in the context of a nested macro
1231 expansion, the function returns the source location of the first
1232 macro expansion that triggered the nested expansions.
1234 Otherwise, return LOCATION. SET is the set of maps location come
1235 from. ORIGINAL_MAP is an output parm. If non NULL, the function
1236 sets *ORIGINAL_MAP to the ordinary (non-macro) map the returned
1237 location comes from.
1239 This is a subroutine of linemap_resolve_location. */
1241 static source_location
1242 linemap_macro_loc_to_exp_point (struct line_maps
*set
,
1243 source_location location
,
1244 const line_map_ordinary
**original_map
)
1246 struct line_map
*map
;
1248 if (IS_ADHOC_LOC (location
))
1249 location
= set
->location_adhoc_data_map
.data
[location
1250 & MAX_SOURCE_LOCATION
].locus
;
1252 linemap_assert (set
&& location
>= RESERVED_LOCATION_COUNT
);
1256 map
= const_cast <line_map
*> (linemap_lookup (set
, location
));
1257 if (!linemap_macro_expansion_map_p (map
))
1259 location
= linemap_macro_map_loc_to_exp_point (linemap_check_macro (map
),
1264 *original_map
= linemap_check_ordinary (map
);
1268 /* Resolve a virtual location into either a spelling location, an
1269 expansion point location or a token argument replacement point
1270 location. Return the map that encodes the virtual location as well
1271 as the resolved location.
1273 If LOC is *NOT* the location of a token resulting from the
1274 expansion of a macro, then the parameter LRK (which stands for
1275 Location Resolution Kind) is ignored and the resulting location
1276 just equals the one given in argument.
1278 Now if LOC *IS* the location of a token resulting from the
1279 expansion of a macro, this is what happens.
1281 * If LRK is set to LRK_MACRO_EXPANSION_POINT
1282 -------------------------------
1284 The virtual location is resolved to the first macro expansion point
1285 that led to this macro expansion.
1287 * If LRK is set to LRK_SPELLING_LOCATION
1288 -------------------------------------
1290 The virtual location is resolved to the locus where the token has
1291 been spelled in the source. This can follow through all the macro
1292 expansions that led to the token.
1294 * If LRK is set to LRK_MACRO_DEFINITION_LOCATION
1295 --------------------------------------
1297 The virtual location is resolved to the locus of the token in the
1298 context of the macro definition.
1300 If LOC is the locus of a token that is an argument of a
1301 function-like macro [replacing a parameter in the replacement list
1302 of the macro] the virtual location is resolved to the locus of the
1303 parameter that is replaced, in the context of the definition of the
1306 If LOC is the locus of a token that is not an argument of a
1307 function-like macro, then the function behaves as if LRK was set to
1308 LRK_SPELLING_LOCATION.
1310 If MAP is not NULL, *MAP is set to the map encoding the
1311 returned location. Note that if the returned location wasn't originally
1312 encoded by a map, then *MAP is set to NULL. This can happen if LOC
1313 resolves to a location reserved for the client code, like
1314 UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC. */
1317 linemap_resolve_location (struct line_maps
*set
,
1318 source_location loc
,
1319 enum location_resolution_kind lrk
,
1320 const line_map_ordinary
**map
)
1322 if (IS_ADHOC_LOC (loc
))
1323 loc
= set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].locus
;
1325 if (loc
< RESERVED_LOCATION_COUNT
)
1327 /* A reserved location wasn't encoded in a map. Let's return a
1328 NULL map here, just like what linemap_ordinary_map_lookup
1337 case LRK_MACRO_EXPANSION_POINT
:
1338 loc
= linemap_macro_loc_to_exp_point (set
, loc
, map
);
1340 case LRK_SPELLING_LOCATION
:
1341 loc
= linemap_macro_loc_to_spelling_point (set
, loc
, map
);
1343 case LRK_MACRO_DEFINITION_LOCATION
:
1344 loc
= linemap_macro_loc_to_def_point (set
, loc
, map
);
1353 Suppose that LOC is the virtual location of a token T coming from
1354 the expansion of a macro M. This function then steps up to get the
1355 location L of the point where M got expanded. If L is a spelling
1356 location inside a macro expansion M', then this function returns
1357 the locus of the point where M' was expanded. Said otherwise, this
1358 function returns the location of T in the context that triggered
1361 *LOC_MAP must be set to the map of LOC. This function then sets it
1362 to the map of the returned location. */
1365 linemap_unwind_toward_expansion (struct line_maps
*set
,
1366 source_location loc
,
1367 const struct line_map
**map
)
1369 source_location resolved_location
;
1370 const line_map_macro
*macro_map
= linemap_check_macro (*map
);
1371 const struct line_map
*resolved_map
;
1373 if (IS_ADHOC_LOC (loc
))
1374 loc
= set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].locus
;
1377 linemap_macro_map_loc_unwind_toward_spelling (macro_map
, loc
);
1378 resolved_map
= linemap_lookup (set
, resolved_location
);
1380 if (!linemap_macro_expansion_map_p (resolved_map
))
1382 resolved_location
= linemap_macro_map_loc_to_exp_point (macro_map
, loc
);
1383 resolved_map
= linemap_lookup (set
, resolved_location
);
1386 *map
= resolved_map
;
1387 return resolved_location
;
1390 /* If LOC is the virtual location of a token coming from the expansion
1391 of a macro M and if its spelling location is reserved (e.g, a
1392 location for a built-in token), then this function unwinds (using
1393 linemap_unwind_toward_expansion) the location until a location that
1394 is not reserved and is not in a system header is reached. In other
1395 words, this unwinds the reserved location until a location that is
1396 in real source code is reached.
1398 Otherwise, if the spelling location for LOC is not reserved or if
1399 LOC doesn't come from the expansion of a macro, the function
1400 returns LOC as is and *MAP is not touched.
1402 *MAP is set to the map of the returned location if the later is
1403 different from LOC. */
1405 linemap_unwind_to_first_non_reserved_loc (struct line_maps
*set
,
1406 source_location loc
,
1407 const struct line_map
**map
)
1409 source_location resolved_loc
;
1410 const struct line_map
*map0
= NULL
;
1411 const line_map_ordinary
*map1
= NULL
;
1413 if (IS_ADHOC_LOC (loc
))
1414 loc
= set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].locus
;
1416 map0
= linemap_lookup (set
, loc
);
1417 if (!linemap_macro_expansion_map_p (map0
))
1420 resolved_loc
= linemap_resolve_location (set
, loc
,
1421 LRK_SPELLING_LOCATION
,
1424 if (resolved_loc
>= RESERVED_LOCATION_COUNT
1425 && !LINEMAP_SYSP (map1
))
1428 while (linemap_macro_expansion_map_p (map0
)
1429 && (resolved_loc
< RESERVED_LOCATION_COUNT
1430 || LINEMAP_SYSP (map1
)))
1432 loc
= linemap_unwind_toward_expansion (set
, loc
, &map0
);
1433 resolved_loc
= linemap_resolve_location (set
, loc
,
1434 LRK_SPELLING_LOCATION
,
1443 /* Expand source code location LOC and return a user readable source
1444 code location. LOC must be a spelling (non-virtual) location. If
1445 it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
1446 location is returned. */
1449 linemap_expand_location (struct line_maps
*set
,
1450 const struct line_map
*map
,
1451 source_location loc
)
1454 expanded_location xloc
;
1456 memset (&xloc
, 0, sizeof (xloc
));
1457 if (IS_ADHOC_LOC (loc
))
1459 loc
= set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].locus
;
1461 = set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].data
;
1464 if (loc
< RESERVED_LOCATION_COUNT
)
1465 /* The location for this token wasn't generated from a line map.
1466 It was probably a location for a builtin token, chosen by some
1467 client code. Let's not try to expand the location in that
1469 else if (map
== NULL
)
1470 /* We shouldn't be getting a NULL map with a location that is not
1471 reserved by the client code. */
1475 /* MAP must be an ordinary map and LOC must be non-virtual,
1476 encoded into this map, obviously; the accessors used on MAP
1477 below ensure it is ordinary. Let's just assert the
1478 non-virtualness of LOC here. */
1479 if (linemap_location_from_macro_expansion_p (set
, loc
))
1482 const line_map_ordinary
*ord_map
= linemap_check_ordinary (map
);
1484 xloc
.file
= LINEMAP_FILE (ord_map
);
1485 xloc
.line
= SOURCE_LINE (ord_map
, loc
);
1486 xloc
.column
= SOURCE_COLUMN (ord_map
, loc
);
1487 xloc
.sysp
= LINEMAP_SYSP (ord_map
) != 0;
1494 /* Dump line map at index IX in line table SET to STREAM. If STREAM
1495 is NULL, use stderr. IS_MACRO is true if the caller wants to
1496 dump a macro map, false otherwise. */
1499 linemap_dump (FILE *stream
, struct line_maps
*set
, unsigned ix
, bool is_macro
)
1501 const char *lc_reasons_v
[LC_ENTER_MACRO
+ 1]
1502 = { "LC_ENTER", "LC_LEAVE", "LC_RENAME", "LC_RENAME_VERBATIM",
1505 const line_map
*map
;
1511 map
= LINEMAPS_ORDINARY_MAP_AT (set
, ix
);
1513 map
= LINEMAPS_MACRO_MAP_AT (set
, ix
);
1515 reason
= (map
->reason
<= LC_ENTER_MACRO
) ? lc_reasons_v
[map
->reason
] : "???";
1517 fprintf (stream
, "Map #%u [%p] - LOC: %u - REASON: %s - SYSP: %s\n",
1518 ix
, (void *) map
, map
->start_location
, reason
,
1520 && ORDINARY_MAP_IN_SYSTEM_HEADER_P (linemap_check_ordinary (map
)))
1524 const line_map_ordinary
*ord_map
= linemap_check_ordinary (map
);
1525 unsigned includer_ix
;
1526 const line_map_ordinary
*includer_map
;
1528 includer_ix
= ORDINARY_MAP_INCLUDER_FILE_INDEX (ord_map
);
1529 includer_map
= includer_ix
< LINEMAPS_ORDINARY_USED (set
)
1530 ? LINEMAPS_ORDINARY_MAP_AT (set
, includer_ix
)
1533 fprintf (stream
, "File: %s:%d\n", ORDINARY_MAP_FILE_NAME (ord_map
),
1534 ORDINARY_MAP_STARTING_LINE_NUMBER (ord_map
));
1535 fprintf (stream
, "Included from: [%d] %s\n", includer_ix
,
1536 includer_map
? ORDINARY_MAP_FILE_NAME (includer_map
) : "None");
1540 const line_map_macro
*macro_map
= linemap_check_macro (map
);
1541 fprintf (stream
, "Macro: %s (%u tokens)\n",
1542 linemap_map_get_macro_name (macro_map
),
1543 MACRO_MAP_NUM_MACRO_TOKENS (macro_map
));
1546 fprintf (stream
, "\n");
1550 /* Dump debugging information about source location LOC into the file
1551 stream STREAM. SET is the line map set LOC comes from. */
1554 linemap_dump_location (struct line_maps
*set
,
1555 source_location loc
,
1558 const line_map_ordinary
*map
;
1559 source_location location
;
1560 const char *path
= "", *from
= "";
1561 int l
= -1, c
= -1, s
= -1, e
= -1;
1563 if (IS_ADHOC_LOC (loc
))
1564 loc
= set
->location_adhoc_data_map
.data
[loc
& MAX_SOURCE_LOCATION
].locus
;
1570 linemap_resolve_location (set
, loc
, LRK_MACRO_DEFINITION_LOCATION
, &map
);
1573 /* Only reserved locations can be tolerated in this case. */
1574 linemap_assert (location
< RESERVED_LOCATION_COUNT
);
1577 path
= LINEMAP_FILE (map
);
1578 l
= SOURCE_LINE (map
, location
);
1579 c
= SOURCE_COLUMN (map
, location
);
1580 s
= LINEMAP_SYSP (map
) != 0;
1581 e
= location
!= loc
;
1585 from
= (INCLUDED_FROM (set
, map
))
1586 ? LINEMAP_FILE (INCLUDED_FROM (set
, map
))
1590 /* P: path, L: line, C: column, S: in-system-header, M: map address,
1591 E: macro expansion?, LOC: original location, R: resolved location */
1592 fprintf (stream
, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d,R:%d}",
1593 path
, from
, l
, c
, s
, (void*)map
, e
, loc
, location
);
1596 /* Return the highest location emitted for a given file for which
1597 there is a line map in SET. FILE_NAME is the file name to
1598 consider. If the function returns TRUE, *LOC is set to the highest
1599 location emitted for that file. */
1602 linemap_get_file_highest_location (struct line_maps
*set
,
1603 const char *file_name
,
1604 source_location
*loc
)
1606 /* If the set is empty or no ordinary map has been created then
1607 there is no file to look for ... */
1608 if (set
== NULL
|| set
->info_ordinary
.used
== 0)
1611 /* Now look for the last ordinary map created for FILE_NAME. */
1613 for (i
= set
->info_ordinary
.used
- 1; i
>= 0; --i
)
1615 const char *fname
= set
->info_ordinary
.maps
[i
].to_file
;
1616 if (fname
&& !filename_cmp (fname
, file_name
))
1623 /* The highest location for a given map is either the starting
1624 location of the next map minus one, or -- if the map is the
1625 latest one -- the highest location of the set. */
1626 source_location result
;
1627 if (i
== (int) set
->info_ordinary
.used
- 1)
1628 result
= set
->highest_location
;
1630 result
= set
->info_ordinary
.maps
[i
+ 1].start_location
- 1;
1636 /* Compute and return statistics about the memory consumption of some
1637 parts of the line table SET. */
1640 linemap_get_statistics (struct line_maps
*set
,
1641 struct linemap_stats
*s
)
1643 long ordinary_maps_allocated_size
, ordinary_maps_used_size
,
1644 macro_maps_allocated_size
, macro_maps_used_size
,
1645 macro_maps_locations_size
= 0, duplicated_macro_maps_locations_size
= 0;
1647 const line_map_macro
*cur_map
;
1649 ordinary_maps_allocated_size
=
1650 LINEMAPS_ORDINARY_ALLOCATED (set
) * sizeof (struct line_map_ordinary
);
1652 ordinary_maps_used_size
=
1653 LINEMAPS_ORDINARY_USED (set
) * sizeof (struct line_map_ordinary
);
1655 macro_maps_allocated_size
=
1656 LINEMAPS_MACRO_ALLOCATED (set
) * sizeof (struct line_map_macro
);
1658 for (cur_map
= LINEMAPS_MACRO_MAPS (set
);
1659 cur_map
&& cur_map
<= LINEMAPS_LAST_MACRO_MAP (set
);
1664 linemap_assert (linemap_macro_expansion_map_p (cur_map
));
1666 macro_maps_locations_size
+=
1667 2 * MACRO_MAP_NUM_MACRO_TOKENS (cur_map
) * sizeof (source_location
);
1669 for (i
= 0; i
< 2 * MACRO_MAP_NUM_MACRO_TOKENS (cur_map
); i
+= 2)
1671 if (MACRO_MAP_LOCATIONS (cur_map
)[i
] ==
1672 MACRO_MAP_LOCATIONS (cur_map
)[i
+ 1])
1673 duplicated_macro_maps_locations_size
+=
1674 sizeof (source_location
);
1678 macro_maps_used_size
=
1679 LINEMAPS_MACRO_USED (set
) * sizeof (struct line_map_macro
);
1681 s
->num_ordinary_maps_allocated
= LINEMAPS_ORDINARY_ALLOCATED (set
);
1682 s
->num_ordinary_maps_used
= LINEMAPS_ORDINARY_USED (set
);
1683 s
->ordinary_maps_allocated_size
= ordinary_maps_allocated_size
;
1684 s
->ordinary_maps_used_size
= ordinary_maps_used_size
;
1685 s
->num_expanded_macros
= num_expanded_macros_counter
;
1686 s
->num_macro_tokens
= num_macro_tokens_counter
;
1687 s
->num_macro_maps_used
= LINEMAPS_MACRO_USED (set
);
1688 s
->macro_maps_allocated_size
= macro_maps_allocated_size
;
1689 s
->macro_maps_locations_size
= macro_maps_locations_size
;
1690 s
->macro_maps_used_size
= macro_maps_used_size
;
1691 s
->duplicated_macro_maps_locations_size
=
1692 duplicated_macro_maps_locations_size
;
1696 /* Dump line table SET to STREAM. If STREAM is NULL, stderr is used.
1697 NUM_ORDINARY specifies how many ordinary maps to dump. NUM_MACRO
1698 specifies how many macro maps to dump. */
1701 line_table_dump (FILE *stream
, struct line_maps
*set
, unsigned int num_ordinary
,
1702 unsigned int num_macro
)
1712 fprintf (stream
, "# of ordinary maps: %d\n", LINEMAPS_ORDINARY_USED (set
));
1713 fprintf (stream
, "# of macro maps: %d\n", LINEMAPS_MACRO_USED (set
));
1714 fprintf (stream
, "Include stack depth: %d\n", set
->depth
);
1715 fprintf (stream
, "Highest location: %u\n", set
->highest_location
);
1719 fprintf (stream
, "\nOrdinary line maps\n");
1720 for (i
= 0; i
< num_ordinary
&& i
< LINEMAPS_ORDINARY_USED (set
); i
++)
1721 linemap_dump (stream
, set
, i
, false);
1722 fprintf (stream
, "\n");
1727 fprintf (stream
, "\nMacro line maps\n");
1728 for (i
= 0; i
< num_macro
&& i
< LINEMAPS_MACRO_USED (set
); i
++)
1729 linemap_dump (stream
, set
, i
, true);
1730 fprintf (stream
, "\n");