OSDN Git Service

alphabatize irix___restrict
[pf3gnuchains/gcc-fork.git] / gcc / c-opts.c
index 5270d62..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.
@@ -32,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;
@@ -49,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;
 
@@ -69,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
@@ -117,6 +142,7 @@ static void sanitize_cpp_opts PARAMS ((void));
   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)                    \
@@ -212,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)                 \
@@ -258,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)                             \
@@ -314,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
 {
@@ -355,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;
@@ -363,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:
@@ -652,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
@@ -767,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:
@@ -1141,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;
@@ -1254,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;
@@ -1263,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:
@@ -1346,7 +1431,7 @@ c_common_decode_option (argc, argv)
       break;
 
     case OPT_v:
-      cpp_opts->verbose = 1;
+      verbose = true;
       break;
     }
 
@@ -1374,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
@@ -1597,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
@@ -1798,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\