From e3dfef44ef6b735ac7eea4202152d672ea0a91ef Mon Sep 17 00:00:00 2001 From: Gabriel Charette Date: Mon, 22 Aug 2011 20:41:07 +0000 Subject: [PATCH] Add ability to force lexed tokens' source_locations. Use it to force BUILTINS_LOCATION when declaring builtins instead of creating a 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 --- gcc/c-family/ChangeLog | 5 +++++ gcc/c-family/c-opts.c | 15 ++++++++++----- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/cpp.c | 12 ++++++++++-- libcpp/ChangeLog | 8 ++++++++ libcpp/include/cpplib.h | 4 ++++ libcpp/init.c | 3 +++ libcpp/internal.h | 4 ++++ libcpp/lex.c | 25 +++++++++++++++++++++++-- 9 files changed, 72 insertions(+), 9 deletions(-) diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index df9cdff40f4..fb00ca98958 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +011-08-22 Gabriel Charette + + * 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 * c-common.c (c_common_reswords): Add __builtin_complex. diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c index 3227f7b9860..49ff80dda7e 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, - _(""), 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/ChangeLog b/gcc/fortran/ChangeLog index 69d901e0c7b..075c366f0b5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2011-08-22 Gabriel Charette + + * cpp.c (gfc_cpp_init): Force BUILTINS_LOCATION for tokens + defined in cpp_define_builtins. + 2011-08-22 Mikael Morin PR fortran/50050 diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c index a40442ee4d7..9368d890973 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, _("")); 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, _("")); diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 81b3a94bb50..8a5e89921a0 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,11 @@ +2011-08-22 Gabriel Charette + + * 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 PR libstdc++/1773 diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 4d68fa76b09..0e90821072f 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -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 *, 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 93f12d0d71f..c5c53256d35 100644 --- a/libcpp/init.c +++ b/libcpp/init.c @@ -223,6 +223,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 d2872c4a11f..6c423f056bc 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 463b5c80eee..75b2b1dc7ff 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) { @@ -2839,3 +2842,21 @@ 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; +}