X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fc-ppoutput.c;h=bd9af2aa0f6c9a1bd557863007b312806f8d098c;hb=f96d34f19f87467b4ca672d423857405c2913bc6;hp=ff3e6b6c8431037d46ec0a57f00e01462ae24e24;hpb=7f5f395354b35ab7f472d03dbcce1301ac4f8257;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/c-ppoutput.c b/gcc/c-ppoutput.c index ff3e6b6c843..bd9af2aa0f6 100644 --- a/gcc/c-ppoutput.c +++ b/gcc/c-ppoutput.c @@ -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)