source_location linemap_unwind_toward_expansion (struct line_maps *set, source_location loc, const struct line_map **map) { source_location resolved_location; const struct line_map *resolved_map; resolved_location = linemap_macro_map_loc_unwind_toward_spelling (*map, loc); resolved_map = linemap_lookup (set, resolved_location); if (!linemap_macro_expansion_map_p (resolved_map)) { resolved_location = linemap_macro_map_loc_to_exp_point (*map, loc); resolved_map = linemap_lookup (set, resolved_location); } *map = resolved_map; return resolved_location; }
static source_location linemap_macro_loc_to_spelling_point (struct line_maps *set, source_location location, const struct line_map **original_map) { struct line_map *map; linemap_assert (set && location >= RESERVED_LOCATION_COUNT); while (true) { map = (struct line_map*) linemap_lookup (set, location); if (!linemap_macro_expansion_map_p (map)) break; location = linemap_macro_map_loc_unwind_toward_spelling (map, location); } if (original_map) *original_map = map; return location; }
int linemap_location_in_system_header_p (struct line_maps *set, source_location location) { const struct line_map *map = NULL; if (location < RESERVED_LOCATION_COUNT) return false; /* Let's look at where the token for LOCATION comes from. */ while (true) { map = linemap_lookup (set, location); if (map != NULL) { if (!linemap_macro_expansion_map_p (map)) /* It's a normal token. */ return LINEMAP_SYSP (map); else { /* It's a token resulting from a macro expansion. */ source_location loc = linemap_macro_map_loc_unwind_toward_spelling (map, location); if (loc < RESERVED_LOCATION_COUNT) /* This token might come from a built-in macro. Let's look at where that macro got expanded. */ location = linemap_macro_map_loc_to_exp_point (map, location); else location = loc; } } else break; } return false; }