diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e5564acbd2bd4637e21cfad36849a734e29e582d..bbb97ec6c9c738635bf924711dd568f64484ef76 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2009-10-14  Pascal Obry  <obry@adacore.com>
+
+	* gcc.c (DEFAULT_SWITCH_CURTAILS_COMPILATION): Add -E.
+	(process_command): Handle -E as done with -c and -S.  Do not add
+	the target executable suffix to the output file when -E is used.
+	(main): Adjust error message accordingly.
+
 2009-10-14  Alexandre Oliva  <aoliva@redhat.com>
 
 	PR debug/41343
diff --git a/gcc/gcc.c b/gcc/gcc.c
index 52fe2277b826a68add15baf210ddf1a41d0d6c4a..78e0ce8d87ed0b9ad4a8ebccfe72216f01d42230 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -984,7 +984,7 @@ static struct user_specs *user_specs_head, *user_specs_tail;
 #ifdef HAVE_TARGET_EXECUTABLE_SUFFIX
 /* This defines which switches stop a full compilation.  */
 #define DEFAULT_SWITCH_CURTAILS_COMPILATION(CHAR) \
-  ((CHAR) == 'c' || (CHAR) == 'S')
+  ((CHAR) == 'c' || (CHAR) == 'S' || (CHAR) == 'E')
 
 #ifndef SWITCH_CURTAILS_COMPILATION
 #define SWITCH_CURTAILS_COMPILATION(CHAR) \
@@ -2000,7 +2000,7 @@ static int argbuf_index;
 
 static int have_o_argbuf_index = 0;
 
-/* Were the options -c or -S passed.  */
+/* Were the options -c, -S or -E passed.  */
 static int have_c = 0;
 
 /* Was the option -o passed.  */
@@ -4142,6 +4142,7 @@ process_command (int argc, const char **argv)
 
 	    case 'S':
 	    case 'c':
+	    case 'E':
 	      if (p[1] == 0)
 		{
 		  have_c = 1;
@@ -4157,7 +4158,7 @@ process_command (int argc, const char **argv)
 		{
 		  int skip;
 
-		  /* Forward scan, just in case -S or -c is specified
+		  /* Forward scan, just in case -S, -E or -c is specified
 		     after -o.  */
 		  int j = i + 1;
 		  if (p[1] == 0)
@@ -7304,7 +7305,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n"
     }
 
   if (!combine_inputs && have_c && have_o && lang_n_infiles > 1)
-   fatal ("cannot specify -o with -c or -S with multiple files");
+   fatal ("cannot specify -o with -c, -S or -E with multiple files");
 
   if (combine_flag && save_temps_flag)
     {