Patchwork [05/11] Make expand_location resolve to locus in main source file

login
register
mail settings
Submitter Dodji Seketeli
Date April 25, 2012, 3:31 p.m.
Message ID <m3obqfn804.fsf@redhat.com>
Download mbox | patch
Permalink /patch/154983/
State New
Headers show

Comments

Dodji Seketeli - April 25, 2012, 3:31 p.m.
I have re-based my tree on top of a recent tree that incorporates the
changes for caret diagnostics and I had to update this patch
accordingly.  Here is its new version on trunk of today.  It basically
updates the new diagnostic_show_locus function to point to spelling
locations.

The patch does pass bootstrap with -ftrack-macro-expansion turned off,
and passes bootstrap with the full series with -ftrack-macro-expansion
turned on.

gcc/

	* input.c (expand_location_1): New.  Takes a parameter to choose
	whether to resolve the location to spelling or expansion point.
	Was factorized from ...
	(expand_location): ... here.
	(expand_location_to_spelling_point): New.  Implemented in terms of
	expand_location_1.
	* diagnostic.c (diagnostic_build_prefix): Use the new
	expand_location_to_spelling_point instead of expand_location.
---
 gcc/diagnostic.c |    4 ++--
 gcc/input.c      |   40 +++++++++++++++++++++++++++++++++++-----
 gcc/input.h      |    9 +++++++++
 3 files changed, 46 insertions(+), 7 deletions(-)
Jason Merrill - April 29, 2012, 4:11 a.m.
On 04/25/2012 11:31 AM, Dodji Seketeli wrote:
> +#define EXPANSION_POINT_LOCATION_FILE(LOC)		\
> +  ((expand_location_to_expansion_point (LOC)).file)
> +#define EXPANSION_POINT_LOCATION_LINE(LOC)		\
> +  ((expand_location_to_expansion_point (LOC)).line)
> +#define EXPANSION_POINT_LOCATION_COLUMN(LOC)		\
> +  ((expand_location_to_expansion_point (LOC)).column)

These macros don't seem to be used anywhere.  The rest of the patch is OK.

Jason

Patch

diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c
index 4496803..729e865 100644
--- a/gcc/diagnostic.c
+++ b/gcc/diagnostic.c
@@ -214,7 +214,7 @@  diagnostic_build_prefix (diagnostic_context *context,
     "must-not-happen"
   };
   const char *text = _(diagnostic_kind_text[diagnostic->kind]);
-  expanded_location s = expand_location (diagnostic->location);
+  expanded_location s = expand_location_to_spelling_point (diagnostic->location);
   if (diagnostic->override_column)
     s.column = diagnostic->override_column;
   gcc_assert (diagnostic->kind < DK_LAST_DIAGNOSTIC_KIND);
@@ -266,7 +266,7 @@  diagnostic_show_locus (diagnostic_context * context,
       || diagnostic->location <= BUILTINS_LOCATION)
     return;
 
-  s = expand_location(diagnostic->location);
+  s = expand_location_to_spelling_point (diagnostic->location);
   line = location_get_source_line (s);
   if (line == NULL)
     return;
diff --git a/gcc/input.c b/gcc/input.c
index bf5fe48..e9ba301 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -32,16 +32,22 @@  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)
+   location is set to the string "<built-in>". If EXPANSION_POINT_P is
+   TRUE and LOC is virtual, then it is resolved to the expansion
+   point of the involved macro.  Otherwise, it is resolved to the
+   spelling location of the token.  */
+
+static expanded_location
+expand_location_1 (source_location loc,
+		   bool expansion_point_p)
 {
   expanded_location xloc;
   const struct line_map *map;
 
   loc = linemap_resolve_location (line_table, loc,
-				  LRK_SPELLING_LOCATION, &map);
+				  expansion_point_p
+				  ? LRK_MACRO_EXPANSION_POINT
+				  : LRK_SPELLING_LOCATION, &map);
   xloc = linemap_expand_location (line_table, map, loc);
 
   if (loc <= BUILTINS_LOCATION)
@@ -109,6 +115,30 @@  location_get_source_line(expanded_location xloc)
   return buffer;
 }
 
+/* Expand the source location LOC into a human readable location.  If
+   LOC is virtual, it resolves to the expansion point of the involved
+   macro.  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)
+{
+  return expand_location_1 (loc, /*expansion_point_p=*/true);
+}
+
+/* Expand the source location LOC into a human readable location.  If
+   LOC is virtual, it resolves to the expansion location of the
+   relevant macro.  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_to_spelling_point (source_location loc)
+{
+  return expand_location_1 (loc, /*expansion_piont_p=*/false);
+}
+
+
 #define ONE_K 1024
 #define ONE_M (ONE_K * ONE_K)
 
diff --git a/gcc/input.h b/gcc/input.h
index 4b15222..f755cdf 100644
--- a/gcc/input.h
+++ b/gcc/input.h
@@ -39,6 +39,7 @@  extern char builtins_location_check[(BUILTINS_LOCATION
 
 extern expanded_location expand_location (source_location);
 extern const char * location_get_source_line(expanded_location xloc);
+extern expanded_location expand_location_to_spelling_point (source_location);
 
 /* Historically GCC used location_t, while cpp used source_location.
    This could be removed but it hardly seems worth the effort.  */
@@ -50,6 +51,14 @@  extern location_t input_location;
 #define LOCATION_LINE(LOC) ((expand_location (LOC)).line)
 #define LOCATION_COLUMN(LOC)((expand_location (LOC)).column)
 
+#define EXPANSION_POINT_LOCATION_FILE(LOC)		\
+  ((expand_location_to_expansion_point (LOC)).file)
+#define EXPANSION_POINT_LOCATION_LINE(LOC)		\
+  ((expand_location_to_expansion_point (LOC)).line)
+#define EXPANSION_POINT_LOCATION_COLUMN(LOC)		\
+  ((expand_location_to_expansion_point (LOC)).column)
+
+
 #define input_line LOCATION_LINE (input_location)
 #define input_filename LOCATION_FILE (input_location)
 #define in_system_header_at(LOC) \