1999-05-10 18:21 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu>
authorbrolley <brolley@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 May 1999 15:25:49 +0000 (15:25 +0000)
committerbrolley <brolley@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 10 May 1999 15:25:49 +0000 (15:25 +0000)
* cppspec.c: Treat two non-option arguments as input and
output file.  Three or more non-option args is an error.
Clean up.
* gcc.c (default_compilers): Pass -$ to the preprocessor.
* cp/lang-specs.h,ch/lang-specs.h,f/lang-specs.h,
objc/lang-specs.h: Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@26870 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cppspec.c
gcc/gcc.c

index f62484d..d9b5942 100644 (file)
@@ -1,3 +1,27 @@
+1999-05-10 18:21 -0400  Zack Weinberg  <zack@rabi.columbia.edu>
+
+       * cppfiles.c (initialize_input_buffer): New function.
+       (finclude): Call it, if pfile->input_buffer is NULL.  Accept
+       any character device as an input file.
+       (read_and_prescan): Use pfile->input_buffer and
+       pfile->input_speccase.
+       * cppinit.c (cpp_cleanup): Free pfile->input_buffer and
+       pfile->input_speccase.
+       * cpplib.h (cpp_reader): Add input_buffer, input_speccase, and
+       input_buffer_len members.  Use memcpy in CPP_PUTS_Q.
+
+       * cppmain.c: Buffer output in the token_buffer; throttle
+       number of calls to fwrite; check for errors from fwrite.
+
+1999-05-10 18:21 -0400  Zack Weinberg  <zack@rabi.phys.columbia.edu>
+
+       * cppspec.c: Treat two non-option arguments as input and
+       output file.  Three or more non-option args is an error.
+       Clean up.
+       * gcc.c (default_compilers): Pass -$ to the preprocessor.
+       * cp/lang-specs.h, ch/lang-specs.h, f/lang-specs.h,
+       objc/lang-specs.h: Likewise.
+
 Mon May 10 12:59:20 1999  Jeffrey A Law  (law@cygnus.com)
 
        * optabs.c (emit_cmp_and_jump_insns): Handle the case where both
index 4a1ee33..2908b73 100644 (file)
@@ -57,13 +57,13 @@ Boston, MA 02111-1307, USA.  */
 #define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
 #endif
 
-/* Suffixes for known sorts of input files.  We let gcc.c worry about
-   which are appropriate preprocessor input.  */
+/* Suffixes for known sorts of input files.  Note that we do not list
+   files which are normally considered to have been preprocessed already,
+   since the user's expectation is that `cpp' always preprocesses.  */
 static const char *const known_suffixes[] =
 {
-  ".c",  ".C",   ".s",   ".S",   ".m",
+  ".c",  ".C",   ".S",   ".m",
   ".cc", ".cxx", ".cpp", ".cp",  ".c++",
-  ".i",  ".ii",  ".mi",  ".o",   ".a",
   NULL
 };
 
@@ -79,34 +79,30 @@ lang_specific_driver (errfn, in_argc, in_argv, in_added_libraries)
   char **argv = *in_argv;
   
   /* Do we need to read stdin? */
-  int read_stdin;
+  int read_stdin = 1;
 
   /* Do we need to insert -E? */
-  int need_E;
-
-  /* Do we need to fixup files with unrecognized suffixes? */
-  int need_fixups;
-
-  /* Table of input files with unrecognized suffixes. */
-  char *urs_tab;
-  int urs_count;
-  int urs_block;
+  int need_E = 1;
 
+  /* Have we seen an input file? */
+  int seen_input = 0;
+  
+  /* Positions to insert -xc, -xassembler-with-cpp, and -o, if necessary.
+     0 means unnecessary. */
+  int lang_c_here = 0;
+  int lang_S_here = 0;
+  int o_here = 0;
+
+  /* Do we need to fix up an input file with an unrecognized suffix? */
+  int need_fixups = 1;
+  
   int i, j, quote;
   char **new_argv;
   int new_argc;
 
   /* First pass.  If we see an -S or -c, barf.  If we see an input file,
-     turn off read_stdin, and if it has an unrecognizable suffix, mark
-     it for fixup. */
-  urs_tab = xmalloc (argc);
-  memset (urs_tab, 0, argc);
-  urs_count = 0;
-  urs_block = 0;
-  quote = 0;
-  read_stdin = 1;
-  need_E = 1;
-  need_fixups = 1;
+     turn off read_stdin.  If we see a second input file, it is actually
+     the output file.  If we see a third input file, barf.  */
   for (i = 1; i < argc; i++)
     {
       if (quote == 1)
@@ -127,7 +123,7 @@ lang_specific_driver (errfn, in_argc, in_argv, in_added_libraries)
                {
                  (*errfn) ("`%s' is not a legal option to the preprocessor",
                            argv[i]);
-                 goto done;
+                 return;
                }
              else if (argv[i][1] == 'x')
                {
@@ -144,76 +140,81 @@ lang_specific_driver (errfn, in_argc, in_argv, in_added_libraries)
        }
       else /* not an option */
        {
-         int l = strlen (argv[i]);
-         int known = 0;
-         const char *const *suff;
-         
-         read_stdin = 0;
-         for (suff = known_suffixes; *suff; suff++)
-           if (!strcmp (*suff, &argv[i][l - strlen(*suff)]))
-             {
-               known = 1;
-               break;
-             }
-
-         if (known)
+         seen_input++;
+         if (seen_input == 3)
            {
-             if (urs_block)
-               {
-                 urs_block = 0;
-                 urs_tab[i] = 2;
-                 urs_count++;
-               }
+             (*errfn) ("too many input files");
+             return;
+           }
+         else if (seen_input == 2)
+           {
+             o_here = i;
            }
          else
            {
-             if (!urs_block)
+             read_stdin = 0;
+             if (need_fixups)
                {
-                 urs_block = 1;
-                 urs_tab[i] = 1;
-                 urs_count++;
+                 int l = strlen (argv[i]);
+                 int known = 0;
+                 const char *const *suff;
+
+                 for (suff = known_suffixes; *suff; suff++)
+                   if (!strcmp (*suff, &argv[i][l - strlen(*suff)]))
+                     {
+                       known = 1;
+                       break;
+                     }
+
+                 if (! known)
+                   {
+                     /* .s files are a special case; we have to treat
+                        them like .S files so -D__ASSEMBLER__ will be
+                        in effect.  */
+                     if (!strcmp (".s", &argv[i][l - 2]))
+                       lang_S_here = i;
+                     else
+                       lang_c_here = i;
+                   }
                }
            }
        }
     }
 
-  /* If we were given an -E option and an input file, and no input
-     files have unrecognized suffixes, we can bail early.  */
-  if (!need_E && !read_stdin && (!need_fixups || urs_count == 0))
-    goto done;
+  /* If we don't need to edit the command line, we can bail early.  */
+
+  new_argc = argc + need_E + read_stdin
+    + !!o_here + !!lang_c_here + !!lang_S_here;
+
+  if (new_argc == argc)
+    return;
 
-  new_argc = argc + need_E + read_stdin + (need_fixups ? urs_count : 0);
   new_argv = xmalloc (new_argc * sizeof(char *));
 
   new_argv[0] = argv[0];
+  j = 1;
+
   if (need_E)
+    new_argv[j++] = "-E";
+
+  for (i = 1; i < argc; i++, j++)
     {
-      new_argv[1] = "-E";
-      j = 2;
+      if (i == lang_c_here)
+       new_argv[j++] = "-xc";
+      else if (i == lang_S_here)
+       new_argv[j++] = "-xassembler-with-cpp";
+      else if (i == o_here)
+       new_argv[j++] = "-o";
+
+      new_argv[j] = argv[i];
     }
-  else
-    j = 1;
-
-  if (need_fixups)
-    for (i = 1; i < argc; i++, j++)
-      {
-       if (urs_tab[i])
-         new_argv[j++] = (urs_tab[i] == 1) ? "-xc" : "-xnone";
-
-       new_argv[j] = argv[i];
-      }
-  else
-    memcpy (&new_argv[j], &argv[1], (argc - 1)*sizeof (char *));
 
   if (read_stdin)
     new_argv[j] = "-";
 
   *in_argc = new_argc;
   *in_argv = new_argv;
-
-done:
-  free (urs_tab);
-}
+} 
 
 /* Called before linking.  Returns 0 on success and -1 on failure. */
 int lang_specific_pre_link ()
index 8b21f60..9e2573d 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -595,7 +595,7 @@ static struct compiler default_compilers[] =
    {
 #if USE_CPPLIB
      "%{E|M|MM:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
-       %{C} %{v} %{A*} %{I*} %{P} %I\
+       %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
        %{C:%{!E:%eGNU C does not support -C without using -E}}\
        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
         -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
@@ -631,7 +631,7 @@ static struct compiler default_compilers[] =
                      %{!pipe:%g.s} %A\n }}}}"
 #else /* ! USE_CPPLIB */
     "cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
-       %{C} %{v} %{A*} %{I*} %{P} %I\
+       %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
        %{C:%{!E:%eGNU C does not support -C without using -E}}\
        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
         -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
@@ -659,7 +659,7 @@ static struct compiler default_compilers[] =
   }},
   {"-",
    {"%{E:cpp -lang-c %{ansi:-std=c89} %{std*} %{nostdinc*}\
-       %{C} %{v} %{A*} %{I*} %{P} %I\
+       %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
        %{C:%{!E:%eGNU C does not support -C without using -E}}\
        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
         -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
@@ -676,9 +676,9 @@ static struct compiler default_compilers[] =
   {".h", {"@c-header"}},
   {"@c-header",
    {"%{!E:%eCompilation of header file requested} \
-    cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
+    cpp %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
        %{C:%{!E:%eGNU C does not support -C without using -E}}\
-        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
+       %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG}\
         -D__GNUC__=%v1 -D__GNUC_MINOR__=%v2\
        %{std=*:%{!std=gnu*:-trigraphs -D__STRICT_ANSI__}}\
        %{!undef:%{!std=*:%p}%{std=gnu*:%p} %P} %{trigraphs}\
@@ -707,7 +707,7 @@ static struct compiler default_compilers[] =
                            %i %A\n }}}}"}},
   {".S", {"@assembler-with-cpp"}},
   {"@assembler-with-cpp",
-   {"cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %I\
+   {"cpp -lang-asm %{nostdinc*} %{C} %{v} %{A*} %{I*} %{P} %{$} %I\
        %{C:%{!E:%eGNU C does not support -C without using -E}}\
        %{M} %{MM} %{MD:-MD %b.d} %{MMD:-MMD %b.d} %{MG} %{trigraphs}\
         -$ %{!undef:%p %P} -D__ASSEMBLER__ \