aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.4.0/gcc/opts.c
diff options
context:
space:
mode:
authorDan Albert <danalbert@google.com>2015-06-17 11:09:54 -0700
committerDan Albert <danalbert@google.com>2015-06-17 14:15:22 -0700
commitf378ebf14df0952eae870c9865bab8326aa8f137 (patch)
tree31794503eb2a8c64ea5f313b93100f1163afcffb /gcc-4.4.0/gcc/opts.c
parent2c58169824949d3a597d9fa81931e001ef9b1bd0 (diff)
downloadtoolchain_gcc-f378ebf14df0952eae870c9865bab8326aa8f137.tar.gz
toolchain_gcc-f378ebf14df0952eae870c9865bab8326aa8f137.tar.bz2
toolchain_gcc-f378ebf14df0952eae870c9865bab8326aa8f137.zip
Delete old versions of GCC.
Change-Id: I710f125d905290e1024cbd67f48299861790c66c
Diffstat (limited to 'gcc-4.4.0/gcc/opts.c')
-rw-r--r--gcc-4.4.0/gcc/opts.c2493
1 files changed, 0 insertions, 2493 deletions
diff --git a/gcc-4.4.0/gcc/opts.c b/gcc-4.4.0/gcc/opts.c
deleted file mode 100644
index 1979b2676..000000000
--- a/gcc-4.4.0/gcc/opts.c
+++ /dev/null
@@ -1,2493 +0,0 @@
-/* Command line option handling.
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
- Free Software Foundation, Inc.
- Contributed by Neil Booth.
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify it under
-the terms of the GNU General Public License as published by the Free
-Software Foundation; either version 3, or (at your option) any later
-version.
-
-GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING3. If not see
-<http://www.gnu.org/licenses/>. */
-
-#include "config.h"
-#include "system.h"
-#include "intl.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "tree.h"
-#include "rtl.h"
-#include "expr.h"
-#include "ggc.h"
-#include "output.h"
-#include "langhooks.h"
-#include "opts.h"
-#include "options.h"
-#include "flags.h"
-#include "toplev.h"
-#include "params.h"
-#include "diagnostic.h"
-#include "tm_p.h" /* For OPTIMIZATION_OPTIONS. */
-#include "insn-attr.h" /* For INSN_SCHEDULING. */
-#include "target.h"
-#include "tree-pass.h"
-#include "dbgcnt.h"
-#include "debug.h"
-#include "plugin.h"
-#include "cgraph.h"
-
-/* Value of the -G xx switch, and whether it was passed or not. */
-unsigned HOST_WIDE_INT g_switch_value;
-bool g_switch_set;
-
-/* Same for selective scheduling. */
-bool sel_sched_switch_set;
-
-/* True if we should exit after parsing options. */
-bool exit_after_options;
-
-/* Print various extra warnings. -W/-Wextra. */
-bool extra_warnings;
-
-/* True to warn about any objects definitions whose size is larger
- than N bytes. Also want about function definitions whose returned
- values are larger than N bytes, where N is `larger_than_size'. */
-bool warn_larger_than;
-HOST_WIDE_INT larger_than_size;
-
-/* True to warn about any function whose frame size is larger
- * than N bytes. */
-bool warn_frame_larger_than;
-HOST_WIDE_INT frame_larger_than_size;
-
-/* Type(s) of debugging information we are producing (if any). See
- flags.h for the definitions of the different possible types of
- debugging information. */
-enum debug_info_type write_symbols = NO_DEBUG;
-
-/* Level of debugging information we are producing. See flags.h for
- the definitions of the different possible levels. */
-enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
-
-/* Whether to include line number table with TERSE-level debug info. */
-bool generate_debug_line_table = false;
-
-/* A major contribution to object and executable size is debug
- information size. A major contribution to debug information size
- is struct descriptions replicated in several object files. The
- following flags attempt to reduce this information. The basic
- idea is to not emit struct debugging information in the current
- compilation unit when that information will be generated by
- another compilation unit.
-
- Debug information for a struct defined in the current source
- file should be generated in the object file. Likewise the
- debug information for a struct defined in a header should be
- generated in the object file of the corresponding source file.
- Both of these case are handled when the base name of the file of
- the struct definition matches the base name of the source file
- of the current compilation unit. This matching emits minimal
- struct debugging information.
-
- The base file name matching rule above will fail to emit debug
- information for structs defined in system headers. So a second
- category of files includes system headers in addition to files
- with matching bases.
-
- The remaining types of files are library headers and application
- headers. We cannot currently distinguish these two types. */
-
-enum debug_struct_file
-{
- DINFO_STRUCT_FILE_NONE, /* Debug no structs. */
- DINFO_STRUCT_FILE_BASE, /* Debug structs defined in files with the
- same base name as the compilation unit. */
- DINFO_STRUCT_FILE_SYS, /* Also debug structs defined in system
- header files. */
- DINFO_STRUCT_FILE_ANY /* Debug structs defined in all files. */
-};
-
-/* Generic structs (e.g. templates not explicitly specialized)
- may not have a compilation unit associated with them, and so
- may need to be treated differently from ordinary structs.
-
- Structs only handled by reference (indirectly), will also usually
- not need as much debugging information. */
-
-static enum debug_struct_file debug_struct_ordinary[DINFO_USAGE_NUM_ENUMS]
- = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
-static enum debug_struct_file debug_struct_generic[DINFO_USAGE_NUM_ENUMS]
- = { DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY, DINFO_STRUCT_FILE_ANY };
-
-/* Parse the -femit-struct-debug-detailed option value
- and set the flag variables. */
-
-#define MATCH( prefix, string ) \
- ((strncmp (prefix, string, sizeof prefix - 1) == 0) \
- ? ((string += sizeof prefix - 1), 1) : 0)
-
-void
-set_struct_debug_option (const char *spec)
-{
- /* various labels for comparison */
- static char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:";
- static char ord_lbl[] = "ord:", gen_lbl[] = "gen:";
- static char none_lbl[] = "none", any_lbl[] = "any";
- static char base_lbl[] = "base", sys_lbl[] = "sys";
-
- enum debug_struct_file files = DINFO_STRUCT_FILE_ANY;
- /* Default is to apply to as much as possible. */
- enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS;
- int ord = 1, gen = 1;
-
- /* What usage? */
- if (MATCH (dfn_lbl, spec))
- usage = DINFO_USAGE_DFN;
- else if (MATCH (dir_lbl, spec))
- usage = DINFO_USAGE_DIR_USE;
- else if (MATCH (ind_lbl, spec))
- usage = DINFO_USAGE_IND_USE;
-
- /* Generics or not? */
- if (MATCH (ord_lbl, spec))
- gen = 0;
- else if (MATCH (gen_lbl, spec))
- ord = 0;
-
- /* What allowable environment? */
- if (MATCH (none_lbl, spec))
- files = DINFO_STRUCT_FILE_NONE;
- else if (MATCH (any_lbl, spec))
- files = DINFO_STRUCT_FILE_ANY;
- else if (MATCH (sys_lbl, spec))
- files = DINFO_STRUCT_FILE_SYS;
- else if (MATCH (base_lbl, spec))
- files = DINFO_STRUCT_FILE_BASE;
- else
- error ("argument %qs to %<-femit-struct-debug-detailed%> not recognized",
- spec);
-
- /* Effect the specification. */
- if (usage == DINFO_USAGE_NUM_ENUMS)
- {
- if (ord)
- {
- debug_struct_ordinary[DINFO_USAGE_DFN] = files;
- debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files;
- debug_struct_ordinary[DINFO_USAGE_IND_USE] = files;
- }
- if (gen)
- {
- debug_struct_generic[DINFO_USAGE_DFN] = files;
- debug_struct_generic[DINFO_USAGE_DIR_USE] = files;
- debug_struct_generic[DINFO_USAGE_IND_USE] = files;
- }
- }
- else
- {
- if (ord)
- debug_struct_ordinary[usage] = files;
- if (gen)
- debug_struct_generic[usage] = files;
- }
-
- if (*spec == ',')
- set_struct_debug_option (spec+1);
- else
- {
- /* No more -femit-struct-debug-detailed specifications.
- Do final checks. */
- if (*spec != '\0')
- error ("argument %qs to %<-femit-struct-debug-detailed%> unknown",
- spec);
- if (debug_struct_ordinary[DINFO_USAGE_DIR_USE]
- < debug_struct_ordinary[DINFO_USAGE_IND_USE]
- || debug_struct_generic[DINFO_USAGE_DIR_USE]
- < debug_struct_generic[DINFO_USAGE_IND_USE])
- error ("%<-femit-struct-debug-detailed=dir:...%> must allow at least"
- " as much as %<-femit-struct-debug-detailed=ind:...%>");
- }
-}
-
-/* Find the base name of a path, stripping off both directories and
- a single final extension. */
-static int
-base_of_path (const char *path, const char **base_out)
-{
- const char *base = path;
- const char *dot = 0;
- const char *p = path;
- char c = *p;
- while (c)
- {
- if (IS_DIR_SEPARATOR(c))
- {
- base = p + 1;
- dot = 0;
- }
- else if (c == '.')
- dot = p;
- c = *++p;
- }
- if (!dot)
- dot = p;
- *base_out = base;
- return dot - base;
-}
-
-/* Match the base name of a file to the base name of a compilation unit. */
-
-static const char *main_input_basename;
-static int main_input_baselength;
-
-static int
-matches_main_base (const char *path)
-{
- /* Cache the last query. */
- static const char *last_path = NULL;
- static int last_match = 0;
- if (path != last_path)
- {
- const char *base;
- int length = base_of_path (path, &base);
- last_path = path;
- last_match = (length == main_input_baselength
- && memcmp (base, main_input_basename, length) == 0);
- }
- return last_match;
-}
-
-#ifdef DEBUG_DEBUG_STRUCT
-
-static int
-dump_struct_debug (tree type, enum debug_info_usage usage,
- enum debug_struct_file criterion, int generic,
- int matches, int result)
-{
- /* Find the type name. */
- tree type_decl = TYPE_STUB_DECL (type);
- tree t = type_decl;
- const char *name = 0;
- if (TREE_CODE (t) == TYPE_DECL)
- t = DECL_NAME (t);
- if (t)
- name = IDENTIFIER_POINTER (t);
-
- fprintf (stderr, " struct %d %s %s %s %s %d %p %s\n",
- criterion,
- DECL_IN_SYSTEM_HEADER (type_decl) ? "sys" : "usr",
- matches ? "bas" : "hdr",
- generic ? "gen" : "ord",
- usage == DINFO_USAGE_DFN ? ";" :
- usage == DINFO_USAGE_DIR_USE ? "." : "*",
- result,
- (void*) type_decl, name);
- return result;
-}
-#define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
- dump_struct_debug (type, usage, criterion, generic, matches, result)
-
-#else
-
-#define DUMP_GSTRUCT(type, usage, criterion, generic, matches, result) \
- (result)
-
-#endif
-
-
-bool
-should_emit_struct_debug (tree type, enum debug_info_usage usage)
-{
- enum debug_struct_file criterion;
- tree type_decl;
- bool generic = lang_hooks.types.generic_p (type);
-
- if (generic)
- criterion = debug_struct_generic[usage];
- else
- criterion = debug_struct_ordinary[usage];
-
- if (criterion == DINFO_STRUCT_FILE_NONE)
- return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
- if (criterion == DINFO_STRUCT_FILE_ANY)
- return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
-
- type_decl = TYPE_STUB_DECL (type);
-
- if (criterion == DINFO_STRUCT_FILE_SYS && DECL_IN_SYSTEM_HEADER (type_decl))
- return DUMP_GSTRUCT (type, usage, criterion, generic, false, true);
-
- if (matches_main_base (DECL_SOURCE_FILE (type_decl)))
- return DUMP_GSTRUCT (type, usage, criterion, generic, true, true);
- return DUMP_GSTRUCT (type, usage, criterion, generic, false, false);
-}
-
-/* Nonzero means use GNU-only extensions in the generated symbolic
- debugging information. Currently, this only has an effect when
- write_symbols is set to DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
-bool use_gnu_debug_info_extensions;
-
-/* Nonzero means use DWARF-4 extensions to the DWARF debugging format. */
-bool use_dwarf4_extensions = 0;
-
-/* The default visibility for all symbols (unless overridden) */
-enum symbol_visibility default_visibility = VISIBILITY_DEFAULT;
-
-/* Global visibility options. */
-struct visibility_flags visibility_options;
-
-/* What to print when a switch has no documentation. */
-#ifdef ENABLE_CHECKING
-static const char undocumented_msg[] = N_("This switch lacks documentation");
-#else
-static const char undocumented_msg[] = "";
-#endif
-
-/* 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;
-static bool flag_inline_functions_set, flag_ipa_cp_set, flag_ipa_cp_clone_set;
-static bool flag_predictive_commoning_set, flag_unswitch_loops_set, flag_gcse_after_reload_set;
-static bool flag_limit_hot_components_set;
-
-/* Functions excluded from profiling. */
-
-typedef char *char_p; /* For DEF_VEC_P. */
-DEF_VEC_P(char_p);
-DEF_VEC_ALLOC_P(char_p,heap);
-
-static VEC(char_p,heap) *flag_instrument_functions_exclude_functions;
-static VEC(char_p,heap) *flag_instrument_functions_exclude_files;
-
-typedef const char *const_char_p; /* For DEF_VEC_P. */
-DEF_VEC_P(const_char_p);
-DEF_VEC_ALLOC_P(const_char_p,heap);
-
-static VEC(const_char_p,heap) *ignored_options;
-
-/* Input file names. */
-const char **in_fnames;
-unsigned num_in_fnames;
-
-static int common_handle_option (size_t scode, const char *arg, int value,
- unsigned int lang_mask);
-static void handle_param (const char *);
-static void set_Wextra (int);
-static unsigned int handle_option (const char **argv, unsigned int lang_mask);
-static char *write_langs (unsigned int lang_mask);
-static void complain_wrong_lang (const char *, const struct cl_option *,
- unsigned int lang_mask);
-static void handle_options (unsigned int, const char **, unsigned int);
-static void set_debug_level (enum debug_info_type type, int extended,
- const char *arg);
-
-/* If ARG is a non-negative integer made up solely of digits, return its
- value, otherwise return -1. */
-static int
-integral_argument (const char *arg)
-{
- const char *p = arg;
-
- while (*p && ISDIGIT (*p))
- p++;
-
- if (*p == '\0')
- return atoi (arg);
-
- return -1;
-}
-
-/* Return a malloced slash-separated list of languages in MASK. */
-static char *
-write_langs (unsigned int mask)
-{
- unsigned int n = 0, len = 0;
- const char *lang_name;
- char *result;
-
- for (n = 0; (lang_name = lang_names[n]) != 0; n++)
- if (mask & (1U << n))
- len += strlen (lang_name) + 1;
-
- result = XNEWVEC (char, len);
- len = 0;
- for (n = 0; (lang_name = lang_names[n]) != 0; n++)
- if (mask & (1U << n))
- {
- if (len)
- result[len++] = '/';
- strcpy (result + len, lang_name);
- len += strlen (lang_name);
- }
-
- result[len] = 0;
-
- return result;
-}
-
-/* Complain that switch OPT_INDEX does not apply to this front end. */
-static void
-complain_wrong_lang (const char *text, const struct cl_option *option,
- unsigned int lang_mask)
-{
- char *ok_langs, *bad_lang;
-
- ok_langs = write_langs (option->flags);
- bad_lang = write_langs (lang_mask);
-
- /* Eventually this should become a hard error IMO. */
- warning (0, "command line option \"%s\" is valid for %s but not for %s",
- text, ok_langs, bad_lang);
-
- free (ok_langs);
- free (bad_lang);
-}
-
-/* Buffer the unknown option described by the string OPT. Currently,
- we only complain about unknown -Wno-* options if they may have
- prevented a diagnostic. Otherwise, we just ignore them.
- Note that if we do complain, it is only as a warning, not an error;
- passing the compiler an unrecognised -Wno-* option should never
- change whether the compilation succeeds or fails. */
-
-static void postpone_unknown_option_warning(const char *opt)
-{
- VEC_safe_push (const_char_p, heap, ignored_options, opt);
-}
-
-/* Produce a warning for each option previously buffered. */
-
-void print_ignored_options (void)
-{
- location_t saved_loc = input_location;
-
- input_location = 0;
-
- while (!VEC_empty (const_char_p, ignored_options))
- {
- const char *opt;
- opt = VEC_pop (const_char_p, ignored_options);
- warning (0, "unrecognized command line option \"%s\"", opt);
- }
-
- input_location = saved_loc;
-}
-
-/* Handle the switch beginning at ARGV for the language indicated by
- LANG_MASK. Returns the number of switches consumed. */
-static unsigned int
-handle_option (const char **argv, unsigned int lang_mask)
-{
- size_t opt_index;
- const char *opt, *arg = 0;
- char *dup = 0;
- int value = 1;
- unsigned int result = 0;
- const struct cl_option *option;
-
- opt = argv[0];
-
- opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
- if (opt_index == cl_options_count
- && (opt[1] == 'W' || opt[1] == 'f' || opt[1] == 'm')
- && opt[2] == 'n' && opt[3] == 'o' && opt[4] == '-')
- {
- /* Drop the "no-" from negative switches. */
- size_t len = strlen (opt) - 3;
-
- dup = XNEWVEC (char, len + 1);
- dup[0] = '-';
- dup[1] = opt[1];
- memcpy (dup + 2, opt + 5, len - 2 + 1);
- opt = dup;
- value = 0;
- opt_index = find_opt (opt + 1, lang_mask | CL_COMMON | CL_TARGET);
- if (opt_index == cl_options_count && opt[1] == 'W')
- {
- /* We don't generate warnings for unknown -Wno-* options
- unless we issue diagnostics. */
- postpone_unknown_option_warning (argv[0]);
- result = 1;
- goto done;
- }
- }
-
- if (opt_index == cl_options_count)
- goto done;
-
- option = &cl_options[opt_index];
-
- /* Reject negative form of switches that don't take negatives as
- unrecognized. */
- if (!value && (option->flags & CL_REJECT_NEGATIVE))
- goto done;
-
- /* We've recognized this switch. */
- result = 1;
-
- /* Check to see if the option is disabled for this configuration. */
- if (option->flags & CL_DISABLED)
- {
- error ("command line option %qs"
- " is not supported by this configuration", opt);
- goto done;
- }
-
- /* Sort out any argument the switch takes. */
- if (option->flags & CL_JOINED)
- {
- /* Have arg point to the original switch. This is because
- some code, such as disable_builtin_function, expects its
- argument to be persistent until the program exits. */
- arg = argv[0] + cl_options[opt_index].opt_len + 1;
- if (!value)
- arg += strlen ("no-");
-
- if (*arg == '\0' && !(option->flags & CL_MISSING_OK))
- {
- if (option->flags & CL_SEPARATE)
- {
- arg = argv[1];
- result = 2;
- }
- else
- /* Missing argument. */
- arg = NULL;
- }
- }
- else if (option->flags & CL_SEPARATE)
- {
- arg = argv[1];
- result = 2;
- }
-
- /* Now we've swallowed any potential argument, complain if this
- is a switch for a different front end. */
- if (!(option->flags & (lang_mask | CL_COMMON | CL_TARGET)))
- {
- complain_wrong_lang (argv[0], option, lang_mask);
- goto done;
- }
- else if ((option->flags & CL_TARGET)
- && (option->flags & CL_LANG_ALL)
- && !(option->flags & lang_mask))
- {
- /* Complain for target flag language mismatches if any languages
- are specified. */
- complain_wrong_lang (argv[0], option, lang_mask);
- goto done;
- }
-
- if (arg == NULL && (option->flags & (CL_JOINED | CL_SEPARATE)))
- {
- if (!lang_hooks.missing_argument (opt, opt_index))
- error ("missing argument to \"%s\"", opt);
- goto done;
- }
-
- /* If the switch takes an integer, convert it. */
- if (arg && (option->flags & CL_UINTEGER))
- {
- value = integral_argument (arg);
- if (value == -1)
- {
- error ("argument to \"%s\" should be a non-negative integer",
- option->opt_text);
- goto done;
- }
- }
-
- if (option->flag_var)
- switch (option->var_type)
- {
- case CLVC_BOOLEAN:
- *(int *) option->flag_var = value;
- break;
-
- case CLVC_EQUAL:
- *(int *) option->flag_var = (value
- ? option->var_value
- : !option->var_value);
- break;
-
- case CLVC_BIT_CLEAR:
- case CLVC_BIT_SET:
- if ((value != 0) == (option->var_type == CLVC_BIT_SET))
- *(int *) option->flag_var |= option->var_value;
- else
- *(int *) option->flag_var &= ~option->var_value;
- if (option->flag_var == &target_flags)
- target_flags_explicit |= option->var_value;
- break;
-
- case CLVC_STRING:
- *(const char **) option->flag_var = arg;
- break;
- }
-
- if (option->flags & lang_mask)
- if (lang_hooks.handle_option (opt_index, arg, value) == 0)
- result = 0;
-
- if (result && (option->flags & CL_COMMON))
- if (common_handle_option (opt_index, arg, value, lang_mask) == 0)
- result = 0;
-
- if (result && (option->flags & CL_TARGET))
- if (!targetm.handle_option (opt_index, arg, value))
- result = 0;
-
- done:
- if (dup)
- free (dup);
- return result;
-}
-
-/* Handle FILENAME from the command line. */
-void
-add_input_filename (const char *filename)
-{
- num_in_fnames++;
- in_fnames = XRESIZEVEC (const char *, in_fnames, num_in_fnames);
- in_fnames[num_in_fnames - 1] = filename;
-}
-
-/* Add comma-separated strings to a char_p vector. */
-
-static void
-add_comma_separated_to_vector (VEC(char_p,heap) **pvec, const char* arg)
-{
- char *tmp;
- char *r;
- char *w;
- char *token_start;
-
- /* We never free this string. */
- tmp = xstrdup (arg);
-
- r = tmp;
- w = tmp;
- token_start = tmp;
-
- while (*r != '\0')
- {
- if (*r == ',')
- {
- *w++ = '\0';
- ++r;
- VEC_safe_push (char_p, heap, *pvec, token_start);
- token_start = w;
- }
- if (*r == '\\' && r[1] == ',')
- {
- *w++ = ',';
- r += 2;
- }
- else
- *w++ = *r++;
- }
- if (*token_start != '\0')
- VEC_safe_push (char_p, heap, *pvec, token_start);
-}
-
-/* Return whether we should exclude FNDECL from instrumentation. */
-
-bool
-flag_instrument_functions_exclude_p (tree fndecl)
-{
- if (VEC_length (char_p, flag_instrument_functions_exclude_functions) > 0)
- {
- const char *name;
- int i;
- char *s;
-
- name = lang_hooks.decl_printable_name (fndecl, 0);
- for (i = 0;
- VEC_iterate (char_p, flag_instrument_functions_exclude_functions,
- i, s);
- ++i)
- {
- if (strstr (name, s) != NULL)
- return true;
- }
- }
-
- if (VEC_length (char_p, flag_instrument_functions_exclude_files) > 0)
- {
- const char *name;
- int i;
- char *s;
-
- name = DECL_SOURCE_FILE (fndecl);
- for (i = 0;
- VEC_iterate (char_p, flag_instrument_functions_exclude_files, i, s);
- ++i)
- {
- if (strstr (name, s) != NULL)
- return true;
- }
- }
-
- return false;
-}
-
-/* GCC command-line options saved to the LIPO profile data file.
- See detailed comment in opts.h. */
-const char **lipo_cl_args;
-unsigned num_lipo_cl_args;
-
-/* Inspect the given GCC command-line arguments, which are part of one GCC
- switch, and decide whether or not to store these to the LIPO profile data
- file. */
-static void
-lipo_save_cl_args (unsigned int argc, const char **argv)
-{
- unsigned int i;
- const char *opt = argv[0];
- /* Store the following command-line flags to the lipo profile data file:
- (1) -f... (except -frandom-seed...)
- (2) -m...
- (3) -W...
- (4) -O...
- (5) --param...
- */
- if (opt[0] == '-'
- && (opt[1] == 'f' || opt[1] == 'm' || opt[1] == 'W' || opt[1] == 'O'
- || (strstr (opt, "--param") == opt))
- && !strstr(opt, "-frandom-seed")
- && !strstr(opt, "-fripa-disallow-opt-mismatch")
- && !strstr(opt, "-Wripa-opt-mismatch"))
- {
- num_lipo_cl_args += argc;
- lipo_cl_args = XRESIZEVEC (const char *, lipo_cl_args, num_lipo_cl_args);
- for (i = 0; i < argc; i++)
- lipo_cl_args[num_lipo_cl_args - argc + i] = argv[i];
- }
-}
-
-/* Decode and handle the vector of command line options. LANG_MASK
- contains has a single bit set representing the current
- language. */
-static void
-handle_options (unsigned int argc, const char **argv, unsigned int lang_mask)
-{
- unsigned int n, i;
- int force_multi_module = 0;
- static int cur_mod_id = 0;
-
- force_multi_module = PARAM_VALUE (PARAM_FORCE_LIPO_MODE);
-
- for (i = 1; i < argc; i += n)
- {
- const char *opt = argv[i];
-
- /* Interpret "-" or a non-switch as a file name. */
- if (opt[0] != '-' || opt[1] == '\0')
- {
- if (main_input_filename == NULL)
- {
- main_input_filename = opt;
- main_input_baselength
- = base_of_path (main_input_filename, &main_input_basename);
- }
- add_input_filename (opt);
- if (force_multi_module)
- add_module_info (++cur_mod_id, (num_in_fnames == 1), num_in_fnames - 1);
- n = 1;
- continue;
- }
-
- n = handle_option (argv + i, lang_mask);
-
- lipo_save_cl_args (n, argv + i);
-
- if (!n)
- {
- n = 1;
- error ("unrecognized command line option \"%s\"", opt);
- }
- }
-}
-
-/* Parse command line options and set default flag values. Do minimal
- options processing. */
-void
-decode_options (unsigned int argc, const char **argv)
-{
- static bool first_time_p = true;
- static int initial_max_aliased_vops;
- static int initial_avg_aliased_vops;
- static int initial_min_crossjump_insns;
- static int initial_max_fields_for_field_sensitive;
- static int initial_loop_invariant_max_bbs_in_loop;
- static unsigned int initial_lang_mask;
-
- unsigned int i, lang_mask;
- int opt1;
- int opt2;
- int opt3;
- int opt1_max;
-
- if (first_time_p)
- {
- /* Perform language-specific options initialization. */
- initial_lang_mask = lang_mask = lang_hooks.init_options (argc, argv);
-
- lang_hooks.initialize_diagnostics (global_dc);
-
- /* Save initial values of parameters we reset. */
- initial_max_aliased_vops = MAX_ALIASED_VOPS;
- initial_avg_aliased_vops = AVG_ALIASED_VOPS;
- initial_min_crossjump_insns
- = compiler_params[PARAM_MIN_CROSSJUMP_INSNS].value;
- initial_max_fields_for_field_sensitive
- = compiler_params[PARAM_MAX_FIELDS_FOR_FIELD_SENSITIVE].value;
- initial_loop_invariant_max_bbs_in_loop
- = compiler_params[PARAM_LOOP_INVARIANT_MAX_BBS_IN_LOOP].value;
- }
- else
- lang_mask = initial_lang_mask;
-
- /* Scan to see what optimization level has been specified. That will
- determine the default value of many flags. */
- for (i = 1; i < argc; i++)
- {
- if (!strcmp (argv[i], "-O"))
- {
- optimize = 1;
- optimize_size = 0;
- }
- else if (argv[i][0] == '-' && argv[i][1] == 'O')
- {
- /* Handle -Os, -O2, -O3, -O69, ... */
- const char *p = &argv[i][2];
-
- if ((p[0] == 's') && (p[1] == 0))
- {
- optimize_size = 1;
-
- /* Optimizing for size forces optimize to be 2. */
- optimize = 2;
- }
- else
- {
- const int optimize_val = read_integral_parameter (p, p - 2, -1);
- if (optimize_val != -1)
- {
- optimize = optimize_val;
- optimize_size = 0;
- }
- }
- }
- }
-
- /* Use priority coloring if cover classes is not defined for the
- target. */
- if (targetm.ira_cover_classes == NULL)
- flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
-
- /* -O1 optimizations. */
- opt1 = (optimize >= 1);
- flag_defer_pop = opt1;
-#ifdef DELAY_SLOTS
- flag_delayed_branch = opt1;
-#endif
-#ifdef CAN_DEBUG_WITHOUT_FP
- flag_omit_frame_pointer = opt1;
-#endif
- flag_guess_branch_prob = opt1;
- flag_cprop_registers = opt1;
- flag_if_conversion = opt1;
- flag_if_conversion2 = opt1;
- flag_ipa_pure_const = opt1;
- flag_ipa_reference = opt1;
- flag_merge_constants = opt1;
- flag_split_wide_types = opt1;
- flag_tree_ccp = opt1;
- flag_tree_dce = opt1;
- flag_tree_dom = opt1;
- flag_tree_dse = opt1;
- flag_tree_ter = opt1;
- flag_tree_sra = opt1;
- flag_tree_copyrename = opt1;
- flag_tree_fre = opt1;
- flag_tree_copy_prop = opt1;
- flag_tree_sink = opt1;
- flag_tree_ch = opt1;
-
- /* -O2 optimizations. */
- opt2 = (optimize >= 2);
- flag_inline_small_functions = opt2;
- flag_indirect_inlining = opt2;
- flag_thread_jumps = opt2;
- flag_crossjumping = opt2;
- flag_optimize_sibling_calls = opt2;
- flag_forward_propagate = opt2;
- flag_cse_follow_jumps = opt2;
- flag_gcse = opt2;
- flag_expensive_optimizations = opt2;
- flag_rerun_cse_after_loop = opt2;
- flag_caller_saves = opt2;
- flag_peephole2 = opt2;
-#ifdef INSN_SCHEDULING
- flag_schedule_insns = opt2;
- flag_schedule_insns_after_reload = opt2;
-#endif
- flag_regmove = opt2;
- flag_strict_aliasing = opt2;
- flag_strict_overflow = opt2;
- flag_delete_null_pointer_checks = opt2;
- flag_reorder_blocks = opt2;
- flag_reorder_functions = opt2;
- flag_tree_vrp = opt2;
- flag_tree_builtin_call_dce = opt2;
- flag_tree_pre = opt2;
- flag_tree_switch_conversion = 1;
- flag_ipa_cp = opt2;
- flag_tree_lr_shrinking = opt2;
-
- /* Allow more virtual operators to increase alias precision. */
-
- set_param_value ("max-aliased-vops",
- (opt2) ? 500 : initial_max_aliased_vops);
-
- /* Track fields in field-sensitive alias analysis. */
- set_param_value ("max-fields-for-field-sensitive",
- (opt2) ? 100 : initial_max_fields_for_field_sensitive);
-
- /* For -O1 only do loop invariant motion for very small loops. */
- set_param_value ("loop-invariant-max-bbs-in-loop",
- (opt2) ? initial_loop_invariant_max_bbs_in_loop : 1000);
-
- /* -O3 optimizations. */
- opt3 = (optimize >= 3);
- flag_predictive_commoning = opt3;
- flag_inline_functions = opt3;
- flag_unswitch_loops = opt3;
- flag_gcse_after_reload = opt3;
- flag_tree_vectorize = opt3;
- flag_ipa_cp_clone = opt3;
- if (flag_ipa_cp_clone)
- flag_ipa_cp = 1;
-
- /* Allow even more virtual operators. Max-aliased-vops was set above for
- -O2, so don't reset it unless we are at -O3. */
- if (opt3)
- set_param_value ("max-aliased-vops", 1000);
-
- set_param_value ("avg-aliased-vops", (opt3) ? 3 : initial_avg_aliased_vops);
-
- /* Just -O1/-O0 optimizations. */
- opt1_max = (optimize <= 1);
- align_loops = opt1_max;
- align_jumps = opt1_max;
- align_labels = opt1_max;
- align_functions = opt1_max;
-
- if (optimize_size)
- {
- /* Inlining of functions reducing size is a good idea regardless of them
- being declared inline. */
- flag_inline_functions = 1;
-
- /* Basic optimization options. */
- optimize_size = 1;
- if (optimize > 2)
- optimize = 2;
-
- /* We want to crossjump as much as possible. */
- set_param_value ("min-crossjump-insns", 1);
- }
- else
- set_param_value ("min-crossjump-insns", initial_min_crossjump_insns);
-
- if (first_time_p)
- {
- /* Initialize whether `char' is signed. */
- flag_signed_char = DEFAULT_SIGNED_CHAR;
- /* 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. */
- target_flags = targetm.default_target_flags;
-
- /* Some targets have ABI-specified unwind tables. */
- flag_unwind_tables = targetm.unwind_tables_default;
- }
-
-#ifdef OPTIMIZATION_OPTIONS
- /* Allow default optimizations to be specified on a per-machine basis. */
- OPTIMIZATION_OPTIONS (optimize, optimize_size);
-#endif
-
- 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))
- {
- 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;
- }
- }
-
- /* Handle related options for unit-at-a-time, toplevel-reorder, and
- section-anchors. */
- if (!flag_unit_at_a_time)
- {
- if (flag_section_anchors == 1)
- error ("Section anchors must be disabled when unit-at-a-time "
- "is disabled.");
- flag_section_anchors = 0;
- if (flag_toplevel_reorder == 1)
- error ("Toplevel reorder must be disabled when unit-at-a-time "
- "is disabled.");
- flag_toplevel_reorder = 0;
- }
- /* Unless the user has asked for section anchors, we disable toplevel
- reordering at -O0 to disable transformations that might be surprising
- to end users and to get -fno-toplevel-reorder tested. */
- if (!optimize && flag_toplevel_reorder == 2 && flag_section_anchors != 1)
- {
- flag_toplevel_reorder = 0;
- flag_section_anchors = 0;
- }
- if (!flag_toplevel_reorder)
- {
- if (flag_section_anchors == 1)
- error ("section anchors must be disabled when toplevel reorder"
- " is disabled");
- flag_section_anchors = 0;
- }
-
- if (first_time_p)
- {
- if (flag_pie)
- flag_pic = flag_pie;
- if (flag_pic && !flag_pie)
- flag_shlib = 1;
- }
-
- if (optimize == 0)
- {
- /* Inlining does not work if not optimizing,
- so force it not to be done. */
- warn_inline = 0;
- flag_no_inline = 1;
- }
-
- /* 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. This is because there is no support for
- generating unwind info. If flag_exceptions is turned on we need to
- turn off the partitioning optimization. */
-
- if (flag_exceptions && flag_reorder_blocks_and_partition)
- {
- inform (input_location,
- "-freorder-blocks-and-partition does not work with exceptions");
- flag_reorder_blocks_and_partition = 0;
- flag_reorder_blocks = 1;
- }
-
- /* If user requested unwind info, then turn off the partitioning
- optimization. */
-
- if (flag_unwind_tables && ! targetm.unwind_tables_default
- && flag_reorder_blocks_and_partition)
- {
- inform (input_location, "-freorder-blocks-and-partition does not support unwind info");
- flag_reorder_blocks_and_partition = 0;
- flag_reorder_blocks = 1;
- }
-
- /* If the target requested unwind info, then turn off the partitioning
- optimization with a different message. Likewise, if the target does not
- support named sections. */
-
- if (flag_reorder_blocks_and_partition
- && (!targetm.have_named_sections
- || (flag_unwind_tables && targetm.unwind_tables_default)))
- {
- inform (input_location,
- "-freorder-blocks-and-partition does not work on this architecture");
- flag_reorder_blocks_and_partition = 0;
- flag_reorder_blocks = 1;
- }
-
- /* Pipelining of outer loops is only possible when general pipelining
- capabilities are requested. */
- if (!flag_sel_sched_pipelining)
- flag_sel_sched_pipelining_outer_loops = 0;
-
- if (!targetm.ira_cover_classes
- && flag_ira_algorithm == IRA_ALGORITHM_CB)
- {
- inform (input_location,
- "-fira-algorithm=CB does not work on this architecture");
- 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))
- PARAM_VALUE (PARAM_LARGE_STACK_FRAME) = 100;
- if (!PARAM_SET_P (PARAM_STACK_FRAME_GROWTH))
- PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) = 40;
- }
-
-}
-
-#define LEFT_COLUMN 27
-
-/* Output ITEM, of length ITEM_WIDTH, in the left column,
- followed by word-wrapped HELP in a second column. */
-static void
-wrap_help (const char *help,
- const char *item,
- unsigned int item_width,
- unsigned int columns)
-{
- unsigned int col_width = LEFT_COLUMN;
- unsigned int remaining, room, len;
-
- remaining = strlen (help);
-
- do
- {
- room = columns - 3 - MAX (col_width, item_width);
- if (room > columns)
- room = 0;
- len = remaining;
-
- if (room < len)
- {
- unsigned int i;
-
- for (i = 0; help[i]; i++)
- {
- if (i >= room && len != remaining)
- break;
- if (help[i] == ' ')
- len = i;
- else if ((help[i] == '-' || help[i] == '/')
- && help[i + 1] != ' '
- && i > 0 && ISALPHA (help[i - 1]))
- len = i + 1;
- }
- }
-
- printf( " %-*.*s %.*s\n", col_width, item_width, item, len, help);
- item_width = 0;
- while (help[len] == ' ')
- len++;
- help += len;
- remaining -= len;
- }
- while (remaining);
-}
-
-/* Print help for a specific front-end, etc. */
-static void
-print_filtered_help (unsigned int include_flags,
- unsigned int exclude_flags,
- unsigned int any_flags,
- unsigned int columns)
-{
- unsigned int i;
- const char *help;
- static char *printed = NULL;
- bool found = false;
- bool displayed = false;
-
- if (include_flags == CL_PARAMS)
- {
- for (i = 0; i < LAST_PARAM; i++)
- {
- const char *param = compiler_params[i].option;
-
- help = compiler_params[i].help;
- if (help == NULL || *help == '\0')
- {
- if (exclude_flags & CL_UNDOCUMENTED)
- continue;
- help = undocumented_msg;
- }
-
- /* Get the translation. */
- help = _(help);
-
- wrap_help (help, param, strlen (param), columns);
- }
- putchar ('\n');
- return;
- }
-
- if (!printed)
- printed = XCNEWVAR (char, cl_options_count);
-
- for (i = 0; i < cl_options_count; i++)
- {
- static char new_help[128];
- const struct cl_option *option = cl_options + i;
- unsigned int len;
- const char *opt;
- const char *tab;
-
- if (include_flags == 0
- || ((option->flags & include_flags) != include_flags))
- {
- if ((option->flags & any_flags) == 0)
- continue;
- }
-
- /* Skip unwanted switches. */
- if ((option->flags & exclude_flags) != 0)
- continue;
-
- found = true;
- /* Skip switches that have already been printed. */
- if (printed[i])
- continue;
-
- printed[i] = true;
-
- help = option->help;
- if (help == NULL)
- {
- if (exclude_flags & CL_UNDOCUMENTED)
- continue;
- help = undocumented_msg;
- }
-
- /* Get the translation. */
- help = _(help);
-
- /* Find the gap between the name of the
- option and its descriptive text. */
- tab = strchr (help, '\t');
- if (tab)
- {
- len = tab - help;
- opt = help;
- help = tab + 1;
- }
- else
- {
- opt = option->opt_text;
- len = strlen (opt);
- }
-
- /* With the -Q option enabled we change the descriptive text associated
- with an option to be an indication of its current setting. */
- if (!quiet_flag)
- {
- if (len < (LEFT_COLUMN + 2))
- strcpy (new_help, "\t\t");
- else
- strcpy (new_help, "\t");
-
- if (option->flag_var != NULL)
- {
- if (option->flags & CL_JOINED)
- {
- if (option->var_type == CLVC_STRING)
- {
- if (* (const char **) option->flag_var != NULL)
- snprintf (new_help + strlen (new_help),
- sizeof (new_help) - strlen (new_help),
- * (const char **) option->flag_var);
- }
- else
- sprintf (new_help + strlen (new_help),
- "%#x", * (int *) option->flag_var);
- }
- else
- strcat (new_help, option_enabled (i)
- ? _("[enabled]") : _("[disabled]"));
- }
-
- help = new_help;
- }
-
- wrap_help (help, opt, len, columns);
- displayed = true;
- }
-
- if (! found)
- {
- unsigned int langs = include_flags & CL_LANG_ALL;
-
- if (langs == 0)
- printf (_(" No options with the desired characteristics were found\n"));
- else
- {
- unsigned int i;
-
- /* PR 31349: Tell the user how to see all of the
- options supported by a specific front end. */
- for (i = 0; (1U << i) < CL_LANG_ALL; i ++)
- if ((1U << i) & langs)
- 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"));
-
- putchar ('\n');
-}
-
-/* Display help for a specified type of option.
- The options must have ALL of the INCLUDE_FLAGS set
- ANY of the flags in the ANY_FLAGS set
- and NONE of the EXCLUDE_FLAGS set. */
-static void
-print_specific_help (unsigned int include_flags,
- unsigned int exclude_flags,
- unsigned int any_flags)
-{
- unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
- const char * description = NULL;
- const char * descrip_extra = "";
- size_t i;
- unsigned int flag;
- static unsigned int columns = 0;
-
- /* Sanity check: Make sure that we do not have more
- languages than we have bits available to enumerate them. */
- gcc_assert ((1U << cl_lang_count) < CL_MIN_OPTION_CLASS);
-
- /* If we have not done so already, obtain
- the desired maximum width of the output. */
- if (columns == 0)
- {
- const char *p;
-
- GET_ENVIRONMENT (p, "COLUMNS");
- if (p != NULL)
- {
- int value = atoi (p);
-
- if (value > 0)
- columns = value;
- }
-
- if (columns == 0)
- /* Use a reasonable default. */
- columns = 80;
- }
-
- /* Decide upon the title for the options that we are going to display. */
- for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++)
- {
- switch (flag & include_flags)
- {
- case 0:
- break;
-
- case CL_TARGET:
- description = _("The following options are target specific");
- break;
- case CL_WARNING:
- description = _("The following options control compiler warning messages");
- break;
- case CL_OPTIMIZATION:
- description = _("The following options control optimizations");
- break;
- case CL_COMMON:
- description = _("The following options are language-independent");
- break;
- case CL_PARAMS:
- description = _("The --param option recognizes the following as parameters");
- break;
- default:
- if (i >= cl_lang_count)
- break;
- if (exclude_flags & all_langs_mask)
- description = _("The following options are specific to just the language ");
- else
- description = _("The following options are supported by the language ");
- descrip_extra = lang_names [i];
- break;
- }
- }
-
- if (description == NULL)
- {
- if (any_flags == 0)
- {
- if (include_flags & CL_UNDOCUMENTED)
- description = _("The following options are not documented");
- else if (include_flags & CL_SEPARATE)
- description = _("The following options take separate arguments");
- else if (include_flags & CL_JOINED)
- description = _("The following options take joined arguments");
- else
- {
- internal_error ("unrecognized include_flags 0x%x passed to print_specific_help",
- include_flags);
- return;
- }
- }
- else
- {
- if (any_flags & all_langs_mask)
- description = _("The following options are language-related");
- else
- description = _("The following options are language-independent");
- }
- }
-
- printf ("%s%s:\n", description, descrip_extra);
- print_filtered_help (include_flags, exclude_flags, any_flags, columns);
-}
-
-/* Handle target- and language-independent options. Return zero to
- generate an "unknown option" message. Only options that need
- extra handling need to be listed here; if you simply want
- VALUE assigned to a variable, it happens automatically. */
-
-static int
-common_handle_option (size_t scode, const char *arg, int value,
- unsigned int lang_mask)
-{
- static bool verbose = false;
- enum opt_code code = (enum opt_code) scode;
-
- switch (code)
- {
- case OPT__param:
- handle_param (arg);
- break;
-
- case OPT_v:
- verbose = true;
- break;
-
- case OPT_fhelp:
- case OPT__help:
- {
- unsigned int all_langs_mask = (1U << cl_lang_count) - 1;
- unsigned int undoc_mask;
- unsigned int i;
-
- undoc_mask = (verbose | extra_warnings) ? 0 : CL_UNDOCUMENTED;
- /* First display any single language specific options. */
- for (i = 0; i < cl_lang_count; i++)
- print_specific_help
- (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0);
- /* Next display any multi language specific options. */
- print_specific_help (0, undoc_mask, all_langs_mask);
- /* Then display any remaining, non-language options. */
- for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1)
- print_specific_help (i, undoc_mask, 0);
- exit_after_options = true;
- break;
- }
-
- case OPT_ftarget_help:
- case OPT__target_help:
- print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0);
- exit_after_options = true;
-
- /* Allow the target a chance to give the user some additional information. */
- if (targetm.target_help)
- targetm.target_help ();
- break;
-
- case OPT_fhelp_:
- case OPT__help_:
- {
- const char * a = arg;
- unsigned int include_flags = 0;
- /* Note - by default we include undocumented options when listing
- specific classes. If you only want to see documented options
- then add ",^undocumented" to the --help= option. E.g.:
-
- --help=target,^undocumented */
- unsigned int exclude_flags = 0;
-
- /* Walk along the argument string, parsing each word in turn.
- The format is:
- arg = [^]{word}[,{arg}]
- word = {optimizers|target|warnings|undocumented|
- params|common|<language>} */
- while (* a != 0)
- {
- static struct
- {
- const char * string;
- unsigned int flag;
- }
- specifics[] =
- {
- { "optimizers", CL_OPTIMIZATION },
- { "target", CL_TARGET },
- { "warnings", CL_WARNING },
- { "undocumented", CL_UNDOCUMENTED },
- { "params", CL_PARAMS },
- { "joined", CL_JOINED },
- { "separate", CL_SEPARATE },
- { "common", CL_COMMON },
- { NULL, 0 }
- };
- unsigned int * pflags;
- char * comma;
- unsigned int lang_flag, specific_flag;
- unsigned int len;
- unsigned int i;
-
- if (* a == '^')
- {
- ++ a;
- pflags = & exclude_flags;
- }
- else
- pflags = & include_flags;
-
- comma = strchr (a, ',');
- if (comma == NULL)
- len = strlen (a);
- else
- len = comma - a;
- if (len == 0)
- {
- a = comma + 1;
- continue;
- }
-
- /* Check to see if the string matches an option class name. */
- for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++)
- if (strncasecmp (a, specifics[i].string, len) == 0)
- {
- specific_flag = specifics[i].flag;
- break;
- }
-
- /* Check to see if the string matches a language name.
- Note - we rely upon the alpha-sorted nature of the entries in
- the lang_names array, specifically that shorter names appear
- before their longer variants. (i.e. C before C++). That way
- when we are attempting to match --help=c for example we will
- match with C first and not C++. */
- for (i = 0, lang_flag = 0; i < cl_lang_count; i++)
- if (strncasecmp (a, lang_names[i], len) == 0)
- {
- lang_flag = 1U << i;
- break;
- }
-
- if (specific_flag != 0)
- {
- if (lang_flag == 0)
- * pflags |= specific_flag;
- else
- {
- /* The option's argument matches both the start of a
- language name and the start of an option class name.
- We have a special case for when the user has
- specified "--help=c", but otherwise we have to issue
- a warning. */
- if (strncasecmp (a, "c", len) == 0)
- * pflags |= lang_flag;
- else
- fnotice (stderr,
- "warning: --help argument %.*s is ambiguous, please be more specific\n",
- len, a);
- }
- }
- else if (lang_flag != 0)
- * pflags |= lang_flag;
- else
- fnotice (stderr,
- "warning: unrecognized argument to --help= option: %.*s\n",
- len, a);
-
- if (comma == NULL)
- break;
- a = comma + 1;
- }
-
- if (include_flags)
- print_specific_help (include_flags, exclude_flags, 0);
- exit_after_options = true;
- break;
- }
-
- case OPT_fversion:
- case OPT__version:
- exit_after_options = true;
- break;
-
- case OPT_G:
- g_switch_value = value;
- g_switch_set = true;
- break;
-
- case OPT_O:
- case OPT_Os:
- /* Currently handled in a prescan. */
- break;
-
- case OPT_W:
- /* For backward compatibility, -W is the same as -Wextra. */
- set_Wextra (value);
- break;
-
- case OPT_Werror_:
- enable_warning_as_error (arg, value, lang_mask);
- break;
-
- case OPT_Wextra:
- set_Wextra (value);
- break;
-
- case OPT_Wlarger_than_:
- /* 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:
- larger_than_size = value;
- warn_larger_than = value != -1;
- break;
-
- case OPT_Wframe_larger_than_:
- frame_larger_than_size = value;
- warn_frame_larger_than = value != -1;
- break;
-
- case OPT_Wstrict_aliasing:
- set_Wstrict_aliasing (value);
- break;
-
- case OPT_Wstrict_aliasing_:
- warn_strict_aliasing = value;
- break;
-
- case OPT_Wstrict_overflow:
- warn_strict_overflow = (value
- ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL
- : 0);
- break;
-
- case OPT_Wstrict_overflow_:
- warn_strict_overflow = value;
- break;
-
- case OPT_Wunused:
- warn_unused = value;
- break;
-
- case OPT_aux_info:
- case OPT_aux_info_:
- aux_info_file_name = arg;
- flag_gen_aux_info = 1;
- break;
-
- case OPT_auxbase:
- aux_base_name = arg;
- break;
-
- case OPT_auxbase_strip:
- {
- char *tmp = xstrdup (arg);
- strip_off_ending (tmp, strlen (tmp));
- if (tmp[0])
- aux_base_name = tmp;
- }
- break;
-
- case OPT_d:
- decode_d_option (arg);
- break;
-
- case OPT_dumpbase:
- dump_base_name = arg;
- break;
-
- case OPT_falign_functions_:
- align_functions = value;
- break;
-
- case OPT_falign_jumps_:
- align_jumps = value;
- break;
-
- case OPT_falign_labels_:
- align_labels = value;
- break;
-
- case OPT_falign_loops_:
- align_loops = value;
- break;
-
- case OPT_fbranch_probabilities:
- flag_branch_probabilities_set = true;
- break;
-
- case OPT_fcall_used_:
- fix_register (arg, 0, 1);
- break;
-
- case OPT_fcall_saved_:
- fix_register (arg, 0, 0);
- break;
-
- case OPT_fdbg_cnt_:
- dbg_cnt_process_opt (arg);
- break;
-
- case OPT_fdbg_cnt_list:
- dbg_cnt_list_all_counters ();
- break;
-
- case OPT_fdebug_prefix_map_:
- add_debug_prefix_map (arg);
- break;
-
- case OPT_fdiagnostics_show_location_:
- if (!strcmp (arg, "once"))
- diagnostic_prefixing_rule (global_dc) = DIAGNOSTICS_SHOW_PREFIX_ONCE;
- else if (!strcmp (arg, "every-line"))
- diagnostic_prefixing_rule (global_dc)
- = DIAGNOSTICS_SHOW_PREFIX_EVERY_LINE;
- else
- return 0;
- break;
-
- case OPT_fdiagnostics_show_option:
- global_dc->show_option_requested = true;
- break;
-
- case OPT_fdump_:
- if (!dump_switch_p (arg))
- return 0;
- break;
-
- case OPT_ffast_math:
- set_fast_math_flags (value);
- break;
-
- case OPT_funsafe_math_optimizations:
- set_unsafe_math_optimizations_flags (value);
- break;
-
- case OPT_ffixed_:
- fix_register (arg, 1, 1);
- break;
-
- case OPT_finline_limit_:
- case OPT_finline_limit_eq:
- set_param_value ("max-inline-insns-single", value / 2);
- set_param_value ("max-inline-insns-auto", value / 2);
- break;
-
- case OPT_finline_plan_:
- {
- const char *p, *q;
- struct inline_plan_file *plan =
- XCNEW (struct inline_plan_file);
-
- /* Inline plan option has the form
- -finline-plan-<pass>=<file>. */
- for (p = arg; *p; p++)
- if (*p == '=')
- {
- /* Everything up to but not including the '=' is the
- pass name. */
- plan->pass_name = XNEWVEC(char, p - arg + 1);
- memcpy (plan->pass_name, arg, p - arg);
- plan->pass_name[q - arg] = 0;
- /* Everything after the '=' is the file name. */
- plan->filename = xstrdup (p + 1);
- }
- if (!plan->pass_name)
- error ("plan should be of form -finline-plan-<pass>=<file>");
- plan->next = inline_plan_files;
- inline_plan_files = plan;
- }
- break;
- case OPT_finstrument_functions_exclude_function_list_:
- add_comma_separated_to_vector
- (&flag_instrument_functions_exclude_functions, arg);
- break;
-
- case OPT_finstrument_functions_exclude_file_list_:
- add_comma_separated_to_vector
- (&flag_instrument_functions_exclude_files, arg);
- break;
-
- case OPT_fmessage_length_:
- pp_set_line_maximum_length (global_dc->printer, value);
- break;
-
- case OPT_fpack_struct_:
- if (value <= 0 || (value & (value - 1)) || value > 16)
- error ("structure alignment must be a small power of two, not %d", value);
- else
- {
- initial_max_fld_align = value;
- maximum_field_alignment = value * BITS_PER_UNIT;
- }
- break;
-
- case OPT_fpeel_loops:
- flag_peel_loops_set = true;
- break;
-
- case OPT_fplugin_:
-#ifdef ENABLE_PLUGIN
- add_new_plugin (arg);
-#else
- error ("Plugin support is disabled. Configure with --enable-plugin.");
-#endif
- break;
-
- case OPT_fplugin_arg_:
-#ifdef ENABLE_PLUGIN
- parse_plugin_arg_opt (arg);
-#else
- error ("Plugin support is disabled. Configure with --enable-plugin.");
-#endif
- break;
-
- case OPT_fprofile_arcs:
- profile_arc_flag_set = true;
- break;
-
- case OPT_finline_functions:
- flag_inline_functions_set = true;
- break;
-
- case OPT_fprofile_dir_:
- profile_data_prefix = xstrdup (arg);
- break;
-
- case OPT_fprofile_use_:
- profile_data_prefix = xstrdup (arg);
- value = true;
- /* No break here - do -fprofile-use processing. */
- case OPT_fprofile_use:
- set_profile_use (value, false, false);
- break;
-
- case OPT_fprofile_generate_:
- profile_data_prefix = xstrdup (arg);
- value = true;
- /* No break here - do -fprofile-generate processing. */
- 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;
- if (!flag_inline_functions_set)
- flag_inline_functions = value;
- break;
-
- case OPT_fprofile_values:
- flag_profile_values_set = true;
- break;
-
- case OPT_fsample_profile_:
- flag_sample_profile = true;
- sample_data_name = xstrdup (arg);
- /* No break here - do -fsample-profile processing. */
- case OPT_fsample_profile:
- set_profile_use (value, true, false);
- break;
-
- case OPT_fvisibility_:
- {
- if (!strcmp(arg, "default"))
- default_visibility = VISIBILITY_DEFAULT;
- else if (!strcmp(arg, "internal"))
- default_visibility = VISIBILITY_INTERNAL;
- else if (!strcmp(arg, "hidden"))
- default_visibility = VISIBILITY_HIDDEN;
- else if (!strcmp(arg, "protected"))
- default_visibility = VISIBILITY_PROTECTED;
- else
- error ("unrecognized visibility value \"%s\"", arg);
- }
- break;
-
- case OPT_fvpt:
- flag_value_profile_transformations_set = true;
- break;
-
- case OPT_frandom_seed:
- /* The real switch is -fno-random-seed. */
- if (value)
- return 0;
- set_random_seed (NULL);
- break;
-
- case OPT_frandom_seed_:
- set_random_seed (arg);
- break;
-
- case OPT_fselective_scheduling:
- case OPT_fselective_scheduling2:
- sel_sched_switch_set = true;
- break;
-
- case OPT_fsched_verbose_:
-#ifdef INSN_SCHEDULING
- fix_sched_param ("verbose", arg);
- break;
-#else
- return 0;
-#endif
-
- case OPT_fsched_stalled_insns_:
- flag_sched_stalled_insns = value;
- if (flag_sched_stalled_insns == 0)
- flag_sched_stalled_insns = -1;
- break;
-
- case OPT_fsched_stalled_insns_dep_:
- flag_sched_stalled_insns_dep = value;
- break;
-
- case OPT_fsample_profile_aggregate_using_:
- if (!strcmp (arg, "avg"))
- flag_sample_profile_aggregate_using = SAMPLE_PROFILE_AGGREGATE_USING_AVG;
- else if (!strcmp (arg, "max"))
- flag_sample_profile_aggregate_using = SAMPLE_PROFILE_AGGREGATE_USING_MAX;
- else
- warning (0, "unknown sample profile aggregation method \"%s\"", arg);
- break;
-
- case OPT_fstack_check_:
- if (!strcmp (arg, "no"))
- flag_stack_check = NO_STACK_CHECK;
- else if (!strcmp (arg, "generic"))
- /* This is the old stack checking method. */
- flag_stack_check = STACK_CHECK_BUILTIN
- ? FULL_BUILTIN_STACK_CHECK
- : GENERIC_STACK_CHECK;
- else if (!strcmp (arg, "specific"))
- /* This is the new stack checking method. */
- flag_stack_check = STACK_CHECK_BUILTIN
- ? FULL_BUILTIN_STACK_CHECK
- : STACK_CHECK_STATIC_BUILTIN
- ? STATIC_BUILTIN_STACK_CHECK
- : GENERIC_STACK_CHECK;
- else
- warning (0, "unknown stack check parameter \"%s\"", arg);
- break;
-
- case OPT_fstack_check:
- /* This is the same as the "specific" mode above. */
- if (value)
- flag_stack_check = STACK_CHECK_BUILTIN
- ? FULL_BUILTIN_STACK_CHECK
- : STACK_CHECK_STATIC_BUILTIN
- ? STATIC_BUILTIN_STACK_CHECK
- : GENERIC_STACK_CHECK;
- else
- flag_stack_check = NO_STACK_CHECK;
- break;
-
- case OPT_fstack_limit:
- /* The real switch is -fno-stack-limit. */
- if (value)
- return 0;
- stack_limit_rtx = NULL_RTX;
- break;
-
- case OPT_fstack_limit_register_:
- {
- int reg = decode_reg_name (arg);
- if (reg < 0)
- error ("unrecognized register name \"%s\"", arg);
- else
- stack_limit_rtx = gen_rtx_REG (Pmode, reg);
- }
- break;
-
- case OPT_fstack_limit_symbol_:
- stack_limit_rtx = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (arg));
- break;
-
- case OPT_ftree_vectorizer_verbose_:
- vect_set_verbosity_level (arg);
- break;
-
- case OPT_ftls_model_:
- if (!strcmp (arg, "global-dynamic"))
- flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC;
- else if (!strcmp (arg, "local-dynamic"))
- flag_tls_default = TLS_MODEL_LOCAL_DYNAMIC;
- else if (!strcmp (arg, "initial-exec"))
- flag_tls_default = TLS_MODEL_INITIAL_EXEC;
- else if (!strcmp (arg, "local-exec"))
- flag_tls_default = TLS_MODEL_LOCAL_EXEC;
- else
- warning (0, "unknown tls-model \"%s\"", arg);
- break;
-
- case OPT_fira_algorithm_:
- if (!strcmp (arg, "CB"))
- flag_ira_algorithm = IRA_ALGORITHM_CB;
- else if (!strcmp (arg, "priority"))
- flag_ira_algorithm = IRA_ALGORITHM_PRIORITY;
- else
- warning (0, "unknown ira algorithm \"%s\"", arg);
- break;
-
- case OPT_fira_region_:
- if (!strcmp (arg, "one"))
- flag_ira_region = IRA_REGION_ONE;
- else if (!strcmp (arg, "all"))
- flag_ira_region = IRA_REGION_ALL;
- else if (!strcmp (arg, "mixed"))
- flag_ira_region = IRA_REGION_MIXED;
- else
- warning (0, "unknown ira region \"%s\"", arg);
- break;
-
- case OPT_fira_verbose_:
- flag_ira_verbose = value;
- break;
-
- case OPT_ftracer:
- flag_tracer_set = true;
- break;
-
- case OPT_fipa_cp:
- flag_ipa_cp_set = true;
- break;
-
- case OPT_fipa_cp_clone:
- flag_ipa_cp_clone_set = true;
- break;
-
- case OPT_fpredictive_commoning:
- flag_predictive_commoning_set = true;
- break;
-
- case OPT_funswitch_loops:
- flag_unswitch_loops_set = true;
- break;
-
- case OPT_fgcse_after_reload:
- flag_gcse_after_reload_set = true;
- break;
-
- case OPT_funroll_loops:
- flag_unroll_loops_set = true;
- break;
-
- case OPT_flimit_hot_components:
- flag_limit_hot_components_set = true;
- break;
-
- case OPT_g:
- set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg);
- break;
-
- case OPT_gcoff:
- set_debug_level (SDB_DEBUG, false, arg);
- break;
-
- case OPT_gdwarf_2:
- set_debug_level (DWARF2_DEBUG, false, arg);
- break;
-
- case OPT_gdwarf_4:
- set_debug_level (DWARF2_DEBUG, false, arg);
- use_dwarf4_extensions = true;
- break;
-
- case OPT_ggdb:
- set_debug_level (NO_DEBUG, 2, arg);
- break;
-
- case OPT_gstabs:
- case OPT_gstabs_:
- set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg);
- break;
-
- case OPT_gmlt:
- set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "1");
- generate_debug_line_table = true;
- break;
-
- case OPT_gvms:
- set_debug_level (VMS_DEBUG, false, arg);
- break;
-
- case OPT_gxcoff:
- case OPT_gxcoff_:
- set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg);
- break;
-
- case OPT_o:
- asm_file_name = arg;
- break;
-
- case OPT_pedantic_errors:
- flag_pedantic_errors = pedantic = 1;
- break;
-
- case OPT_floop_optimize:
- case OPT_frerun_loop_opt:
- case OPT_fstrength_reduce:
- case OPT_ftree_store_copy_prop:
- case OPT_fforce_addr:
- case OPT_ftree_salias:
- case OPT_ftree_store_ccp:
- /* These are no-ops, preserved for backward compatibility. */
- break;
-
- case OPT_fuse_ld_:
- /* No-op. Used by the driver and passed to us because it starts with f. */
- break;
-
- default:
- /* If the flag was handled in a standard way, assume the lack of
- processing here is intentional. */
- gcc_assert (cl_options[scode].flag_var);
- break;
- }
-
- return 1;
-}
-
-/* Handle --param NAME=VALUE. */
-static void
-handle_param (const char *carg)
-{
- char *equal, *arg;
- int value;
-
- arg = xstrdup (carg);
- equal = strchr (arg, '=');
- if (!equal)
- error ("%s: --param arguments should be of the form NAME=VALUE", arg);
- else
- {
- value = integral_argument (equal + 1);
- if (value == -1)
- error ("invalid --param value %qs", equal + 1);
- else
- {
- *equal = '\0';
- set_param_value (arg, value);
- }
- }
-
- free (arg);
-}
-
-/* Handle -W and -Wextra. */
-static void
-set_Wextra (int setting)
-{
- extra_warnings = setting;
-
- /* We save the value of warn_uninitialized, since if they put
- -Wuninitialized on the command line, we need to generate a
- warning about not using it without also specifying -O. */
- if (setting == 0)
- warn_uninitialized = 0;
- else if (warn_uninitialized != 1)
- warn_uninitialized = 2;
-}
-
-/* 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,
- and 0 otherwise. After calling this function, wstrict_aliasing will be
- set to the default value of -Wstrict_aliasing=level, currently 3. */
-void
-set_Wstrict_aliasing (int onoff)
-{
- gcc_assert (onoff == 0 || onoff == 1);
- if (onoff != 0)
- warn_strict_aliasing = 3;
- else
- warn_strict_aliasing = 0;
-}
-
-/* The following routines are useful in setting all the flags that
- -ffast-math and -fno-fast-math imply. */
-void
-set_fast_math_flags (int set)
-{
- flag_unsafe_math_optimizations = set;
- set_unsafe_math_optimizations_flags (set);
- flag_finite_math_only = set;
- flag_errno_math = !set;
- if (set)
- {
- flag_signaling_nans = 0;
- flag_rounding_math = 0;
- flag_cx_limited_range = 1;
- }
-}
-
-/* When -funsafe-math-optimizations is set the following
- flags are set as well. */
-void
-set_unsafe_math_optimizations_flags (int set)
-{
- flag_trapping_math = !set;
- flag_signed_zeros = !set;
- flag_associative_math = set;
- flag_reciprocal_math = set;
-}
-
-/* Return true iff flags are set as if -ffast-math. */
-bool
-fast_math_flags_set_p (void)
-{
- return (!flag_trapping_math
- && flag_unsafe_math_optimizations
- && flag_finite_math_only
- && !flag_signed_zeros
- && !flag_errno_math);
-}
-
-/* Return true iff flags are set as if -ffast-math but using the flags stored
- in the struct cl_optimization structure. */
-bool
-fast_math_flags_struct_set_p (struct cl_optimization *opt)
-{
- return (!opt->flag_trapping_math
- && opt->flag_unsafe_math_optimizations
- && opt->flag_finite_math_only
- && !opt->flag_signed_zeros
- && !opt->flag_errno_math);
-}
-
-/* Handle a debug output -g switch. EXTENDED is true or false to support
- extended output (2 is special and means "-ggdb" was given). */
-static void
-set_debug_level (enum debug_info_type type, int extended, const char *arg)
-{
- static bool type_explicit;
-
- use_gnu_debug_info_extensions = extended;
-
- if (type == NO_DEBUG)
- {
- if (write_symbols == NO_DEBUG)
- {
- write_symbols = PREFERRED_DEBUGGING_TYPE;
-
- if (extended == 2)
- {
-#ifdef DWARF2_DEBUGGING_INFO
- write_symbols = DWARF2_DEBUG;
-#elif defined DBX_DEBUGGING_INFO
- write_symbols = DBX_DEBUG;
-#endif
- }
-
- if (write_symbols == NO_DEBUG)
- warning (0, "target system does not support debug output");
- }
- }
- else
- {
- /* Does it conflict with an already selected type? */
- if (type_explicit && write_symbols != NO_DEBUG && type != write_symbols)
- error ("debug format \"%s\" conflicts with prior selection",
- debug_type_names[type]);
- write_symbols = type;
- type_explicit = true;
- }
-
- /* A debug flag without a level defaults to level 2. */
- if (*arg == '\0')
- {
- if (!debug_info_level)
- debug_info_level = 2;
- }
- else
- {
- debug_info_level = integral_argument (arg);
- if (debug_info_level == (unsigned int) -1)
- error ("unrecognised debug output level \"%s\"", arg);
- else if (debug_info_level > 3)
- error ("debug output level %s is too high", arg);
- }
-
- generate_debug_line_table = debug_info_level >= DINFO_LEVEL_NORMAL;
-}
-
-/* Return 1 if OPTION is enabled, 0 if it is disabled, or -1 if it isn't
- a simple on-off switch. */
-
-int
-option_enabled (int opt_idx)
-{
- const struct cl_option *option = &(cl_options[opt_idx]);
-
- if (option->flag_var)
- switch (option->var_type)
- {
- case CLVC_BOOLEAN:
- return *(int *) option->flag_var != 0;
-
- case CLVC_EQUAL:
- return *(int *) option->flag_var == option->var_value;
-
- case CLVC_BIT_CLEAR:
- return (*(int *) option->flag_var & option->var_value) == 0;
-
- case CLVC_BIT_SET:
- return (*(int *) option->flag_var & option->var_value) != 0;
-
- case CLVC_STRING:
- break;
- }
- return -1;
-}
-
-/* Fill STATE with the current state of option OPTION. Return true if
- there is some state to store. */
-
-bool
-get_option_state (int option, struct cl_option_state *state)
-{
- if (cl_options[option].flag_var == 0)
- return false;
-
- switch (cl_options[option].var_type)
- {
- case CLVC_BOOLEAN:
- case CLVC_EQUAL:
- state->data = cl_options[option].flag_var;
- state->size = sizeof (int);
- break;
-
- case CLVC_BIT_CLEAR:
- case CLVC_BIT_SET:
- state->ch = option_enabled (option);
- state->data = &state->ch;
- state->size = 1;
- break;
-
- case CLVC_STRING:
- state->data = *(const char **) cl_options[option].flag_var;
- if (state->data == 0)
- state->data = "";
- state->size = strlen ((const char *) state->data) + 1;
- break;
- }
- return true;
-}
-
-/* Enable a warning option as an error. This is used by -Werror= and
- also by legacy Werror-implicit-function-declaration. */
-
-void
-enable_warning_as_error (const char *arg, int value, unsigned int lang_mask)
-{
- char *new_option;
- int option_index;
-
- new_option = XNEWVEC (char, strlen (arg) + 2);
- new_option[0] = 'W';
- strcpy (new_option + 1, arg);
- option_index = find_opt (new_option, lang_mask);
- if (option_index == N_OPTS)
- {
- error ("-Werror=%s: No option -%s", arg, new_option);
- }
- else
- {
- int 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;
- }
- free (new_option);
-}
-
-/* Set FLAG_PROFILE_USE and dependent flags based on VALUE and
- SAMPLE_PROFILE. This function is used to handle the
- -f(no)profile-use and -fsample-profile options as well as to reset
- flags if a .gcda file is not found. */
-
-void
-set_profile_use (bool value, bool sample_profile, bool force)
-{
- if (!sample_profile)
- {
- flag_profile_use = value;
- if (!flag_branch_probabilities_set || force)
- flag_branch_probabilities = value;
- if (!flag_profile_values_set || force)
- flag_profile_values = value;
- if (!flag_value_profile_transformations_set || force)
- flag_value_profile_transformations = value;
- }
- if (!flag_unroll_loops_set)
- flag_unroll_loops = value;
- if (!flag_peel_loops_set)
- flag_peel_loops = value;
- if (!flag_inline_functions_set)
- flag_inline_functions = value;
- if (!flag_ipa_cp_set)
- flag_ipa_cp = value;
- if (!flag_ipa_cp_clone_set)
- {
- if (!flag_ipa_cp_set || flag_ipa_cp)
- flag_ipa_cp_clone = value;
- }
- if (!flag_predictive_commoning_set)
- flag_predictive_commoning = value;
- if (!flag_unswitch_loops_set)
- flag_unswitch_loops = value;
- if (!flag_gcse_after_reload_set)
- flag_gcse_after_reload = value;
- if (!flag_limit_hot_components_set)
- flag_limit_hot_components = value;
-}