Mercurial > hg > CbC > CbC_gcc
annotate gcc/opts.c @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 1830386684a0 |
children |
rev | line source |
---|---|
0 | 1 /* Command line option handling. |
145 | 2 Copyright (C) 2002-2020 Free Software Foundation, Inc. |
0 | 3 Contributed by Neil Booth. |
4 | |
5 This file is part of GCC. | |
6 | |
7 GCC is free software; you can redistribute it and/or modify it under | |
8 the terms of the GNU General Public License as published by the Free | |
9 Software Foundation; either version 3, or (at your option) any later | |
10 version. | |
11 | |
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
18 along with GCC; see the file COPYING3. If not see | |
19 <http://www.gnu.org/licenses/>. */ | |
20 | |
21 #include "config.h" | |
22 #include "system.h" | |
23 #include "intl.h" | |
24 #include "coretypes.h" | |
25 #include "opts.h" | |
111 | 26 #include "tm.h" |
0 | 27 #include "flags.h" |
28 #include "diagnostic.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
29 #include "opts-diagnostic.h" |
111 | 30 #include "insn-attr-common.h" |
31 #include "common/common-target.h" | |
32 #include "spellcheck.h" | |
145 | 33 #include "opt-suggestions.h" |
34 #include "diagnostic-color.h" | |
111 | 35 |
36 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff); | |
37 | |
38 /* Indexed by enum debug_info_type. */ | |
39 const char *const debug_type_names[] = | |
40 { | |
131 | 41 "none", "stabs", "dwarf-2", "xcoff", "vms" |
111 | 42 }; |
0 | 43 |
44 /* Parse the -femit-struct-debug-detailed option value | |
45 and set the flag variables. */ | |
46 | |
47 #define MATCH( prefix, string ) \ | |
48 ((strncmp (prefix, string, sizeof prefix - 1) == 0) \ | |
49 ? ((string += sizeof prefix - 1), 1) : 0) | |
50 | |
51 void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
52 set_struct_debug_option (struct gcc_options *opts, location_t loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
53 const char *spec) |
0 | 54 { |
55 /* various labels for comparison */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
56 static const char dfn_lbl[] = "dfn:", dir_lbl[] = "dir:", ind_lbl[] = "ind:"; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
57 static const char ord_lbl[] = "ord:", gen_lbl[] = "gen:"; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
58 static const char none_lbl[] = "none", any_lbl[] = "any"; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
59 static const char base_lbl[] = "base", sys_lbl[] = "sys"; |
0 | 60 |
61 enum debug_struct_file files = DINFO_STRUCT_FILE_ANY; | |
62 /* Default is to apply to as much as possible. */ | |
63 enum debug_info_usage usage = DINFO_USAGE_NUM_ENUMS; | |
64 int ord = 1, gen = 1; | |
65 | |
66 /* What usage? */ | |
67 if (MATCH (dfn_lbl, spec)) | |
68 usage = DINFO_USAGE_DFN; | |
69 else if (MATCH (dir_lbl, spec)) | |
70 usage = DINFO_USAGE_DIR_USE; | |
71 else if (MATCH (ind_lbl, spec)) | |
72 usage = DINFO_USAGE_IND_USE; | |
73 | |
74 /* Generics or not? */ | |
75 if (MATCH (ord_lbl, spec)) | |
76 gen = 0; | |
77 else if (MATCH (gen_lbl, spec)) | |
78 ord = 0; | |
79 | |
80 /* What allowable environment? */ | |
81 if (MATCH (none_lbl, spec)) | |
82 files = DINFO_STRUCT_FILE_NONE; | |
83 else if (MATCH (any_lbl, spec)) | |
84 files = DINFO_STRUCT_FILE_ANY; | |
85 else if (MATCH (sys_lbl, spec)) | |
86 files = DINFO_STRUCT_FILE_SYS; | |
87 else if (MATCH (base_lbl, spec)) | |
88 files = DINFO_STRUCT_FILE_BASE; | |
89 else | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
90 error_at (loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
91 "argument %qs to %<-femit-struct-debug-detailed%> " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
92 "not recognized", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
93 spec); |
0 | 94 |
95 /* Effect the specification. */ | |
96 if (usage == DINFO_USAGE_NUM_ENUMS) | |
97 { | |
98 if (ord) | |
99 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
100 opts->x_debug_struct_ordinary[DINFO_USAGE_DFN] = files; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
101 opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] = files; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
102 opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] = files; |
0 | 103 } |
104 if (gen) | |
105 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
106 opts->x_debug_struct_generic[DINFO_USAGE_DFN] = files; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
107 opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] = files; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
108 opts->x_debug_struct_generic[DINFO_USAGE_IND_USE] = files; |
0 | 109 } |
110 } | |
111 else | |
112 { | |
113 if (ord) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
114 opts->x_debug_struct_ordinary[usage] = files; |
0 | 115 if (gen) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
116 opts->x_debug_struct_generic[usage] = files; |
0 | 117 } |
118 | |
119 if (*spec == ',') | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
120 set_struct_debug_option (opts, loc, spec+1); |
0 | 121 else |
122 { | |
123 /* No more -femit-struct-debug-detailed specifications. | |
124 Do final checks. */ | |
125 if (*spec != '\0') | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
126 error_at (loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
127 "argument %qs to %<-femit-struct-debug-detailed%> unknown", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
128 spec); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
129 if (opts->x_debug_struct_ordinary[DINFO_USAGE_DIR_USE] |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
130 < opts->x_debug_struct_ordinary[DINFO_USAGE_IND_USE] |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
131 || opts->x_debug_struct_generic[DINFO_USAGE_DIR_USE] |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
132 < opts->x_debug_struct_generic[DINFO_USAGE_IND_USE]) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
133 error_at (loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
134 "%<-femit-struct-debug-detailed=dir:...%> must allow " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
135 "at least as much as " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
136 "%<-femit-struct-debug-detailed=ind:...%>"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
137 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
138 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
139 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
140 /* Strip off a legitimate source ending from the input string NAME of |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
141 length LEN. Rather than having to know the names used by all of |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
142 our front ends, we strip off an ending of a period followed by |
111 | 143 up to fource characters. (C++ uses ".cpp".) */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
144 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
145 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
146 strip_off_ending (char *name, int len) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
147 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
148 int i; |
111 | 149 for (i = 2; i < 5 && len > i; i++) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
150 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
151 if (name[len - i] == '.') |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
152 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
153 name[len - i] = '\0'; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
154 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
155 } |
0 | 156 } |
157 } | |
158 | |
159 /* Find the base name of a path, stripping off both directories and | |
160 a single final extension. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
161 int |
0 | 162 base_of_path (const char *path, const char **base_out) |
163 { | |
164 const char *base = path; | |
165 const char *dot = 0; | |
166 const char *p = path; | |
167 char c = *p; | |
168 while (c) | |
169 { | |
111 | 170 if (IS_DIR_SEPARATOR (c)) |
0 | 171 { |
172 base = p + 1; | |
173 dot = 0; | |
174 } | |
175 else if (c == '.') | |
176 dot = p; | |
177 c = *++p; | |
178 } | |
179 if (!dot) | |
180 dot = p; | |
181 *base_out = base; | |
182 return dot - base; | |
183 } | |
184 | |
185 /* What to print when a switch has no documentation. */ | |
111 | 186 static const char undocumented_msg[] = N_("This option lacks documentation."); |
187 static const char use_diagnosed_msg[] = N_("Uses of this option are diagnosed."); | |
0 | 188 |
189 typedef char *char_p; /* For DEF_VEC_P. */ | |
190 | |
191 static void set_debug_level (enum debug_info_type type, int extended, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
192 const char *arg, struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
193 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
194 location_t loc); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
195 static void set_fast_math_flags (struct gcc_options *opts, int set); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
196 static void decode_d_option (const char *arg, struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
197 location_t loc, diagnostic_context *dc); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
198 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
199 int set); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
200 static void enable_warning_as_error (const char *arg, int value, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
201 unsigned int lang_mask, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
202 const struct cl_option_handlers *handlers, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
203 struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
204 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
205 location_t loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
206 diagnostic_context *dc); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
207 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
208 /* Handle a back-end option; arguments and return value as for |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
209 handle_option. */ |
0 | 210 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
211 bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
212 target_handle_option (struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
213 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
214 const struct cl_decoded_option *decoded, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
215 unsigned int lang_mask ATTRIBUTE_UNUSED, int kind, |
111 | 216 location_t loc, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
217 const struct cl_option_handlers *handlers ATTRIBUTE_UNUSED, |
111 | 218 diagnostic_context *dc, void (*) (void)) |
0 | 219 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
220 gcc_assert (dc == global_dc); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
221 gcc_assert (kind == DK_UNSPECIFIED); |
111 | 222 return targetm_common.handle_option (opts, opts_set, decoded, loc); |
0 | 223 } |
224 | |
225 /* Add comma-separated strings to a char_p vector. */ | |
226 | |
227 static void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
228 add_comma_separated_to_vector (void **pvec, const char *arg) |
0 | 229 { |
230 char *tmp; | |
231 char *r; | |
232 char *w; | |
233 char *token_start; | |
111 | 234 vec<char_p> *v = (vec<char_p> *) *pvec; |
235 | |
236 vec_check_alloc (v, 1); | |
0 | 237 |
238 /* We never free this string. */ | |
239 tmp = xstrdup (arg); | |
240 | |
241 r = tmp; | |
242 w = tmp; | |
243 token_start = tmp; | |
244 | |
245 while (*r != '\0') | |
246 { | |
247 if (*r == ',') | |
248 { | |
249 *w++ = '\0'; | |
250 ++r; | |
111 | 251 v->safe_push (token_start); |
0 | 252 token_start = w; |
253 } | |
254 if (*r == '\\' && r[1] == ',') | |
255 { | |
256 *w++ = ','; | |
257 r += 2; | |
258 } | |
259 else | |
260 *w++ = *r++; | |
261 } | |
145 | 262 |
263 *w = '\0'; | |
0 | 264 if (*token_start != '\0') |
111 | 265 v->safe_push (token_start); |
266 | |
267 *pvec = v; | |
268 } | |
0 | 269 |
111 | 270 /* Initialize opts_obstack. */ |
271 | |
272 void | |
273 init_opts_obstack (void) | |
274 { | |
275 gcc_obstack_init (&opts_obstack); | |
0 | 276 } |
277 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
278 /* Initialize OPTS and OPTS_SET before using them in parsing options. */ |
0 | 279 |
280 void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
281 init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set) |
0 | 282 { |
111 | 283 /* Ensure that opts_obstack has already been initialized by the time |
284 that we initialize any gcc_options instances (PR jit/68446). */ | |
285 gcc_assert (opts_obstack.chunk_size > 0); | |
286 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
287 *opts = global_options_init; |
111 | 288 |
289 if (opts_set) | |
290 memset (opts_set, 0, sizeof (*opts_set)); | |
0 | 291 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
292 /* Initialize whether `char' is signed. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
293 opts->x_flag_signed_char = DEFAULT_SIGNED_CHAR; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
294 /* Set this to a special "uninitialized" value. The actual default |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
295 is set after target options have been processed. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
296 opts->x_flag_short_enums = 2; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
297 |
111 | 298 /* Initialize target_flags before default_options_optimization |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
299 so the latter can modify it. */ |
111 | 300 opts->x_target_flags = targetm_common.default_target_flags; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
301 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
302 /* Some targets have ABI-specified unwind tables. */ |
111 | 303 opts->x_flag_unwind_tables = targetm_common.unwind_tables_default; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
304 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
305 /* Some targets have other target-specific initialization. */ |
111 | 306 targetm_common.option_init_struct (opts); |
307 } | |
308 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
309 /* If indicated by the optimization level LEVEL (-Os if SIZE is set, |
111 | 310 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT |
311 to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language | |
312 mask LANG_MASK and option handlers HANDLERS. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
313 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
314 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
315 maybe_default_option (struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
316 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
317 const struct default_options *default_opt, |
111 | 318 int level, bool size, bool fast, bool debug, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
319 unsigned int lang_mask, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
320 const struct cl_option_handlers *handlers, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
321 location_t loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
322 diagnostic_context *dc) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
323 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
324 const struct cl_option *option = &cl_options[default_opt->opt_index]; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
325 bool enabled; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
326 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
327 if (size) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
328 gcc_assert (level == 2); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
329 if (fast) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
330 gcc_assert (level == 3); |
111 | 331 if (debug) |
332 gcc_assert (level == 1); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
333 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
334 switch (default_opt->levels) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
335 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
336 case OPT_LEVELS_ALL: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
337 enabled = true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
338 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
339 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
340 case OPT_LEVELS_0_ONLY: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
341 enabled = (level == 0); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
342 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
343 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
344 case OPT_LEVELS_1_PLUS: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
345 enabled = (level >= 1); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
346 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
347 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
348 case OPT_LEVELS_1_PLUS_SPEED_ONLY: |
111 | 349 enabled = (level >= 1 && !size && !debug); |
350 break; | |
351 | |
352 case OPT_LEVELS_1_PLUS_NOT_DEBUG: | |
353 enabled = (level >= 1 && !debug); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
354 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
355 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
356 case OPT_LEVELS_2_PLUS: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
357 enabled = (level >= 2); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
358 break; |
0 | 359 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
360 case OPT_LEVELS_2_PLUS_SPEED_ONLY: |
111 | 361 enabled = (level >= 2 && !size && !debug); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
362 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
363 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
364 case OPT_LEVELS_3_PLUS: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
365 enabled = (level >= 3); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
366 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
367 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
368 case OPT_LEVELS_3_PLUS_AND_SIZE: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
369 enabled = (level >= 3 || size); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
370 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
371 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
372 case OPT_LEVELS_SIZE: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
373 enabled = size; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
374 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
375 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
376 case OPT_LEVELS_FAST: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
377 enabled = fast; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
378 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
379 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
380 case OPT_LEVELS_NONE: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
381 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
382 gcc_unreachable (); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
383 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
384 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
385 if (enabled) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
386 handle_generated_option (opts, opts_set, default_opt->opt_index, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
387 default_opt->arg, default_opt->value, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
388 lang_mask, DK_UNSPECIFIED, loc, |
111 | 389 handlers, true, dc); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
390 else if (default_opt->arg == NULL |
145 | 391 && !option->cl_reject_negative |
392 && !(option->flags & CL_PARAMS)) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
393 handle_generated_option (opts, opts_set, default_opt->opt_index, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
394 default_opt->arg, !default_opt->value, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
395 lang_mask, DK_UNSPECIFIED, loc, |
111 | 396 handlers, true, dc); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
397 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
398 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
399 /* As indicated by the optimization level LEVEL (-Os if SIZE is set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
400 -Ofast if FAST is set), apply the options in array DEFAULT_OPTS to |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
401 OPTS and OPTS_SET, diagnostic context DC, location LOC, with |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
402 language mask LANG_MASK and option handlers HANDLERS. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
403 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
404 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
405 maybe_default_options (struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
406 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
407 const struct default_options *default_opts, |
111 | 408 int level, bool size, bool fast, bool debug, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
409 unsigned int lang_mask, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
410 const struct cl_option_handlers *handlers, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
411 location_t loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
412 diagnostic_context *dc) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
413 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
414 size_t i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
415 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
416 for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
417 maybe_default_option (opts, opts_set, &default_opts[i], |
111 | 418 level, size, fast, debug, |
419 lang_mask, handlers, loc, dc); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
420 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
421 |
145 | 422 /* Table of options enabled by default at different levels. |
423 Please keep this list sorted by level and alphabetized within | |
424 each level; this makes it easier to keep the documentation | |
425 in sync. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
426 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
427 static const struct default_options default_options_table[] = |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
428 { |
145 | 429 /* -O1 and -Og optimizations. */ |
430 { OPT_LEVELS_1_PLUS, OPT_fcombine_stack_adjustments, NULL, 1 }, | |
431 { OPT_LEVELS_1_PLUS, OPT_fcompare_elim, NULL, 1 }, | |
432 { OPT_LEVELS_1_PLUS, OPT_fcprop_registers, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
433 { OPT_LEVELS_1_PLUS, OPT_fdefer_pop, NULL, 1 }, |
145 | 434 { OPT_LEVELS_1_PLUS, OPT_fforward_propagate, NULL, 1 }, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
435 { OPT_LEVELS_1_PLUS, OPT_fguess_branch_probability, NULL, 1 }, |
145 | 436 { OPT_LEVELS_1_PLUS, OPT_fipa_profile, NULL, 1 }, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
437 { OPT_LEVELS_1_PLUS, OPT_fipa_pure_const, NULL, 1 }, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
438 { OPT_LEVELS_1_PLUS, OPT_fipa_reference, NULL, 1 }, |
145 | 439 { OPT_LEVELS_1_PLUS, OPT_fipa_reference_addressable, NULL, 1 }, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
440 { OPT_LEVELS_1_PLUS, OPT_fmerge_constants, NULL, 1 }, |
145 | 441 { OPT_LEVELS_1_PLUS, OPT_fomit_frame_pointer, NULL, 1 }, |
111 | 442 { OPT_LEVELS_1_PLUS, OPT_freorder_blocks, NULL, 1 }, |
443 { OPT_LEVELS_1_PLUS, OPT_fshrink_wrap, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
444 { OPT_LEVELS_1_PLUS, OPT_fsplit_wide_types, NULL, 1 }, |
145 | 445 { OPT_LEVELS_1_PLUS, OPT_ftree_builtin_call_dce, NULL, 1 }, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
446 { OPT_LEVELS_1_PLUS, OPT_ftree_ccp, NULL, 1 }, |
145 | 447 { OPT_LEVELS_1_PLUS, OPT_ftree_ch, NULL, 1 }, |
111 | 448 { OPT_LEVELS_1_PLUS, OPT_ftree_coalesce_vars, NULL, 1 }, |
145 | 449 { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 }, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
450 { OPT_LEVELS_1_PLUS, OPT_ftree_dce, NULL, 1 }, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
451 { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 }, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
452 { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 }, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
453 { OPT_LEVELS_1_PLUS, OPT_ftree_sink, NULL, 1 }, |
111 | 454 { OPT_LEVELS_1_PLUS, OPT_ftree_slsr, NULL, 1 }, |
145 | 455 { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 }, |
456 | |
457 /* -O1 (and not -Og) optimizations. */ | |
111 | 458 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fbranch_count_reg, NULL, 1 }, |
145 | 459 #if DELAY_SLOTS |
460 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdelayed_branch, NULL, 1 }, | |
461 #endif | |
462 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fdse, NULL, 1 }, | |
463 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion, NULL, 1 }, | |
464 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fif_conversion2, NULL, 1 }, | |
465 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 }, | |
111 | 466 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fmove_loop_invariants, NULL, 1 }, |
467 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_fssa_phiopt, NULL, 1 }, | |
145 | 468 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_bit_ccp, NULL, 1 }, |
469 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_dse, NULL, 1 }, | |
470 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_pta, NULL, 1 }, | |
471 { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 }, | |
472 | |
473 /* -O2 and -Os optimizations. */ | |
474 { OPT_LEVELS_2_PLUS, OPT_fcaller_saves, NULL, 1 }, | |
475 { OPT_LEVELS_2_PLUS, OPT_fcode_hoisting, NULL, 1 }, | |
476 { OPT_LEVELS_2_PLUS, OPT_fcrossjumping, NULL, 1 }, | |
477 { OPT_LEVELS_2_PLUS, OPT_fcse_follow_jumps, NULL, 1 }, | |
478 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize, NULL, 1 }, | |
479 { OPT_LEVELS_2_PLUS, OPT_fdevirtualize_speculatively, NULL, 1 }, | |
480 { OPT_LEVELS_2_PLUS, OPT_fexpensive_optimizations, NULL, 1 }, | |
481 { OPT_LEVELS_2_PLUS, OPT_ffinite_loops, NULL, 1 }, | |
482 { OPT_LEVELS_2_PLUS, OPT_fgcse, NULL, 1 }, | |
483 { OPT_LEVELS_2_PLUS, OPT_fhoist_adjacent_loads, NULL, 1 }, | |
484 { OPT_LEVELS_2_PLUS, OPT_findirect_inlining, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
485 { OPT_LEVELS_2_PLUS, OPT_finline_small_functions, NULL, 1 }, |
145 | 486 { OPT_LEVELS_2_PLUS, OPT_fipa_bit_cp, NULL, 1 }, |
487 { OPT_LEVELS_2_PLUS, OPT_fipa_cp, NULL, 1 }, | |
488 { OPT_LEVELS_2_PLUS, OPT_fipa_icf, NULL, 1 }, | |
489 { OPT_LEVELS_2_PLUS, OPT_fipa_ra, NULL, 1 }, | |
490 { OPT_LEVELS_2_PLUS, OPT_fipa_sra, NULL, 1 }, | |
491 { OPT_LEVELS_2_PLUS, OPT_fipa_vrp, NULL, 1 }, | |
492 { OPT_LEVELS_2_PLUS, OPT_fisolate_erroneous_paths_dereference, NULL, 1 }, | |
493 { OPT_LEVELS_2_PLUS, OPT_flra_remat, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
494 { OPT_LEVELS_2_PLUS, OPT_foptimize_sibling_calls, NULL, 1 }, |
145 | 495 { OPT_LEVELS_2_PLUS, OPT_fpartial_inlining, NULL, 1 }, |
496 { OPT_LEVELS_2_PLUS, OPT_fpeephole2, NULL, 1 }, | |
497 { OPT_LEVELS_2_PLUS, OPT_freorder_functions, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
498 { OPT_LEVELS_2_PLUS, OPT_frerun_cse_after_loop, NULL, 1 }, |
0 | 499 #ifdef INSN_SCHEDULING |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
500 { OPT_LEVELS_2_PLUS, OPT_fschedule_insns2, NULL, 1 }, |
0 | 501 #endif |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
502 { OPT_LEVELS_2_PLUS, OPT_fstrict_aliasing, NULL, 1 }, |
145 | 503 { OPT_LEVELS_2_PLUS, OPT_fstore_merging, NULL, 1 }, |
504 { OPT_LEVELS_2_PLUS, OPT_fthread_jumps, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
505 { OPT_LEVELS_2_PLUS, OPT_ftree_pre, NULL, 1 }, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
506 { OPT_LEVELS_2_PLUS, OPT_ftree_switch_conversion, NULL, 1 }, |
145 | 507 { OPT_LEVELS_2_PLUS, OPT_ftree_tail_merge, NULL, 1 }, |
508 { OPT_LEVELS_2_PLUS, OPT_ftree_vrp, NULL, 1 }, | |
509 { OPT_LEVELS_2_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_CHEAP }, | |
510 { OPT_LEVELS_2_PLUS, OPT_finline_functions, NULL, 1 }, | |
511 { OPT_LEVELS_2_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 }, | |
512 | |
513 /* -O2 and above optimizations, but not -Os or -Og. */ | |
514 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_functions, NULL, 1 }, | |
131 | 515 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_jumps, NULL, 1 }, |
516 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_labels, NULL, 1 }, | |
145 | 517 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_falign_loops, NULL, 1 }, |
111 | 518 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_foptimize_strlen, NULL, 1 }, |
145 | 519 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_freorder_blocks_algorithm_, NULL, |
520 REORDER_BLOCKS_ALGORITHM_STC }, | |
521 #ifdef INSN_SCHEDULING | |
522 /* Only run the pre-regalloc scheduling pass if optimizing for speed. */ | |
523 { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_fschedule_insns, NULL, 1 }, | |
524 #endif | |
525 | |
526 /* -O3 and -Os optimizations. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
527 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
528 /* -O3 optimizations. */ |
145 | 529 { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 }, |
530 { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 }, | |
131 | 531 { OPT_LEVELS_3_PLUS, OPT_floop_interchange, NULL, 1 }, |
145 | 532 { OPT_LEVELS_3_PLUS, OPT_floop_unroll_and_jam, NULL, 1 }, |
533 { OPT_LEVELS_3_PLUS, OPT_fpeel_loops, NULL, 1 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
534 { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 }, |
111 | 535 { OPT_LEVELS_3_PLUS, OPT_fsplit_loops, NULL, 1 }, |
145 | 536 { OPT_LEVELS_3_PLUS, OPT_fsplit_paths, NULL, 1 }, |
537 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribution, NULL, 1 }, | |
111 | 538 { OPT_LEVELS_3_PLUS, OPT_ftree_loop_vectorize, NULL, 1 }, |
145 | 539 { OPT_LEVELS_3_PLUS, OPT_ftree_partial_pre, NULL, 1 }, |
111 | 540 { OPT_LEVELS_3_PLUS, OPT_ftree_slp_vectorize, NULL, 1 }, |
145 | 541 { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 }, |
111 | 542 { OPT_LEVELS_3_PLUS, OPT_fvect_cost_model_, NULL, VECT_COST_MODEL_DYNAMIC }, |
145 | 543 { OPT_LEVELS_3_PLUS, OPT_fversion_loops_for_strides, NULL, 1 }, |
544 | |
545 /* -O3 parameters. */ | |
546 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_auto_, NULL, 30 }, | |
547 { OPT_LEVELS_3_PLUS, OPT__param_early_inlining_insns_, NULL, 14 }, | |
548 { OPT_LEVELS_3_PLUS, OPT__param_inline_heuristics_hint_percent_, NULL, 600 }, | |
549 { OPT_LEVELS_3_PLUS, OPT__param_inline_min_speedup_, NULL, 15 }, | |
550 { OPT_LEVELS_3_PLUS, OPT__param_max_inline_insns_single_, NULL, 200 }, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
551 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
552 /* -Ofast adds optimizations to -O3. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
553 { OPT_LEVELS_FAST, OPT_ffast_math, NULL, 1 }, |
145 | 554 { OPT_LEVELS_FAST, OPT_fallow_store_data_races, NULL, 1 }, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
555 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
556 { OPT_LEVELS_NONE, 0, NULL, 0 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
557 }; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
558 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
559 /* Default the options in OPTS and OPTS_SET based on the optimization |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
560 settings in DECODED_OPTIONS and DECODED_OPTIONS_COUNT. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
561 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
562 default_options_optimization (struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
563 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
564 struct cl_decoded_option *decoded_options, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
565 unsigned int decoded_options_count, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
566 location_t loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
567 unsigned int lang_mask, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
568 const struct cl_option_handlers *handlers, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
569 diagnostic_context *dc) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
570 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
571 unsigned int i; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
572 int opt2; |
111 | 573 bool openacc_mode = false; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
574 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
575 /* Scan to see what optimization level has been specified. That will |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
576 determine the default value of many flags. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
577 for (i = 1; i < decoded_options_count; i++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
578 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
579 struct cl_decoded_option *opt = &decoded_options[i]; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
580 switch (opt->opt_index) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
581 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
582 case OPT_O: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
583 if (*opt->arg == '\0') |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
584 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
585 opts->x_optimize = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
586 opts->x_optimize_size = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
587 opts->x_optimize_fast = 0; |
111 | 588 opts->x_optimize_debug = 0; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
589 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
590 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
591 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
592 const int optimize_val = integral_argument (opt->arg); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
593 if (optimize_val == -1) |
111 | 594 error_at (loc, "argument to %<-O%> should be a non-negative " |
595 "integer, %<g%>, %<s%> or %<fast%>"); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
596 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
597 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
598 opts->x_optimize = optimize_val; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
599 if ((unsigned int) opts->x_optimize > 255) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
600 opts->x_optimize = 255; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
601 opts->x_optimize_size = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
602 opts->x_optimize_fast = 0; |
111 | 603 opts->x_optimize_debug = 0; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
604 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
605 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
606 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
607 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
608 case OPT_Os: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
609 opts->x_optimize_size = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
610 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
611 /* Optimizing for size forces optimize to be 2. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
612 opts->x_optimize = 2; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
613 opts->x_optimize_fast = 0; |
111 | 614 opts->x_optimize_debug = 0; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
615 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
616 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
617 case OPT_Ofast: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
618 /* -Ofast only adds flags to -O3. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
619 opts->x_optimize_size = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
620 opts->x_optimize = 3; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
621 opts->x_optimize_fast = 1; |
111 | 622 opts->x_optimize_debug = 0; |
623 break; | |
624 | |
625 case OPT_Og: | |
626 /* -Og selects optimization level 1. */ | |
627 opts->x_optimize_size = 0; | |
628 opts->x_optimize = 1; | |
629 opts->x_optimize_fast = 0; | |
630 opts->x_optimize_debug = 1; | |
631 break; | |
632 | |
633 case OPT_fopenacc: | |
634 if (opt->value) | |
635 openacc_mode = true; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
636 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
637 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
638 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
639 /* Ignore other options in this prescan. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
640 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
641 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
642 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
643 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
644 maybe_default_options (opts, opts_set, default_options_table, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
645 opts->x_optimize, opts->x_optimize_size, |
111 | 646 opts->x_optimize_fast, opts->x_optimize_debug, |
647 lang_mask, handlers, loc, dc); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
648 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
649 /* -O2 param settings. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
650 opt2 = (opts->x_optimize >= 2); |
0 | 651 |
145 | 652 if (openacc_mode) |
653 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_pta, true); | |
111 | 654 |
0 | 655 /* Track fields in field-sensitive alias analysis. */ |
145 | 656 if (opt2) |
657 SET_OPTION_IF_UNSET (opts, opts_set, param_max_fields_for_field_sensitive, | |
658 100); | |
111 | 659 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
660 if (opts->x_optimize_size) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
661 /* We want to crossjump as much as possible. */ |
145 | 662 SET_OPTION_IF_UNSET (opts, opts_set, param_min_crossjump_insns, 1); |
0 | 663 |
111 | 664 /* Restrict the amount of work combine does at -Og while retaining |
665 most of its useful transforms. */ | |
666 if (opts->x_optimize_debug) | |
145 | 667 SET_OPTION_IF_UNSET (opts, opts_set, param_max_combine_insns, 2); |
111 | 668 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
669 /* Allow default optimizations to be specified on a per-machine basis. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
670 maybe_default_options (opts, opts_set, |
111 | 671 targetm_common.option_optimization_table, |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
672 opts->x_optimize, opts->x_optimize_size, |
111 | 673 opts->x_optimize_fast, opts->x_optimize_debug, |
674 lang_mask, handlers, loc, dc); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
675 } |
0 | 676 |
145 | 677 /* Control IPA optimizations based on different live patching LEVEL. */ |
678 static void | |
679 control_options_for_live_patching (struct gcc_options *opts, | |
680 struct gcc_options *opts_set, | |
681 enum live_patching_level level, | |
682 location_t loc) | |
683 { | |
684 gcc_assert (level > LIVE_PATCHING_NONE); | |
685 | |
686 switch (level) | |
687 { | |
688 case LIVE_PATCHING_INLINE_ONLY_STATIC: | |
689 if (opts_set->x_flag_ipa_cp_clone && opts->x_flag_ipa_cp_clone) | |
690 error_at (loc, | |
691 "%<-fipa-cp-clone%> is incompatible with " | |
692 "%<-flive-patching=inline-only-static%>"); | |
693 else | |
694 opts->x_flag_ipa_cp_clone = 0; | |
695 | |
696 if (opts_set->x_flag_ipa_sra && opts->x_flag_ipa_sra) | |
697 error_at (loc, | |
698 "%<-fipa-sra%> is incompatible with " | |
699 "%<-flive-patching=inline-only-static%>"); | |
700 else | |
701 opts->x_flag_ipa_sra = 0; | |
702 | |
703 if (opts_set->x_flag_partial_inlining && opts->x_flag_partial_inlining) | |
704 error_at (loc, | |
705 "%<-fpartial-inlining%> is incompatible with " | |
706 "%<-flive-patching=inline-only-static%>"); | |
707 else | |
708 opts->x_flag_partial_inlining = 0; | |
709 | |
710 if (opts_set->x_flag_ipa_cp && opts->x_flag_ipa_cp) | |
711 error_at (loc, | |
712 "%<-fipa-cp%> is incompatible with " | |
713 "%<-flive-patching=inline-only-static%>"); | |
714 else | |
715 opts->x_flag_ipa_cp = 0; | |
716 | |
717 /* FALLTHROUGH. */ | |
718 case LIVE_PATCHING_INLINE_CLONE: | |
719 /* live patching should disable whole-program optimization. */ | |
720 if (opts_set->x_flag_whole_program && opts->x_flag_whole_program) | |
721 error_at (loc, | |
722 "%<-fwhole-program%> is incompatible with " | |
723 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
724 else | |
725 opts->x_flag_whole_program = 0; | |
726 | |
727 /* visibility change should be excluded by !flag_whole_program | |
728 && !in_lto_p && !flag_ipa_cp_clone && !flag_ipa_sra | |
729 && !flag_partial_inlining. */ | |
730 | |
731 if (opts_set->x_flag_ipa_pta && opts->x_flag_ipa_pta) | |
732 error_at (loc, | |
733 "%<-fipa-pta%> is incompatible with " | |
734 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
735 else | |
736 opts->x_flag_ipa_pta = 0; | |
737 | |
738 if (opts_set->x_flag_ipa_reference && opts->x_flag_ipa_reference) | |
739 error_at (loc, | |
740 "%<-fipa-reference%> is incompatible with " | |
741 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
742 else | |
743 opts->x_flag_ipa_reference = 0; | |
744 | |
745 if (opts_set->x_flag_ipa_ra && opts->x_flag_ipa_ra) | |
746 error_at (loc, | |
747 "%<-fipa-ra%> is incompatible with " | |
748 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
749 else | |
750 opts->x_flag_ipa_ra = 0; | |
751 | |
752 if (opts_set->x_flag_ipa_icf && opts->x_flag_ipa_icf) | |
753 error_at (loc, | |
754 "%<-fipa-icf%> is incompatible with " | |
755 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
756 else | |
757 opts->x_flag_ipa_icf = 0; | |
758 | |
759 if (opts_set->x_flag_ipa_icf_functions && opts->x_flag_ipa_icf_functions) | |
760 error_at (loc, | |
761 "%<-fipa-icf-functions%> is incompatible with " | |
762 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
763 else | |
764 opts->x_flag_ipa_icf_functions = 0; | |
765 | |
766 if (opts_set->x_flag_ipa_icf_variables && opts->x_flag_ipa_icf_variables) | |
767 error_at (loc, | |
768 "%<-fipa-icf-variables%> is incompatible with " | |
769 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
770 else | |
771 opts->x_flag_ipa_icf_variables = 0; | |
772 | |
773 if (opts_set->x_flag_ipa_bit_cp && opts->x_flag_ipa_bit_cp) | |
774 error_at (loc, | |
775 "%<-fipa-bit-cp%> is incompatible with " | |
776 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
777 else | |
778 opts->x_flag_ipa_bit_cp = 0; | |
779 | |
780 if (opts_set->x_flag_ipa_vrp && opts->x_flag_ipa_vrp) | |
781 error_at (loc, | |
782 "%<-fipa-vrp%> is incompatible with " | |
783 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
784 else | |
785 opts->x_flag_ipa_vrp = 0; | |
786 | |
787 if (opts_set->x_flag_ipa_pure_const && opts->x_flag_ipa_pure_const) | |
788 error_at (loc, | |
789 "%<-fipa-pure-const%> is incompatible with " | |
790 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
791 else | |
792 opts->x_flag_ipa_pure_const = 0; | |
793 | |
794 /* FIXME: disable unreachable code removal. */ | |
795 | |
796 /* discovery of functions/variables with no address taken. */ | |
797 if (opts_set->x_flag_ipa_reference_addressable | |
798 && opts->x_flag_ipa_reference_addressable) | |
799 error_at (loc, | |
800 "%<-fipa-reference-addressable%> is incompatible with " | |
801 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
802 else | |
803 opts->x_flag_ipa_reference_addressable = 0; | |
804 | |
805 /* ipa stack alignment propagation. */ | |
806 if (opts_set->x_flag_ipa_stack_alignment | |
807 && opts->x_flag_ipa_stack_alignment) | |
808 error_at (loc, | |
809 "%<-fipa-stack-alignment%> is incompatible with " | |
810 "%<-flive-patching=inline-only-static|inline-clone%>"); | |
811 else | |
812 opts->x_flag_ipa_stack_alignment = 0; | |
813 break; | |
814 default: | |
815 gcc_unreachable (); | |
816 } | |
817 } | |
818 | |
819 /* --help option argument if set. */ | |
820 vec<const char *> help_option_arguments; | |
821 | |
822 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
823 /* After all options at LOC have been read into OPTS and OPTS_SET, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
824 finalize settings of those options and diagnose incompatible |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
825 combinations. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
826 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
827 finish_options (struct gcc_options *opts, struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
828 location_t loc) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
829 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
830 enum unwind_info_type ui_except; |
0 | 831 |
111 | 832 if (opts->x_dump_base_name |
833 && ! opts->x_dump_base_name_prefixed) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
834 { |
131 | 835 const char *sep = opts->x_dump_base_name; |
836 | |
837 for (; *sep; sep++) | |
838 if (IS_DIR_SEPARATOR (*sep)) | |
839 break; | |
840 | |
841 if (*sep) | |
842 /* If dump_base_path contains subdirectories, don't prepend | |
843 anything. */; | |
844 else if (opts->x_dump_dir_name) | |
845 /* We have a DUMP_DIR_NAME, prepend that. */ | |
111 | 846 opts->x_dump_base_name = opts_concat (opts->x_dump_dir_name, |
847 opts->x_dump_base_name, NULL); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
848 else if (opts->x_aux_base_name |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
849 && strcmp (opts->x_aux_base_name, HOST_BIT_BUCKET) != 0) |
131 | 850 /* AUX_BASE_NAME is set and is not the bit bucket. If it |
851 contains a directory component, prepend those directories. | |
852 Typically this places things in the same directory as the | |
853 object file. */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
854 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
855 const char *aux_base; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
856 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
857 base_of_path (opts->x_aux_base_name, &aux_base); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
858 if (opts->x_aux_base_name != aux_base) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
859 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
860 int dir_len = aux_base - opts->x_aux_base_name; |
111 | 861 char *new_dump_base_name |
862 = XOBNEWVEC (&opts_obstack, char, | |
863 strlen (opts->x_dump_base_name) + dir_len + 1); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
864 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
865 /* Copy directory component from OPTS->X_AUX_BASE_NAME. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
866 memcpy (new_dump_base_name, opts->x_aux_base_name, dir_len); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
867 /* Append existing OPTS->X_DUMP_BASE_NAME. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
868 strcpy (new_dump_base_name + dir_len, opts->x_dump_base_name); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
869 opts->x_dump_base_name = new_dump_base_name; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
870 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
871 } |
131 | 872 |
873 /* It is definitely prefixed now. */ | |
874 opts->x_dump_base_name_prefixed = true; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
875 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
876 |
0 | 877 /* Handle related options for unit-at-a-time, toplevel-reorder, and |
878 section-anchors. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
879 if (!opts->x_flag_unit_at_a_time) |
0 | 880 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
881 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
882 error_at (loc, "section anchors must be disabled when unit-at-a-time " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
883 "is disabled"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
884 opts->x_flag_section_anchors = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
885 if (opts->x_flag_toplevel_reorder == 1) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
886 error_at (loc, "toplevel reorder must be disabled when unit-at-a-time " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
887 "is disabled"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
888 opts->x_flag_toplevel_reorder = 0; |
0 | 889 } |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
890 |
111 | 891 /* -fself-test depends on the state of the compiler prior to |
892 compiling anything. Ideally it should be run on an empty source | |
893 file. However, in case we get run with actual source, assume | |
894 -fsyntax-only which will inhibit any compiler initialization | |
895 which may confuse the self tests. */ | |
896 if (opts->x_flag_self_test) | |
897 opts->x_flag_syntax_only = 1; | |
898 | |
899 if (opts->x_flag_tm && opts->x_flag_non_call_exceptions) | |
900 sorry ("transactional memory is not supported with non-call exceptions"); | |
901 | |
0 | 902 /* Unless the user has asked for section anchors, we disable toplevel |
903 reordering at -O0 to disable transformations that might be surprising | |
904 to end users and to get -fno-toplevel-reorder tested. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
905 if (!opts->x_optimize |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
906 && opts->x_flag_toplevel_reorder == 2 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
907 && !(opts->x_flag_section_anchors && opts_set->x_flag_section_anchors)) |
0 | 908 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
909 opts->x_flag_toplevel_reorder = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
910 opts->x_flag_section_anchors = 0; |
0 | 911 } |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
912 if (!opts->x_flag_toplevel_reorder) |
0 | 913 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
914 if (opts->x_flag_section_anchors && opts_set->x_flag_section_anchors) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
915 error_at (loc, "section anchors must be disabled when toplevel reorder" |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
916 " is disabled"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
917 opts->x_flag_section_anchors = 0; |
0 | 918 } |
919 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
920 if (!opts->x_flag_opts_finished) |
0 | 921 { |
111 | 922 /* We initialize opts->x_flag_pie to -1 so that targets can set a |
923 default value. */ | |
924 if (opts->x_flag_pie == -1) | |
925 { | |
926 /* We initialize opts->x_flag_pic to -1 so that we can tell if | |
927 -fpic, -fPIC, -fno-pic or -fno-PIC is used. */ | |
928 if (opts->x_flag_pic == -1) | |
929 opts->x_flag_pie = DEFAULT_FLAG_PIE; | |
930 else | |
931 opts->x_flag_pie = 0; | |
932 } | |
933 /* If -fPIE or -fpie is used, turn on PIC. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
934 if (opts->x_flag_pie) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
935 opts->x_flag_pic = opts->x_flag_pie; |
111 | 936 else if (opts->x_flag_pic == -1) |
937 opts->x_flag_pic = 0; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
938 if (opts->x_flag_pic && !opts->x_flag_pie) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
939 opts->x_flag_shlib = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
940 opts->x_flag_opts_finished = true; |
0 | 941 } |
942 | |
111 | 943 /* We initialize opts->x_flag_stack_protect to -1 so that targets |
944 can set a default value. */ | |
945 if (opts->x_flag_stack_protect == -1) | |
946 opts->x_flag_stack_protect = DEFAULT_FLAG_SSP; | |
947 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
948 if (opts->x_optimize == 0) |
0 | 949 { |
950 /* Inlining does not work if not optimizing, | |
951 so force it not to be done. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
952 opts->x_warn_inline = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
953 opts->x_flag_no_inline = 1; |
0 | 954 } |
955 | |
956 /* The optimization to partition hot and cold basic blocks into separate | |
957 sections of the .o and executable files does not work (currently) | |
958 with exception handling. This is because there is no support for | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
959 generating unwind info. If opts->x_flag_exceptions is turned on |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
960 we need to turn off the partitioning optimization. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
961 |
111 | 962 ui_except = targetm_common.except_unwind_info (opts); |
0 | 963 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
964 if (opts->x_flag_exceptions |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
965 && opts->x_flag_reorder_blocks_and_partition |
111 | 966 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET)) |
0 | 967 { |
111 | 968 if (opts_set->x_flag_reorder_blocks_and_partition) |
969 inform (loc, | |
970 "%<-freorder-blocks-and-partition%> does not work " | |
971 "with exceptions on this architecture"); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
972 opts->x_flag_reorder_blocks_and_partition = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
973 opts->x_flag_reorder_blocks = 1; |
0 | 974 } |
975 | |
976 /* If user requested unwind info, then turn off the partitioning | |
977 optimization. */ | |
978 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
979 if (opts->x_flag_unwind_tables |
111 | 980 && !targetm_common.unwind_tables_default |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
981 && opts->x_flag_reorder_blocks_and_partition |
111 | 982 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET)) |
0 | 983 { |
111 | 984 if (opts_set->x_flag_reorder_blocks_and_partition) |
985 inform (loc, | |
986 "%<-freorder-blocks-and-partition%> does not support " | |
987 "unwind info on this architecture"); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
988 opts->x_flag_reorder_blocks_and_partition = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
989 opts->x_flag_reorder_blocks = 1; |
0 | 990 } |
991 | |
992 /* If the target requested unwind info, then turn off the partitioning | |
993 optimization with a different message. Likewise, if the target does not | |
994 support named sections. */ | |
995 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
996 if (opts->x_flag_reorder_blocks_and_partition |
111 | 997 && (!targetm_common.have_named_sections |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
998 || (opts->x_flag_unwind_tables |
111 | 999 && targetm_common.unwind_tables_default |
1000 && (ui_except == UI_SJLJ || ui_except >= UI_TARGET)))) | |
0 | 1001 { |
111 | 1002 if (opts_set->x_flag_reorder_blocks_and_partition) |
1003 inform (loc, | |
1004 "%<-freorder-blocks-and-partition%> does not work " | |
1005 "on this architecture"); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1006 opts->x_flag_reorder_blocks_and_partition = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1007 opts->x_flag_reorder_blocks = 1; |
0 | 1008 } |
1009 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1010 |
0 | 1011 /* Pipelining of outer loops is only possible when general pipelining |
1012 capabilities are requested. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1013 if (!opts->x_flag_sel_sched_pipelining) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1014 opts->x_flag_sel_sched_pipelining_outer_loops = 0; |
0 | 1015 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1016 if (opts->x_flag_conserve_stack) |
0 | 1017 { |
145 | 1018 SET_OPTION_IF_UNSET (opts, opts_set, param_large_stack_frame, 100); |
1019 SET_OPTION_IF_UNSET (opts, opts_set, param_stack_frame_growth, 40); | |
0 | 1020 } |
1021 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1022 if (opts->x_flag_lto) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1023 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1024 #ifdef ENABLE_LTO |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1025 opts->x_flag_generate_lto = 1; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1026 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1027 /* When generating IL, do not operate in whole-program mode. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1028 Otherwise, symbols will be privatized too early, causing link |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1029 errors later. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1030 opts->x_flag_whole_program = 0; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1031 #else |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1032 error_at (loc, "LTO support has not been enabled in this configuration"); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1033 #endif |
111 | 1034 if (!opts->x_flag_fat_lto_objects |
1035 && (!HAVE_LTO_PLUGIN | |
1036 || (opts_set->x_flag_use_linker_plugin | |
1037 && !opts->x_flag_use_linker_plugin))) | |
1038 { | |
1039 if (opts_set->x_flag_fat_lto_objects) | |
1040 error_at (loc, "%<-fno-fat-lto-objects%> are supported only with " | |
1041 "linker plugin"); | |
1042 opts->x_flag_fat_lto_objects = 1; | |
1043 } | |
145 | 1044 |
1045 /* -gsplit-dwarf isn't compatible with LTO, see PR88389. */ | |
1046 if (opts->x_dwarf_split_debug_info) | |
1047 { | |
1048 inform (loc, "%<-gsplit-dwarf%> is not supported with LTO," | |
1049 " disabling"); | |
1050 opts->x_dwarf_split_debug_info = 0; | |
1051 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1052 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1053 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1054 /* We initialize opts->x_flag_split_stack to -1 so that targets can set a |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1055 default value if they choose based on other options. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1056 if (opts->x_flag_split_stack == -1) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1057 opts->x_flag_split_stack = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1058 else if (opts->x_flag_split_stack) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1059 { |
111 | 1060 if (!targetm_common.supports_split_stack (true, opts)) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1061 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1062 error_at (loc, "%<-fsplit-stack%> is not supported by " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1063 "this compiler configuration"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1064 opts->x_flag_split_stack = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1065 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1066 } |
111 | 1067 |
1068 /* If stack splitting is turned on, and the user did not explicitly | |
1069 request function partitioning, turn off partitioning, as it | |
1070 confuses the linker when trying to handle partitioned split-stack | |
1071 code that calls a non-split-stack functions. But if partitioning | |
1072 was turned on explicitly just hope for the best. */ | |
1073 if (opts->x_flag_split_stack | |
145 | 1074 && opts->x_flag_reorder_blocks_and_partition) |
1075 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_blocks_and_partition, 0); | |
1076 | |
1077 if (opts->x_flag_reorder_blocks_and_partition) | |
1078 SET_OPTION_IF_UNSET (opts, opts_set, flag_reorder_functions, 1); | |
111 | 1079 |
1080 /* The -gsplit-dwarf option requires -ggnu-pubnames. */ | |
1081 if (opts->x_dwarf_split_debug_info) | |
1082 opts->x_debug_generate_pub_sections = 2; | |
1083 | |
131 | 1084 if ((opts->x_flag_sanitize |
1085 & (SANITIZE_USER_ADDRESS | SANITIZE_KERNEL_ADDRESS)) == 0) | |
1086 { | |
1087 if (opts->x_flag_sanitize & SANITIZE_POINTER_COMPARE) | |
1088 error_at (loc, | |
1089 "%<-fsanitize=pointer-compare%> must be combined with " | |
1090 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>"); | |
1091 if (opts->x_flag_sanitize & SANITIZE_POINTER_SUBTRACT) | |
1092 error_at (loc, | |
1093 "%<-fsanitize=pointer-subtract%> must be combined with " | |
1094 "%<-fsanitize=address%> or %<-fsanitize=kernel-address%>"); | |
1095 } | |
1096 | |
111 | 1097 /* Userspace and kernel ASan conflict with each other. */ |
1098 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) | |
1099 && (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS)) | |
1100 error_at (loc, | |
1101 "%<-fsanitize=address%> is incompatible with " | |
1102 "%<-fsanitize=kernel-address%>"); | |
1103 | |
1104 /* And with TSan. */ | |
1105 if ((opts->x_flag_sanitize & SANITIZE_ADDRESS) | |
1106 && (opts->x_flag_sanitize & SANITIZE_THREAD)) | |
1107 error_at (loc, | |
1108 "%<-fsanitize=address%> and %<-fsanitize=kernel-address%> " | |
1109 "are incompatible with %<-fsanitize=thread%>"); | |
1110 | |
1111 if ((opts->x_flag_sanitize & SANITIZE_LEAK) | |
1112 && (opts->x_flag_sanitize & SANITIZE_THREAD)) | |
1113 error_at (loc, | |
1114 "%<-fsanitize=leak%> is incompatible with %<-fsanitize=thread%>"); | |
1115 | |
1116 /* Check error recovery for -fsanitize-recover option. */ | |
1117 for (int i = 0; sanitizer_opts[i].name != NULL; ++i) | |
1118 if ((opts->x_flag_sanitize_recover & sanitizer_opts[i].flag) | |
1119 && !sanitizer_opts[i].can_recover) | |
1120 error_at (loc, "%<-fsanitize-recover=%s%> is not supported", | |
1121 sanitizer_opts[i].name); | |
1122 | |
1123 /* When instrumenting the pointers, we don't want to remove | |
1124 the null pointer checks. */ | |
1125 if (opts->x_flag_sanitize & (SANITIZE_NULL | SANITIZE_NONNULL_ATTRIBUTE | |
1126 | SANITIZE_RETURNS_NONNULL_ATTRIBUTE)) | |
1127 opts->x_flag_delete_null_pointer_checks = 0; | |
1128 | |
1129 /* Aggressive compiler optimizations may cause false negatives. */ | |
1130 if (opts->x_flag_sanitize & ~(SANITIZE_LEAK | SANITIZE_UNREACHABLE)) | |
1131 opts->x_flag_aggressive_loop_optimizations = 0; | |
1132 | |
1133 /* Enable -fsanitize-address-use-after-scope if address sanitizer is | |
1134 enabled. */ | |
145 | 1135 if (opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) |
1136 SET_OPTION_IF_UNSET (opts, opts_set, flag_sanitize_address_use_after_scope, | |
1137 true); | |
111 | 1138 |
1139 /* Force -fstack-reuse=none in case -fsanitize-address-use-after-scope | |
1140 is enabled. */ | |
1141 if (opts->x_flag_sanitize_address_use_after_scope) | |
1142 { | |
1143 if (opts->x_flag_stack_reuse != SR_NONE | |
1144 && opts_set->x_flag_stack_reuse != SR_NONE) | |
1145 error_at (loc, | |
1146 "%<-fsanitize-address-use-after-scope%> requires " | |
1147 "%<-fstack-reuse=none%> option"); | |
1148 | |
1149 opts->x_flag_stack_reuse = SR_NONE; | |
1150 } | |
1151 | |
1152 if ((opts->x_flag_sanitize & SANITIZE_USER_ADDRESS) && opts->x_flag_tm) | |
1153 sorry ("transactional memory is not supported with %<-fsanitize=address%>"); | |
1154 | |
1155 if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm) | |
1156 sorry ("transactional memory is not supported with " | |
1157 "%<-fsanitize=kernel-address%>"); | |
145 | 1158 |
1159 /* Currently live patching is not support for LTO. */ | |
1160 if (opts->x_flag_live_patching && opts->x_flag_lto) | |
1161 sorry ("live patching is not supported with LTO"); | |
1162 | |
1163 /* Currently vtable verification is not supported for LTO */ | |
1164 if (opts->x_flag_vtable_verify && opts->x_flag_lto) | |
1165 sorry ("vtable verification is not supported with LTO"); | |
1166 | |
1167 /* Control IPA optimizations based on different -flive-patching level. */ | |
1168 if (opts->x_flag_live_patching) | |
1169 { | |
1170 control_options_for_live_patching (opts, opts_set, | |
1171 opts->x_flag_live_patching, | |
1172 loc); | |
1173 } | |
0 | 1174 } |
1175 | |
1176 #define LEFT_COLUMN 27 | |
1177 | |
1178 /* Output ITEM, of length ITEM_WIDTH, in the left column, | |
1179 followed by word-wrapped HELP in a second column. */ | |
1180 static void | |
1181 wrap_help (const char *help, | |
1182 const char *item, | |
1183 unsigned int item_width, | |
1184 unsigned int columns) | |
1185 { | |
1186 unsigned int col_width = LEFT_COLUMN; | |
1187 unsigned int remaining, room, len; | |
1188 | |
1189 remaining = strlen (help); | |
1190 | |
1191 do | |
1192 { | |
1193 room = columns - 3 - MAX (col_width, item_width); | |
1194 if (room > columns) | |
1195 room = 0; | |
1196 len = remaining; | |
1197 | |
1198 if (room < len) | |
1199 { | |
1200 unsigned int i; | |
1201 | |
1202 for (i = 0; help[i]; i++) | |
1203 { | |
1204 if (i >= room && len != remaining) | |
1205 break; | |
1206 if (help[i] == ' ') | |
1207 len = i; | |
1208 else if ((help[i] == '-' || help[i] == '/') | |
1209 && help[i + 1] != ' ' | |
1210 && i > 0 && ISALPHA (help[i - 1])) | |
1211 len = i + 1; | |
1212 } | |
1213 } | |
1214 | |
111 | 1215 printf (" %-*.*s %.*s\n", col_width, item_width, item, len, help); |
0 | 1216 item_width = 0; |
1217 while (help[len] == ' ') | |
1218 len++; | |
1219 help += len; | |
1220 remaining -= len; | |
1221 } | |
1222 while (remaining); | |
1223 } | |
1224 | |
131 | 1225 /* Data structure used to print list of valid option values. */ |
1226 | |
145 | 1227 class option_help_tuple |
131 | 1228 { |
145 | 1229 public: |
131 | 1230 option_help_tuple (int code, vec<const char *> values): |
1231 m_code (code), m_values (values) | |
1232 {} | |
1233 | |
1234 /* Code of an option. */ | |
1235 int m_code; | |
1236 | |
1237 /* List of possible values. */ | |
1238 vec<const char *> m_values; | |
1239 }; | |
1240 | |
0 | 1241 /* Print help for a specific front-end, etc. */ |
1242 static void | |
1243 print_filtered_help (unsigned int include_flags, | |
1244 unsigned int exclude_flags, | |
1245 unsigned int any_flags, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1246 unsigned int columns, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1247 struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1248 unsigned int lang_mask) |
0 | 1249 { |
1250 unsigned int i; | |
1251 const char *help; | |
1252 bool found = false; | |
1253 bool displayed = false; | |
111 | 1254 char new_help[256]; |
0 | 1255 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1256 if (!opts->x_help_printed) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1257 opts->x_help_printed = XCNEWVAR (char, cl_options_count); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1258 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1259 if (!opts->x_help_enum_printed) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1260 opts->x_help_enum_printed = XCNEWVAR (char, cl_enums_count); |
0 | 1261 |
131 | 1262 auto_vec<option_help_tuple> help_tuples; |
1263 | |
0 | 1264 for (i = 0; i < cl_options_count; i++) |
1265 { | |
1266 const struct cl_option *option = cl_options + i; | |
1267 unsigned int len; | |
1268 const char *opt; | |
1269 const char *tab; | |
1270 | |
1271 if (include_flags == 0 | |
1272 || ((option->flags & include_flags) != include_flags)) | |
1273 { | |
1274 if ((option->flags & any_flags) == 0) | |
1275 continue; | |
1276 } | |
1277 | |
1278 /* Skip unwanted switches. */ | |
1279 if ((option->flags & exclude_flags) != 0) | |
1280 continue; | |
1281 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1282 /* The driver currently prints its own help text. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1283 if ((option->flags & CL_DRIVER) != 0 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1284 && (option->flags & (((1U << cl_lang_count) - 1) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1285 | CL_COMMON | CL_TARGET)) == 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1286 continue; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1287 |
145 | 1288 /* If an option contains a language specification, |
1289 exclude it from common unless all languages are present. */ | |
1290 if ((include_flags & CL_COMMON) | |
1291 && !(option->flags & CL_DRIVER) | |
1292 && (option->flags & CL_LANG_ALL) | |
1293 && (option->flags & CL_LANG_ALL) != CL_LANG_ALL) | |
1294 continue; | |
1295 | |
0 | 1296 found = true; |
1297 /* Skip switches that have already been printed. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1298 if (opts->x_help_printed[i]) |
0 | 1299 continue; |
1300 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1301 opts->x_help_printed[i] = true; |
0 | 1302 |
1303 help = option->help; | |
1304 if (help == NULL) | |
1305 { | |
1306 if (exclude_flags & CL_UNDOCUMENTED) | |
1307 continue; | |
111 | 1308 |
0 | 1309 help = undocumented_msg; |
1310 } | |
1311 | |
111 | 1312 if (option->alias_target < N_OPTS |
1313 && cl_options [option->alias_target].help) | |
1314 { | |
1315 if (help == undocumented_msg) | |
1316 { | |
1317 /* For undocumented options that are aliases for other options | |
1318 that are documented, point the reader to the other option in | |
1319 preference of the former. */ | |
1320 snprintf (new_help, sizeof new_help, | |
1321 _("Same as %s. Use the latter option instead."), | |
1322 cl_options [option->alias_target].opt_text); | |
1323 } | |
1324 else | |
1325 { | |
1326 /* For documented options with aliases, mention the aliased | |
1327 option's name for reference. */ | |
1328 snprintf (new_help, sizeof new_help, | |
1329 _("%s Same as %s."), | |
1330 help, cl_options [option->alias_target].opt_text); | |
1331 } | |
1332 | |
1333 help = new_help; | |
1334 } | |
1335 | |
1336 if (option->warn_message) | |
1337 { | |
1338 /* Mention that the use of the option will trigger a warning. */ | |
1339 if (help == new_help) | |
1340 snprintf (new_help + strlen (new_help), | |
1341 sizeof new_help - strlen (new_help), | |
1342 " %s", _(use_diagnosed_msg)); | |
1343 else | |
1344 snprintf (new_help, sizeof new_help, | |
1345 "%s %s", help, _(use_diagnosed_msg)); | |
1346 | |
1347 help = new_help; | |
1348 } | |
1349 | |
0 | 1350 /* Get the translation. */ |
1351 help = _(help); | |
1352 | |
1353 /* Find the gap between the name of the | |
1354 option and its descriptive text. */ | |
1355 tab = strchr (help, '\t'); | |
1356 if (tab) | |
1357 { | |
1358 len = tab - help; | |
1359 opt = help; | |
1360 help = tab + 1; | |
1361 } | |
1362 else | |
1363 { | |
1364 opt = option->opt_text; | |
1365 len = strlen (opt); | |
1366 } | |
1367 | |
1368 /* With the -Q option enabled we change the descriptive text associated | |
1369 with an option to be an indication of its current setting. */ | |
111 | 1370 if (!opts->x_quiet_flag) |
0 | 1371 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1372 void *flag_var = option_flag_var (i, opts); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1373 |
0 | 1374 if (len < (LEFT_COLUMN + 2)) |
1375 strcpy (new_help, "\t\t"); | |
1376 else | |
1377 strcpy (new_help, "\t"); | |
1378 | |
145 | 1379 /* Set to print whether the option is enabled or disabled, |
1380 or, if it's an alias for another option, the name of | |
1381 the aliased option. */ | |
1382 bool print_state = false; | |
1383 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1384 if (flag_var != NULL |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1385 && option->var_type != CLVC_DEFER) |
0 | 1386 { |
145 | 1387 /* If OPTION is only available for a specific subset |
1388 of languages other than this one, mention them. */ | |
1389 bool avail_for_lang = true; | |
1390 if (unsigned langset = option->flags & CL_LANG_ALL) | |
1391 { | |
1392 if (!(langset & lang_mask)) | |
1393 { | |
1394 avail_for_lang = false; | |
1395 strcat (new_help, _("[available in ")); | |
1396 for (unsigned i = 0, n = 0; (1U << i) < CL_LANG_ALL; ++i) | |
1397 if (langset & (1U << i)) | |
1398 { | |
1399 if (n++) | |
1400 strcat (new_help, ", "); | |
1401 strcat (new_help, lang_names[i]); | |
1402 } | |
1403 strcat (new_help, "]"); | |
1404 } | |
1405 } | |
1406 if (!avail_for_lang) | |
1407 ; /* Print nothing else if the option is not available | |
1408 in the current language. */ | |
1409 else if (option->flags & CL_JOINED) | |
0 | 1410 { |
1411 if (option->var_type == CLVC_STRING) | |
1412 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1413 if (* (const char **) flag_var != NULL) |
0 | 1414 snprintf (new_help + strlen (new_help), |
1415 sizeof (new_help) - strlen (new_help), | |
111 | 1416 "%s", * (const char **) flag_var); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1417 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1418 else if (option->var_type == CLVC_ENUM) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1419 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1420 const struct cl_enum *e = &cl_enums[option->var_enum]; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1421 int value; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1422 const char *arg = NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1423 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1424 value = e->get (flag_var); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1425 enum_value_to_arg (e->values, &arg, value, lang_mask); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1426 if (arg == NULL) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1427 arg = _("[default]"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1428 snprintf (new_help + strlen (new_help), |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1429 sizeof (new_help) - strlen (new_help), |
111 | 1430 "%s", arg); |
0 | 1431 } |
1432 else | |
145 | 1433 { |
1434 if (option->cl_host_wide_int) | |
1435 sprintf (new_help + strlen (new_help), | |
1436 _("%llu bytes"), (unsigned long long) | |
1437 *(unsigned HOST_WIDE_INT *) flag_var); | |
1438 else | |
1439 sprintf (new_help + strlen (new_help), | |
1440 "%i", * (int *) flag_var); | |
1441 } | |
0 | 1442 } |
1443 else | |
145 | 1444 print_state = true; |
1445 } | |
1446 else | |
1447 /* When there is no argument, print the option state only | |
1448 if the option takes no argument. */ | |
1449 print_state = !(option->flags & CL_JOINED); | |
1450 | |
1451 if (print_state) | |
1452 { | |
1453 if (option->alias_target < N_OPTS | |
1454 && option->alias_target != OPT_SPECIAL_warn_removed | |
1455 && option->alias_target != OPT_SPECIAL_ignore | |
1456 && option->alias_target != OPT_SPECIAL_input_file | |
1457 && option->alias_target != OPT_SPECIAL_program_name | |
1458 && option->alias_target != OPT_SPECIAL_unknown) | |
1459 { | |
1460 const struct cl_option *target | |
1461 = &cl_options[option->alias_target]; | |
1462 sprintf (new_help + strlen (new_help), "%s%s", | |
1463 target->opt_text, | |
1464 option->alias_arg ? option->alias_arg : ""); | |
1465 } | |
1466 else if (option->alias_target == OPT_SPECIAL_ignore) | |
1467 strcat (new_help, ("[ignored]")); | |
1468 else | |
1469 { | |
1470 /* Print the state for an on/off option. */ | |
1471 int ena = option_enabled (i, lang_mask, opts); | |
1472 if (ena > 0) | |
1473 strcat (new_help, _("[enabled]")); | |
1474 else if (ena == 0) | |
1475 strcat (new_help, _("[disabled]")); | |
1476 } | |
0 | 1477 } |
1478 | |
1479 help = new_help; | |
1480 } | |
1481 | |
111 | 1482 if (option->range_max != -1) |
1483 { | |
1484 char b[128]; | |
1485 snprintf (b, sizeof (b), "<%d,%d>", option->range_min, | |
1486 option->range_max); | |
1487 opt = concat (opt, b, NULL); | |
1488 len += strlen (b); | |
1489 } | |
1490 | |
0 | 1491 wrap_help (help, opt, len, columns); |
1492 displayed = true; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1493 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1494 if (option->var_type == CLVC_ENUM |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1495 && opts->x_help_enum_printed[option->var_enum] != 2) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1496 opts->x_help_enum_printed[option->var_enum] = 1; |
131 | 1497 else |
1498 { | |
1499 vec<const char *> option_values | |
1500 = targetm_common.get_valid_option_values (i, NULL); | |
1501 if (!option_values.is_empty ()) | |
1502 help_tuples.safe_push (option_help_tuple (i, option_values)); | |
1503 } | |
0 | 1504 } |
1505 | |
1506 if (! found) | |
1507 { | |
1508 unsigned int langs = include_flags & CL_LANG_ALL; | |
1509 | |
1510 if (langs == 0) | |
1511 printf (_(" No options with the desired characteristics were found\n")); | |
1512 else | |
1513 { | |
1514 unsigned int i; | |
1515 | |
1516 /* PR 31349: Tell the user how to see all of the | |
1517 options supported by a specific front end. */ | |
1518 for (i = 0; (1U << i) < CL_LANG_ALL; i ++) | |
1519 if ((1U << i) & langs) | |
111 | 1520 printf (_(" None found. Use --help=%s to show *all* the options supported by the %s front-end.\n"), |
0 | 1521 lang_names[i], lang_names[i]); |
1522 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
1523 |
0 | 1524 } |
1525 else if (! displayed) | |
1526 printf (_(" All options with the desired characteristics have already been displayed\n")); | |
1527 | |
1528 putchar ('\n'); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1529 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1530 /* Print details of enumerated option arguments, if those |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1531 enumerations have help text headings provided. If no help text |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1532 is provided, presume that the possible values are listed in the |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1533 help text for the relevant options. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1534 for (i = 0; i < cl_enums_count; i++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1535 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1536 unsigned int j, pos; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1537 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1538 if (opts->x_help_enum_printed[i] != 1) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1539 continue; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1540 if (cl_enums[i].help == NULL) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1541 continue; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1542 printf (" %s\n ", _(cl_enums[i].help)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1543 pos = 4; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1544 for (j = 0; cl_enums[i].values[j].arg != NULL; j++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1545 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1546 unsigned int len = strlen (cl_enums[i].values[j].arg); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1547 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1548 if (pos > 4 && pos + 1 + len <= columns) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1549 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1550 printf (" %s", cl_enums[i].values[j].arg); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1551 pos += 1 + len; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1552 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1553 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1554 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1555 if (pos > 4) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1556 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1557 printf ("\n "); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1558 pos = 4; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1559 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1560 printf ("%s", cl_enums[i].values[j].arg); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1561 pos += len; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1562 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1563 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1564 printf ("\n\n"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1565 opts->x_help_enum_printed[i] = 2; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1566 } |
131 | 1567 |
1568 for (unsigned i = 0; i < help_tuples.length (); i++) | |
1569 { | |
1570 const struct cl_option *option = cl_options + help_tuples[i].m_code; | |
145 | 1571 printf (_(" Known valid arguments for %s option:\n "), |
1572 option->opt_text); | |
131 | 1573 for (unsigned j = 0; j < help_tuples[i].m_values.length (); j++) |
1574 printf (" %s", help_tuples[i].m_values[j]); | |
1575 printf ("\n\n"); | |
1576 } | |
0 | 1577 } |
1578 | |
1579 /* Display help for a specified type of option. | |
1580 The options must have ALL of the INCLUDE_FLAGS set | |
1581 ANY of the flags in the ANY_FLAGS set | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1582 and NONE of the EXCLUDE_FLAGS set. The current option state is in |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1583 OPTS; LANG_MASK is used for interpreting enumerated option state. */ |
0 | 1584 static void |
1585 print_specific_help (unsigned int include_flags, | |
1586 unsigned int exclude_flags, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1587 unsigned int any_flags, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1588 struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1589 unsigned int lang_mask) |
0 | 1590 { |
1591 unsigned int all_langs_mask = (1U << cl_lang_count) - 1; | |
1592 const char * description = NULL; | |
1593 const char * descrip_extra = ""; | |
1594 size_t i; | |
1595 unsigned int flag; | |
1596 | |
1597 /* Sanity check: Make sure that we do not have more | |
1598 languages than we have bits available to enumerate them. */ | |
111 | 1599 gcc_assert ((1U << cl_lang_count) <= CL_MIN_OPTION_CLASS); |
0 | 1600 |
1601 /* If we have not done so already, obtain | |
1602 the desired maximum width of the output. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1603 if (opts->x_help_columns == 0) |
0 | 1604 { |
111 | 1605 opts->x_help_columns = get_terminal_width (); |
1606 if (opts->x_help_columns == INT_MAX) | |
0 | 1607 /* Use a reasonable default. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1608 opts->x_help_columns = 80; |
0 | 1609 } |
1610 | |
1611 /* Decide upon the title for the options that we are going to display. */ | |
1612 for (i = 0, flag = 1; flag <= CL_MAX_OPTION_CLASS; flag <<= 1, i ++) | |
1613 { | |
1614 switch (flag & include_flags) | |
1615 { | |
1616 case 0: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1617 case CL_DRIVER: |
0 | 1618 break; |
1619 | |
1620 case CL_TARGET: | |
1621 description = _("The following options are target specific"); | |
1622 break; | |
1623 case CL_WARNING: | |
1624 description = _("The following options control compiler warning messages"); | |
1625 break; | |
1626 case CL_OPTIMIZATION: | |
1627 description = _("The following options control optimizations"); | |
1628 break; | |
1629 case CL_COMMON: | |
1630 description = _("The following options are language-independent"); | |
1631 break; | |
1632 case CL_PARAMS: | |
145 | 1633 description = _("The following options control parameters"); |
0 | 1634 break; |
1635 default: | |
1636 if (i >= cl_lang_count) | |
1637 break; | |
1638 if (exclude_flags & all_langs_mask) | |
1639 description = _("The following options are specific to just the language "); | |
1640 else | |
1641 description = _("The following options are supported by the language "); | |
1642 descrip_extra = lang_names [i]; | |
1643 break; | |
1644 } | |
1645 } | |
1646 | |
1647 if (description == NULL) | |
1648 { | |
1649 if (any_flags == 0) | |
1650 { | |
1651 if (include_flags & CL_UNDOCUMENTED) | |
1652 description = _("The following options are not documented"); | |
1653 else if (include_flags & CL_SEPARATE) | |
1654 description = _("The following options take separate arguments"); | |
1655 else if (include_flags & CL_JOINED) | |
1656 description = _("The following options take joined arguments"); | |
1657 else | |
1658 { | |
145 | 1659 internal_error ("unrecognized %<include_flags 0x%x%> passed " |
1660 "to %<print_specific_help%>", | |
0 | 1661 include_flags); |
1662 return; | |
1663 } | |
1664 } | |
1665 else | |
1666 { | |
1667 if (any_flags & all_langs_mask) | |
1668 description = _("The following options are language-related"); | |
1669 else | |
1670 description = _("The following options are language-independent"); | |
1671 } | |
1672 } | |
1673 | |
1674 printf ("%s%s:\n", description, descrip_extra); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1675 print_filtered_help (include_flags, exclude_flags, any_flags, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1676 opts->x_help_columns, opts, lang_mask); |
0 | 1677 } |
1678 | |
111 | 1679 /* Enable FDO-related flags. */ |
1680 | |
1681 static void | |
1682 enable_fdo_optimizations (struct gcc_options *opts, | |
1683 struct gcc_options *opts_set, | |
1684 int value) | |
1685 { | |
145 | 1686 SET_OPTION_IF_UNSET (opts, opts_set, flag_branch_probabilities, value); |
1687 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value); | |
1688 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_loops, value); | |
1689 SET_OPTION_IF_UNSET (opts, opts_set, flag_peel_loops, value); | |
1690 SET_OPTION_IF_UNSET (opts, opts_set, flag_tracer, value); | |
1691 SET_OPTION_IF_UNSET (opts, opts_set, flag_value_profile_transformations, | |
1692 value); | |
1693 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value); | |
1694 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp, value); | |
1695 if (value) | |
1696 { | |
1697 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_cp_clone, 1); | |
1698 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, 1); | |
1699 } | |
1700 SET_OPTION_IF_UNSET (opts, opts_set, flag_predictive_commoning, value); | |
1701 SET_OPTION_IF_UNSET (opts, opts_set, flag_split_loops, value); | |
1702 SET_OPTION_IF_UNSET (opts, opts_set, flag_unswitch_loops, value); | |
1703 SET_OPTION_IF_UNSET (opts, opts_set, flag_gcse_after_reload, value); | |
1704 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_vectorize, value); | |
1705 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_slp_vectorize, value); | |
1706 SET_OPTION_IF_UNSET (opts, opts_set, flag_version_loops_for_strides, value); | |
1707 SET_OPTION_IF_UNSET (opts, opts_set, flag_vect_cost_model, | |
1708 VECT_COST_MODEL_DYNAMIC); | |
1709 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribute_patterns, | |
1710 value); | |
1711 SET_OPTION_IF_UNSET (opts, opts_set, flag_loop_interchange, value); | |
1712 SET_OPTION_IF_UNSET (opts, opts_set, flag_unroll_jam, value); | |
1713 SET_OPTION_IF_UNSET (opts, opts_set, flag_tree_loop_distribution, value); | |
111 | 1714 } |
1715 | |
1716 /* -f{,no-}sanitize{,-recover}= suboptions. */ | |
1717 const struct sanitizer_opts_s sanitizer_opts[] = | |
1718 { | |
1719 #define SANITIZER_OPT(name, flags, recover) \ | |
1720 { #name, flags, sizeof #name - 1, recover } | |
1721 SANITIZER_OPT (address, (SANITIZE_ADDRESS | SANITIZE_USER_ADDRESS), true), | |
1722 SANITIZER_OPT (kernel-address, (SANITIZE_ADDRESS | SANITIZE_KERNEL_ADDRESS), | |
1723 true), | |
131 | 1724 SANITIZER_OPT (pointer-compare, SANITIZE_POINTER_COMPARE, true), |
1725 SANITIZER_OPT (pointer-subtract, SANITIZE_POINTER_SUBTRACT, true), | |
111 | 1726 SANITIZER_OPT (thread, SANITIZE_THREAD, false), |
1727 SANITIZER_OPT (leak, SANITIZE_LEAK, false), | |
1728 SANITIZER_OPT (shift, SANITIZE_SHIFT, true), | |
1729 SANITIZER_OPT (shift-base, SANITIZE_SHIFT_BASE, true), | |
1730 SANITIZER_OPT (shift-exponent, SANITIZE_SHIFT_EXPONENT, true), | |
1731 SANITIZER_OPT (integer-divide-by-zero, SANITIZE_DIVIDE, true), | |
1732 SANITIZER_OPT (undefined, SANITIZE_UNDEFINED, true), | |
1733 SANITIZER_OPT (unreachable, SANITIZE_UNREACHABLE, false), | |
1734 SANITIZER_OPT (vla-bound, SANITIZE_VLA, true), | |
1735 SANITIZER_OPT (return, SANITIZE_RETURN, false), | |
1736 SANITIZER_OPT (null, SANITIZE_NULL, true), | |
1737 SANITIZER_OPT (signed-integer-overflow, SANITIZE_SI_OVERFLOW, true), | |
1738 SANITIZER_OPT (bool, SANITIZE_BOOL, true), | |
1739 SANITIZER_OPT (enum, SANITIZE_ENUM, true), | |
1740 SANITIZER_OPT (float-divide-by-zero, SANITIZE_FLOAT_DIVIDE, true), | |
1741 SANITIZER_OPT (float-cast-overflow, SANITIZE_FLOAT_CAST, true), | |
1742 SANITIZER_OPT (bounds, SANITIZE_BOUNDS, true), | |
1743 SANITIZER_OPT (bounds-strict, SANITIZE_BOUNDS | SANITIZE_BOUNDS_STRICT, true), | |
1744 SANITIZER_OPT (alignment, SANITIZE_ALIGNMENT, true), | |
1745 SANITIZER_OPT (nonnull-attribute, SANITIZE_NONNULL_ATTRIBUTE, true), | |
1746 SANITIZER_OPT (returns-nonnull-attribute, SANITIZE_RETURNS_NONNULL_ATTRIBUTE, | |
1747 true), | |
1748 SANITIZER_OPT (object-size, SANITIZE_OBJECT_SIZE, true), | |
1749 SANITIZER_OPT (vptr, SANITIZE_VPTR, true), | |
1750 SANITIZER_OPT (pointer-overflow, SANITIZE_POINTER_OVERFLOW, true), | |
1751 SANITIZER_OPT (builtin, SANITIZE_BUILTIN, true), | |
1752 SANITIZER_OPT (all, ~0U, true), | |
1753 #undef SANITIZER_OPT | |
1754 { NULL, 0U, 0UL, false } | |
1755 }; | |
1756 | |
1757 /* -f{,no-}sanitize-coverage= suboptions. */ | |
1758 const struct sanitizer_opts_s coverage_sanitizer_opts[] = | |
1759 { | |
1760 #define COVERAGE_SANITIZER_OPT(name, flags) \ | |
1761 { #name, flags, sizeof #name - 1, true } | |
1762 COVERAGE_SANITIZER_OPT (trace-pc, SANITIZE_COV_TRACE_PC), | |
1763 COVERAGE_SANITIZER_OPT (trace-cmp, SANITIZE_COV_TRACE_CMP), | |
1764 #undef COVERAGE_SANITIZER_OPT | |
1765 { NULL, 0U, 0UL, false } | |
1766 }; | |
1767 | |
1768 /* A struct for describing a run of chars within a string. */ | |
1769 | |
145 | 1770 class string_fragment |
111 | 1771 { |
145 | 1772 public: |
111 | 1773 string_fragment (const char *start, size_t len) |
1774 : m_start (start), m_len (len) {} | |
1775 | |
1776 const char *m_start; | |
1777 size_t m_len; | |
1778 }; | |
1779 | |
1780 /* Specialization of edit_distance_traits for string_fragment, | |
1781 for use by get_closest_sanitizer_option. */ | |
1782 | |
1783 template <> | |
1784 struct edit_distance_traits<const string_fragment &> | |
1785 { | |
1786 static size_t get_length (const string_fragment &fragment) | |
1787 { | |
1788 return fragment.m_len; | |
1789 } | |
1790 | |
1791 static const char *get_string (const string_fragment &fragment) | |
1792 { | |
1793 return fragment.m_start; | |
1794 } | |
1795 }; | |
1796 | |
1797 /* Given ARG, an unrecognized sanitizer option, return the best | |
1798 matching sanitizer option, or NULL if there isn't one. | |
1799 OPTS is array of candidate sanitizer options. | |
1800 CODE is OPT_fsanitize_, OPT_fsanitize_recover_ or | |
1801 OPT_fsanitize_coverage_. | |
1802 VALUE is non-zero for the regular form of the option, zero | |
1803 for the "no-" form (e.g. "-fno-sanitize-recover="). */ | |
1804 | |
1805 static const char * | |
1806 get_closest_sanitizer_option (const string_fragment &arg, | |
1807 const struct sanitizer_opts_s *opts, | |
1808 enum opt_code code, int value) | |
1809 { | |
1810 best_match <const string_fragment &, const char*> bm (arg); | |
1811 for (int i = 0; opts[i].name != NULL; ++i) | |
1812 { | |
1813 /* -fsanitize=all is not valid, so don't offer it. */ | |
1814 if (code == OPT_fsanitize_ | |
1815 && opts[i].flag == ~0U | |
1816 && value) | |
1817 continue; | |
1818 | |
1819 /* For -fsanitize-recover= (and not -fno-sanitize-recover=), | |
1820 don't offer the non-recoverable options. */ | |
1821 if (code == OPT_fsanitize_recover_ | |
1822 && !opts[i].can_recover | |
1823 && value) | |
1824 continue; | |
1825 | |
1826 bm.consider (opts[i].name); | |
1827 } | |
1828 return bm.get_best_meaningful_candidate (); | |
1829 } | |
1830 | |
1831 /* Parse comma separated sanitizer suboptions from P for option SCODE, | |
1832 adjust previous FLAGS and return new ones. If COMPLAIN is false, | |
1833 don't issue diagnostics. */ | |
1834 | |
1835 unsigned int | |
1836 parse_sanitizer_options (const char *p, location_t loc, int scode, | |
1837 unsigned int flags, int value, bool complain) | |
1838 { | |
1839 enum opt_code code = (enum opt_code) scode; | |
1840 | |
1841 const struct sanitizer_opts_s *opts; | |
1842 if (code == OPT_fsanitize_coverage_) | |
1843 opts = coverage_sanitizer_opts; | |
1844 else | |
1845 opts = sanitizer_opts; | |
1846 | |
1847 while (*p != 0) | |
1848 { | |
1849 size_t len, i; | |
1850 bool found = false; | |
1851 const char *comma = strchr (p, ','); | |
1852 | |
1853 if (comma == NULL) | |
1854 len = strlen (p); | |
1855 else | |
1856 len = comma - p; | |
1857 if (len == 0) | |
1858 { | |
1859 p = comma + 1; | |
1860 continue; | |
1861 } | |
1862 | |
1863 /* Check to see if the string matches an option class name. */ | |
1864 for (i = 0; opts[i].name != NULL; ++i) | |
1865 if (len == opts[i].len && memcmp (p, opts[i].name, len) == 0) | |
1866 { | |
1867 /* Handle both -fsanitize and -fno-sanitize cases. */ | |
1868 if (value && opts[i].flag == ~0U) | |
1869 { | |
1870 if (code == OPT_fsanitize_) | |
1871 { | |
1872 if (complain) | |
1873 error_at (loc, "%<-fsanitize=all%> option is not valid"); | |
1874 } | |
1875 else | |
1876 flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK | |
1877 | SANITIZE_UNREACHABLE | SANITIZE_RETURN); | |
1878 } | |
1879 else if (value) | |
1880 { | |
1881 /* Do not enable -fsanitize-recover=unreachable and | |
1882 -fsanitize-recover=return if -fsanitize-recover=undefined | |
1883 is selected. */ | |
1884 if (code == OPT_fsanitize_recover_ | |
1885 && opts[i].flag == SANITIZE_UNDEFINED) | |
1886 flags |= (SANITIZE_UNDEFINED | |
1887 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN)); | |
1888 else | |
1889 flags |= opts[i].flag; | |
1890 } | |
1891 else | |
1892 flags &= ~opts[i].flag; | |
1893 found = true; | |
1894 break; | |
1895 } | |
1896 | |
1897 if (! found && complain) | |
1898 { | |
1899 const char *hint | |
1900 = get_closest_sanitizer_option (string_fragment (p, len), | |
1901 opts, code, value); | |
1902 | |
1903 const char *suffix; | |
1904 if (code == OPT_fsanitize_recover_) | |
1905 suffix = "-recover"; | |
1906 else if (code == OPT_fsanitize_coverage_) | |
1907 suffix = "-coverage"; | |
1908 else | |
1909 suffix = ""; | |
1910 | |
1911 if (hint) | |
1912 error_at (loc, | |
145 | 1913 "unrecognized argument to %<-f%ssanitize%s=%> " |
1914 "option: %q.*s; did you mean %qs?", | |
111 | 1915 value ? "" : "no-", |
1916 suffix, (int) len, p, hint); | |
1917 else | |
1918 error_at (loc, | |
145 | 1919 "unrecognized argument to %<-f%ssanitize%s=%> option: " |
1920 "%q.*s", value ? "" : "no-", | |
111 | 1921 suffix, (int) len, p); |
1922 } | |
1923 | |
1924 if (comma == NULL) | |
1925 break; | |
1926 p = comma + 1; | |
1927 } | |
1928 return flags; | |
1929 } | |
1930 | |
1931 /* Parse string values of no_sanitize attribute passed in VALUE. | |
1932 Values are separated with comma. */ | |
1933 | |
1934 unsigned int | |
1935 parse_no_sanitize_attribute (char *value) | |
1936 { | |
1937 unsigned int flags = 0; | |
1938 unsigned int i; | |
1939 char *q = strtok (value, ","); | |
1940 | |
1941 while (q != NULL) | |
1942 { | |
1943 for (i = 0; sanitizer_opts[i].name != NULL; ++i) | |
1944 if (strcmp (sanitizer_opts[i].name, q) == 0) | |
1945 { | |
1946 flags |= sanitizer_opts[i].flag; | |
1947 if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED) | |
1948 flags |= SANITIZE_UNDEFINED_NONDEFAULT; | |
1949 break; | |
1950 } | |
1951 | |
1952 if (sanitizer_opts[i].name == NULL) | |
1953 warning (OPT_Wattributes, | |
145 | 1954 "%qs attribute directive ignored", q); |
111 | 1955 |
1956 q = strtok (NULL, ","); | |
1957 } | |
1958 | |
1959 return flags; | |
1960 } | |
1961 | |
131 | 1962 /* Parse -falign-NAME format for a FLAG value. Return individual |
1963 parsed integer values into RESULT_VALUES array. If REPORT_ERROR is | |
1964 set, print error message at LOC location. */ | |
1965 | |
1966 bool | |
1967 parse_and_check_align_values (const char *flag, | |
1968 const char *name, | |
1969 auto_vec<unsigned> &result_values, | |
1970 bool report_error, | |
1971 location_t loc) | |
1972 { | |
1973 char *str = xstrdup (flag); | |
1974 for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":")) | |
1975 { | |
1976 char *end; | |
1977 int v = strtol (p, &end, 10); | |
1978 if (*end != '\0' || v < 0) | |
1979 { | |
1980 if (report_error) | |
1981 error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs", | |
1982 name, flag); | |
1983 | |
1984 return false; | |
1985 } | |
1986 | |
1987 result_values.safe_push ((unsigned)v); | |
1988 } | |
1989 | |
1990 free (str); | |
1991 | |
1992 /* Check that we have a correct number of values. */ | |
145 | 1993 if (result_values.is_empty () || result_values.length () > 4) |
131 | 1994 { |
1995 if (report_error) | |
1996 error_at (loc, "invalid number of arguments for %<-falign-%s%> " | |
1997 "option: %qs", name, flag); | |
1998 return false; | |
1999 } | |
2000 | |
2001 for (unsigned i = 0; i < result_values.length (); i++) | |
2002 if (result_values[i] > MAX_CODE_ALIGN_VALUE) | |
2003 { | |
2004 if (report_error) | |
2005 error_at (loc, "%<-falign-%s%> is not between 0 and %d", | |
2006 name, MAX_CODE_ALIGN_VALUE); | |
2007 return false; | |
2008 } | |
2009 | |
2010 return true; | |
2011 } | |
2012 | |
2013 /* Check that alignment value FLAG for -falign-NAME is valid at a given | |
2014 location LOC. */ | |
2015 | |
2016 static void | |
2017 check_alignment_argument (location_t loc, const char *flag, const char *name) | |
2018 { | |
2019 auto_vec<unsigned> align_result; | |
2020 parse_and_check_align_values (flag, name, align_result, true, loc); | |
2021 } | |
2022 | |
145 | 2023 /* Print help when OPT__help_ is set. */ |
2024 | |
2025 void | |
2026 print_help (struct gcc_options *opts, unsigned int lang_mask, | |
2027 const char *help_option_argument) | |
2028 { | |
2029 const char *a = help_option_argument; | |
2030 unsigned int include_flags = 0; | |
2031 /* Note - by default we include undocumented options when listing | |
2032 specific classes. If you only want to see documented options | |
2033 then add ",^undocumented" to the --help= option. E.g.: | |
2034 | |
2035 --help=target,^undocumented */ | |
2036 unsigned int exclude_flags = 0; | |
2037 | |
2038 if (lang_mask == CL_DRIVER) | |
2039 return; | |
2040 | |
2041 /* Walk along the argument string, parsing each word in turn. | |
2042 The format is: | |
2043 arg = [^]{word}[,{arg}] | |
2044 word = {optimizers|target|warnings|undocumented| | |
2045 params|common|<language>} */ | |
2046 while (*a != 0) | |
2047 { | |
2048 static const struct | |
2049 { | |
2050 const char *string; | |
2051 unsigned int flag; | |
2052 } | |
2053 specifics[] = | |
2054 { | |
2055 { "optimizers", CL_OPTIMIZATION }, | |
2056 { "target", CL_TARGET }, | |
2057 { "warnings", CL_WARNING }, | |
2058 { "undocumented", CL_UNDOCUMENTED }, | |
2059 { "params", CL_PARAMS }, | |
2060 { "joined", CL_JOINED }, | |
2061 { "separate", CL_SEPARATE }, | |
2062 { "common", CL_COMMON }, | |
2063 { NULL, 0 } | |
2064 }; | |
2065 unsigned int *pflags; | |
2066 const char *comma; | |
2067 unsigned int lang_flag, specific_flag; | |
2068 unsigned int len; | |
2069 unsigned int i; | |
2070 | |
2071 if (*a == '^') | |
2072 { | |
2073 ++a; | |
2074 if (*a == '\0') | |
2075 { | |
2076 error ("missing argument to %qs", "--help=^"); | |
2077 break; | |
2078 } | |
2079 pflags = &exclude_flags; | |
2080 } | |
2081 else | |
2082 pflags = &include_flags; | |
2083 | |
2084 comma = strchr (a, ','); | |
2085 if (comma == NULL) | |
2086 len = strlen (a); | |
2087 else | |
2088 len = comma - a; | |
2089 if (len == 0) | |
2090 { | |
2091 a = comma + 1; | |
2092 continue; | |
2093 } | |
2094 | |
2095 /* Check to see if the string matches an option class name. */ | |
2096 for (i = 0, specific_flag = 0; specifics[i].string != NULL; i++) | |
2097 if (strncasecmp (a, specifics[i].string, len) == 0) | |
2098 { | |
2099 specific_flag = specifics[i].flag; | |
2100 break; | |
2101 } | |
2102 | |
2103 /* Check to see if the string matches a language name. | |
2104 Note - we rely upon the alpha-sorted nature of the entries in | |
2105 the lang_names array, specifically that shorter names appear | |
2106 before their longer variants. (i.e. C before C++). That way | |
2107 when we are attempting to match --help=c for example we will | |
2108 match with C first and not C++. */ | |
2109 for (i = 0, lang_flag = 0; i < cl_lang_count; i++) | |
2110 if (strncasecmp (a, lang_names[i], len) == 0) | |
2111 { | |
2112 lang_flag = 1U << i; | |
2113 break; | |
2114 } | |
2115 | |
2116 if (specific_flag != 0) | |
2117 { | |
2118 if (lang_flag == 0) | |
2119 *pflags |= specific_flag; | |
2120 else | |
2121 { | |
2122 /* The option's argument matches both the start of a | |
2123 language name and the start of an option class name. | |
2124 We have a special case for when the user has | |
2125 specified "--help=c", but otherwise we have to issue | |
2126 a warning. */ | |
2127 if (strncasecmp (a, "c", len) == 0) | |
2128 *pflags |= lang_flag; | |
2129 else | |
2130 warning (0, | |
2131 "%<--help%> argument %q.*s is ambiguous, " | |
2132 "please be more specific", | |
2133 len, a); | |
2134 } | |
2135 } | |
2136 else if (lang_flag != 0) | |
2137 *pflags |= lang_flag; | |
2138 else | |
2139 warning (0, | |
2140 "unrecognized argument to %<--help=%> option: %q.*s", | |
2141 len, a); | |
2142 | |
2143 if (comma == NULL) | |
2144 break; | |
2145 a = comma + 1; | |
2146 } | |
2147 | |
2148 /* We started using PerFunction/Optimization for parameters and | |
2149 a warning. We should exclude these from optimization options. */ | |
2150 if (include_flags & CL_OPTIMIZATION) | |
2151 exclude_flags |= CL_WARNING; | |
2152 if (!(include_flags & CL_PARAMS)) | |
2153 exclude_flags |= CL_PARAMS; | |
2154 | |
2155 if (include_flags) | |
2156 print_specific_help (include_flags, exclude_flags, 0, opts, | |
2157 lang_mask); | |
2158 } | |
2159 | |
0 | 2160 /* Handle target- and language-independent options. Return zero to |
2161 generate an "unknown option" message. Only options that need | |
2162 extra handling need to be listed here; if you simply want | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2163 DECODED->value assigned to a variable, it happens automatically. */ |
0 | 2164 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2165 bool |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2166 common_handle_option (struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2167 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2168 const struct cl_decoded_option *decoded, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2169 unsigned int lang_mask, int kind ATTRIBUTE_UNUSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2170 location_t loc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2171 const struct cl_option_handlers *handlers, |
111 | 2172 diagnostic_context *dc, |
2173 void (*target_option_override_hook) (void)) | |
0 | 2174 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2175 size_t scode = decoded->opt_index; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2176 const char *arg = decoded->arg; |
131 | 2177 HOST_WIDE_INT value = decoded->value; |
0 | 2178 enum opt_code code = (enum opt_code) scode; |
2179 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2180 gcc_assert (decoded->canonical_option_num_elements <= 2); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2181 |
0 | 2182 switch (code) |
2183 { | |
2184 case OPT__help: | |
2185 { | |
2186 unsigned int all_langs_mask = (1U << cl_lang_count) - 1; | |
2187 unsigned int undoc_mask; | |
2188 unsigned int i; | |
2189 | |
111 | 2190 if (lang_mask == CL_DRIVER) |
2191 break; | |
2192 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2193 undoc_mask = ((opts->x_verbose_flag | opts->x_extra_warnings) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2194 ? 0 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2195 : CL_UNDOCUMENTED); |
111 | 2196 target_option_override_hook (); |
0 | 2197 /* First display any single language specific options. */ |
2198 for (i = 0; i < cl_lang_count; i++) | |
2199 print_specific_help | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2200 (1U << i, (all_langs_mask & (~ (1U << i))) | undoc_mask, 0, opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2201 lang_mask); |
0 | 2202 /* Next display any multi language specific options. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2203 print_specific_help (0, undoc_mask, all_langs_mask, opts, lang_mask); |
0 | 2204 /* Then display any remaining, non-language options. */ |
2205 for (i = CL_MIN_OPTION_CLASS; i <= CL_MAX_OPTION_CLASS; i <<= 1) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2206 if (i != CL_DRIVER) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2207 print_specific_help (i, undoc_mask, 0, opts, lang_mask); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2208 opts->x_exit_after_options = true; |
0 | 2209 break; |
2210 } | |
2211 | |
2212 case OPT__target_help: | |
111 | 2213 if (lang_mask == CL_DRIVER) |
2214 break; | |
2215 | |
2216 target_option_override_hook (); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2217 print_specific_help (CL_TARGET, CL_UNDOCUMENTED, 0, opts, lang_mask); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2218 opts->x_exit_after_options = true; |
0 | 2219 break; |
2220 | |
2221 case OPT__help_: | |
2222 { | |
145 | 2223 help_option_arguments.safe_push (arg); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2224 opts->x_exit_after_options = true; |
0 | 2225 break; |
2226 } | |
2227 | |
2228 case OPT__version: | |
111 | 2229 if (lang_mask == CL_DRIVER) |
2230 break; | |
2231 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2232 opts->x_exit_after_options = true; |
0 | 2233 break; |
2234 | |
131 | 2235 case OPT__completion_: |
2236 break; | |
2237 | |
111 | 2238 case OPT_fsanitize_: |
2239 opts->x_flag_sanitize | |
2240 = parse_sanitizer_options (arg, loc, code, | |
2241 opts->x_flag_sanitize, value, true); | |
2242 | |
2243 /* Kernel ASan implies normal ASan but does not yet support | |
2244 all features. */ | |
2245 if (opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) | |
2246 { | |
145 | 2247 SET_OPTION_IF_UNSET (opts, opts_set, |
2248 param_asan_instrumentation_with_call_threshold, | |
2249 0); | |
2250 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_globals, 0); | |
2251 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_stack, 0); | |
2252 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_protect_allocas, 0); | |
2253 SET_OPTION_IF_UNSET (opts, opts_set, param_asan_use_after_return, 0); | |
111 | 2254 } |
2255 break; | |
2256 | |
2257 case OPT_fsanitize_recover_: | |
2258 opts->x_flag_sanitize_recover | |
2259 = parse_sanitizer_options (arg, loc, code, | |
2260 opts->x_flag_sanitize_recover, value, true); | |
2261 break; | |
2262 | |
2263 case OPT_fasan_shadow_offset_: | |
2264 /* Deferred. */ | |
2265 break; | |
2266 | |
2267 case OPT_fsanitize_address_use_after_scope: | |
2268 opts->x_flag_sanitize_address_use_after_scope = value; | |
2269 break; | |
2270 | |
2271 case OPT_fsanitize_recover: | |
2272 if (value) | |
2273 opts->x_flag_sanitize_recover | |
2274 |= (SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT) | |
2275 & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN); | |
2276 else | |
2277 opts->x_flag_sanitize_recover | |
2278 &= ~(SANITIZE_UNDEFINED | SANITIZE_UNDEFINED_NONDEFAULT); | |
2279 break; | |
2280 | |
2281 case OPT_fsanitize_coverage_: | |
2282 opts->x_flag_sanitize_coverage | |
2283 = parse_sanitizer_options (arg, loc, code, | |
2284 opts->x_flag_sanitize_coverage, value, true); | |
2285 break; | |
2286 | |
0 | 2287 case OPT_O: |
2288 case OPT_Os: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2289 case OPT_Ofast: |
111 | 2290 case OPT_Og: |
0 | 2291 /* Currently handled in a prescan. */ |
2292 break; | |
2293 | |
111 | 2294 case OPT_Werror: |
2295 dc->warning_as_error_requested = value; | |
2296 break; | |
2297 | |
0 | 2298 case OPT_Werror_: |
111 | 2299 if (lang_mask == CL_DRIVER) |
2300 break; | |
2301 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2302 enable_warning_as_error (arg, value, lang_mask, handlers, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2303 opts, opts_set, loc, dc); |
0 | 2304 break; |
2305 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2306 case OPT_Wfatal_errors: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2307 dc->fatal_errors = value; |
0 | 2308 break; |
2309 | |
111 | 2310 case OPT_Wstack_usage_: |
2311 opts->x_flag_stack_usage_info = value != -1; | |
2312 break; | |
2313 | |
0 | 2314 case OPT_Wstrict_aliasing: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2315 set_Wstrict_aliasing (opts, value); |
0 | 2316 break; |
2317 | |
2318 case OPT_Wstrict_overflow: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2319 opts->x_warn_strict_overflow = (value |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2320 ? (int) WARN_STRICT_OVERFLOW_CONDITIONAL |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2321 : 0); |
0 | 2322 break; |
2323 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2324 case OPT_Wsystem_headers: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2325 dc->dc_warn_system_headers = value; |
0 | 2326 break; |
2327 | |
2328 case OPT_aux_info: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2329 opts->x_flag_gen_aux_info = 1; |
0 | 2330 break; |
2331 | |
2332 case OPT_auxbase_strip: | |
2333 { | |
2334 char *tmp = xstrdup (arg); | |
2335 strip_off_ending (tmp, strlen (tmp)); | |
2336 if (tmp[0]) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2337 opts->x_aux_base_name = tmp; |
111 | 2338 else |
2339 free (tmp); | |
0 | 2340 } |
2341 break; | |
2342 | |
2343 case OPT_d: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2344 decode_d_option (arg, opts, loc, dc); |
0 | 2345 break; |
2346 | |
2347 case OPT_fcall_used_: | |
2348 case OPT_fcall_saved_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2349 /* Deferred. */ |
0 | 2350 break; |
2351 | |
2352 case OPT_fdbg_cnt_: | |
111 | 2353 /* Deferred. */ |
2354 break; | |
2355 | |
0 | 2356 case OPT_fdbg_cnt_list: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2357 /* Deferred. */ |
111 | 2358 opts->x_exit_after_options = true; |
0 | 2359 break; |
2360 | |
2361 case OPT_fdebug_prefix_map_: | |
131 | 2362 case OPT_ffile_prefix_map_: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2363 /* Deferred. */ |
0 | 2364 break; |
2365 | |
145 | 2366 case OPT_fcallgraph_info: |
2367 opts->x_flag_callgraph_info = CALLGRAPH_INFO_NAKED; | |
2368 break; | |
2369 | |
2370 case OPT_fcallgraph_info_: | |
2371 { | |
2372 char *my_arg, *p; | |
2373 my_arg = xstrdup (arg); | |
2374 p = strtok (my_arg, ","); | |
2375 while (p) | |
2376 { | |
2377 if (strcmp (p, "su") == 0) | |
2378 { | |
2379 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_STACK_USAGE; | |
2380 opts->x_flag_stack_usage_info = true; | |
2381 } | |
2382 else if (strcmp (p, "da") == 0) | |
2383 opts->x_flag_callgraph_info |= CALLGRAPH_INFO_DYNAMIC_ALLOC; | |
2384 else | |
2385 return 0; | |
2386 p = strtok (NULL, ","); | |
2387 } | |
2388 free (my_arg); | |
2389 } | |
2390 break; | |
2391 | |
0 | 2392 case OPT_fdiagnostics_show_location_: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2393 diagnostic_prefixing_rule (dc) = (diagnostic_prefixing_rule_t) value; |
0 | 2394 break; |
111 | 2395 |
2396 case OPT_fdiagnostics_show_caret: | |
2397 dc->show_caret = value; | |
2398 break; | |
2399 | |
131 | 2400 case OPT_fdiagnostics_show_labels: |
2401 dc->show_labels_p = value; | |
2402 break; | |
2403 | |
2404 case OPT_fdiagnostics_show_line_numbers: | |
2405 dc->show_line_numbers_p = value; | |
2406 break; | |
2407 | |
111 | 2408 case OPT_fdiagnostics_color_: |
2409 diagnostic_color_init (dc, value); | |
2410 break; | |
2411 | |
145 | 2412 case OPT_fdiagnostics_urls_: |
2413 diagnostic_urls_init (dc, value); | |
2414 break; | |
2415 | |
2416 case OPT_fdiagnostics_format_: | |
2417 diagnostic_output_format_init (dc, | |
2418 (enum diagnostics_output_format)value); | |
2419 break; | |
2420 | |
111 | 2421 case OPT_fdiagnostics_parseable_fixits: |
2422 dc->parseable_fixits_p = value; | |
2423 break; | |
0 | 2424 |
145 | 2425 case OPT_fdiagnostics_show_cwe: |
2426 dc->show_cwe = value; | |
2427 break; | |
2428 | |
2429 case OPT_fdiagnostics_path_format_: | |
2430 dc->path_format = (enum diagnostic_path_format)value; | |
2431 break; | |
2432 | |
2433 case OPT_fdiagnostics_show_path_depths: | |
2434 dc->show_path_depths = value; | |
2435 break; | |
2436 | |
0 | 2437 case OPT_fdiagnostics_show_option: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2438 dc->show_option_requested = value; |
0 | 2439 break; |
2440 | |
131 | 2441 case OPT_fdiagnostics_minimum_margin_width_: |
2442 dc->min_margin_width = value; | |
2443 break; | |
2444 | |
0 | 2445 case OPT_fdump_: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2446 /* Deferred. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2447 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2448 |
0 | 2449 case OPT_ffast_math: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2450 set_fast_math_flags (opts, value); |
0 | 2451 break; |
2452 | |
2453 case OPT_funsafe_math_optimizations: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2454 set_unsafe_math_optimizations_flags (opts, value); |
0 | 2455 break; |
2456 | |
2457 case OPT_ffixed_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2458 /* Deferred. */ |
0 | 2459 break; |
2460 | |
2461 case OPT_finline_limit_: | |
145 | 2462 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_single, |
2463 value / 2); | |
2464 SET_OPTION_IF_UNSET (opts, opts_set, param_max_inline_insns_auto, | |
2465 value / 2); | |
0 | 2466 break; |
2467 | |
2468 case OPT_finstrument_functions_exclude_function_list_: | |
2469 add_comma_separated_to_vector | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2470 (&opts->x_flag_instrument_functions_exclude_functions, arg); |
0 | 2471 break; |
2472 | |
2473 case OPT_finstrument_functions_exclude_file_list_: | |
2474 add_comma_separated_to_vector | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2475 (&opts->x_flag_instrument_functions_exclude_files, arg); |
0 | 2476 break; |
2477 | |
2478 case OPT_fmessage_length_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2479 pp_set_line_maximum_length (dc->printer, value); |
111 | 2480 diagnostic_set_caret_max_width (dc, value); |
0 | 2481 break; |
2482 | |
111 | 2483 case OPT_fopt_info: |
2484 case OPT_fopt_info_: | |
2485 /* Deferred. */ | |
2486 break; | |
2487 | |
2488 case OPT_foffload_: | |
2489 { | |
2490 const char *p = arg; | |
2491 opts->x_flag_disable_hsa = true; | |
2492 while (*p != 0) | |
2493 { | |
2494 const char *comma = strchr (p, ','); | |
2495 | |
2496 if ((strncmp (p, "disable", 7) == 0) | |
2497 && (p[7] == ',' || p[7] == '\0')) | |
2498 { | |
2499 opts->x_flag_disable_hsa = true; | |
2500 break; | |
2501 } | |
2502 | |
2503 if ((strncmp (p, "hsa", 3) == 0) | |
2504 && (p[3] == ',' || p[3] == '\0')) | |
2505 { | |
2506 #ifdef ENABLE_HSA | |
2507 opts->x_flag_disable_hsa = false; | |
2508 #else | |
2509 sorry ("HSA has not been enabled during configuration"); | |
2510 #endif | |
2511 } | |
2512 if (!comma) | |
2513 break; | |
2514 p = comma + 1; | |
2515 } | |
2516 break; | |
2517 } | |
2518 | |
2519 #ifndef ACCEL_COMPILER | |
2520 case OPT_foffload_abi_: | |
2521 error_at (loc, "%<-foffload-abi%> option can be specified only for " | |
2522 "offload compiler"); | |
2523 break; | |
2524 #endif | |
2525 | |
0 | 2526 case OPT_fpack_struct_: |
2527 if (value <= 0 || (value & (value - 1)) || value > 16) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2528 error_at (loc, |
131 | 2529 "structure alignment must be a small power of two, not %wu", |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2530 value); |
0 | 2531 else |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2532 opts->x_initial_max_fld_align = value; |
0 | 2533 break; |
2534 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2535 case OPT_fplugin_: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2536 case OPT_fplugin_arg_: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2537 /* Deferred. */ |
0 | 2538 break; |
2539 | |
2540 case OPT_fprofile_use_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2541 opts->x_profile_data_prefix = xstrdup (arg); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2542 opts->x_flag_profile_use = true; |
0 | 2543 value = true; |
2544 /* No break here - do -fprofile-use processing. */ | |
111 | 2545 /* FALLTHRU */ |
0 | 2546 case OPT_fprofile_use: |
111 | 2547 enable_fdo_optimizations (opts, opts_set, value); |
145 | 2548 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_reorder_functions, |
2549 value); | |
111 | 2550 /* Indirect call profiling should do all useful transformations |
2551 speculative devirtualization does. */ | |
145 | 2552 if (opts->x_flag_value_profile_transformations) |
2553 SET_OPTION_IF_UNSET (opts, opts_set, flag_devirtualize_speculatively, | |
2554 false); | |
111 | 2555 break; |
2556 | |
2557 case OPT_fauto_profile_: | |
2558 opts->x_auto_profile_file = xstrdup (arg); | |
2559 opts->x_flag_auto_profile = true; | |
2560 value = true; | |
2561 /* No break here - do -fauto-profile processing. */ | |
2562 /* FALLTHRU */ | |
2563 case OPT_fauto_profile: | |
2564 enable_fdo_optimizations (opts, opts_set, value); | |
145 | 2565 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_correction, value); |
2566 SET_OPTION_IF_UNSET (opts, opts_set, | |
2567 param_early_inliner_max_iterations, 10); | |
0 | 2568 break; |
2569 | |
2570 case OPT_fprofile_generate_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2571 opts->x_profile_data_prefix = xstrdup (arg); |
0 | 2572 value = true; |
2573 /* No break here - do -fprofile-generate processing. */ | |
111 | 2574 /* FALLTHRU */ |
0 | 2575 case OPT_fprofile_generate: |
145 | 2576 SET_OPTION_IF_UNSET (opts, opts_set, profile_arc_flag, value); |
2577 SET_OPTION_IF_UNSET (opts, opts_set, flag_profile_values, value); | |
2578 SET_OPTION_IF_UNSET (opts, opts_set, flag_inline_functions, value); | |
2579 SET_OPTION_IF_UNSET (opts, opts_set, flag_ipa_bit_cp, value); | |
0 | 2580 break; |
2581 | |
111 | 2582 case OPT_fpatchable_function_entry_: |
2583 { | |
2584 char *patch_area_arg = xstrdup (arg); | |
2585 char *comma = strchr (patch_area_arg, ','); | |
2586 if (comma) | |
2587 { | |
2588 *comma = '\0'; | |
2589 function_entry_patch_area_size = | |
2590 integral_argument (patch_area_arg); | |
2591 function_entry_patch_area_start = | |
2592 integral_argument (comma + 1); | |
2593 } | |
2594 else | |
2595 { | |
2596 function_entry_patch_area_size = | |
2597 integral_argument (patch_area_arg); | |
2598 function_entry_patch_area_start = 0; | |
2599 } | |
2600 if (function_entry_patch_area_size < 0 | |
2601 || function_entry_patch_area_start < 0 | |
2602 || function_entry_patch_area_size | |
2603 < function_entry_patch_area_start) | |
2604 error ("invalid arguments for %<-fpatchable_function_entry%>"); | |
2605 free (patch_area_arg); | |
2606 } | |
2607 break; | |
2608 | |
2609 case OPT_ftree_vectorize: | |
2610 /* Automatically sets -ftree-loop-vectorize and | |
2611 -ftree-slp-vectorize. Nothing more to do here. */ | |
2612 break; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2613 case OPT_fshow_column: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2614 dc->show_column = value; |
0 | 2615 break; |
2616 | |
2617 case OPT_frandom_seed: | |
2618 /* The real switch is -fno-random-seed. */ | |
2619 if (value) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2620 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2621 /* Deferred. */ |
0 | 2622 break; |
2623 | |
2624 case OPT_frandom_seed_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2625 /* Deferred. */ |
0 | 2626 break; |
2627 | |
2628 case OPT_fsched_verbose_: | |
2629 #ifdef INSN_SCHEDULING | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2630 /* Handled with Var in common.opt. */ |
0 | 2631 break; |
2632 #else | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2633 return false; |
0 | 2634 #endif |
2635 | |
2636 case OPT_fsched_stalled_insns_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2637 opts->x_flag_sched_stalled_insns = value; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2638 if (opts->x_flag_sched_stalled_insns == 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2639 opts->x_flag_sched_stalled_insns = -1; |
0 | 2640 break; |
2641 | |
2642 case OPT_fsched_stalled_insns_dep_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2643 opts->x_flag_sched_stalled_insns_dep = value; |
0 | 2644 break; |
2645 | |
2646 case OPT_fstack_check_: | |
2647 if (!strcmp (arg, "no")) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2648 opts->x_flag_stack_check = NO_STACK_CHECK; |
0 | 2649 else if (!strcmp (arg, "generic")) |
2650 /* This is the old stack checking method. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2651 opts->x_flag_stack_check = STACK_CHECK_BUILTIN |
0 | 2652 ? FULL_BUILTIN_STACK_CHECK |
2653 : GENERIC_STACK_CHECK; | |
2654 else if (!strcmp (arg, "specific")) | |
2655 /* This is the new stack checking method. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2656 opts->x_flag_stack_check = STACK_CHECK_BUILTIN |
0 | 2657 ? FULL_BUILTIN_STACK_CHECK |
2658 : STACK_CHECK_STATIC_BUILTIN | |
2659 ? STATIC_BUILTIN_STACK_CHECK | |
2660 : GENERIC_STACK_CHECK; | |
2661 else | |
111 | 2662 warning_at (loc, 0, "unknown stack check parameter %qs", arg); |
0 | 2663 break; |
2664 | |
2665 case OPT_fstack_limit: | |
2666 /* The real switch is -fno-stack-limit. */ | |
2667 if (value) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2668 return false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2669 /* Deferred. */ |
0 | 2670 break; |
2671 | |
2672 case OPT_fstack_limit_register_: | |
2673 case OPT_fstack_limit_symbol_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2674 /* Deferred. */ |
0 | 2675 break; |
2676 | |
111 | 2677 case OPT_fstack_usage: |
2678 opts->x_flag_stack_usage = value; | |
2679 opts->x_flag_stack_usage_info = value != 0; | |
0 | 2680 break; |
2681 | |
2682 case OPT_g: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2683 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, arg, opts, opts_set, |
111 | 2684 loc); |
0 | 2685 break; |
2686 | |
111 | 2687 case OPT_gdwarf: |
2688 if (arg && strlen (arg) != 0) | |
2689 { | |
145 | 2690 error_at (loc, "%<-gdwarf%s%> is ambiguous; " |
2691 "use %<-gdwarf-%s%> for DWARF version " | |
2692 "or %<-gdwarf%> %<-g%s%> for debug level", arg, arg, arg); | |
111 | 2693 break; |
2694 } | |
2695 else | |
2696 value = opts->x_dwarf_version; | |
2697 | |
2698 /* FALLTHRU */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2699 case OPT_gdwarf_: |
111 | 2700 if (value < 2 || value > 5) |
131 | 2701 error_at (loc, "dwarf version %wu is not supported", value); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2702 else |
111 | 2703 opts->x_dwarf_version = value; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2704 set_debug_level (DWARF2_DEBUG, false, "", opts, opts_set, loc); |
0 | 2705 break; |
2706 | |
111 | 2707 case OPT_gsplit_dwarf: |
2708 set_debug_level (NO_DEBUG, DEFAULT_GDB_EXTENSIONS, "", opts, opts_set, | |
2709 loc); | |
2710 break; | |
2711 | |
0 | 2712 case OPT_ggdb: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2713 set_debug_level (NO_DEBUG, 2, arg, opts, opts_set, loc); |
0 | 2714 break; |
2715 | |
2716 case OPT_gstabs: | |
2717 case OPT_gstabs_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2718 set_debug_level (DBX_DEBUG, code == OPT_gstabs_, arg, opts, opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2719 loc); |
0 | 2720 break; |
2721 | |
2722 case OPT_gvms: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2723 set_debug_level (VMS_DEBUG, false, arg, opts, opts_set, loc); |
0 | 2724 break; |
2725 | |
2726 case OPT_gxcoff: | |
2727 case OPT_gxcoff_: | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2728 set_debug_level (XCOFF_DEBUG, code == OPT_gxcoff_, arg, opts, opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2729 loc); |
0 | 2730 break; |
2731 | |
111 | 2732 case OPT_gz: |
2733 case OPT_gz_: | |
2734 /* Handled completely via specs. */ | |
2735 break; | |
2736 | |
0 | 2737 case OPT_pedantic_errors: |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2738 dc->pedantic_errors = 1; |
111 | 2739 control_warning_option (OPT_Wpedantic, DK_ERROR, NULL, value, |
2740 loc, lang_mask, | |
2741 handlers, opts, opts_set, | |
2742 dc); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2743 break; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2744 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2745 case OPT_flto: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2746 opts->x_flag_lto = value ? "" : NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2747 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2748 |
145 | 2749 case OPT_flto_: |
2750 if (strcmp (arg, "none") != 0 | |
2751 && strcmp (arg, "jobserver") != 0 | |
2752 && strcmp (arg, "auto") != 0 | |
2753 && atoi (arg) == 0) | |
2754 error_at (loc, | |
2755 "unrecognized argument to %<-flto=%> option: %qs", arg); | |
2756 break; | |
2757 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2758 case OPT_w: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2759 dc->dc_inhibit_warnings = true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2760 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2761 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2762 case OPT_fmax_errors_: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2763 dc->max_errors = value; |
0 | 2764 break; |
2765 | |
111 | 2766 case OPT_fuse_ld_bfd: |
2767 case OPT_fuse_ld_gold: | |
145 | 2768 case OPT_fuse_ld_lld: |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2769 case OPT_fuse_linker_plugin: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2770 /* No-op. Used by the driver and passed to us because it starts with f.*/ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2771 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2772 |
111 | 2773 case OPT_fwrapv: |
2774 if (value) | |
2775 opts->x_flag_trapv = 0; | |
2776 break; | |
2777 | |
2778 case OPT_ftrapv: | |
2779 if (value) | |
2780 opts->x_flag_wrapv = 0; | |
2781 break; | |
2782 | |
131 | 2783 case OPT_fstrict_overflow: |
2784 opts->x_flag_wrapv = !value; | |
2785 opts->x_flag_wrapv_pointer = !value; | |
2786 if (!value) | |
2787 opts->x_flag_trapv = 0; | |
2788 break; | |
2789 | |
111 | 2790 case OPT_fipa_icf: |
2791 opts->x_flag_ipa_icf_functions = value; | |
2792 opts->x_flag_ipa_icf_variables = value; | |
2793 break; | |
2794 | |
131 | 2795 case OPT_falign_loops_: |
2796 check_alignment_argument (loc, arg, "loops"); | |
2797 break; | |
2798 | |
2799 case OPT_falign_jumps_: | |
2800 check_alignment_argument (loc, arg, "jumps"); | |
2801 break; | |
2802 | |
2803 case OPT_falign_labels_: | |
2804 check_alignment_argument (loc, arg, "labels"); | |
2805 break; | |
2806 | |
2807 case OPT_falign_functions_: | |
2808 check_alignment_argument (loc, arg, "functions"); | |
2809 break; | |
2810 | |
0 | 2811 default: |
2812 /* If the flag was handled in a standard way, assume the lack of | |
2813 processing here is intentional. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2814 gcc_assert (option_flag_var (scode, opts)); |
0 | 2815 break; |
2816 } | |
2817 | |
111 | 2818 common_handle_option_auto (opts, opts_set, decoded, lang_mask, kind, |
2819 loc, handlers, dc); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2820 return true; |
0 | 2821 } |
2822 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2823 /* Used to set the level of strict aliasing warnings in OPTS, |
0 | 2824 when no level is specified (i.e., when -Wstrict-aliasing, and not |
2825 -Wstrict-aliasing=level was given). | |
2826 ONOFF is assumed to take value 1 when -Wstrict-aliasing is specified, | |
2827 and 0 otherwise. After calling this function, wstrict_aliasing will be | |
2828 set to the default value of -Wstrict_aliasing=level, currently 3. */ | |
111 | 2829 static void |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2830 set_Wstrict_aliasing (struct gcc_options *opts, int onoff) |
0 | 2831 { |
2832 gcc_assert (onoff == 0 || onoff == 1); | |
2833 if (onoff != 0) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2834 opts->x_warn_strict_aliasing = 3; |
0 | 2835 else |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2836 opts->x_warn_strict_aliasing = 0; |
0 | 2837 } |
2838 | |
2839 /* The following routines are useful in setting all the flags that | |
2840 -ffast-math and -fno-fast-math imply. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2841 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2842 set_fast_math_flags (struct gcc_options *opts, int set) |
0 | 2843 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2844 if (!opts->frontend_set_flag_unsafe_math_optimizations) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2845 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2846 opts->x_flag_unsafe_math_optimizations = set; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2847 set_unsafe_math_optimizations_flags (opts, set); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2848 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2849 if (!opts->frontend_set_flag_finite_math_only) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2850 opts->x_flag_finite_math_only = set; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2851 if (!opts->frontend_set_flag_errno_math) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2852 opts->x_flag_errno_math = !set; |
0 | 2853 if (set) |
2854 { | |
145 | 2855 if (opts->frontend_set_flag_excess_precision == EXCESS_PRECISION_DEFAULT) |
2856 opts->x_flag_excess_precision | |
111 | 2857 = set ? EXCESS_PRECISION_FAST : EXCESS_PRECISION_DEFAULT; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2858 if (!opts->frontend_set_flag_signaling_nans) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2859 opts->x_flag_signaling_nans = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2860 if (!opts->frontend_set_flag_rounding_math) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2861 opts->x_flag_rounding_math = 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2862 if (!opts->frontend_set_flag_cx_limited_range) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2863 opts->x_flag_cx_limited_range = 1; |
0 | 2864 } |
2865 } | |
2866 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2867 /* When -funsafe-math-optimizations is set the following |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2868 flags are set as well. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2869 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2870 set_unsafe_math_optimizations_flags (struct gcc_options *opts, int set) |
0 | 2871 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2872 if (!opts->frontend_set_flag_trapping_math) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2873 opts->x_flag_trapping_math = !set; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2874 if (!opts->frontend_set_flag_signed_zeros) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2875 opts->x_flag_signed_zeros = !set; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2876 if (!opts->frontend_set_flag_associative_math) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2877 opts->x_flag_associative_math = set; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2878 if (!opts->frontend_set_flag_reciprocal_math) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2879 opts->x_flag_reciprocal_math = set; |
0 | 2880 } |
2881 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2882 /* Return true iff flags in OPTS are set as if -ffast-math. */ |
0 | 2883 bool |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2884 fast_math_flags_set_p (const struct gcc_options *opts) |
0 | 2885 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2886 return (!opts->x_flag_trapping_math |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2887 && opts->x_flag_unsafe_math_optimizations |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2888 && opts->x_flag_finite_math_only |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2889 && !opts->x_flag_signed_zeros |
111 | 2890 && !opts->x_flag_errno_math |
145 | 2891 && opts->x_flag_excess_precision == EXCESS_PRECISION_FAST); |
0 | 2892 } |
2893 | |
2894 /* Return true iff flags are set as if -ffast-math but using the flags stored | |
2895 in the struct cl_optimization structure. */ | |
2896 bool | |
2897 fast_math_flags_struct_set_p (struct cl_optimization *opt) | |
2898 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2899 return (!opt->x_flag_trapping_math |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2900 && opt->x_flag_unsafe_math_optimizations |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2901 && opt->x_flag_finite_math_only |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2902 && !opt->x_flag_signed_zeros |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2903 && !opt->x_flag_errno_math); |
0 | 2904 } |
2905 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2906 /* Handle a debug output -g switch for options OPTS |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2907 (OPTS_SET->x_write_symbols storing whether a debug type was passed |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2908 explicitly), location LOC. EXTENDED is true or false to support |
0 | 2909 extended output (2 is special and means "-ggdb" was given). */ |
2910 static void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2911 set_debug_level (enum debug_info_type type, int extended, const char *arg, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2912 struct gcc_options *opts, struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2913 location_t loc) |
0 | 2914 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2915 opts->x_use_gnu_debug_info_extensions = extended; |
0 | 2916 |
2917 if (type == NO_DEBUG) | |
2918 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2919 if (opts->x_write_symbols == NO_DEBUG) |
0 | 2920 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2921 opts->x_write_symbols = PREFERRED_DEBUGGING_TYPE; |
0 | 2922 |
2923 if (extended == 2) | |
2924 { | |
111 | 2925 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_LINENO_DEBUGGING_INFO |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2926 opts->x_write_symbols = DWARF2_DEBUG; |
0 | 2927 #elif defined DBX_DEBUGGING_INFO |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2928 opts->x_write_symbols = DBX_DEBUG; |
0 | 2929 #endif |
2930 } | |
2931 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2932 if (opts->x_write_symbols == NO_DEBUG) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2933 warning_at (loc, 0, "target system does not support debug output"); |
0 | 2934 } |
2935 } | |
2936 else | |
2937 { | |
2938 /* Does it conflict with an already selected type? */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2939 if (opts_set->x_write_symbols != NO_DEBUG |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2940 && opts->x_write_symbols != NO_DEBUG |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2941 && type != opts->x_write_symbols) |
111 | 2942 error_at (loc, "debug format %qs conflicts with prior selection", |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2943 debug_type_names[type]); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2944 opts->x_write_symbols = type; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2945 opts_set->x_write_symbols = type; |
0 | 2946 } |
2947 | |
111 | 2948 /* A debug flag without a level defaults to level 2. |
2949 If off or at level 1, set it to level 2, but if already | |
2950 at level 3, don't lower it. */ | |
0 | 2951 if (*arg == '\0') |
2952 { | |
111 | 2953 if (opts->x_debug_info_level < DINFO_LEVEL_NORMAL) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2954 opts->x_debug_info_level = DINFO_LEVEL_NORMAL; |
0 | 2955 } |
2956 else | |
2957 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2958 int argval = integral_argument (arg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2959 if (argval == -1) |
111 | 2960 error_at (loc, "unrecognized debug output level %qs", arg); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2961 else if (argval > 3) |
111 | 2962 error_at (loc, "debug output level %qs is too high", arg); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
2963 else |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2964 opts->x_debug_info_level = (enum debug_info_levels) argval; |
0 | 2965 } |
2966 } | |
2967 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2968 /* Arrange to dump core on error for diagnostic context DC. (The |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2969 regular error message is still printed first, except in the case of |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2970 abort ().) */ |
0 | 2971 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2972 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2973 setup_core_dumping (diagnostic_context *dc) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2974 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2975 #ifdef SIGABRT |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2976 signal (SIGABRT, SIG_DFL); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2977 #endif |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2978 #if defined(HAVE_SETRLIMIT) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2979 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2980 struct rlimit rlim; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2981 if (getrlimit (RLIMIT_CORE, &rlim) != 0) |
111 | 2982 fatal_error (input_location, "getting core file size maximum limit: %m"); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2983 rlim.rlim_cur = rlim.rlim_max; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2984 if (setrlimit (RLIMIT_CORE, &rlim) != 0) |
111 | 2985 fatal_error (input_location, |
2986 "setting core file size limit to maximum: %m"); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2987 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2988 #endif |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2989 diagnostic_abort_on_error (dc); |
0 | 2990 } |
2991 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2992 /* Parse a -d<ARG> command line switch for OPTS, location LOC, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2993 diagnostic context DC. */ |
0 | 2994 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2995 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2996 decode_d_option (const char *arg, struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2997 location_t loc, diagnostic_context *dc) |
0 | 2998 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2999 int c; |
0 | 3000 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3001 while (*arg) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3002 switch (c = *arg++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3003 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3004 case 'A': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3005 opts->x_flag_debug_asm = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3006 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3007 case 'p': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3008 opts->x_flag_print_asm_name = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3009 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3010 case 'P': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3011 opts->x_flag_dump_rtl_in_asm = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3012 opts->x_flag_print_asm_name = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3013 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3014 case 'x': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3015 opts->x_rtl_dump_and_exit = 1; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3016 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3017 case 'D': /* These are handled by the preprocessor. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3018 case 'I': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3019 case 'M': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3020 case 'N': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3021 case 'U': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3022 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3023 case 'H': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3024 setup_core_dumping (dc); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3025 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3026 case 'a': |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3027 opts->x_flag_dump_all_passed = true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3028 break; |
0 | 3029 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3030 default: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3031 warning_at (loc, 0, "unrecognized gcc debugging option: %c", c); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3032 break; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3033 } |
0 | 3034 } |
3035 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3036 /* Enable (or disable if VALUE is 0) a warning option ARG (language |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3037 mask LANG_MASK, option handlers HANDLERS) as an error for option |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3038 structures OPTS and OPTS_SET, diagnostic context DC (possibly |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3039 NULL), location LOC. This is used by -Werror=. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
3040 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3041 static void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3042 enable_warning_as_error (const char *arg, int value, unsigned int lang_mask, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3043 const struct cl_option_handlers *handlers, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3044 struct gcc_options *opts, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3045 struct gcc_options *opts_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3046 location_t loc, diagnostic_context *dc) |
0 | 3047 { |
3048 char *new_option; | |
3049 int option_index; | |
3050 | |
3051 new_option = XNEWVEC (char, strlen (arg) + 2); | |
3052 new_option[0] = 'W'; | |
3053 strcpy (new_option + 1, arg); | |
3054 option_index = find_opt (new_option, lang_mask); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3055 if (option_index == OPT_SPECIAL_unknown) |
145 | 3056 { |
3057 option_proposer op; | |
3058 const char *hint = op.suggest_option (new_option); | |
3059 if (hint) | |
3060 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;" | |
3061 " did you mean %<-%s%>?", value ? "" : "no-", | |
3062 arg, new_option, hint); | |
3063 else | |
3064 error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>", | |
3065 value ? "" : "no-", arg, new_option); | |
3066 } | |
111 | 3067 else if (!(cl_options[option_index].flags & CL_WARNING)) |
145 | 3068 error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that " |
3069 "controls warnings", arg, new_option); | |
0 | 3070 else |
3071 { | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
3072 const diagnostic_t kind = value ? DK_ERROR : DK_WARNING; |
111 | 3073 const char *arg = NULL; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
3074 |
111 | 3075 if (cl_options[option_index].flags & CL_JOINED) |
3076 arg = new_option + cl_options[option_index].opt_len; | |
3077 control_warning_option (option_index, (int) kind, arg, value, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3078 loc, lang_mask, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3079 handlers, opts, opts_set, dc); |
0 | 3080 } |
3081 free (new_option); | |
3082 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3083 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3084 /* Return malloced memory for the name of the option OPTION_INDEX |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3085 which enabled a diagnostic (context CONTEXT), originally of type |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3086 ORIG_DIAG_KIND but possibly converted to DIAG_KIND by options such |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3087 as -Werror. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3088 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3089 char * |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3090 option_name (diagnostic_context *context, int option_index, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3091 diagnostic_t orig_diag_kind, diagnostic_t diag_kind) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3092 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3093 if (option_index) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3094 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3095 /* A warning classified as an error. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3096 if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3097 && diag_kind == DK_ERROR) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3098 return concat (cl_options[OPT_Werror_].opt_text, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3099 /* Skip over "-W". */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3100 cl_options[option_index].opt_text + 2, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3101 NULL); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3102 /* A warning with option. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3103 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3104 return xstrdup (cl_options[option_index].opt_text); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3105 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3106 /* A warning without option classified as an error. */ |
111 | 3107 else if ((orig_diag_kind == DK_WARNING || orig_diag_kind == DK_PEDWARN |
3108 || diag_kind == DK_WARNING) | |
3109 && context->warning_as_error_requested) | |
3110 return xstrdup (cl_options[OPT_Werror].opt_text); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3111 else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3112 return NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3113 } |
145 | 3114 |
3115 /* Return malloced memory for a URL describing the option OPTION_INDEX | |
3116 which enabled a diagnostic (context CONTEXT). */ | |
3117 | |
3118 char * | |
3119 get_option_url (diagnostic_context *, int option_index) | |
3120 { | |
3121 if (option_index) | |
3122 /* DOCUMENTATION_ROOT_URL should be supplied via -D by the Makefile | |
3123 (see --with-documentation-root-url). | |
3124 | |
3125 Expect an anchor of the form "index-Wfoo" e.g. | |
3126 <a name="index-Wformat"></a>, and thus an id within | |
3127 the URL of "#index-Wformat". */ | |
3128 return concat (DOCUMENTATION_ROOT_URL, | |
3129 "Warning-Options.html", | |
3130 "#index", cl_options[option_index].opt_text, | |
3131 NULL); | |
3132 else | |
3133 return NULL; | |
3134 } |