From: Jason Merrill Date: Wed, 21 Sep 2016 19:59:29 +0000 (-0400) Subject: Add from_macro_definition_at predicate for locations. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=63cb3926080e7f7e1b93dd94911ad4720813a081;p=gcc.git Add from_macro_definition_at predicate for locations. gcc/ * input.h (from_macro_definition_at): New. libcpp/ * line-map.c (linemap_location_from_macro_definition_p): New. * line-map.h: Declare it. From-SVN: r240330 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 330d9fd2bdc..bb998d165e7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-09-21 Jason Merrill + + * input.h (from_macro_definition_at): New. + 2016-09-21 Segher Boessenkool * doc/rtl.texi (JUMP_LABEL): Document RETURN and SIMPLE_RETURN values. diff --git a/gcc/input.h b/gcc/input.h index e95bd3cb1a9..fe80605967e 100644 --- a/gcc/input.h +++ b/gcc/input.h @@ -77,6 +77,11 @@ extern location_t input_location; comes from a macro expansion, O otherwise. */ #define from_macro_expansion_at(LOC) \ ((linemap_location_from_macro_expansion_p (line_table, LOC))) +/* Return a positive value if LOCATION is the locus of a token that comes from + a macro definition, O otherwise. This differs from from_macro_expansion_at + in its treatment of macro arguments, for which this returns false. */ +#define from_macro_definition_at(LOC) \ + ((linemap_location_from_macro_definition_p (line_table, LOC))) static inline location_t get_pure_location (location_t loc) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index b2b36037463..e039069a714 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,8 @@ +2016-09-21 Jason Merrill + + * line-map.c (linemap_location_from_macro_definition_p): New. + * line-map.h: Declare it. + 2016-09-15 David Malcolm * include/line-map.h (class rich_location): Note that newlines diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index 747609d4393..8be98b5f597 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -1086,12 +1086,16 @@ const char* linemap_map_get_macro_name (const line_map_macro *); int linemap_location_in_system_header_p (struct line_maps *, source_location); -/* Return TRUE if LOCATION is a source code location of a token coming - from a macro replacement-list at a macro expansion point, FALSE - otherwise. */ +/* Return TRUE if LOCATION is a source code location of a token that is part of + a macro expansion, FALSE otherwise. */ bool linemap_location_from_macro_expansion_p (const struct line_maps *, source_location); +/* TRUE if LOCATION is a source code location of a token that is part of the + definition of a macro, FALSE otherwise. */ +bool linemap_location_from_macro_definition_p (struct line_maps *, + source_location); + /* With the precondition that LOCATION is the locus of a token that is an argument of a function-like macro MACRO_MAP and appears in the expansion of MACRO_MAP, return the locus of that argument in the diff --git a/libcpp/line-map.c b/libcpp/line-map.c index 07e3acb78a5..c5c42f0966b 100644 --- a/libcpp/line-map.c +++ b/libcpp/line-map.c @@ -1223,9 +1223,8 @@ linemap_location_in_system_header_p (struct line_maps *set, return false; } -/* Return TRUE if LOCATION is a source code location of a token coming - from a macro replacement-list at a macro expansion point, FALSE - otherwise. */ +/* Return TRUE if LOCATION is a source code location of a token that is part of + a macro expansion, FALSE otherwise. */ bool linemap_location_from_macro_expansion_p (const struct line_maps *set, @@ -1570,6 +1569,37 @@ linemap_resolve_location (struct line_maps *set, return loc; } +/* TRUE if LOCATION is a source code location of a token that is part of the + definition of a macro, FALSE otherwise. */ + +bool +linemap_location_from_macro_definition_p (struct line_maps *set, + source_location loc) +{ + if (IS_ADHOC_LOC (loc)) + loc = get_location_from_adhoc_loc (set, loc); + + if (!linemap_location_from_macro_expansion_p (set, loc)) + return false; + + while (true) + { + const struct line_map_macro *map + = linemap_check_macro (linemap_lookup (set, loc)); + + source_location s_loc + = linemap_macro_map_loc_unwind_toward_spelling (set, map, loc); + if (linemap_location_from_macro_expansion_p (set, s_loc)) + loc = s_loc; + else + { + source_location def_loc + = linemap_macro_map_loc_to_def_point (map, loc); + return s_loc == def_loc; + } + } +} + /* Suppose that LOC is the virtual location of a token T coming from the expansion of a macro M. This function then steps up to get the