OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / gcc / c-ppoutput.c
index ff3e6b6..bd9af2a 100644 (file)
@@ -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)