Commit e3dfef44 by Gabriel Charette Committed by Gabriel Charette

Add ability to force lexed tokens' source_locations.

Use it to force BUILTINS_LOCATION when declaring builtins instead of creating a <built-in> entry in the line_table which is wrong.

	* 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.

From-SVN: r177973
parent c4831cff
011-08-22 Gabriel Charette <gchare@google.com>
* c-opts.c (c_finish_options): Force BUILTINS_LOCATION for tokens
defined in cpp_init_builtins and c_cpp_builtins.
2011-08-19 Joseph Myers <joseph@codesourcery.com> 2011-08-19 Joseph Myers <joseph@codesourcery.com>
* c-common.c (c_common_reswords): Add __builtin_complex. * c-common.c (c_common_reswords): Add __builtin_complex.
......
...@@ -1306,13 +1306,18 @@ c_finish_options (void) ...@@ -1306,13 +1306,18 @@ c_finish_options (void)
{ {
size_t i; size_t i;
cb_file_change (parse_in, {
linemap_add (line_table, LC_RENAME, 0, /* Make sure all of the builtins about to be declared have
_("<built-in>"), 0)); 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); cpp_init_builtins (parse_in, flag_hosted);
c_cpp_builtins (parse_in); 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 /* We're about to send user input to cpplib, so make it warn for
things that we previously (when we sent it internal definitions) things that we previously (when we sent it internal definitions)
told it to not warn. told it to not warn.
......
2011-08-22 Gabriel Charette <gchare@google.com>
* cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens
defined in cpp_define_builtins.
2011-08-22 Mikael Morin <mikael.morin@gcc.gnu.org> 2011-08-22 Mikael Morin <mikael.morin@gcc.gnu.org>
PR fortran/50050 PR fortran/50050
......
...@@ -565,10 +565,18 @@ gfc_cpp_init (void) ...@@ -565,10 +565,18 @@ gfc_cpp_init (void)
if (gfc_option.flag_preprocessed) if (gfc_option.flag_preprocessed)
return; return;
cpp_change_file (cpp_in, LC_RENAME, _("<built-in>"));
if (!gfc_cpp_option.no_predefined) if (!gfc_cpp_option.no_predefined)
{
/* 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_define_builtins (cpp_in);
cpp_stop_forcing_token_locations (cpp_in);
}
/* Handle deferred options from command-line. */ /* Handle deferred options from command-line. */
cpp_change_file (cpp_in, LC_RENAME, _("<command-line>")); cpp_change_file (cpp_in, LC_RENAME, _("<command-line>"));
......
2011-08-22 Gabriel Charette <gchare@google.com>
* 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.
2011-08-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2011-08-18 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR libstdc++/1773 PR libstdc++/1773
......
...@@ -989,4 +989,8 @@ extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **); ...@@ -989,4 +989,8 @@ extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
extern int cpp_read_state (cpp_reader *, const char *, FILE *, extern int cpp_read_state (cpp_reader *, const char *, FILE *,
struct save_macro_data *); 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 */ #endif /* ! LIBCPP_CPPLIB_H */
...@@ -223,6 +223,9 @@ cpp_create_reader (enum c_lang lang, hash_table *table, ...@@ -223,6 +223,9 @@ cpp_create_reader (enum c_lang lang, hash_table *table,
/* Initialize table for push_macro/pop_macro. */ /* Initialize table for push_macro/pop_macro. */
pfile->pushed_macros = 0; pfile->pushed_macros = 0;
/* Do not force token locations by default. */
pfile->forced_token_location_p = NULL;
/* The expression parser stack. */ /* The expression parser stack. */
_cpp_expand_op_stack (pfile); _cpp_expand_op_stack (pfile);
......
...@@ -499,6 +499,10 @@ struct cpp_reader ...@@ -499,6 +499,10 @@ struct cpp_reader
/* List of saved macros by push_macro. */ /* List of saved macros by push_macro. */
struct def_pragma_macro *pushed_macros; 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. /* Character classes. Based on the more primitive macros in safe-ctype.h.
......
...@@ -1975,6 +1975,9 @@ _cpp_lex_direct (cpp_reader *pfile) ...@@ -1975,6 +1975,9 @@ _cpp_lex_direct (cpp_reader *pfile)
} }
c = *buffer->cur++; c = *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, result->src_loc = linemap_position_for_column (pfile->line_table,
CPP_BUF_COLUMN (buffer, buffer->cur)); CPP_BUF_COLUMN (buffer, buffer->cur));
...@@ -2839,3 +2842,21 @@ cpp_token_val_index (cpp_token *tok) ...@@ -2839,3 +2842,21 @@ cpp_token_val_index (cpp_token *tok)
return CPP_TOKEN_FLD_NONE; 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment