gcc.c (do_spec_1): Implement %j spec flag.
authorJeff Law <law@gcc.gnu.org>
Mon, 21 Aug 2000 18:01:51 +0000 (12:01 -0600)
committerJeff Law <law@gcc.gnu.org>
Mon, 21 Aug 2000 18:01:51 +0000 (12:01 -0600)
* gcc.c (do_spec_1): Implement %j spec flag.
Remove dead comment.

* gcc.texi (The Configuration File): Document HOST_BIT_BUCKET.
        * system.h (HOST_BIT_BUCKET): Default to "/dev/null".
        * config/i386/xm-dos.h (HOST_BIT_BUCKET): Define as "NUL".
        * config/i386/xm-os2.h, config/winnt/winnt.h: Likewise.
      * protoize.c (munge_compile_params): Use HOST_BIT_BUCKET (if
writable) instead of hardcoded value.

* toplev.c (compile_file): Output to a file even if -fsyntax-only.

        * gcc.c, config/i386/xm-dos.h, config/i386/xm-os2.h: Kill
        MKTEMP_EACH_FILE.

         * gcc.c (cc1_options): Do not process -o or
        run the assembler if -fsyntax-only.

From-SVN: r35849

gcc/ChangeLog
gcc/config/i386/xm-dos.h
gcc/config/i386/xm-os2.h
gcc/gcc.c
gcc/gcc.texi
gcc/protoize.c
gcc/system.h
gcc/toplev.c

index a9f64a4..8aabc1d 100644 (file)
@@ -1,4 +1,25 @@
-2000-08-05  Eli Zaretskii  <eliz@is.elta.co.il>
+2000-08-21  Nix  <nix@esperi.demon.co.uk>
+
+       * gcc.c (do_spec_1): Implement %j spec flag.
+       Remove dead comment.
+
+       * gcc.texi (The Configuration File): Document HOST_BIT_BUCKET.
+        * system.h (HOST_BIT_BUCKET): Default to "/dev/null".
+        * config/i386/xm-dos.h (HOST_BIT_BUCKET): Define as "NUL".
+        * config/i386/xm-os2.h, config/winnt/winnt.h: Likewise.
+
+        * protoize.c (munge_compile_params): Use HOST_BIT_BUCKET (if
+       writable) instead of hardcoded value.
+
+       * toplev.c (compile_file): Output to a file even if -fsyntax-only.
+
+        * gcc.c, config/i386/xm-dos.h, config/i386/xm-os2.h: Kill
+        MKTEMP_EACH_FILE.
+
+        * gcc.c (cc1_options): Do not process -o or run the assembler if
+       -fsyntax-only.
+
+2000-08-21  Eli Zaretskii  <eliz@is.elta.co.il>
 
        * fixinc/fixincl.c (fix_with_system): Pipe the output of
        "external" fixes through `cat', to avoid truncating the input
index 4e1cb42..48d5b11 100644 (file)
@@ -33,6 +33,8 @@ Boston, MA 02111-1307, USA.  */
 /* Suffix for executable file names.  */
 #define EXECUTABLE_SUFFIX ".exe"
 
-#define MKTEMP_EACH_FILE 1
+/* Tell GCC about DOS's bit bucket. */
+
+#define HOST_BIT_BUCKET "NUL"
 
 #define NO_PRECOMPILES 1
index 83476c0..3c84877 100644 (file)
@@ -67,8 +67,8 @@ int spawnvp (int modeflag, char *path, char *argv[]);
 #define OBJECT_SUFFIX ".obj"
 #endif
 
-/* This is required to make temporary file names unique on file
-   systems which severely restrict the length of file names. */
-#define MKTEMP_EACH_FILE
+/* Tell GCC about OS/2's bit bucket. */
+
+#define HOST_BIT_BUCKET "NUL"
 
 #include "i386/xm-i386.h"
index 50c49ea..243609d 100644 (file)
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -292,6 +292,12 @@ or with constant text in a single argument.
        for each `%g.s' and another for each `%U.s'.  Previously, %U was
        simply substituted with a file name chosen for the previous %u,
        without regard to any appended suffix.
+ %jSUFFIX
+        substitutes the name of the HOST_BIT_BUCKET, if any, and if it is
+        writable, and if save-temps is off; otherwise, substitute the name
+        of a temporary file, just like %u.  This temporary file is not
+        meant for communication between processes, but rather as a junk
+        disposal mechanism.
  %d    marks the argument containing or following the %d as a
        temporary file name, so that that file will be deleted if CC exits
        successfully.  Unlike %g, this contributes no text to the argument.
@@ -571,7 +577,8 @@ static const char *cc1_options =
  %{g*} %{O*} %{W*} %{w} %{pedantic*} %{std*} %{ansi}\
  %{traditional} %{v:-version} %{pg:-p} %{p} %{f*}\
  %{aux-info*} %{Qn:-fno-ident} %{--help:--help}\
- %{S:%W{o*}%{!o*:-o %b.s}}";
+ %{!fsyntax-only:%{S:%W{o*}%{!o*:-o %b.s}}}\
+ %{fsyntax-only:-o %j}";
 
 static const char *asm_options =
 "%a %Y %{c:%W{o*}%{!o*:-o %w%b%O}}%{!c:-o %d%w%u%O}";
@@ -690,13 +697,13 @@ static struct compiler default_compilers[] =
 #if USE_CPPLIB
      "%{E|M|MM:cpp0 -lang-c %{ansi:-std=c89} %(cpp_options)}\
       %{!E:%{!M:%{!MM:cc1 -lang-c %{ansi:-std=c89} %(cpp_options)\
-                         %(cc1_options) %{!S:-o %{|!pipe:%g.s} |\n\
-      as %(asm_options) %{!pipe:%g.s} %A }}}}"
+                         %(cc1_options) %{!fsyntax-only:%{!S:-o %{|!pipe:%g.s} |\n\
+      as %(asm_options) %{!pipe:%g.s} %A }}}}}"
 #else /* ! USE_CPPLIB */
      "%(trad_capable_cpp) -lang-c %{ansi:-std=c89} %(cpp_options) \
                          %{!M:%{!MM:%{!E:%{!pipe:%g.i} |\n\
-      cc1 %{!pipe:%g.i} %(cc1_options)  %{!S:-o %{|!pipe:%g.s} |\n\
-      as %(asm_options) %{!pipe:%g.s} %A }}}}\n"
+      cc1 %{!pipe:%g.i} %(cc1_options) %{!fsyntax-only:%{!S:-o %{|!pipe:%g.s} |\n\
+      as %(asm_options) %{!pipe:%g.s} %A }}}}}\n"
 #endif /* ! USE_CPPLIB */
   },
   {"-",
@@ -709,8 +716,8 @@ static struct compiler default_compilers[] =
   {".i", "@cpp-output"},
   {"@cpp-output",
    "%{!M:%{!MM:%{!E:\
-    cc1 %i %(cc1_options) %{!S:-o %{|!pipe:%g.s} |\n\
-    as %(asm_options) %{!pipe:%g.s} %A }}}}"},
+    cc1 %i %(cc1_options) %{!fsyntax-only:%{!S:-o %{|!pipe:%g.s} |\n\
+    as %(asm_options) %{!pipe:%g.s} %A }}}}}"},
   {".s", "@assembler"},
   {"@assembler",
    "%{!M:%{!MM:%{!E:%{!S:as %(asm_options) %i %A }}}}"},
@@ -1226,13 +1233,9 @@ static int argbuf_length;
 
 static int argbuf_index;
 
-/* We want this on by default all the time now.  */
-#define MKTEMP_EACH_FILE
-
-#ifdef MKTEMP_EACH_FILE
-
-/* This is the list of suffixes and codes (%g/%u/%U) and the associated
-   temp file.  */
+/* This is the list of suffixes and codes (%g/%u/%U/%j) and the associated
+   temp file.  If the HOST_BIT_BUCKET is used for %j, no entry is made for
+   it here.  */
 
 static struct temp_name {
   const char *suffix;  /* suffix associated with the code.  */
@@ -1242,8 +1245,6 @@ static struct temp_name {
   int filename_length; /* strlen (filename).  */
   struct temp_name *next;
 } *temp_names;
-#endif
-
 
 /* Number of commands executed so far.  */
 
@@ -1681,7 +1682,7 @@ read_specs (filename, main_p)
 
 /* This is the common prefix we use to make temp file names.
    It is chosen once for each run of this program.
-   It is substituted into a spec by %g.
+   It is substituted into a spec by %g or %j.
    Thus, all temp file names contain this prefix.
    In practice, all temp file names start with this prefix.
 
@@ -3973,6 +3974,26 @@ do_spec_1 (spec, inswitch, soft_matched_part)
            }
            break;
 
+          case 'j':
+            {
+              struct stat st;
+
+              /* If save_temps_flag is off, and the HOST_BIT_BUCKET is defined,
+                 and it is not a directory, and it is writable, use it.
+                 Otherwise, fall through and treat this like any other
+                 temporary file. */
+
+              if ((!save_temps_flag)
+                  && (stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
+                  && (access (HOST_BIT_BUCKET, W_OK) == 0))
+                {
+                  obstack_grow (&obstack, HOST_BIT_BUCKET,
+                                strlen (HOST_BIT_BUCKET));
+                  delete_this_arg = 0;
+                  arg_going = 1;
+                  break;
+                }
+            }
          case 'g':
          case 'u':
          case 'U':
@@ -3983,11 +4004,6 @@ do_spec_1 (spec, inswitch, soft_matched_part)
              }
            else
              {
-#ifdef MKTEMP_EACH_FILE
-               /* ??? This has a problem: the total number of
-                  values mktemp can return is limited.
-                  That matters for the names of object files.
-                  In 2.4, do something about that.  */
                struct temp_name *t;
                int suffix_length;
                const char *suffix = p;
@@ -4024,8 +4040,8 @@ do_spec_1 (spec, inswitch, soft_matched_part)
                      && t->unique == (c != 'g'))
                    break;
 
-               /* Make a new association if needed.  %u requires one.  */
-               if (t == 0 || c == 'u')
+               /* Make a new association if needed.  %u and %j require one.  */
+               if (t == 0 || c == 'u' || c == 'j')
                  {
                    if (t == 0)
                      {
@@ -4047,19 +4063,6 @@ do_spec_1 (spec, inswitch, soft_matched_part)
 
                obstack_grow (&obstack, t->filename, t->filename_length);
                delete_this_arg = 1;
-#else
-               obstack_grow (&obstack, temp_filename, temp_filename_length);
-               if (c == 'u' || c == 'U')
-                 {
-                   static int unique;
-                   char buff[9];
-                   if (c == 'u')
-                     unique++;
-                   sprintf (buff, "%d", unique);
-                   obstack_grow (&obstack, buff, strlen (buff));
-                 }
-#endif
-               delete_this_arg = 1;
              }
            arg_going = 1;
            break;
@@ -5196,13 +5199,6 @@ main (argc, argv)
   putenv (INIT_ENVIRONMENT);
 #endif
 
-  /* Choose directory for temp files.  */
-
-#ifndef MKTEMP_EACH_FILE
-  temp_filename = choose_temp_base ();
-  temp_filename_length = strlen (temp_filename);
-#endif
-
   /* Make a table of what switches there are (switches, n_switches).
      Make a table of specified input files (infiles, n_infiles).
      Decode switches that are handled locally.  */
index 21facae..7c1f097 100644 (file)
@@ -3928,6 +3928,15 @@ Define this macro to be a C string representing the suffix for executable
 files on your machine.  If you do not define this macro, GCC will use
 the null string as the suffix for object files.
 
+@findex HOST_BIT_BUCKET
+@item HOST_BIT_BUCKET
+The name of a file or file-like object on the host system which acts as
+a ``bit bucket''.  If you do not define this macro, GCC will use
+@samp{/dev/null} as the bit bucket.  If the target does not support a
+bit bucket, this should be defined to the null string, or some other
+illegal filename.  If the bit bucket is not writable, GCC will use a
+temporary file instead.
+
 @findex COLLECT_EXPORT_LIST
 @item COLLECT_EXPORT_LIST
 If defined, @code{collect2} will scan the individual object files
index 7a58df2..1a51a7d 100644 (file)
@@ -1952,6 +1952,7 @@ munge_compile_params (params_list)
     = (const char **) alloca ((strlen (params_list) + 8) * sizeof (char *));
   int param_count = 0;
   const char *param;
+  struct stat st;
 
   temp_params[param_count++] = compiler_file_name;
   for (;;)
@@ -1998,11 +1999,15 @@ munge_compile_params (params_list)
 
   temp_params[param_count++] = "-S";
   temp_params[param_count++] = "-o";
-#if defined (_WIN32) && ! defined (__CYGWIN__) && ! defined (_UWIN)
-  temp_params[param_count++] = "NUL";
-#else
-  temp_params[param_count++] = "/dev/null";
-#endif
+  
+  if ((stat (HOST_BIT_BUCKET, &st) == 0) && (!S_ISDIR (st.st_mode))
+      (access (HOST_BIT_BUCKET, W_OK) == 0))
+    temp_params[param_count++] = HOST_BIT_BUCKET;
+  else
+    /* FIXME: This is hardly likely to be right, if HOST_BIT_BUCKET is not
+       writable.  But until this is rejigged to use make_temp_file(), this
+       is the best we can do.  */
+    temp_params[param_count++] = "/dev/null";
 
   /* Leave room for the input file name argument.  */
   input_file_name_index = param_count;
index 066c805..afaa977 100644 (file)
@@ -589,6 +589,13 @@ extern void abort PARAMS ((void));
 #define ONLY_INT_FIELDS 0
 #endif 
 
+/* Provide a default for the HOST_BIT_BUCKET.
+   This suffices for POSIX-like hosts.  */
+
+#ifndef HOST_BIT_BUCKET
+#define HOST_BIT_BUCKET "/dev/null"
+#endif
+
 /* Enumerated bitfields are safe to use unless we've been explictly told
    otherwise or if they are signed. */
  
index bff4b31..225549a 100644 (file)
@@ -2127,38 +2127,35 @@ compile_file (name)
        pfatal_with_name (aux_info_file_name);
     }
 
-  /* Open assembler code output file.  */
+  /* Open assembler code output file.  Do this even if -fsyntax-only is on,
+     because then the driver will have provided the name of a temporary
+     file or bit bucket for us.  */
 
-  if (flag_syntax_only)
-    asm_out_file = NULL;
+  if (! name_specified && asm_file_name == 0)
+    asm_out_file = stdout;
   else
     {
-      if (! name_specified && asm_file_name == 0)
-       asm_out_file = stdout;
+      if (asm_file_name == 0)
+        {
+          int len = strlen (dump_base_name);
+          char *dumpname = (char *) xmalloc (len + 6);
+          memcpy (dumpname, dump_base_name, len + 1);
+          strip_off_ending (dumpname, len);
+          strcat (dumpname, ".s");
+          asm_file_name = dumpname;
+        }
+      if (!strcmp (asm_file_name, "-"))
+        asm_out_file = stdout;
       else
-       {
-         if (asm_file_name == 0)
-           {
-             int len = strlen (dump_base_name);
-             char *dumpname = (char *) xmalloc (len + 6);
-             memcpy (dumpname, dump_base_name, len + 1);
-             strip_off_ending (dumpname, len);
-             strcat (dumpname, ".s");
-             asm_file_name = dumpname;
-           }
-         if (!strcmp (asm_file_name, "-"))
-           asm_out_file = stdout;
-         else
-           asm_out_file = fopen (asm_file_name, "w");
-         if (asm_out_file == 0)
-           pfatal_with_name (asm_file_name);
-       }
+        asm_out_file = fopen (asm_file_name, "w");
+      if (asm_out_file == 0)
+        pfatal_with_name (asm_file_name);
+    }
 
 #ifdef IO_BUFFER_SIZE
-      setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
-              _IOFBF, IO_BUFFER_SIZE);
+  setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
+           _IOFBF, IO_BUFFER_SIZE);
 #endif
-    }
 
   if (ggc_p && name != 0)
     name = ggc_alloc_string (name, strlen (name));
@@ -2427,8 +2424,7 @@ compile_file (name)
 
   finish_parse ();
 
-  if (! flag_syntax_only
-      && (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0))
+  if (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0)
     fatal_io_error (asm_file_name);
 
   /* Do whatever is necessary to finish printing the graphs.  */