The processing of command line macros is a little confusing. In the
same way we force builtin locations, we should force command line
locations. We also call the main-starting debug hook on two separate
paths. I found it clearer to call it once, and then restart the
non-preprocessed handling afterwards.
booted and tested on x86_64-linux, applying to trunk.
nathan
--
Nathan Sidwell
2018-10-31 Nathan Sidwell <nat...@acm.org>
* c-opts.c (c_finish_options): Force command line macro
location. Refactor to avoid repeating main debug hook.
(push_command_line_include): Clarify comment.
Index: gcc/c-family/c-opts.c
===================================================================
--- gcc/c-family/c-opts.c (revision 265692)
+++ gcc/c-family/c-opts.c (working copy)
@@ -1387,13 +1387,11 @@ c_finish_options (void)
{
if (!cpp_opts->preprocessed)
{
- size_t i;
+ const line_map_ordinary *bltin_map
+ = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
+ _("<built-in>"), 0));
+ cb_file_change (parse_in, bltin_map);
- cb_file_change (parse_in,
- linemap_check_ordinary (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. */
cpp_force_token_locations (parse_in, BUILTINS_LOCATION);
@@ -1401,8 +1399,6 @@ c_finish_options (void)
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)
told it to not warn.
@@ -1414,11 +1410,14 @@ c_finish_options (void)
their acceptance on the -std= setting. */
cpp_opts->warn_dollars = (cpp_opts->cpp_pedantic && !cpp_opts->c99);
- cb_file_change (parse_in,
- linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
- _("<command-line>"), 0)));
-
- for (i = 0; i < deferred_count; i++)
+ const line_map_ordinary *cmd_map
+ = linemap_check_ordinary (linemap_add (line_table, LC_RENAME, 0,
+ _("<command-line>"), 0));
+ cb_file_change (parse_in, cmd_map);
+
+ /* All command line defines must have the same location. */
+ cpp_force_token_locations (parse_in, cmd_map->start_location);
+ for (size_t i = 0; i < deferred_count; i++)
{
struct deferred_opt *opt = &deferred_opts[i];
@@ -1435,35 +1434,30 @@ c_finish_options (void)
}
}
- /* Start the main input file, if the debug writer wants it. */
- if (debug_hooks->start_end_main_source_file
- && !flag_preprocess_only)
- (*debug_hooks->start_source_file) (0, this_input_filename);
-
- /* Handle -imacros after -D and -U. */
- for (i = 0; i < deferred_count; i++)
- {
- struct deferred_opt *opt = &deferred_opts[i];
-
- if (opt->code == OPT_imacros
- && cpp_push_include (parse_in, opt->arg))
- {
- /* Disable push_command_line_include callback for now. */
- include_cursor = deferred_count + 1;
- cpp_scan_nooutput (parse_in);
- }
- }
+ cpp_stop_forcing_token_locations (parse_in);
}
- else
- {
- if (cpp_opts->directives_only)
- cpp_init_special_builtins (parse_in);
+ else if (cpp_opts->directives_only)
+ cpp_init_special_builtins (parse_in);
- /* Start the main input file, if the debug writer wants it. */
- if (debug_hooks->start_end_main_source_file
- && !flag_preprocess_only)
- (*debug_hooks->start_source_file) (0, this_input_filename);
- }
+ /* Start the main input file, if the debug writer wants it. */
+ if (debug_hooks->start_end_main_source_file
+ && !flag_preprocess_only)
+ (*debug_hooks->start_source_file) (0, this_input_filename);
+
+ if (!cpp_opts->preprocessed)
+ /* Handle -imacros after -D and -U. */
+ for (size_t i = 0; i < deferred_count; i++)
+ {
+ struct deferred_opt *opt = &deferred_opts[i];
+
+ if (opt->code == OPT_imacros
+ && cpp_push_include (parse_in, opt->arg))
+ {
+ /* Disable push_command_line_include callback for now. */
+ include_cursor = deferred_count + 1;
+ cpp_scan_nooutput (parse_in);
+ }
+ }
include_cursor = 0;
push_command_line_include ();
@@ -1506,7 +1500,7 @@ push_command_line_include (void)
include_cursor++;
/* -Wunused-macros should only warn about macros defined hereafter. */
cpp_opts->warn_unused_macros = cpp_warn_unused_macros;
- /* Restore the line map from <command line>. */
+ /* Restore the line map back to the main file. */
if (!cpp_opts->preprocessed)
cpp_change_file (parse_in, LC_RENAME, this_input_filename);