summaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2016-09-21 19:59:29 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2016-09-21 19:59:29 +0000
commite496fd6fce138a58d49d0b0e9288f6a2835d224b (patch)
tree452d1f9ed62885789446c7406e5160af2992acdd /libcpp
parentd19317f0ea263bbd69746085f170a62a54d054b7 (diff)
downloadgcc-e496fd6fce138a58d49d0b0e9288f6a2835d224b.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@240330 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r--libcpp/ChangeLog5
-rw-r--r--libcpp/include/line-map.h10
-rw-r--r--libcpp/line-map.c36
3 files changed, 45 insertions, 6 deletions
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 <jason@redhat.com>
+
+ * line-map.c (linemap_location_from_macro_definition_p): New.
+ * line-map.h: Declare it.
+
2016-09-15 David Malcolm <dmalcolm@redhat.com>
* 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