OSDN Git Service

Add framework support for darwin.
[pf3gnuchains/gcc-fork.git] / gcc / c-opts.c
index e2a3043..6d9696a 100644 (file)
@@ -1,5 +1,5 @@
 /* C/ObjC/C++ command line option handling.
-   Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
    Contributed by Neil Booth.
 
 This file is part of GCC.
@@ -88,6 +88,9 @@ static bool quote_chain_split;
 /* If -Wunused-macros.  */
 static bool warn_unused_macros;
 
+/* If -Wvariadic-macros.  */
+static bool warn_variadic_macros = true;
+
 /* Number of deferred options.  */
 static size_t deferred_count;
 
@@ -108,7 +111,8 @@ static void sanitize_cpp_opts (void);
 static void add_prefixed_path (const char *, size_t);
 static void push_command_line_include (void);
 static void cb_file_change (cpp_reader *, const struct line_map *);
-static void finish_options (const char *);
+static void cb_dir_change (cpp_reader *, const char *);
+static void finish_options (void);
 
 #ifndef STDC_0_IN_SYSTEM_HEADERS
 #define STDC_0_IN_SYSTEM_HEADERS 0
@@ -149,6 +153,7 @@ c_common_missing_argument (const char *opt, size_t code)
       error ("macro name missing after \"%s\"", opt);
       break;
 
+    case OPT_F:
     case OPT_I:
     case OPT_idirafter:
     case OPT_isysroot:
@@ -203,7 +208,7 @@ c_common_init_options (unsigned int argc, const char **argv ATTRIBUTE_UNUSED)
     }
 
   parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
-                               ident_hash);
+                               ident_hash, &line_table);
 
   cpp_opts = cpp_get_options (parse_in);
   cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
@@ -281,6 +286,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       cpp_opts->print_include_names = 1;
       break;
 
+    case OPT_F:
+      TARGET_OPTF (xstrdup (arg));
+      break;
+
     case OPT_I:
       if (strcmp (arg, "-"))
        add_path (xstrdup (arg), BRACKET, 0);
@@ -475,6 +484,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       warn_format_zero_length = value;
       break;
 
+    case OPT_Winit_self:
+      warn_init_self = value;
+      break;
+
     case OPT_Wimplicit:
       set_Wimplicit (value);
       break;
@@ -546,6 +559,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       warn_nonnull = value;
       break;
 
+    case OPT_Wold_style_definition:
+      warn_old_style_definition = value;
+      break;
+
     case OPT_Wold_style_cast:
       warn_old_style_cast = value;
       break;
@@ -637,6 +654,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       warn_unused_macros = value;
       break;
 
+    case OPT_Wvariadic_macros:
+      warn_variadic_macros = value;
+      break;
+
     case OPT_Wwrite_strings:
       if (!c_dialect_cxx ())
        flag_const_strings = value;
@@ -664,7 +685,9 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       /* Fall through.  */
 
     case OPT_fall_virtual:
+    case OPT_falt_external_templates:
     case OPT_fenum_int_equiv:
+    case OPT_fexternal_templates:
     case OPT_fguiding_decls:
     case OPT_fhonor_std:
     case OPT_fhuge_objects:
@@ -681,23 +704,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       warning ("switch \"%s\" is no longer supported", option->opt_text);
       break;
 
-    case OPT_fabi_version_:
-      flag_abi_version = value;
-      break;
-
     case OPT_faccess_control:
       flag_access_control = value;
       break;
 
-    case OPT_falt_external_templates:
-      flag_alt_external_templates = value;
-      if (value)
-       flag_external_templates = true;
-    cp_deprecated:
-      warning ("switch \"%s\" is deprecated, please see documentation "
-              "for details", option->opt_text);
-      break;
-
     case OPT_fasm:
       flag_no_asm = !value;
       break;
@@ -791,10 +801,6 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       flag_enforce_eh_specs = value;
       break;
 
-    case OPT_fexternal_templates:
-      flag_external_templates = value;
-      goto cp_deprecated;
-
     case OPT_ffixed_form:
     case OPT_ffixed_line_length_:
       /* Fortran front end options ignored when preprocessing only.  */
@@ -839,10 +845,18 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       flag_next_runtime = value;
       break;
 
+    case OPT_fnil_receivers:
+      flag_nil_receivers = value;
+      break;
+
     case OPT_fnonansi_builtins:
       flag_no_nonansi_builtin = !value;
       break;
 
+    case OPT_fobjc_exceptions:
+      flag_objc_exceptions = value;
+      break;
+
     case OPT_foperator_names:
       cpp_opts->operator_names = value;
       break;
@@ -863,6 +877,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       cpp_opts->preprocessed = value;
       break;
 
+    case OPT_freplace_objc_classes:
+      flag_replace_objc_classes = value;
+      break;
+      
     case OPT_frepo:
       flag_use_repository = value;
       if (value)
@@ -895,6 +913,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       cpp_opts->wide_charset = arg;
       break;
 
+    case OPT_finput_charset_:
+      cpp_opts->input_charset = arg;
+      break;
+
     case OPT_ftemplate_depth_:
       max_tinst_depth = value;
       break;
@@ -907,6 +929,10 @@ c_common_handle_option (size_t scode, const char *arg, int value)
       flag_weak = value;
       break;
 
+    case OPT_fzero_link:
+      flag_zero_link = value;
+      break;
+
     case OPT_gen_decls:
       flag_gen_declaration = 1;
       break;
@@ -1038,6 +1064,8 @@ c_common_handle_option (size_t scode, const char *arg, int value)
 bool
 c_common_post_options (const char **pfilename)
 {
+  struct cpp_callbacks *cb;
+
   /* Canonicalize the input and output filenames.  */
   if (in_fnames == NULL)
     {
@@ -1125,10 +1153,10 @@ c_common_post_options (const char **pfilename)
       input_line = 0;
     }
 
-  cpp_get_callbacks (parse_in)->file_change = cb_file_change;
-
-  /* NOTE: we use in_fname here, not the one supplied.  */
-  *pfilename = cpp_read_main_file (parse_in, in_fnames[0]);
+  cb = cpp_get_callbacks (parse_in);
+  cb->file_change = cb_file_change;
+  cb->dir_change = cb_dir_change;
+  cpp_post_options (parse_in);
 
   saved_lineno = input_line;
   input_line = 0;
@@ -1137,6 +1165,15 @@ c_common_post_options (const char **pfilename)
      immediately.  */
   errorcount += cpp_errors (parse_in);
 
+  *pfilename = this_input_filename
+    = cpp_read_main_file (parse_in, in_fnames[0]);
+  if (this_input_filename == NULL)
+    return true;
+
+  if (flag_working_directory
+      && flag_preprocess_only && ! flag_no_line_commands)
+    pp_dir_change (parse_in, get_src_pwd ());
+
   return flag_preprocess_only;
 }
 
@@ -1161,7 +1198,7 @@ c_common_init (void)
 
   if (flag_preprocess_only)
     {
-      finish_options (in_fnames[0]);
+      finish_options ();
       preprocess_file (parse_in);
       return false;
     }
@@ -1196,10 +1233,12 @@ c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
 
          /* Reset cpplib's macros and start a new file.  */
          cpp_undef_all (parse_in);
-         cpp_stack_file (parse_in, in_fnames[file_index]);
+         main_input_filename = this_input_filename
+           = cpp_read_main_file (parse_in, in_fnames[file_index]);
+         if (this_input_filename == NULL)
+           break;
        }
-
-      finish_options(in_fnames[file_index]);
+      finish_options ();
       if (file_index == 0)
        pch_init();
       c_parse_file ();
@@ -1207,7 +1246,6 @@ c_common_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
       file_index++;
     } while (file_index < num_in_fnames);
   
-  free_parser_stacks ();
   finish_file ();
 }
 
@@ -1334,14 +1372,17 @@ sanitize_cpp_opts (void)
   cpp_opts->warn_long_long
     = warn_long_long && ((!flag_isoc99 && pedantic) || warn_traditional);
 
+  /* Similarly with -Wno-variadic-macros.  No check for c99 here, since
+     this also turns off warnings about GCCs extension.  */
+  cpp_opts->warn_variadic_macros
+    = warn_variadic_macros && (pedantic || warn_traditional);
+
   /* If we're generating preprocessor output, emit current directory
      if explicitly requested or if debugging information is enabled.
      ??? Maybe we should only do it for debugging formats that
      actually output the current directory?  */
   if (flag_working_directory == -1)
     flag_working_directory = (debug_info_level != DINFO_LEVEL_NONE);
-  cpp_opts->working_directory
-    = flag_preprocess_only && flag_working_directory;
 }
 
 /* Add include path with a prefix at the front of its name.  */
@@ -1364,11 +1405,9 @@ add_prefixed_path (const char *suffix, size_t chain)
   add_path (path, chain, 0);
 }
 
-/* Handle -D, -U, -A, -imacros, and the first -include.  
-   TIF is the input file to which we will return after processing all
-   the includes.  */
+/* Handle -D, -U, -A, -imacros, and the first -include.  */
 static void
-finish_options (const char *tif)
+finish_options (void)
 {
   if (!cpp_opts->preprocessed)
     {
@@ -1414,12 +1453,15 @@ finish_options (const char *tif)
 
          if (opt->code == OPT_imacros
              && cpp_push_include (parse_in, opt->arg))
-           cpp_scan_nooutput (parse_in);
+           {
+             /* Disable push_command_line_include callback for now.  */
+             include_cursor = deferred_count + 1;
+             cpp_scan_nooutput (parse_in);
+           }
        }
     }
 
   include_cursor = 0;
-  this_input_filename = tif;
   push_command_line_include ();
 }
 
@@ -1427,24 +1469,27 @@ finish_options (const char *tif)
 static void
 push_command_line_include (void)
 {
-  if (cpp_opts->preprocessed)
-    return;
-
   while (include_cursor < deferred_count)
     {
       struct deferred_opt *opt = &deferred_opts[include_cursor++];
 
-      if (opt->code == OPT_include && cpp_push_include (parse_in, opt->arg))
+      if (! cpp_opts->preprocessed && opt->code == OPT_include
+         && cpp_push_include (parse_in, opt->arg))
        return;
     }
 
   if (include_cursor == deferred_count)
     {
-      /* Restore the line map from <command line>.  */
-      cpp_change_file (parse_in, LC_RENAME, this_input_filename);
+      include_cursor++;
       /* -Wunused-macros should only warn about macros defined hereafter.  */
       cpp_opts->warn_unused_macros = warn_unused_macros;
-      include_cursor++;
+      /* Restore the line map from <command line>.  */
+      if (! cpp_opts->preprocessed)
+       cpp_change_file (parse_in, LC_RENAME, main_input_filename);
+
+      /* Set this here so the client can change the option if it wishes,
+        and after stacking the main file so we don't trace the main file.  */
+      line_table.trace_includes = cpp_opts->print_include_names;
     }
 }
 
@@ -1458,10 +1503,17 @@ cb_file_change (cpp_reader *pfile ATTRIBUTE_UNUSED,
   else
     fe_file_change (new_map);
 
-  if (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map))
+  if (new_map == 0 || (new_map->reason == LC_LEAVE && MAIN_FILE_P (new_map)))
     push_command_line_include ();
 }
 
+void
+cb_dir_change (cpp_reader *pfile ATTRIBUTE_UNUSED, const char *dir)
+{
+  if (! set_src_pwd (dir))
+    warning ("too late for # directive to set debug directory");
+}
+
 /* Set the C 89 standard (with 1994 amendments if C94, without GNU
    extensions if ISO).  There is no concept of gnu94.  */
 static void
@@ -1474,7 +1526,6 @@ set_std_c89 (int c94, int iso)
   flag_no_nonansi_builtin = iso;
   flag_isoc94 = c94;
   flag_isoc99 = 0;
-  flag_writable_strings = 0;
 }
 
 /* Set the C 99 standard (without GNU extensions if ISO).  */
@@ -1487,7 +1538,6 @@ set_std_c99 (int iso)
   flag_iso = iso;
   flag_isoc99 = 1;
   flag_isoc94 = 1;
-  flag_writable_strings = 0;
 }
 
 /* Set the C++ 98 standard (without GNU extensions if ISO).  */