OSDN Git Service

* lib/compat.exp (compat-execute): Break up long lines.
[pf3gnuchains/gcc-fork.git] / gcc / opts.c
index 694cac7..cd9e8e3 100644 (file)
@@ -1,5 +1,5 @@
 /* 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.
@@ -37,6 +37,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "diagnostic.h"
 #include "tm_p.h"              /* For OPTIMIZATION_OPTIONS.  */
 #include "insn-attr.h"         /* For INSN_SCHEDULING.  */
+#include "target.h"
 
 /* Value of the -G xx switch, and whether it was passed or not.  */
 unsigned HOST_WIDE_INT g_switch_value;
@@ -99,7 +100,7 @@ bool warn_shadow;
 
 /* Nonzero means warn about constructs which might not be
    strict-aliasing safe.  */
-bool warn_strict_aliasing;
+int warn_strict_aliasing;
 
 /* True to warn if a switch on an enum, that does not have a default
    case, fails to have a case for every enum value.  */
@@ -148,6 +149,13 @@ static unsigned int columns = 80;
 /* What to print when a switch has no documentation.  */
 static const char undocumented_msg[] = N_("This switch lacks documentation");
 
+/* Used for bookkeeping on whether user set these flags so
+   -fprofile-use/-fprofile-generate does not use them.  */
+static bool profile_arc_flag_set, flag_profile_values_set;
+static bool flag_unroll_loops_set, flag_tracer_set;
+static bool flag_value_profile_transformations_set;
+static bool flag_peel_loops_set, flag_branch_probabilities_set;
+
 /* Input file names.  */
 const char **in_fnames;
 unsigned num_in_fnames;
@@ -395,7 +403,7 @@ handle_option (const char **argv, unsigned int lang_mask)
 
   if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
     {
-      if (!(*lang_hooks.missing_argument) (opt, opt_index))
+      if (!lang_hooks.missing_argument (opt, opt_index))
        error ("missing argument to \"%s\"", opt);
       goto done;
     }
@@ -413,7 +421,7 @@ handle_option (const char **argv, unsigned int lang_mask)
     }
 
   if (option->flags & lang_mask)
-    if ((*lang_hooks.handle_option) (opt_index, arg, value) == 0)
+    if (lang_hooks.handle_option (opt_index, arg, value) == 0)
       result = 0;
 
   if (result && (option->flags & CL_COMMON))
@@ -441,7 +449,8 @@ handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
       /* Interpret "-" or a non-switch as a file name.  */
       if (opt[0] != '-' || opt[1] == '\0')
        {
-         main_input_filename = opt;
+         if (main_input_filename == NULL)
+           main_input_filename = opt;
          add_input_filename (opt);
          n = 1;
          continue;
@@ -474,7 +483,7 @@ decode_options (unsigned int argc, const char **argv)
   unsigned int i, lang_mask;
 
   /* Perform language-specific options initialization.  */
-  lang_mask = (*lang_hooks.init_options) (argc, argv);
+  lang_mask = lang_hooks.init_options (argc, argv);
 
   lang_hooks.initialize_diagnostics (global_dc);
 
@@ -529,13 +538,31 @@ decode_options (unsigned int argc, const char **argv)
       flag_guess_branch_prob = 1;
       flag_cprop_registers = 1;
       flag_loop_optimize = 1;
-      flag_crossjumping = 1;
       flag_if_conversion = 1;
       flag_if_conversion2 = 1;
+      flag_tree_ccp = 1;
+      flag_tree_dce = 1;
+      flag_tree_dom = 1;
+      flag_tree_dse = 1;
+      flag_tree_pre = 1;
+      flag_tree_ter = 1;
+      flag_tree_live_range_split = 1;
+      flag_tree_sra = 1;
+      flag_tree_copyrename = 1;
+
+      if (!optimize_size)
+       {
+         /* Loop header copying usually increases size of the code.  This used
+            not to be true, since quite often it is possible to verify that
+            the condition is satisfied in the first iteration and therefore
+            to eliminate it.  Jump threading handles these cases now.  */
+         flag_tree_ch = 1;
+       }
     }
 
   if (optimize >= 2)
     {
+      flag_crossjumping = 1;
       flag_optimize_sibling_calls = 1;
       flag_cse_follow_jumps = 1;
       flag_cse_skip_blocks = 1;
@@ -562,9 +589,8 @@ decode_options (unsigned int argc, const char **argv)
   if (optimize >= 3)
     {
       flag_inline_functions = 1;
-      flag_rename_registers = 1;
       flag_unswitch_loops = 1;
-      flag_web = 1;
+      flag_gcse_after_reload = 1;
     }
 
   if (optimize < 2 || optimize_size)
@@ -582,14 +608,23 @@ decode_options (unsigned int argc, const char **argv)
         or less automatically remove extra jumps, but would also try to
         use more short jumps instead of long jumps.  */
       flag_reorder_blocks = 0;
+      flag_reorder_blocks_and_partition = 0;
+    }
+
+  if (optimize_size)
+    {
+      /* Inlining of very small functions usually reduces total size.  */
+      set_param_value ("max-inline-insns-single", 5);
+      set_param_value ("max-inline-insns-auto", 5);
+      set_param_value ("max-inline-insns-rtl", 10);
+      flag_inline_functions = 1;
     }
 
   /* Initialize whether `char' is signed.  */
   flag_signed_char = DEFAULT_SIGNED_CHAR;
-#ifdef DEFAULT_SHORT_ENUMS
-  /* Initialize how much space enums occupy, by default.  */
-  flag_short_enums = DEFAULT_SHORT_ENUMS;
-#endif
+  /* Set this to a special "uninitialized" value.  The actual default is set
+     after target options have been processed.  */
+  flag_short_enums = 2;
 
   /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
      modify it.  */
@@ -640,6 +675,19 @@ decode_options (unsigned int argc, const char **argv)
 
   if (flag_really_no_inline == 2)
     flag_really_no_inline = flag_no_inline;
+
+  /* The optimization to partition hot and cold basic blocks into separate
+     sections of the .o and executable files does not work (currently)
+     with exception handling.  If flag_exceptions is turned on we need to
+     turn off the partitioning optimization.  */
+
+  if (flag_exceptions && flag_reorder_blocks_and_partition)
+    {
+      warning 
+           ("-freorder-blocks-and-partition does not work with exceptions");
+      flag_reorder_blocks_and_partition = 0;
+      flag_reorder_blocks = 1;
+    }
 }
 
 /* Handle target- and language-independent options.  Return zero to
@@ -713,6 +761,10 @@ common_handle_option (size_t scode, const char *arg,
       set_Wextra (value);
       break;
 
+    case OPT_Wfatal_errors:
+      flag_fatal_errors = value;
+      break;
+
     case OPT_Winline:
       warn_inline = value;
       break;
@@ -739,6 +791,7 @@ common_handle_option (size_t scode, const char *arg,
       break;
 
     case OPT_Wstrict_aliasing:
+    case OPT_Wstrict_aliasing_:
       warn_strict_aliasing = value;
       break;
 
@@ -825,6 +878,10 @@ common_handle_option (size_t scode, const char *arg,
       flag_pie = value + value;
       break;
 
+    case OPT_fabi_version_:
+      flag_abi_version = value;
+      break;
+
     case OPT_falign_functions:
       align_functions = !value;
       break;
@@ -882,6 +939,7 @@ common_handle_option (size_t scode, const char *arg,
       break;
 
     case OPT_fbranch_probabilities:
+      flag_branch_probabilities_set = true;
       flag_branch_probabilities = value;
       break;
 
@@ -893,6 +951,10 @@ common_handle_option (size_t scode, const char *arg,
       flag_branch_target_load_optimize2 = value;
       break;
 
+    case OPT_fbtr_bb_exclusive:
+      flag_btr_bb_exclusive = value;
+      break;
+
     case OPT_fcall_used_:
       fix_register (arg, 0, 1);
       break;
@@ -951,6 +1013,11 @@ common_handle_option (size_t scode, const char *arg,
        return 0;
       break;
 
+    case OPT_fdump_:
+      if (!dump_switch_p (arg))
+       return 0;
+      break;
+
     case OPT_fdump_unnumbered:
       flag_dump_unnumbered = value;
       break;
@@ -1019,12 +1086,12 @@ common_handle_option (size_t scode, const char *arg,
       flag_gcse_sm = value;
       break;
 
-    case OPT_fgcse_las:
-      flag_gcse_las = value;
+    case OPT_fgcse_after_reload:
+      flag_gcse_after_reload = value;
       break;
 
-    case OPT_fgnu_linker:
-      flag_gnu_linker = value;
+    case OPT_fgcse_las:
+      flag_gcse_las = value;
       break;
 
     case OPT_fguess_branch_probability:
@@ -1106,6 +1173,19 @@ common_handle_option (size_t scode, const char *arg,
       flag_move_all_movables = value;
       break;
 
+    case OPT_fmudflap:
+      flag_mudflap = value;
+      break;
+
+    case OPT_fmudflapth:
+      flag_mudflap = value;
+      flag_mudflap_threads = value;
+      break;
+
+    case OPT_fmudflapir:
+      flag_mudflap_ignore_reads = value;
+      break;
+
     case OPT_fnew_ra:
       flag_new_regalloc = value;
       break;
@@ -1139,6 +1219,7 @@ common_handle_option (size_t scode, const char *arg,
       break;
 
     case OPT_fpeel_loops:
+      flag_peel_loops_set = true;
       flag_peel_loops = value;
       break;
 
@@ -1171,14 +1252,41 @@ common_handle_option (size_t scode, const char *arg,
       break;
 
     case OPT_fprofile_arcs:
+      profile_arc_flag_set = true;
       profile_arc_flag = value;
       break;
 
+    case OPT_fprofile_use:
+      if (!flag_branch_probabilities_set)
+        flag_branch_probabilities = value;
+      if (!flag_profile_values_set)
+        flag_profile_values = value;
+      if (!flag_unroll_loops_set)
+        flag_unroll_loops = value;
+      if (!flag_peel_loops_set)
+        flag_peel_loops = value;
+      if (!flag_tracer_set)
+        flag_tracer = value;
+      if (!flag_value_profile_transformations_set)
+        flag_value_profile_transformations = value;
+      break;
+
+    case OPT_fprofile_generate:
+      if (!profile_arc_flag_set)
+        profile_arc_flag = value;
+      if (!flag_profile_values_set)
+        flag_profile_values = value;
+      if (!flag_value_profile_transformations_set)
+        flag_value_profile_transformations = value;
+      break;
+
     case OPT_fprofile_values:
+      flag_profile_values_set = true;
       flag_profile_values = value;
       break;
 
     case OPT_fvpt:
+      flag_value_profile_transformations_set = value;
       flag_value_profile_transformations = value;
       break;
 
@@ -1213,6 +1321,10 @@ common_handle_option (size_t scode, const char *arg,
       flag_reorder_blocks = value;
       break;
 
+    case OPT_freorder_blocks_and_partition:
+      flag_reorder_blocks_and_partition = value;
+      break;
+  
     case OPT_freorder_functions:
       flag_reorder_functions = value;
       break;
@@ -1286,7 +1398,9 @@ common_handle_option (size_t scode, const char *arg,
     case OPT_fsched_stalled_insns_dep_:
       flag_sched_stalled_insns_dep = value;
       break;
-
+    case OPT_fmodulo_sched:
+      flag_modulo_sched = 1;
+      break;
     case OPT_fshared_data:
       flag_shared_data = value;
       break;
@@ -1299,18 +1413,6 @@ common_handle_option (size_t scode, const char *arg,
       flag_single_precision_constant = value;
       break;
 
-    case OPT_fssa:
-      flag_ssa = value;
-      break;
-
-    case OPT_fssa_ccp:
-      flag_ssa_ccp = value;
-      break;
-
-    case OPT_fssa_dce:
-      flag_ssa_dce = value;
-      break;
-
     case OPT_fstack_check:
       flag_stack_check = value;
       break;
@@ -1374,6 +1476,7 @@ common_handle_option (size_t scode, const char *arg,
       break;
 
     case OPT_ftracer:
+      flag_tracer_set = true;
       flag_tracer = value;
       break;
 
@@ -1385,6 +1488,70 @@ common_handle_option (size_t scode, const char *arg,
       flag_trapv = value;
       break;
 
+    case OPT_ftree_based_profiling:
+      flag_tree_based_profiling = value;
+      break;
+
+    case OPT_ftree_ccp:
+      flag_tree_ccp = value;
+      break;
+
+    case OPT_ftree_dce:
+      flag_tree_dce = value;
+      break;
+
+    case OPT_ftree_combine_temps:
+      flag_tree_combine_temps = value;
+      break;
+
+    case OPT_ftree_ter:
+      flag_tree_ter = value;
+      break;
+
+    case OPT_ftree_lrs:
+      flag_tree_live_range_split = value;
+      break;
+
+    case OPT_ftree_dominator_opts:
+      flag_tree_dom = value;
+      break;
+
+    case OPT_ftree_copyrename:
+      flag_tree_copyrename = value;
+      break;
+
+    case OPT_ftree_ch:
+      flag_tree_ch = value;
+      break;
+
+    case OPT_ftree_dse:
+      flag_tree_dse = value;
+      break;
+
+    case OPT_ftree_sra:
+      flag_tree_sra = value;
+      break;
+
+    case OPT_ftree_points_to_:
+      if (!strcmp (arg, "andersen"))
+#ifdef HAVE_BANSHEE
+        flag_tree_points_to = PTA_ANDERSEN;
+#else
+        warning ("Andersen's PTA not available - libbanshee not compiled.");
+#endif
+      else if (!strcmp (arg, "none"))
+       flag_tree_points_to = PTA_NONE;
+      else
+       {
+         warning ("`%s`: unknown points-to analysis algorithm", arg);
+         return 0;
+       }
+      break;
+
+    case OPT_ftree_pre:
+      flag_tree_pre = value;
+      break;
+
     case OPT_funit_at_a_time:
       flag_unit_at_a_time = value;
       break;
@@ -1394,6 +1561,7 @@ common_handle_option (size_t scode, const char *arg,
       break;
 
     case OPT_funroll_loops:
+      flag_unroll_loops_set = true;
       flag_unroll_loops = value;
       break;
 
@@ -1409,6 +1577,10 @@ common_handle_option (size_t scode, const char *arg,
       flag_unwind_tables = value;
       break;
 
+    case OPT_fvar_tracking:
+      flag_var_tracking = value;
+      break;
+
     case OPT_fverbose_asm:
       flag_verbose_asm = value;
       break;
@@ -1421,10 +1593,6 @@ common_handle_option (size_t scode, const char *arg,
       flag_wrapv = value;
       break;
 
-    case OPT_fwritable_strings:
-      flag_writable_strings = value;
-      break;
-
     case OPT_fzero_initialized_in_bss:
       flag_zero_initialized_in_bss = value;
       break;
@@ -1437,19 +1605,6 @@ common_handle_option (size_t scode, const char *arg,
       set_debug_level (SDB_DEBUG, false, arg);
       break;
 
-    case OPT_gdwarf:
-      if (*arg)
-       {
-         error ("use -gdwarf -gN for DWARF v1 level N, "
-                "and -gdwarf-2 for DWARF v2" );
-         break;
-       }
-
-      /* Fall through.  */
-    case OPT_gdwarf_:
-      set_debug_level (DWARF_DEBUG, code == OPT_gdwarf_, arg);
-      break;
-
     case OPT_gdwarf_2:
       set_debug_level (DWARF2_DEBUG, false, arg);
       break;
@@ -1845,7 +2000,7 @@ wrap_help (const char *help, const char *item, unsigned int item_width)
                len = i;
              else if ((help[i] == '-' || help[i] == '/')
                       && help[i + 1] != ' '
-                      && ISALPHA (help[i - 1]))
+                      && i > 0 && ISALPHA (help[i - 1]))
                len = i + 1;
            }
        }