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