/* Specific flags and argument handling of the C preprocessor.
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2007, 2010 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
for more details.
You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING. If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA. */
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>. */
#include "config.h"
#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
#include "gcc.h"
/* The `cpp' executable installed in $(bindir) and $(cpp_install_dir)
assume the user knows what they're doing. If no explicit input is
mentioned, it will read stdin. */
-/* Snarfed from gcc.c: */
-
-/* This defines which switch letters take arguments. */
-
-#define DEFAULT_SWITCH_TAKES_ARG(CHAR) \
- ((CHAR) == 'D' || (CHAR) == 'U' || (CHAR) == 'o' \
- || (CHAR) == 'e' || (CHAR) == 'T' || (CHAR) == 'u' \
- || (CHAR) == 'I' || (CHAR) == 'm' || (CHAR) == 'x' \
- || (CHAR) == 'L' || (CHAR) == 'A' || (CHAR) == 'V' \
- || (CHAR) == 'B' || (CHAR) == 'b')
-
#ifndef SWITCH_TAKES_ARG
#define SWITCH_TAKES_ARG(CHAR) DEFAULT_SWITCH_TAKES_ARG(CHAR)
#endif
-/* This defines which multi-letter switches take arguments. */
-
-#define DEFAULT_WORD_SWITCH_TAKES_ARG(STR) \
- (!strcmp (STR, "Tdata") || !strcmp (STR, "Ttext") \
- || !strcmp (STR, "Tbss") || !strcmp (STR, "include") \
- || !strcmp (STR, "imacros") || !strcmp (STR, "aux-info") \
- || !strcmp (STR, "idirafter") || !strcmp (STR, "iprefix") \
- || !strcmp (STR, "iwithprefix") || !strcmp (STR, "iwithprefixbefore") \
- || !strcmp (STR, "isystem") || !strcmp (STR, "specs") \
- || !strcmp (STR, "MF") || !strcmp (STR, "MT") || !strcmp (STR, "MQ"))
-
#ifndef WORD_SWITCH_TAKES_ARG
#define WORD_SWITCH_TAKES_ARG(STR) DEFAULT_WORD_SWITCH_TAKES_ARG (STR)
#endif
{
".c", ".C", ".S", ".m",
".cc", ".cxx", ".cpp", ".cp", ".c++",
+ ".sx",
NULL
};
/* Filter argc and argv before processing by the gcc driver proper. */
void
-lang_specific_driver (in_argc, in_argv, in_added_libraries)
- int *in_argc;
- const char *const **in_argv;
- int *in_added_libraries ATTRIBUTE_UNUSED;
+lang_specific_driver (int *in_argc, const char *const **in_argv,
+ int *in_added_libraries ATTRIBUTE_UNUSED)
{
int argc = *in_argc;
const char *const *argv = *in_argv;
/* Do we need to insert -E? */
int need_E = 1;
- /* Do we need to insert -no-gcc? */
- int need_no_gcc = 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;
/* Do we need to fix up an input file with an unrecognized suffix? */
int need_fixups = 1;
-
+
int i, j, quote = 0;
const char **new_argv;
int new_argc;
+ extern int is_cpp_driver;
+
+ is_cpp_driver = 1;
/* First pass. If we see an -S or -c, barf. If we see an input file,
turn off read_stdin. If we see a second input file, it is actually
quote = 0;
continue;
}
-
+
if (argv[i][0] == '-')
{
if (argv[i][1] == '\0')
need_E = 0;
else if (argv[i][1] == 'S' || argv[i][1] == 'c')
{
- fatal ("\"%s\" is not a valid option to the preprocessor",
- argv[i]);
+ fatal_error ("%qs is not a valid option to the "
+ "preprocessor", argv[i]);
return;
}
else if (argv[i][1] == 'x')
}
else if (argv[i][1] == 'x')
need_fixups = 0;
- else if (argv[i][1] == 'g' && !strcmp(&argv[i][2], "cc"))
- need_no_gcc = 0;
else if (WORD_SWITCH_TAKES_ARG (&argv[i][1]))
quote = 1;
}
seen_input++;
if (seen_input == 3)
{
- fatal ("too many input files");
+ fatal_error ("too many input files");
return;
}
else if (seen_input == 2)
/* If we don't need to edit the command line, we can bail early. */
- new_argc = argc + need_E + need_no_gcc + read_stdin
+ new_argc = argc + need_E + read_stdin
+ !!o_here + !!lang_c_here + !!lang_S_here;
if (new_argc == argc)
return;
/* One more slot for a terminating null. */
- new_argv = (const char **) xmalloc ((new_argc + 1) * sizeof(char *));
+ new_argv = XNEWVEC (const char *, new_argc + 1);
new_argv[0] = argv[0];
j = 1;
if (need_E)
new_argv[j++] = "-E";
- if (need_no_gcc)
- new_argv[j++] = "-no-gcc";
-
for (i = 1; i < argc; i++, j++)
{
if (i == lang_c_here)
new_argv[j] = NULL;
*in_argc = new_argc;
*in_argv = new_argv;
-}
+}
/* Called before linking. Returns 0 on success and -1 on failure. */
-int lang_specific_pre_link ()
+int lang_specific_pre_link (void)
{
return 0; /* Not used for cpp. */
}