OSDN Git Service

alphabatize irix___restrict
[pf3gnuchains/gcc-fork.git] / gcc / c-opts.c
index b8e5fe5..c5f25c9 100644 (file)
@@ -1,5 +1,5 @@
 /* C/ObjC/C++ command line option handling.
-   Copyright (C) 2002 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
    Contributed by Neil Booth.
 
 This file is part of GCC.
@@ -21,6 +21,8 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include "config.h"
 #include "system.h"
+#include "coretypes.h"
+#include "tm.h"
 #include "tree.h"
 #include "c-common.h"
 #include "c-pragma.h"
@@ -30,6 +32,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "tree-inline.h"
 #include "diagnostic.h"
 #include "intl.h"
+#include "cppdefault.h"
+#include "c-incpath.h"
+
+#ifndef TARGET_SYSTEM_ROOT
+# define TARGET_SYSTEM_ROOT NULL
+#endif
 
 /* CPP's options.  */
 static cpp_options *cpp_opts;
@@ -47,9 +55,27 @@ static bool deps_append;
 /* If dependency switches (-MF etc.) have been given.  */
 static bool deps_seen;
 
+/* If -v seen.  */
+static bool verbose;
+
 /* Dependency output file.  */
 static const char *deps_file;
 
+/* The prefix given by -iprefix, if any.  */
+static const char *iprefix;
+
+/* The system root, if any.  Overridden by -isysroot.  */
+static const char *sysroot = TARGET_SYSTEM_ROOT;
+
+/* Zero disables all standard directories for headers.  */
+static bool std_inc = true;
+
+/* Zero disables the C++-specific standard directories for headers.  */
+static bool std_cxx_inc = true;
+
+/* If the quote chain has been split by -I-.  */
+static bool quote_chain_split;
+
 /* Number of deferred options, deferred options array size.  */
 static size_t deferred_count, deferred_size;
 
@@ -67,6 +93,7 @@ static void check_deps_environment_vars PARAMS ((void));
 static void preprocess_file PARAMS ((void));
 static void handle_deferred_opts PARAMS ((void));
 static void sanitize_cpp_opts PARAMS ((void));
+static void add_prefixed_path PARAMS ((const char *, size_t));
 
 #ifndef STDC_0_IN_SYSTEM_HEADERS
 #define STDC_0_IN_SYSTEM_HEADERS 0
@@ -110,10 +137,12 @@ static void sanitize_cpp_opts PARAMS ((void));
 
 #define COMMAND_LINE_OPTIONS                                                \
   OPT("-help",                  CL_ALL,   OPT__help)                        \
+  OPT("-output-pch=",          CL_ALL | CL_ARG, OPT__output_pch)            \
   OPT("C",                      CL_ALL,   OPT_C)                            \
   OPT("CC",                     CL_ALL,   OPT_CC)                           \
   OPT("E",                     CL_ALL,   OPT_E)                             \
   OPT("H",                      CL_ALL,   OPT_H)                            \
+  OPT("I",                      CL_ALL | CL_ARG, OPT_I)                             \
   OPT("M",                      CL_ALL,   OPT_M)                            \
   OPT("MD",                     CL_ALL | CL_SEPARATE, OPT_MD)               \
   OPT("MF",                     CL_ALL | CL_ARG, OPT_MF)                    \
@@ -152,6 +181,7 @@ static void sanitize_cpp_opts PARAMS ((void));
   OPT("Wimplicit-function-declaration",        CL_C, OPT_Wimplicit_function_decl)   \
   OPT("Wimplicit-int",         CL_C,     OPT_Wimplicit_int)                 \
   OPT("Wimport",                CL_ALL,   OPT_Wimport)                      \
+  OPT("Winvalid-pch",           CL_ALL,   OPT_Winvalid_pch)                 \
   OPT("Wlong-long",            CL_ALL,   OPT_Wlong_long)                    \
   OPT("Wmain",                 CL_C,     OPT_Wmain)                         \
   OPT("Wmissing-braces",       CL_ALL,   OPT_Wmissing_braces)               \
@@ -208,6 +238,8 @@ static void sanitize_cpp_opts PARAMS ((void));
   OPT("fenforce-eh-specs",     CL_CXX,   OPT_fenforce_eh_specs)             \
   OPT("fenum-int-equiv",       CL_CXX,   OPT_fenum_int_equiv)               \
   OPT("fexternal-templates",   CL_CXX,   OPT_fexternal_templates)           \
+  OPT("ffixed-form",           CL_C,     OPT_ffixed_form)                   \
+  OPT("ffixed-line-length-",   CL_C | CL_JOINED, OPT_ffixed_line_length)    \
   OPT("ffor-scope",            CL_CXX,   OPT_ffor_scope)                    \
   OPT("ffreestanding",         CL_C,     OPT_ffreestanding)                 \
   OPT("fgnu-keywords",         CL_CXX,   OPT_fgnu_keywords)                 \
@@ -229,6 +261,7 @@ static void sanitize_cpp_opts PARAMS ((void));
   OPT("fnonnull-objects",      CL_CXX,   OPT_fnonnull_objects)              \
   OPT("foperator-names",       CL_CXX,   OPT_foperator_names)               \
   OPT("foptional-diags",       CL_CXX,   OPT_foptional_diags)               \
+  OPT("fpch-deps",             CL_ALL,   OPT_fpch_deps)                     \
   OPT("fpermissive",           CL_CXX,   OPT_fpermissive)                   \
   OPT("fpreprocessed",         CL_ALL,   OPT_fpreprocessed)                 \
   OPT("frepo",                 CL_CXX,   OPT_frepo)                         \
@@ -253,6 +286,12 @@ static void sanitize_cpp_opts PARAMS ((void));
   OPT("fweak",                 CL_CXX,   OPT_fweak)                         \
   OPT("fxref",                 CL_CXX,   OPT_fxref)                         \
   OPT("gen-decls",             CL_OBJC,  OPT_gen_decls)                     \
+  OPT("idirafter",              CL_ALL | CL_ARG, OPT_idirafter)              \
+  OPT("iprefix",               CL_ALL | CL_ARG, OPT_iprefix)                \
+  OPT("isysroot",               CL_ALL | CL_ARG, OPT_isysroot)               \
+  OPT("isystem",                CL_ALL | CL_ARG, OPT_isystem)                \
+  OPT("iwithprefix",            CL_ALL | CL_ARG, OPT_iwithprefix)            \
+  OPT("iwithprefixbefore",      CL_ALL | CL_ARG, OPT_iwithprefixbefore)             \
   OPT("lang-asm",              CL_C_ONLY, OPT_lang_asm)                     \
   OPT("lang-objc",              CL_ALL,   OPT_lang_objc)                    \
   OPT("nostdinc",               CL_ALL,   OPT_nostdinc)                             \
@@ -309,7 +348,7 @@ static const struct cl_option cl_options[] =
 #undef COMMAND_LINE_OPTIONS
 
 /* Holds switches parsed by c_common_decode_option (), but whose
-   handling is deffered to c_common_post_options ().  */
+   handling is deferred to c_common_post_options ().  */
 static void defer_opt PARAMS ((enum opt_code, const char *));
 static struct deferred_opt
 {
@@ -341,6 +380,7 @@ missing_arg (opt_index)
 
   switch (cl_options[opt_index].opt_code)
     {
+    case OPT__output_pch:
     case OPT_Wformat_eq:
     case OPT_d:
     case OPT_fabi_version:
@@ -349,6 +389,9 @@ missing_arg (opt_index)
     case OPT_fname_mangling:
     case OPT_ftabstop:
     case OPT_ftemplate_depth:
+    case OPT_iprefix:
+    case OPT_iwithprefix:
+    case OPT_iwithprefixbefore:
     default:
       error ("missing argument to \"-%s\"", opt_text);
       break;
@@ -357,6 +400,13 @@ missing_arg (opt_index)
       error ("no class name specified with \"-%s\"", opt_text);
       break;
 
+    case OPT_I:
+    case OPT_idirafter:
+    case OPT_isysroot:
+    case OPT_isystem:
+      error ("missing path after \"-%s\"", opt_text);
+      break;
+
     case OPT_MF:
     case OPT_MD:
     case OPT_MMD:
@@ -625,6 +675,10 @@ c_common_decode_option (argc, argv)
       print_help ();
       break;
 
+    case OPT__output_pch:
+      pch_file = arg;
+      break;
+
     case OPT_C:
       cpp_opts->discard_comments = 0;
       break;
@@ -642,6 +696,18 @@ c_common_decode_option (argc, argv)
       cpp_opts->print_include_names = 1;
       break;
 
+    case OPT_I:
+      if (strcmp (arg, "-"))
+       add_path (xstrdup (arg), BRACKET, 0);
+      else
+       {
+         if (quote_chain_split)
+           error ("-I- specified twice");
+         quote_chain_split = true;
+         split_quote_chain ();
+       }
+      break;
+
     case OPT_M:
     case OPT_MM:
       /* When doing dependencies with -M or -MM, suppress normal
@@ -757,6 +823,7 @@ c_common_decode_option (argc, argv)
 
     case OPT_Wdeprecated:
       warn_deprecated = on;
+      cpp_opts->warn_deprecated = on;
       break;
 
     case OPT_Wdiv_by_zero:
@@ -830,6 +897,10 @@ c_common_decode_option (argc, argv)
       cpp_opts->warn_import = on;
       break;
 
+    case OPT_Winvalid_pch:
+      cpp_opts->warn_invalid_pch = on;
+      break;
+
     case OPT_Wlong_long:
       warn_long_long = on;
       break;
@@ -1127,6 +1198,13 @@ c_common_decode_option (argc, argv)
       flag_external_templates = on;
       goto cp_deprecated;
 
+    case OPT_ffixed_form:
+    case OPT_ffixed_line_length:
+      /* Fortran front end options ignored when preprocessing only.  */
+      if (flag_preprocess_only)
+        result = -1;
+      break;
+
     case OPT_ffor_scope:
       flag_new_for_scope = on;
       break;
@@ -1176,6 +1254,10 @@ c_common_decode_option (argc, argv)
       flag_optional_diags = on;
       break;
 
+    case OPT_fpch_deps:
+      cpp_opts->restore_pch_deps = on;
+      break;
+
     case OPT_fpermissive:
       flag_permissive = on;
       break;
@@ -1236,6 +1318,30 @@ c_common_decode_option (argc, argv)
       flag_gen_declaration = 1;
       break;
 
+    case OPT_idirafter:
+      add_path (xstrdup (arg), AFTER, 0);
+      break;
+
+    case OPT_iprefix:
+      iprefix = arg;
+      break;
+
+    case OPT_isysroot:
+      sysroot = arg;
+      break;
+
+    case OPT_isystem:
+      add_path (xstrdup (arg), SYSTEM, 0);
+      break;
+
+    case OPT_iwithprefix:
+      add_prefixed_path (arg, SYSTEM);
+      break;
+
+    case OPT_iwithprefixbefore:
+      add_prefixed_path (arg, BRACKET);
+      break;
+
     case OPT_lang_asm:
       cpp_set_lang (parse_in, CLK_ASM);
       break;
@@ -1245,14 +1351,11 @@ c_common_decode_option (argc, argv)
       break;
 
     case OPT_nostdinc:
-      /* No default include directories.  You must specify all
-        include-file directories with -I.  */
-      cpp_opts->no_standard_includes = 1;
+      std_inc = false;
       break;
 
     case OPT_nostdincplusplus:
-      /* No default C++-specific include directories.  */
-      cpp_opts->no_standard_cplusplus_includes = 1;
+      std_cxx_inc = false;
       break;
 
     case OPT_o:
@@ -1328,7 +1431,7 @@ c_common_decode_option (argc, argv)
       break;
 
     case OPT_v:
-      cpp_opts->verbose = 1;
+      verbose = true;
       break;
     }
 
@@ -1356,6 +1459,10 @@ c_common_post_options ()
 
   sanitize_cpp_opts ();
 
+  register_include_chains (parse_in, sysroot, iprefix,
+                          std_inc, std_cxx_inc && c_language == clk_cplusplus,
+                          verbose);
+
   flag_inline_trees = 1;
 
   /* Use tree inlining if possible.  Function instrumentation is only
@@ -1579,6 +1686,18 @@ sanitize_cpp_opts ()
     = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
 }
 
+/* Add include path with a prefix at the front of its name.  */
+static void
+add_prefixed_path (suffix, chain)
+     const char *suffix;
+     size_t chain;
+{
+  const char *prefix;
+
+  prefix = iprefix ? iprefix: cpp_GCC_INCLUDE_DIR;
+  add_path (concat (prefix, suffix), chain, 0);
+}
+
 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
    extensions if ISO).  There is no concept of gnu94.  */
 static void
@@ -1780,6 +1899,7 @@ Switches:\n\
   fputs (_("\
   -f[no-]preprocessed       Treat the input file as already preprocessed\n\
   -ftabstop=<number>        Distance between tab stops for column reporting\n\
+  -isysroot <dir>           Set <dir> to be the system root directory\n\
   -P                        Do not generate #line directives\n\
   -remap                    Remap file names when including files\n\
   --help                    Display this information\n\