From 49009afdf737a82926f3f3a245508ef6db51c33e Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Mon, 21 Aug 2000 12:01:51 -0600 Subject: [PATCH] gcc.c (do_spec_1): Implement %j spec flag. * 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 | 23 ++++++++++- gcc/config/i386/xm-dos.h | 4 +- gcc/config/i386/xm-os2.h | 6 +-- gcc/gcc.c | 84 +++++++++++++++++++--------------------- gcc/gcc.texi | 9 +++++ gcc/protoize.c | 15 ++++--- gcc/system.h | 7 ++++ gcc/toplev.c | 50 +++++++++++------------- 8 files changed, 117 insertions(+), 81 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a9f64a4c301..8aabc1dc6b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,25 @@ -2000-08-05 Eli Zaretskii +2000-08-21 Nix + + * 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 * fixinc/fixincl.c (fix_with_system): Pipe the output of "external" fixes through `cat', to avoid truncating the input diff --git a/gcc/config/i386/xm-dos.h b/gcc/config/i386/xm-dos.h index 4e1cb42c8c1..48d5b11268f 100644 --- a/gcc/config/i386/xm-dos.h +++ b/gcc/config/i386/xm-dos.h @@ -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 diff --git a/gcc/config/i386/xm-os2.h b/gcc/config/i386/xm-os2.h index 83476c0a87d..3c84877794c 100644 --- a/gcc/config/i386/xm-os2.h +++ b/gcc/config/i386/xm-os2.h @@ -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" diff --git a/gcc/gcc.c b/gcc/gcc.c index 50c49ea7e85..243609d5597 100644 --- 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. */ diff --git a/gcc/gcc.texi b/gcc/gcc.texi index 21facaec343..7c1f0972eb0 100644 --- a/gcc/gcc.texi +++ b/gcc/gcc.texi @@ -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 diff --git a/gcc/protoize.c b/gcc/protoize.c index 7a58df23ef7..1a51a7d20fa 100644 --- a/gcc/protoize.c +++ b/gcc/protoize.c @@ -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; diff --git a/gcc/system.h b/gcc/system.h index 066c80561ba..afaa977a0d9 100644 --- a/gcc/system.h +++ b/gcc/system.h @@ -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. */ diff --git a/gcc/toplev.c b/gcc/toplev.c index bff4b3187ae..225549ac7ba 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -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. */ -- 2.30.2