diff gcc/c-ppoutput.c @ 55:77e2b8dfacca gcc-4.4.5

update it from 4.4.3 to 4.5.0
author ryoma <e075725@ie.u-ryukyu.ac.jp>
date Fri, 12 Feb 2010 23:39:51 +0900
parents a06113de4d67
children b7f97abdc517
line wrap: on
line diff
--- a/gcc/c-ppoutput.c	Sun Feb 07 18:28:00 2010 +0900
+++ b/gcc/c-ppoutput.c	Fri Feb 12 23:39:51 2010 +0900
@@ -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 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 @@
 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 @@
       /* 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 @@
 	  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 @@
     }
 }
 
-/* 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 @@
     }
 }
 
+/* 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 @@
 
   if (map != NULL)
     {
+      input_location = map->start_location;
       if (print.first_time)
 	{
 	  /* Avoid printing foo.i when the main file is foo.c.  */