summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog24
-rw-r--r--gcc/cppspec.c145
-rw-r--r--gcc/gcc.c12
3 files changed, 103 insertions, 78 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f62484d5503..d9b59422cac 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cppspec.c b/gcc/cppspec.c
index 4a1ee3315e7..2908b739368 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 8b21f6020ab..9e2573d6d76 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__ \