Support expansion of reserved locations wrapped in virtual locations
authordodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Oct 2011 08:58:54 +0000 (08:58 +0000)
committerdodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Oct 2011 08:58:54 +0000 (08:58 +0000)
libcpp/

* include/line-map.h (linemap_expand_location): Take a line table
parameter.  Update comment.
(linemap_resolve_location): Update comment.
(linemap_expand_location_full): Remove.
* line-map.c (linemap_resolve_location):  Handle reserved
locations; return a NULL map in those cases.
(linemap_expand_location): If location is reserved, return a
zeroed expanded location.  Update comment.  Take a line table to
assert that the function takes non-virtual locations only.
(linemap_expand_location_full): remove.
(linemap_dump_location): Handle the fact that
linemap_resolve_location can return NULL line maps when the
location resolves to a reserved location.

gcc/
* input.c (expand_location): Rewrite using
linemap_resolve_location and linemap_expand_location.  Add a
comment.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@180426 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/input.c
libcpp/ChangeLog
libcpp/include/line-map.h
libcpp/line-map.c

index 77ab424..1788d6a 100644 (file)
@@ -1,3 +1,9 @@
+2011-10-24  Dodji Seketeli  <dodji@redhat.com>
+
+       * input.c (expand_location): Rewrite using
+       linemap_resolve_location and linemap_expand_location.  Add a
+       comment.
+
 2011-10-25  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/50596
index a780f5c..4077f9e 100644 (file)
@@ -30,20 +30,23 @@ location_t input_location;
 
 struct line_maps *line_table;
 
+/* Expand the source location LOC into a human readable location.  If
+   LOC resolves to a builtin location, the file name of the readable
+   location is set to the string "<built-in>".  */
+
 expanded_location
 expand_location (source_location loc)
 {
   expanded_location xloc;
+  const struct line_map *map;
+
+  loc = linemap_resolve_location (line_table, loc,
+                                 LRK_SPELLING_LOCATION, &map);
+  xloc = linemap_expand_location (line_table, map, loc);
+
   if (loc <= BUILTINS_LOCATION)
-    {
-      xloc.file = loc == UNKNOWN_LOCATION ? NULL : _("<built-in>");
-      xloc.line = 0;
-      xloc.column = 0;
-      xloc.sysp = 0;
-    }
-  else
-    xloc = linemap_expand_location_full (line_table, loc,
-                                        LRK_SPELLING_LOCATION);
+    xloc.file = loc == UNKNOWN_LOCATION ? NULL : _("<built-in>");
+
   return xloc;
 }
 
index 3c47795..d7fb84f 100644 (file)
@@ -1,3 +1,21 @@
+2011-10-24  Dodji Seketeli  <dodji@redhat.com>
+
+       * include/line-map.h (linemap_expand_location): Take a line table
+       parameter.  Update comment.
+       (linemap_resolve_location): Update comment.
+       (linemap_expand_location_full): Remove.
+       * line-map.c (linemap_resolve_location):  Handle reserved
+       locations; return a NULL map in those cases.
+       (linemap_expand_location): If location is reserved, return a
+       zeroed expanded location.  Update comment.  Take a line table to
+       assert that the function takes non-virtual locations only.
+       (linemap_expand_location_full): remove.
+       (linemap_dump_location): Handle the fact that
+       linemap_resolve_location can return NULL line maps when the
+       location resolves to a reserved location.
+
+       * line-map.c (linemap_macro_map_lookup): Fix logic.
+
 2011-10-22  Dodji Seketeli  <dodji@redhat.com>
 
        PR bootstrap/50778
index ef98f59..112bc02 100644 (file)
@@ -651,7 +651,10 @@ enum location_resolution_kind
    LRK_SPELLING_LOCATION.
 
    If LOC_MAP is not NULL, *LOC_MAP is set to the map encoding the
-   returned location.  */
+   returned location.  Note that if the resturned location wasn't originally
+   encoded by a map, the *MAP is set to NULL.  This can happen if LOC
+   resolves to a location reserved for the client code, like
+   UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC.  */
 
 source_location linemap_resolve_location (struct line_maps *,
                                          source_location loc,
@@ -670,19 +673,13 @@ source_location linemap_unwind_toward_expansion (struct line_maps *,
                                                 const struct line_map **loc_map);
 
 /* Expand source code location LOC and return a user readable source
-   code location.  LOC must be a spelling (non-virtual) location.  */
-
-expanded_location linemap_expand_location (const struct line_map *,
+   code location.  LOC must be a spelling (non-virtual) location.  If
+   it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
+   location is returned.  */
+expanded_location linemap_expand_location (struct line_maps *,
+                                          const struct line_map *,
                                           source_location loc);
 
-/* Expand source code location LOC and return a user readable source
-   code location.  LOC can be a virtual location.  The LRK parameter
-   is the same as for linemap_resolve_location.  */
-
-expanded_location linemap_expand_location_full (struct line_maps *,
-                                               source_location loc,
-                                               enum location_resolution_kind lrk);
-
 /* Statistics about maps allocation and usage as returned by
    linemap_get_statistics.  */
 struct linemap_stats
index fb3be3a..7a1decc 100644 (file)
@@ -755,12 +755,12 @@ linemap_location_in_system_header_p (struct line_maps *set,
 {
   const struct line_map *map = NULL;
 
-  if (location < RESERVED_LOCATION_COUNT)
-    return false;
-
   location =
     linemap_resolve_location (set, location, LRK_SPELLING_LOCATION, &map);
 
+  if (location < RESERVED_LOCATION_COUNT)
+    return false;
+
   return LINEMAP_SYSP (map);
 }
 
@@ -1039,7 +1039,10 @@ linemap_macro_loc_to_exp_point (struct line_maps *set,
    LRK_SPELLING_LOCATION.
 
    If MAP is non-NULL, *MAP is set to the map of the resolved
-   location.  */
+   location.  Note that if the resturned location wasn't originally
+   encoded by a map, the *MAP is set to NULL.  This can happen if LOC
+   resolves to a location reserved for the client code, like
+   UNKNOWN_LOCATION or BUILTINS_LOCATION in GCC.  */
 
 source_location
 linemap_resolve_location (struct line_maps *set,
@@ -1047,7 +1050,15 @@ linemap_resolve_location (struct line_maps *set,
                          enum location_resolution_kind lrk,
                          const struct line_map **map)
 {
-  linemap_assert (set && loc >= RESERVED_LOCATION_COUNT);
+  if (loc < RESERVED_LOCATION_COUNT)
+    {
+      /* A reserved location wasn't encoded in a map.  Let's return a
+        NULL map here, just like what linemap_ordinary_map_lookup
+        does.  */
+      if (map)
+       *map = NULL;
+      return loc;
+    }
 
   switch (lrk)
     {
@@ -1101,37 +1112,44 @@ linemap_unwind_toward_expansion (struct line_maps *set,
 }
 
 /* Expand source code location LOC and return a user readable source
-   code location.  LOC must be a spelling (non-virtual) location.  */
+   code location.  LOC must be a spelling (non-virtual) location.  If
+   it's a location < RESERVED_LOCATION_COUNT a zeroed expanded source
+   location is returned.  */
 
 expanded_location
-linemap_expand_location (const struct line_map *map,
+linemap_expand_location (struct line_maps *set,
+                        const struct line_map *map,
                         source_location loc)
 
 {
   expanded_location xloc;
 
-  xloc.file = LINEMAP_FILE (map);
-  xloc.line = SOURCE_LINE (map, loc);
-  xloc.column = SOURCE_COLUMN (map, loc);
-  xloc.sysp = LINEMAP_SYSP (map) != 0;
-
-  return xloc;
-}
-
-/* Expand source code location LOC and return a user readable source
-   code location.  LOC can be a virtual location.  The LRK parameter
-   is the same as for linemap_resolve_location.  */
+  memset (&xloc, 0, sizeof (xloc));
+
+  if (loc < RESERVED_LOCATION_COUNT)
+    /* The location for this token wasn't generated from a line map.
+       It was probably a location for a builtin token, chosen by some
+       client code.  Let's not try to expand the location in that
+       case.  */;
+  else if (map == NULL)
+    /* We shouldn't be getting a NULL map with a location that is not
+       reserved by the client code.  */
+    abort ();
+  else
+    {
+      /* MAP must be an ordinary map and LOC must be non-virtual,
+        encoded into this map, obviously; the accessors used on MAP
+        below ensure it is ordinary.  Let's just assert the
+        non-virtualness of LOC here.  */
+      if (linemap_location_from_macro_expansion_p (set, loc))
+       abort ();
 
-expanded_location
-linemap_expand_location_full (struct line_maps *set,
-                             source_location loc,
-                             enum location_resolution_kind lrk)
-{
-  const struct line_map *map;
-  expanded_location xloc;
+      xloc.file = LINEMAP_FILE (map);
+      xloc.line = SOURCE_LINE (map, loc);
+      xloc.column = SOURCE_COLUMN (map, loc);
+      xloc.sysp = LINEMAP_SYSP (map) != 0;
+    }
 
-  loc = linemap_resolve_location (set, loc, lrk, &map);
-  xloc = linemap_expand_location (map, loc);
   return xloc;
 }
 
@@ -1145,32 +1163,37 @@ linemap_dump_location (struct line_maps *set,
 {
   const struct line_map *map;
   source_location location;
-  const char *path, *from;
-  int l,c,s,e;
+  const char *path = "", *from = "";
+  int l = -1, c = -1, s = -1, e = -1;
 
   if (loc == 0)
     return;
 
   location =
     linemap_resolve_location (set, loc, LRK_MACRO_DEFINITION_LOCATION, &map);
-  path = LINEMAP_FILE (map);
-
-  l = SOURCE_LINE (map, location);
-  c = SOURCE_COLUMN (map, location);
-  s = LINEMAP_SYSP (map) != 0;
-  e = location != loc;
 
-  if (e)
-    from = "N/A";
+  if (map == NULL)
+    /* Only reserved locations can be tolerated in this case.  */
+    linemap_assert (location < RESERVED_LOCATION_COUNT);
   else
-    from = (INCLUDED_FROM (set, map))
-      ? LINEMAP_FILE (INCLUDED_FROM (set, map))
-      : "<NULL>";
+    {
+      path = LINEMAP_FILE (map);
+      l = SOURCE_LINE (map, location);
+      c = SOURCE_COLUMN (map, location);
+      s = LINEMAP_SYSP (map) != 0;
+      e = location != loc;
+      if (e)
+       from = "N/A";
+      else
+       from = (INCLUDED_FROM (set, map))
+         ? LINEMAP_FILE (INCLUDED_FROM (set, map))
+         : "<NULL>";
+    }
 
   /* P: path, L: line, C: column, S: in-system-header, M: map address,
-     E: macro expansion?.   */
-  fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d}",
-          path, from, l, c, s, (void*)map, e, loc);
+     E: macro expansion?, LOC: original location, R: resolved location   */
+  fprintf (stream, "{P:%s;F:%s;L:%d;C:%d;S:%d;M:%p;E:%d,LOC:%d,R:%d}",
+          path, from, l, c, s, (void*)map, e, loc, location);
 }
 
 /* Compute and return statistics about the memory consumption of some