diff mbox

Linemap force location and remove LINEMAP_POSITION_FOR_COLUMN (issue4801090)

Message ID 20110816003729.5C11A1C0F8B@gchare.mtv.corp.google.com
State New
Headers show

Commit Message

Gab Charette Aug. 16, 2011, 12:37 a.m. UTC
Here is the updated patch.

It nows exposes two libcpp functions to force the source_location for tokens when desired.

The lexer then checks for a value set by these functions in cpp_reader and acts accordingly when needing a location for a new token (either using the forced_location or calling the linemap as it used to).

It turns out the fortran library made the same mistake of creating a line_table entry for builtins, I fixed it as well in this patch.

Tested on x64 for c++,fortran.

(fyi: I moved the removal of LINEMAP_POSITION_FOR_COLUMN to a separate patch which is checked-in already; thus it doesn't show up in this updated patch obviously.
)

Ok for trunk?

Gabriel

2011-08-15  Gabriel Charette  <gchare@google.com>

	gcc/c-family/ChangeLog
	* c-opts.c (c_finish_options): Force BUILTINS_LOCATION for tokens
	defined in cpp_init_builtins and c_cpp_builtins.

	gcc/fortran/ChangeLog
	* cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens
	defined in cpp_define_builtins.

	libcpp/ChangeLog
	* init.c (cpp_create_reader): Inititalize forced_token_location_p.
	* internal.h (struct cpp_reader): Add field forced_token_location_p.
	* lex.c (_cpp_lex_direct): Use forced_token_location_p.
	(cpp_force_token_locations): New.
	(cpp_stop_forcing_token_locations): New.


--
This patch is available for review at http://codereview.appspot.com/4801090

Comments

Dodji Seketeli Aug. 17, 2011, 8:04 p.m. UTC | #1
Hello Gabriel,

gchare@google.com (Gabriel Charette) a écrit:

> Here is the updated patch.
>
> It nows exposes two libcpp functions to force the source_location for tokens when desired.
>
> The lexer then checks for a value set by these functions in cpp_reader and acts accordingly when needing a location for a new token (either using the forced_location or calling the linemap as it used to).
>
> It turns out the fortran library made the same mistake of creating a line_table entry for builtins, I fixed it as well in this patch.
>
> Tested on x64 for c++,fortran.
>
> (fyi: I moved the removal of LINEMAP_POSITION_FOR_COLUMN to a separate patch which is checked-in already; thus it doesn't show up in this updated patch obviously.
> )
>
> Ok for trunk?
>
> Gabriel
>
> 2011-08-15  Gabriel Charette  <gchare@google.com>
>
> 	gcc/c-family/ChangeLog
> 	* c-opts.c (c_finish_options): Force BUILTINS_LOCATION for tokens
> 	defined in cpp_init_builtins and c_cpp_builtins.
>
> 	gcc/fortran/ChangeLog
> 	* cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens
> 	defined in cpp_define_builtins.
>
> 	libcpp/ChangeLog
> 	* init.c (cpp_create_reader): Inititalize forced_token_location_p.
> 	* internal.h (struct cpp_reader): Add field forced_token_location_p.
> 	* lex.c (_cpp_lex_direct): Use forced_token_location_p.
> 	(cpp_force_token_locations): New.
> 	(cpp_stop_forcing_token_locations): New.

I cannot approve or reject this patch, but FWIW, it looks OK to me.

Thanks.
Gab Charette Aug. 18, 2011, 4:47 p.m. UTC | #2
Tom: ok for trunk?

fortran@: The fortran change just reflects the fix from libcpp,
fortran bootstrap and tests passed.

Thanks,
Gabriel

On Wed, Aug 17, 2011 at 1:04 PM, Dodji Seketeli <dodji@seketeli.org> wrote:
> Hello Gabriel,
>
> gchare@google.com (Gabriel Charette) a écrit:
>
>> Here is the updated patch.
>>
>> It nows exposes two libcpp functions to force the source_location for tokens when desired.
>>
>> The lexer then checks for a value set by these functions in cpp_reader and acts accordingly when needing a location for a new token (either using the forced_location or calling the linemap as it used to).
>>
>> It turns out the fortran library made the same mistake of creating a line_table entry for builtins, I fixed it as well in this patch.
>>
>> Tested on x64 for c++,fortran.
>>
>> (fyi: I moved the removal of LINEMAP_POSITION_FOR_COLUMN to a separate patch which is checked-in already; thus it doesn't show up in this updated patch obviously.
>> )
>>
>> Ok for trunk?
>>
>> Gabriel
>>
>> 2011-08-15  Gabriel Charette  <gchare@google.com>
>>
>>       gcc/c-family/ChangeLog
>>       * c-opts.c (c_finish_options): Force BUILTINS_LOCATION for tokens
>>       defined in cpp_init_builtins and c_cpp_builtins.
>>
>>       gcc/fortran/ChangeLog
>>       * cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens
>>       defined in cpp_define_builtins.
>>
>>       libcpp/ChangeLog
>>       * init.c (cpp_create_reader): Inititalize forced_token_location_p.
>>       * internal.h (struct cpp_reader): Add field forced_token_location_p.
>>       * lex.c (_cpp_lex_direct): Use forced_token_location_p.
>>       (cpp_force_token_locations): New.
>>       (cpp_stop_forcing_token_locations): New.
>
> I cannot approve or reject this patch, but FWIW, it looks OK to me.
>
> Thanks.
>
> --
>                Dodji
>
Tobias Burnus Aug. 18, 2011, 5:11 p.m. UTC | #3
On 08/18/2011 06:47 PM, Gabriel Charette wrote:
 > Tom: ok for trunk?
 >
 > fortran@: The fortran change just reflects the fix from libcpp,
 > fortran bootstrap and tests passed.

The Fortran change is OK.

Thanks for the patch!

Tobias

On 08/16/2011 02:37 AM, Gabriel Charette wrote:
> Here is the updated patch.
>
> It nows exposes two libcpp functions to force the source_location for tokens when desired.
>
> The lexer then checks for a value set by these functions in cpp_reader and acts accordingly when needing a location for a new token (either using the forced_location or calling the linemap as it used to).
>
> It turns out the fortran library made the same mistake of creating a line_table entry for builtins, I fixed it as well in this patch.
>
> Tested on x64 for c++,fortran.
> Ok for trunk?
>
> Gabriel
>
> 2011-08-15  Gabriel Charette<gchare@google.com>
>
> 	gcc/c-family/ChangeLog
> 	* c-opts.c (c_finish_options): Force BUILTINS_LOCATION for tokens
> 	defined in cpp_init_builtins and c_cpp_builtins.
>
> 	gcc/fortran/ChangeLog
> 	* cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens
> 	defined in cpp_define_builtins.
>
> 	libcpp/ChangeLog
> 	* init.c (cpp_create_reader): Inititalize forced_token_location_p.
> 	* internal.h (struct cpp_reader): Add field forced_token_location_p.
> 	* lex.c (_cpp_lex_direct): Use forced_token_location_p.
> 	(cpp_force_token_locations): New.
> 	(cpp_stop_forcing_token_locations): New.
>
> diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
> index 3227f7b..49ff80d 100644
> --- a/gcc/c-family/c-opts.c
> +++ b/gcc/c-family/c-opts.c
> @@ -1306,12 +1306,17 @@ c_finish_options (void)
>       {
>         size_t i;
>
> -      cb_file_change (parse_in,
> -		      linemap_add (line_table, LC_RENAME, 0,
> -				   _("<built-in>"), 0));
> +      {
> +	/* Make sure all of the builtins about to be declared have
> +	  BUILTINS_LOCATION has their source_location.  */
> +	source_location builtins_loc = BUILTINS_LOCATION;
> +	cpp_force_token_locations (parse_in,&builtins_loc);
>
> -      cpp_init_builtins (parse_in, flag_hosted);
> -      c_cpp_builtins (parse_in);
> +	cpp_init_builtins (parse_in, flag_hosted);
> +	c_cpp_builtins (parse_in);
> +
> +	cpp_stop_forcing_token_locations (parse_in);
> +      }
>
>         /* We're about to send user input to cpplib, so make it warn for
>   	 things that we previously (when we sent it internal definitions)
> diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c
> index a40442e..9368d89 100644
> --- a/gcc/fortran/cpp.c
> +++ b/gcc/fortran/cpp.c
> @@ -565,9 +565,17 @@ gfc_cpp_init (void)
>     if (gfc_option.flag_preprocessed)
>       return;
>
> -  cpp_change_file (cpp_in, LC_RENAME, _("<built-in>"));
>     if (!gfc_cpp_option.no_predefined)
> -    cpp_define_builtins (cpp_in);
> +    {
> +      /* Make sure all of the builtins about to be declared have
> +	BUILTINS_LOCATION has their source_location.  */
> +      source_location builtins_loc = BUILTINS_LOCATION;
> +      cpp_force_token_locations (cpp_in,&builtins_loc);
> +
> +      cpp_define_builtins (cpp_in);
> +
> +      cpp_stop_forcing_token_locations (cpp_in);
> +    }
>
>     /* Handle deferred options from command-line.  */
>     cpp_change_file (cpp_in, LC_RENAME, _("<command-line>"));
[...]
Tom Tromey Aug. 19, 2011, 4:21 p.m. UTC | #4
>>>>> "Gabriel" == Gabriel Charette <gchare@google.com> writes:

Gabriel> It nows exposes two libcpp functions to force the
Gabriel> source_location for tokens when desired.

I am not really a fan of this approach, but I see why you did it this
way -- anything else would be very invasive.

I can only approve the libcpp parts.

Gabriel> +void cpp_force_token_locations (cpp_reader *r, source_location *p)

Newline after "void".

Gabriel> +void cpp_stop_forcing_token_locations (cpp_reader *r)

Likewise.

The libcpp parts are ok with those changes.

Tom
diff mbox

Patch

diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index 3227f7b..49ff80d 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -1306,12 +1306,17 @@  c_finish_options (void)
     {
       size_t i;
 
-      cb_file_change (parse_in,
-		      linemap_add (line_table, LC_RENAME, 0,
-				   _("<built-in>"), 0));
+      {
+	/* Make sure all of the builtins about to be declared have
+	  BUILTINS_LOCATION has their source_location.  */
+	source_location builtins_loc = BUILTINS_LOCATION;
+	cpp_force_token_locations (parse_in, &builtins_loc);
 
-      cpp_init_builtins (parse_in, flag_hosted);
-      c_cpp_builtins (parse_in);
+	cpp_init_builtins (parse_in, flag_hosted);
+	c_cpp_builtins (parse_in);
+
+	cpp_stop_forcing_token_locations (parse_in);
+      }
 
       /* We're about to send user input to cpplib, so make it warn for
 	 things that we previously (when we sent it internal definitions)
diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c
index a40442e..9368d89 100644
--- a/gcc/fortran/cpp.c
+++ b/gcc/fortran/cpp.c
@@ -565,9 +565,17 @@  gfc_cpp_init (void)
   if (gfc_option.flag_preprocessed)
     return;
 
-  cpp_change_file (cpp_in, LC_RENAME, _("<built-in>"));
   if (!gfc_cpp_option.no_predefined)
-    cpp_define_builtins (cpp_in);
+    {
+      /* Make sure all of the builtins about to be declared have
+	BUILTINS_LOCATION has their source_location.  */
+      source_location builtins_loc = BUILTINS_LOCATION;
+      cpp_force_token_locations (cpp_in, &builtins_loc);
+
+      cpp_define_builtins (cpp_in);
+
+      cpp_stop_forcing_token_locations (cpp_in);
+    }
 
   /* Handle deferred options from command-line.  */
   cpp_change_file (cpp_in, LC_RENAME, _("<command-line>"));
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 55b0f1b..6ad0345 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -985,4 +985,8 @@  extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
 extern int cpp_read_state (cpp_reader *, const char *, FILE *,
 			   struct save_macro_data *);
 
+/* In lex.c */
+extern void cpp_force_token_locations (cpp_reader *, source_location *);
+extern void cpp_stop_forcing_token_locations (cpp_reader *);
+
 #endif /* ! LIBCPP_CPPLIB_H */
diff --git a/libcpp/init.c b/libcpp/init.c
index 5ba6666..b3d4c8c 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -221,6 +221,9 @@  cpp_create_reader (enum c_lang lang, hash_table *table,
   /* Initialize table for push_macro/pop_macro.  */
   pfile->pushed_macros = 0;
 
+  /* Do not force token locations by default.  */
+  pfile->forced_token_location_p = NULL;
+
   /* The expression parser stack.  */
   _cpp_expand_op_stack (pfile);
 
diff --git a/libcpp/internal.h b/libcpp/internal.h
index d2872c4..6c423f0 100644
--- a/libcpp/internal.h
+++ b/libcpp/internal.h
@@ -499,6 +499,10 @@  struct cpp_reader
 
   /* List of saved macros by push_macro.  */
   struct def_pragma_macro *pushed_macros;
+
+  /* If non-null, the lexer will use this location for the next token
+     instead of getting a location from the linemap.  */
+  source_location *forced_token_location_p;
 };
 
 /* Character classes.  Based on the more primitive macros in safe-ctype.h.
diff --git a/libcpp/lex.c b/libcpp/lex.c
index d460b98..244b14d 100644
--- a/libcpp/lex.c
+++ b/libcpp/lex.c
@@ -1975,8 +1975,11 @@  _cpp_lex_direct (cpp_reader *pfile)
     }
   c = *buffer->cur++;
 
-  result->src_loc = linemap_position_for_column (pfile->line_table,
-			                                    CPP_BUF_COLUMN (buffer, buffer->cur));
+  if (pfile->forced_token_location_p)
+    result->src_loc = *pfile->forced_token_location_p;
+  else
+    result->src_loc = linemap_position_for_column (pfile->line_table,
+					  CPP_BUF_COLUMN (buffer, buffer->cur));
 
   switch (c)
     {
@@ -2837,3 +2840,19 @@  cpp_token_val_index (cpp_token *tok)
       return CPP_TOKEN_FLD_NONE;
     }
 }
+
+/* All tokens lexed in R after calling this function will be forced to have
+   their source_location the same as the location referenced by P, until
+   cpp_stop_forcing_token_locations is called for R.  */
+
+void cpp_force_token_locations (cpp_reader *r, source_location *p)
+{
+  r->forced_token_location_p = p;
+}
+
+/* Go back to assigning locations naturally for lexed tokens.  */
+
+void cpp_stop_forcing_token_locations (cpp_reader *r)
+{
+  r->forced_token_location_p = NULL;
+}