/* 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.
#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;
/* 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. */
/* 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;
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;
}
}
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))
/* 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;
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);
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;
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)
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. */
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
set_Wextra (value);
break;
+ case OPT_Wfatal_errors:
+ flag_fatal_errors = value;
+ break;
+
case OPT_Winline:
warn_inline = value;
break;
break;
case OPT_Wstrict_aliasing:
+ case OPT_Wstrict_aliasing_:
warn_strict_aliasing = value;
break;
flag_pie = value + value;
break;
+ case OPT_fabi_version_:
+ flag_abi_version = value;
+ break;
+
case OPT_falign_functions:
align_functions = !value;
break;
break;
case OPT_fbranch_probabilities:
+ flag_branch_probabilities_set = true;
flag_branch_probabilities = value;
break;
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;
return 0;
break;
+ case OPT_fdump_:
+ if (!dump_switch_p (arg))
+ return 0;
+ break;
+
case OPT_fdump_unnumbered:
flag_dump_unnumbered = value;
break;
flag_gcse_sm = value;
break;
- case OPT_fgnu_linker:
- flag_gnu_linker = value;
+ case OPT_fgcse_after_reload:
+ flag_gcse_after_reload = value;
+ break;
+
+ case OPT_fgcse_las:
+ flag_gcse_las = value;
break;
case OPT_fguess_branch_probability:
case OPT_finline_limit_:
case OPT_finline_limit_eq:
- set_param_value ("max-inline-insns", value);
set_param_value ("max-inline-insns-single", value / 2);
set_param_value ("max-inline-insns-auto", value / 2);
set_param_value ("max-inline-insns-rtl", value);
- if (value / 4 < MIN_INLINE_INSNS)
- {
- if (value / 4 > 10)
- set_param_value ("min-inline-insns", value / 4);
- else
- set_param_value ("min-inline-insns", 10);
- }
break;
case OPT_finstrument_functions:
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;
break;
case OPT_fpeel_loops:
+ flag_peel_loops_set = true;
flag_peel_loops = value;
break;
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;
+
case OPT_frandom_seed:
/* The real switch is -fno-random-seed. */
if (value)
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;
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;
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;
break;
case OPT_ftracer:
+ flag_tracer_set = true;
flag_tracer = value;
break;
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;
break;
case OPT_funroll_loops:
+ flag_unroll_loops_set = true;
flag_unroll_loops = value;
break;
flag_unwind_tables = value;
break;
+ case OPT_fvar_tracking:
+ flag_var_tracking = value;
+ break;
+
case OPT_fverbose_asm:
flag_verbose_asm = value;
break;
+
+ case OPT_fweb:
+ flag_web = value;
+ break;
case OPT_fwrapv:
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;
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;
len = i;
else if ((help[i] == '-' || help[i] == '/')
&& help[i + 1] != ' '
- && ISALPHA (help[i - 1]))
+ && i > 0 && ISALPHA (help[i - 1]))
len = i + 1;
}
}