OSDN Git Service

* opts.c (decode_options): Disable whpr incompatible passes.
[pf3gnuchains/gcc-fork.git] / gcc / opts.c
index 4e8fdcc..0e86ab0 100644 (file)
@@ -1,5 +1,5 @@
 /* Command line option handling.
-   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+   Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
    Free Software Foundation, Inc.
    Contributed by Neil Booth.
 
@@ -436,7 +436,7 @@ complain_wrong_lang (const char *text, const struct cl_option *option,
   /* The LTO front end inherits all the options from the first front
      end that was used.  However, not all the original front end
      options make sense in LTO.
-     
+
      A real solution would be to filter this in collect2, but collect2
      does not have access to all the option attributes to know what to
      filter.  So, in lto1 we silently accept inherited flags and do
@@ -829,12 +829,14 @@ decode_options (unsigned int argc, const char **argv)
              if (optimize_val != -1)
                {
                  optimize = optimize_val;
+                 if ((unsigned int) optimize > 255)
+                   optimize = 255;
                  optimize_size = 0;
                }
            }
        }
     }
-  
+
   /* Use priority coloring if cover classes is not defined for the
      target.  */
   if (targetm.ira_cover_classes == NULL)
@@ -896,7 +898,7 @@ decode_options (unsigned int argc, const char **argv)
   flag_tree_vrp = opt2;
   flag_tree_builtin_call_dce = opt2;
   flag_tree_pre = opt2;
-  flag_tree_switch_conversion = 1;
+  flag_tree_switch_conversion = opt2;
   flag_ipa_cp = opt2;
   flag_ipa_sra = opt2;
 
@@ -969,24 +971,31 @@ decode_options (unsigned int argc, const char **argv)
 
   handle_options (argc, argv, lang_mask);
 
-  /* Make DUMP_BASE_NAME relative to the AUX_BASE_NAME directory,
-     typically the directory to contain the object file.  */
-  if (aux_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
+  if (dump_base_name && ! IS_ABSOLUTE_PATH (dump_base_name))
     {
-      const char *aux_base;
-
-      base_of_path (aux_base_name, &aux_base);
-      if (aux_base_name != aux_base)
+      /* First try to make DUMP_BASE_NAME relative to the DUMP_DIR_NAME
+        directory.  Then try to make DUMP_BASE_NAME relative to the
+        AUX_BASE_NAME directory, typically the directory to contain
+        the object file.  */
+      if (dump_dir_name)
+       dump_base_name = concat (dump_dir_name, dump_base_name, NULL);
+      else if (aux_base_name)
        {
-         int dir_len = aux_base - aux_base_name;
-         char *new_dump_base_name =
-           XNEWVEC (char, strlen(dump_base_name) + dir_len + 1);
-
-         /* Copy directory component from AUX_BASE_NAME.  */
-         memcpy (new_dump_base_name, aux_base_name, dir_len);
-         /* Append existing DUMP_BASE_NAME.  */
-         strcpy (new_dump_base_name + dir_len, dump_base_name);
-         dump_base_name = new_dump_base_name;
+         const char *aux_base;
+
+         base_of_path (aux_base_name, &aux_base);
+         if (aux_base_name != aux_base)
+           {
+             int dir_len = aux_base - aux_base_name;
+             char *new_dump_base_name =
+               XNEWVEC (char, strlen(dump_base_name) + dir_len + 1);
+
+             /* Copy directory component from AUX_BASE_NAME.  */
+             memcpy (new_dump_base_name, aux_base_name, dir_len);
+             /* Append existing DUMP_BASE_NAME.  */
+             strcpy (new_dump_base_name + dir_len, dump_base_name);
+             dump_base_name = new_dump_base_name;
+           }
        }
     }
 
@@ -1025,6 +1034,7 @@ decode_options (unsigned int argc, const char **argv)
        flag_pic = flag_pie;
       if (flag_pic && !flag_pie)
        flag_shlib = 1;
+      first_time_p = false;
     }
 
   if (optimize == 0)
@@ -1048,7 +1058,7 @@ decode_options (unsigned int argc, const char **argv)
 #endif
         ))
     {
-      inform (input_location, 
+      inform (input_location,
              "-freorder-blocks-and-partition does not work with exceptions on this architecture");
       flag_reorder_blocks_and_partition = 0;
       flag_reorder_blocks = 1;
@@ -1103,13 +1113,6 @@ decode_options (unsigned int argc, const char **argv)
       flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
     }
 
-  /* Save the current optimization options if this is the first call.  */
-  if (first_time_p)
-    {
-      optimization_default_node = build_optimization_node ();
-      optimization_current_node = optimization_default_node;
-      first_time_p = false;
-    }
   if (flag_conserve_stack)
     {
       if (!PARAM_SET_P (PARAM_LARGE_STACK_FRAME))
@@ -1117,6 +1120,16 @@ decode_options (unsigned int argc, const char **argv)
       if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
         PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
     }
+  if (flag_wpa || flag_ltrans)
+    {
+      /* These passes are not WHOPR compatible yet.  */
+      flag_ipa_cp = 0;
+      flag_ipa_reference = 0;
+      flag_ipa_pure_const = 0;
+      flag_ipa_type_escape = 0;
+      flag_ipa_pta = 0;
+      flag_ipa_struct_reorg = 0;
+    }
 
   if (flag_lto || flag_whopr)
     {
@@ -1127,10 +1140,6 @@ decode_options (unsigned int argc, const char **argv)
         Otherwise, symbols will be privatized too early, causing link
         errors later.  */
       flag_whole_program = 0;
-
-      /* FIXME lto.  Disable var-tracking until debug information
-        is properly handled in free_lang_data.  */
-      flag_var_tracking = 0;
 #else
       error ("LTO support has not been enabled in this configuration");
 #endif
@@ -1335,7 +1344,7 @@ print_filtered_help (unsigned int include_flags,
              printf (_(" None found.  Use --help=%s to show *all* the options supported by the %s front-end\n"),
                      lang_names[i], lang_names[i]);
        }
-       
+
     }
   else if (! displayed)
     printf (_(" All options with the desired characteristics have already been displayed\n"));
@@ -1640,8 +1649,8 @@ common_handle_option (size_t scode, const char *arg, int value,
       break;
 
     case OPT_Wlarger_than_:
-      /* This form corresponds to -Wlarger-than-.  
-        Kept for backward compatibility. 
+      /* This form corresponds to -Wlarger-than-.
+        Kept for backward compatibility.
         Don't use it as the first argument of warning().  */
 
     case OPT_Wlarger_than_eq:
@@ -1703,6 +1712,10 @@ common_handle_option (size_t scode, const char *arg, int value,
       dump_base_name = arg;
       break;
 
+    case OPT_dumpdir:
+      dump_dir_name = arg;
+      break;
+
     case OPT_falign_functions_:
       align_functions = value;
       break;
@@ -2117,11 +2130,17 @@ common_handle_option (size_t scode, const char *arg, int value,
     case OPT_fcse_skip_blocks:
     case OPT_floop_optimize:
     case OPT_frerun_loop_opt:
+    case OPT_fsched2_use_traces:
     case OPT_fstrength_reduce:
     case OPT_ftree_store_copy_prop:
     case OPT_fforce_addr:
     case OPT_ftree_salias:
     case OPT_ftree_store_ccp:
+    case OPT_Wunreachable_code:
+    case OPT_fargument_alias:
+    case OPT_fargument_noalias:
+    case OPT_fargument_noalias_anything:
+    case OPT_fargument_noalias_global:
       /* These are no-ops, preserved for backward compatibility.  */
       break;
 
@@ -2165,7 +2184,7 @@ handle_param (const char *carg)
   free (arg);
 }
 
-/* Used to set the level of strict aliasing warnings, 
+/* Used to set the level of strict aliasing warnings,
    when no level is specified (i.e., when -Wstrict-aliasing, and not
    -Wstrict-aliasing=level was given).
    ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified,
@@ -2198,8 +2217,8 @@ set_fast_math_flags (int set)
     }
 }
 
-/* When -funsafe-math-optimizations is set the following 
-   flags are set as well.  */ 
+/* When -funsafe-math-optimizations is set the following
+   flags are set as well.  */
 void
 set_unsafe_math_optimizations_flags (int set)
 {
@@ -2387,6 +2406,20 @@ set_option (const struct cl_option *option, int value, const char *arg)
     }
 }
 
+
+/* Callback function, called when -Werror= enables a warning.  */
+
+static void (*warning_as_error_callback) (int) = NULL;
+
+/* Register a callback for enable_warning_as_error calls.  */
+
+void
+register_warning_as_error_callback (void (*callback) (int))
+{
+  gcc_assert (warning_as_error_callback == NULL || callback == NULL);
+  warning_as_error_callback = callback;
+}
+
 /* Enable a warning option as an error.  This is used by -Werror= and
    also by legacy Werror-implicit-function-declaration.  */
 
@@ -2406,14 +2439,20 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
     }
   else
     {
-      diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
+      const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
+
       diagnostic_classify_diagnostic (global_dc, option_index, kind);
-      
-      /* -Werror=foo implies -Wfoo.  */
-      if (cl_options[option_index].var_type == CLVC_BOOLEAN
-         && cl_options[option_index].flag_var
-         && kind == DK_ERROR)
-       *(int *) cl_options[option_index].flag_var = 1;
+      if (kind == DK_ERROR)
+       {
+         const struct cl_option * const option = cl_options + option_index;
+
+         /* -Werror=foo implies -Wfoo.  */
+         if (option->var_type == CLVC_BOOLEAN && option->flag_var)
+           *(int *) option->flag_var = 1;
+
+         if (warning_as_error_callback)
+           warning_as_error_callback (option_index);
+       }
     }
   free (new_option);
 }