| Index: gcc/gcc/c-ppoutput.c
|
| diff --git a/gcc/gcc/c-ppoutput.c b/gcc/gcc/c-ppoutput.c
|
| index f5a3a788256e726a7f931bc997972101ca160b61..bd9af2aa0f6c9a1bd557863007b312806f8d098c 100644
|
| --- a/gcc/gcc/c-ppoutput.c
|
| +++ b/gcc/gcc/c-ppoutput.c
|
| @@ -1,6 +1,6 @@
|
| /* Preprocess only, using cpplib.
|
| Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007,
|
| - 2008 Free Software Foundation, Inc.
|
| + 2008, 2009 Free Software Foundation, Inc.
|
| Written by Per Bothner, 1994-95.
|
|
|
| This program is free software; you can redistribute it and/or modify it
|
| @@ -61,6 +61,8 @@ static void dump_queued_macros (cpp_reader *);
|
|
|
| static void print_line (source_location, const char *);
|
| static void maybe_print_line (source_location);
|
| +static void do_line_change (cpp_reader *, const cpp_token *,
|
| + source_location, int);
|
|
|
| /* Callback routines for the parser. Most of these are active only
|
| in specific modes. */
|
| @@ -160,11 +162,16 @@ static void
|
| scan_translation_unit (cpp_reader *pfile)
|
| {
|
| bool avoid_paste = false;
|
| + bool do_line_adjustments
|
| + = cpp_get_options (parse_in)->lang != CLK_ASM
|
| + && !flag_no_line_commands;
|
| + bool in_pragma = false;
|
|
|
| print.source = NULL;
|
| for (;;)
|
| {
|
| - const cpp_token *token = cpp_get_token (pfile);
|
| + source_location loc;
|
| + const cpp_token *token = cpp_get_token_with_location (pfile, &loc);
|
|
|
| if (token->type == CPP_PADDING)
|
| {
|
| @@ -182,16 +189,38 @@ scan_translation_unit (cpp_reader *pfile)
|
| /* Subtle logic to output a space if and only if necessary. */
|
| if (avoid_paste)
|
| {
|
| + const struct line_map *map
|
| + = linemap_lookup (line_table, loc);
|
| + int src_line = SOURCE_LINE (map, loc);
|
| +
|
| if (print.source == NULL)
|
| print.source = token;
|
| - if (print.source->flags & PREV_WHITE
|
| - || (print.prev
|
| - && cpp_avoid_paste (pfile, print.prev, token))
|
| - || (print.prev == NULL && token->type == CPP_HASH))
|
| +
|
| + if (src_line != print.src_line
|
| + && do_line_adjustments
|
| + && !in_pragma)
|
| + {
|
| + do_line_change (pfile, token, loc, false);
|
| + putc (' ', print.outf);
|
| + }
|
| + else if (print.source->flags & PREV_WHITE
|
| + || (print.prev
|
| + && cpp_avoid_paste (pfile, print.prev, token))
|
| + || (print.prev == NULL && token->type == CPP_HASH))
|
| putc (' ', print.outf);
|
| }
|
| else if (token->flags & PREV_WHITE)
|
| - putc (' ', print.outf);
|
| + {
|
| + const struct line_map *map
|
| + = linemap_lookup (line_table, loc);
|
| + int src_line = SOURCE_LINE (map, loc);
|
| +
|
| + if (src_line != print.src_line
|
| + && do_line_adjustments
|
| + && !in_pragma)
|
| + do_line_change (pfile, token, loc, false);
|
| + putc (' ', print.outf);
|
| + }
|
|
|
| avoid_paste = false;
|
| print.source = NULL;
|
| @@ -209,9 +238,13 @@ scan_translation_unit (cpp_reader *pfile)
|
| else
|
| fprintf (print.outf, "%s", name);
|
| print.printed = 1;
|
| + in_pragma = true;
|
| }
|
| else if (token->type == CPP_PRAGMA_EOL)
|
| - maybe_print_line (token->src_loc);
|
| + {
|
| + maybe_print_line (token->src_loc);
|
| + in_pragma = false;
|
| + }
|
| else
|
| cpp_output_token (token, print.outf);
|
|
|
| @@ -331,14 +364,11 @@ print_line (source_location src_loc, const char *special_flags)
|
| }
|
| }
|
|
|
| -/* Called when a line of output is started. TOKEN is the first token
|
| - of the line, and at end of file will be CPP_EOF. */
|
| +/* Helper function for cb_line_change and scan_translation_unit. */
|
| static void
|
| -cb_line_change (cpp_reader *pfile, const cpp_token *token,
|
| - int parsing_args)
|
| +do_line_change (cpp_reader *pfile, const cpp_token *token,
|
| + source_location src_loc, int parsing_args)
|
| {
|
| - source_location src_loc = token->src_loc;
|
| -
|
| if (define_queue || undef_queue)
|
| dump_queued_macros (pfile);
|
|
|
| @@ -365,6 +395,15 @@ cb_line_change (cpp_reader *pfile, const cpp_token *token,
|
| }
|
| }
|
|
|
| +/* Called when a line of output is started. TOKEN is the first token
|
| + of the line, and at end of file will be CPP_EOF. */
|
| +static void
|
| +cb_line_change (cpp_reader *pfile, const cpp_token *token,
|
| + int parsing_args)
|
| +{
|
| + do_line_change (pfile, token, token->src_loc, parsing_args);
|
| +}
|
| +
|
| static void
|
| cb_ident (cpp_reader *pfile ATTRIBUTE_UNUSED, source_location line,
|
| const cpp_string *str)
|
| @@ -521,6 +560,7 @@ pp_file_change (const struct line_map *map)
|
|
|
| if (map != NULL)
|
| {
|
| + input_location = map->start_location;
|
| if (print.first_time)
|
| {
|
| /* Avoid printing foo.i when the main file is foo.c. */
|
|
|