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
This commit is contained in:
Gabriel Charette 2011-08-22 20:41:07 +00:00 committed by Gabriel Charette
parent c4831cff11
commit e3dfef44ef
9 changed files with 72 additions and 9 deletions

View File

@ -1,3 +1,8 @@
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.

View File

@ -1306,12 +1306,17 @@ 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)

View File

@ -1,3 +1,8 @@
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

View File

@ -565,9 +565,17 @@ 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)
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. */ /* Handle deferred options from command-line. */
cpp_change_file (cpp_in, LC_RENAME, _("<command-line>")); cpp_change_file (cpp_in, LC_RENAME, _("<command-line>"));

View File

@ -1,3 +1,11 @@
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

View File

@ -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 */

View File

@ -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);

View File

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

View File

@ -1975,8 +1975,11 @@ _cpp_lex_direct (cpp_reader *pfile)
} }
c = *buffer->cur++; c = *buffer->cur++;
result->src_loc = linemap_position_for_column (pfile->line_table, if (pfile->forced_token_location_p)
CPP_BUF_COLUMN (buffer, buffer->cur)); 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) switch (c)
{ {
@ -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;
}