Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2616)

Unified Diff: gcc/gcc/c-ppoutput.c

Issue 3050029: [gcc] GCC 4.5.0=>4.5.1 (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/nacl-toolchain.git
Patch Set: Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gcc/gcc/c-parser.c ('k') | gcc/gcc/c-pragma.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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. */
« no previous file with comments | « gcc/gcc/c-parser.c ('k') | gcc/gcc/c-pragma.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698