From c5b7b99eb9a0f4416d36eaaa784a83d081086a6e Mon Sep 17 00:00:00 2001 From: brolley Date: Mon, 10 May 1999 15:25:49 +0000 Subject: [PATCH] 1999-05-10 18:21 -0400 Zack Weinberg * 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 | 24 ++++++++++ gcc/cppspec.c | 145 +++++++++++++++++++++++++++++----------------------------- gcc/gcc.c | 12 ++--- 3 files changed, 103 insertions(+), 78 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f62484d..d9b5942 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,27 @@ +1999-05-10 18:21 -0400 Zack Weinberg + + * 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 + + * 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 diff --git a/gcc/cppspec.c b/gcc/cppspec.c index 4a1ee33..2908b73 100644 --- a/gcc/cppspec.c +++ b/gcc/cppspec.c @@ -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 () diff --git a/gcc/gcc.c b/gcc/gcc.c index 8b21f60..9e2573d 100644 --- 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__ \ -- 2.7.4