Mercurial > hg > CbC > CbC_gcc
annotate gcc/toplev.c @ 59:5b5b9ea5b220
fix
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 15 Feb 2010 17:22:24 +0900 |
parents | 77e2b8dfacca |
children | b7f97abdc517 |
rev | line source |
---|---|
0 | 1 /* Top level of GCC compilers (cc1, cc1plus, etc.) |
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 |
0 | 4 Free Software Foundation, Inc. |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 /* This is the top level of cc1/c++. | |
23 It parses command args, opens files, invokes the various passes | |
24 in the proper order, and counts the time used by each. | |
25 Error messages and low-level interface to malloc also handled here. */ | |
26 | |
27 #include "config.h" | |
28 #undef FLOAT /* This is for hpux. They should change hpux. */ | |
29 #undef FFS /* Some systems define this in param.h. */ | |
30 #include "system.h" | |
31 #include "coretypes.h" | |
32 #include "tm.h" | |
33 #include <signal.h> | |
34 | |
35 #ifdef HAVE_SYS_RESOURCE_H | |
36 # include <sys/resource.h> | |
37 #endif | |
38 | |
39 #ifdef HAVE_SYS_TIMES_H | |
40 # include <sys/times.h> | |
41 #endif | |
42 | |
43 #include "line-map.h" | |
44 #include "input.h" | |
45 #include "tree.h" | |
46 #include "version.h" | |
47 #include "rtl.h" | |
48 #include "tm_p.h" | |
49 #include "flags.h" | |
50 #include "insn-attr.h" | |
51 #include "insn-config.h" | |
52 #include "insn-flags.h" | |
53 #include "hard-reg-set.h" | |
54 #include "recog.h" | |
55 #include "output.h" | |
56 #include "except.h" | |
57 #include "function.h" | |
58 #include "toplev.h" | |
59 #include "expr.h" | |
60 #include "basic-block.h" | |
61 #include "intl.h" | |
62 #include "ggc.h" | |
63 #include "graph.h" | |
64 #include "regs.h" | |
65 #include "timevar.h" | |
66 #include "diagnostic.h" | |
67 #include "params.h" | |
68 #include "reload.h" | |
69 #include "ira.h" | |
70 #include "dwarf2asm.h" | |
71 #include "integrate.h" | |
72 #include "real.h" | |
73 #include "debug.h" | |
74 #include "target.h" | |
75 #include "langhooks.h" | |
76 #include "cfglayout.h" | |
77 #include "cfgloop.h" | |
78 #include "hosthooks.h" | |
79 #include "cgraph.h" | |
80 #include "opts.h" | |
81 #include "coverage.h" | |
82 #include "value-prof.h" | |
83 #include "alloc-pool.h" | |
84 #include "tree-mudflap.h" | |
85 #include "tree-pass.h" | |
86 #include "gimple.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
87 #include "tree-ssa-alias.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
88 #include "plugin.h" |
0 | 89 |
90 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) | |
91 #include "dwarf2out.h" | |
92 #endif | |
93 | |
94 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) | |
95 #include "dbxout.h" | |
96 #endif | |
97 | |
98 #ifdef SDB_DEBUGGING_INFO | |
99 #include "sdbout.h" | |
100 #endif | |
101 | |
102 #ifdef XCOFF_DEBUGGING_INFO | |
103 #include "xcoffout.h" /* Needed for external data | |
104 declarations for e.g. AIX 4.x. */ | |
105 #endif | |
106 | |
107 static void general_init (const char *); | |
108 static void do_compile (void); | |
109 static void process_options (void); | |
110 static void backend_init (void); | |
111 static int lang_dependent_init (const char *); | |
112 static void init_asm_output (const char *); | |
113 static void finalize (void); | |
114 | |
115 static void crash_signal (int) ATTRIBUTE_NORETURN; | |
116 static void setup_core_dumping (void); | |
117 static void compile_file (void); | |
118 | |
119 /* Nonzero to dump debug info whilst parsing (-dy option). */ | |
120 static int set_yydebug; | |
121 | |
122 /* True if we don't need a backend (e.g. preprocessing only). */ | |
123 static bool no_backend; | |
124 | |
125 /* Length of line when printing switch values. */ | |
126 #define MAX_LINE 75 | |
127 | |
128 /* Name of program invoked, sans directories. */ | |
129 | |
130 const char *progname; | |
131 | |
132 /* Copy of argument vector to toplev_main. */ | |
133 static const char **save_argv; | |
134 | |
135 /* Name of top-level original source file (what was input to cpp). | |
136 This comes from the #-command at the beginning of the actual input. | |
137 If there isn't any there, then this is the cc1 input file name. */ | |
138 | |
139 const char *main_input_filename; | |
140 | |
141 /* Used to enable -fvar-tracking, -fweb and -frename-registers according | |
142 to optimize and default_debug_hooks in process_options (). */ | |
143 #define AUTODETECT_VALUE 2 | |
144 | |
145 /* Current position in real source file. */ | |
146 | |
147 location_t input_location; | |
148 | |
149 struct line_maps *line_table; | |
150 | |
151 /* Name to use as base of names for dump output files. */ | |
152 | |
153 const char *dump_base_name; | |
154 | |
155 /* Name to use as a base for auxiliary output files. */ | |
156 | |
157 const char *aux_base_name; | |
158 | |
159 /* Prefix for profile data files */ | |
160 const char *profile_data_prefix; | |
161 | |
162 /* A mask of target_flags that includes bit X if X was set or cleared | |
163 on the command line. */ | |
164 | |
165 int target_flags_explicit; | |
166 | |
167 /* Debug hooks - dependent upon command line options. */ | |
168 | |
169 const struct gcc_debug_hooks *debug_hooks; | |
170 | |
171 /* Debug hooks - target default. */ | |
172 | |
173 static const struct gcc_debug_hooks *default_debug_hooks; | |
174 | |
175 /* Other flags saying which kinds of debugging dump have been requested. */ | |
176 | |
177 int rtl_dump_and_exit; | |
178 int flag_print_asm_name; | |
179 enum graph_dump_types graph_dump_format; | |
180 | |
181 /* Name for output file of assembly code, specified with -o. */ | |
182 | |
183 const char *asm_file_name; | |
184 | |
185 /* Nonzero means do optimizations. -O. | |
186 Particular numeric values stand for particular amounts of optimization; | |
187 thus, -O2 stores 2 here. However, the optimizations beyond the basic | |
188 ones are not controlled directly by this variable. Instead, they are | |
189 controlled by individual `flag_...' variables that are defaulted | |
190 based on this variable. */ | |
191 | |
192 int optimize = 0; | |
193 | |
194 /* Nonzero means optimize for size. -Os. | |
195 The only valid values are zero and nonzero. When optimize_size is | |
196 nonzero, optimize defaults to 2, but certain individual code | |
197 bloating optimizations are disabled. */ | |
198 | |
199 int optimize_size = 0; | |
200 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
201 /* True if this is the lto front end. This is used to disable |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
202 gimple generation and lowering passes that are normally run on the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
203 output of a front end. These passes must be bypassed for lto since |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
204 they have already been done before the gimple was written. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
205 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
206 bool in_lto_p = false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
207 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
208 /* Nonzero if we should write GIMPLE bytecode for link-time optimization. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
209 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
210 int flag_generate_lto; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
211 |
0 | 212 /* The FUNCTION_DECL for the function currently being compiled, |
213 or 0 if between functions. */ | |
214 tree current_function_decl; | |
215 | |
216 /* Set to the FUNC_BEGIN label of the current function, or NULL | |
217 if none. */ | |
218 const char * current_function_func_begin_label; | |
219 | |
220 /* Nonzero means to collect statistics which might be expensive | |
221 and to print them when we are done. */ | |
222 int flag_detailed_statistics = 0; | |
223 | |
224 /* A random sequence of characters, unless overridden by user. */ | |
225 static const char *flag_random_seed; | |
226 | |
227 /* A local time stamp derived from the time of compilation. It will be | |
228 zero if the system cannot provide a time. It will be -1u, if the | |
229 user has specified a particular random seed. */ | |
230 unsigned local_tick; | |
231 | |
232 /* -f flags. */ | |
233 | |
234 /* Nonzero means `char' should be signed. */ | |
235 | |
236 int flag_signed_char; | |
237 | |
238 /* Nonzero means give an enum type only as many bytes as it needs. A value | |
239 of 2 means it has not yet been initialized. */ | |
240 | |
241 int flag_short_enums; | |
242 | |
243 /* Nonzero if structures and unions should be returned in memory. | |
244 | |
245 This should only be defined if compatibility with another compiler or | |
246 with an ABI is needed, because it results in slower code. */ | |
247 | |
248 #ifndef DEFAULT_PCC_STRUCT_RETURN | |
249 #define DEFAULT_PCC_STRUCT_RETURN 1 | |
250 #endif | |
251 | |
252 /* Nonzero for -fpcc-struct-return: return values the same way PCC does. */ | |
253 | |
254 int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN; | |
255 | |
256 /* 0 means straightforward implementation of complex divide acceptable. | |
257 1 means wide ranges of inputs must work for complex divide. | |
258 2 means C99-like requirements for complex multiply and divide. */ | |
259 | |
260 int flag_complex_method = 1; | |
261 | |
262 /* Nonzero means we should be saving declaration info into a .X file. */ | |
263 | |
264 int flag_gen_aux_info = 0; | |
265 | |
266 /* Specified name of aux-info file. */ | |
267 | |
268 const char *aux_info_file_name; | |
269 | |
270 /* Nonzero if we are compiling code for a shared library, zero for | |
271 executable. */ | |
272 | |
273 int flag_shlib; | |
274 | |
275 /* Generate code for GNU or NeXT Objective-C runtime environment. */ | |
276 | |
277 #ifdef NEXT_OBJC_RUNTIME | |
278 int flag_next_runtime = 1; | |
279 #else | |
280 int flag_next_runtime = 0; | |
281 #endif | |
282 | |
283 /* Set to the default thread-local storage (tls) model to use. */ | |
284 | |
285 enum tls_model flag_tls_default = TLS_MODEL_GLOBAL_DYNAMIC; | |
286 | |
287 /* Set the default region and algorithm for the integrated register | |
288 allocator. */ | |
289 | |
290 enum ira_algorithm flag_ira_algorithm = IRA_ALGORITHM_CB; | |
291 enum ira_region flag_ira_region = IRA_REGION_MIXED; | |
292 | |
293 /* Set the default value for -fira-verbose. */ | |
294 | |
295 unsigned int flag_ira_verbose = 5; | |
296 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
297 /* Set the default for excess precision. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
298 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
299 enum excess_precision flag_excess_precision_cmdline = EXCESS_PRECISION_DEFAULT; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
300 enum excess_precision flag_excess_precision = EXCESS_PRECISION_DEFAULT; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
301 |
0 | 302 /* Nonzero means change certain warnings into errors. |
303 Usually these are warnings about failure to conform to some standard. */ | |
304 | |
305 int flag_pedantic_errors = 0; | |
306 | |
307 /* Nonzero means make permerror produce warnings instead of errors. */ | |
308 | |
309 int flag_permissive = 0; | |
310 | |
311 /* -dA causes debug commentary information to be produced in | |
312 the generated assembly code (to make it more readable). This option | |
313 is generally only of use to those who actually need to read the | |
314 generated assembly code (perhaps while debugging the compiler itself). | |
315 Currently, this switch is only used by dwarfout.c; however, it is intended | |
316 to be a catchall for printing debug information in the assembler file. */ | |
317 | |
318 int flag_debug_asm = 0; | |
319 | |
320 /* -dP causes the rtl to be emitted as a comment in assembly. */ | |
321 | |
322 int flag_dump_rtl_in_asm = 0; | |
323 | |
324 /* When non-NULL, indicates that whenever space is allocated on the | |
325 stack, the resulting stack pointer must not pass this | |
326 address---that is, for stacks that grow downward, the stack pointer | |
327 must always be greater than or equal to this address; for stacks | |
328 that grow upward, the stack pointer must be less than this address. | |
329 At present, the rtx may be either a REG or a SYMBOL_REF, although | |
330 the support provided depends on the backend. */ | |
331 rtx stack_limit_rtx; | |
332 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
333 /* Positive if we should track variables, negative if we should run |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
334 the var-tracking pass only to discard debug annotations, zero if |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
335 we're not to run it. When flag_var_tracking == AUTODETECT_VALUE it |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
336 will be set according to optimize, debug_info_level and debug_hooks |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
337 in process_options (). */ |
0 | 338 int flag_var_tracking = AUTODETECT_VALUE; |
339 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
340 /* Positive if we should track variables at assignments, negative if |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
341 we should run the var-tracking pass only to discard debug |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
342 annotations. When flag_var_tracking_assignments == |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
343 AUTODETECT_VALUE it will be set according to flag_var_tracking. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
344 int flag_var_tracking_assignments = AUTODETECT_VALUE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
345 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
346 /* Nonzero if we should toggle flag_var_tracking_assignments after |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
347 processing options and computing its default. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
348 int flag_var_tracking_assignments_toggle = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
349 |
0 | 350 /* Type of stack check. */ |
351 enum stack_check_type flag_stack_check = NO_STACK_CHECK; | |
352 | |
353 /* True if the user has tagged the function with the 'section' | |
354 attribute. */ | |
355 | |
356 bool user_defined_section_attribute = false; | |
357 | |
358 /* Values of the -falign-* flags: how much to align labels in code. | |
359 0 means `use default', 1 means `don't align'. | |
360 For each variable, there is an _log variant which is the power | |
361 of two not less than the variable, for .align output. */ | |
362 | |
363 int align_loops_log; | |
364 int align_loops_max_skip; | |
365 int align_jumps_log; | |
366 int align_jumps_max_skip; | |
367 int align_labels_log; | |
368 int align_labels_max_skip; | |
369 int align_functions_log; | |
370 | |
371 typedef struct | |
372 { | |
373 const char *const string; | |
374 int *const variable; | |
375 const int on_value; | |
376 } | |
377 lang_independent_options; | |
378 | |
379 /* Nonzero if subexpressions must be evaluated from left-to-right. */ | |
380 int flag_evaluation_order = 0; | |
381 | |
382 /* The user symbol prefix after having resolved same. */ | |
383 const char *user_label_prefix; | |
384 | |
385 static const param_info lang_independent_params[] = { | |
386 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT, MIN, MAX) \ | |
387 { OPTION, DEFAULT, false, MIN, MAX, HELP }, | |
388 #include "params.def" | |
389 #undef DEFPARAM | |
390 { NULL, 0, false, 0, 0, NULL } | |
391 }; | |
392 | |
393 /* Output files for assembler code (real compiler output) | |
394 and debugging dumps. */ | |
395 | |
396 FILE *asm_out_file; | |
397 FILE *aux_info_file; | |
398 FILE *dump_file = NULL; | |
399 const char *dump_file_name; | |
400 | |
401 /* The current working directory of a translation. It's generally the | |
402 directory from which compilation was initiated, but a preprocessed | |
403 file may specify the original directory in which it was | |
404 created. */ | |
405 | |
406 static const char *src_pwd; | |
407 | |
408 /* Initialize src_pwd with the given string, and return true. If it | |
409 was already initialized, return false. As a special case, it may | |
410 be called with a NULL argument to test whether src_pwd has NOT been | |
411 initialized yet. */ | |
412 | |
413 bool | |
414 set_src_pwd (const char *pwd) | |
415 { | |
416 if (src_pwd) | |
417 { | |
418 if (strcmp (src_pwd, pwd) == 0) | |
419 return true; | |
420 else | |
421 return false; | |
422 } | |
423 | |
424 src_pwd = xstrdup (pwd); | |
425 return true; | |
426 } | |
427 | |
428 /* Return the directory from which the translation unit was initiated, | |
429 in case set_src_pwd() was not called before to assign it a | |
430 different value. */ | |
431 | |
432 const char * | |
433 get_src_pwd (void) | |
434 { | |
435 if (! src_pwd) | |
436 { | |
437 src_pwd = getpwd (); | |
438 if (!src_pwd) | |
439 src_pwd = "."; | |
440 } | |
441 | |
442 return src_pwd; | |
443 } | |
444 | |
445 /* Called when the start of a function definition is parsed, | |
446 this function prints on stderr the name of the function. */ | |
447 void | |
448 announce_function (tree decl) | |
449 { | |
450 if (!quiet_flag) | |
451 { | |
452 if (rtl_dump_and_exit) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
453 fprintf (stderr, "%s ", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
454 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl)))); |
0 | 455 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
456 fprintf (stderr, " %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
457 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2))); |
0 | 458 fflush (stderr); |
459 pp_needs_newline (global_dc->printer) = true; | |
460 diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL); | |
461 } | |
462 } | |
463 | |
464 /* Initialize local_tick with the time of day, or -1 if | |
465 flag_random_seed is set. */ | |
466 | |
467 static void | |
468 init_local_tick (void) | |
469 { | |
470 if (!flag_random_seed) | |
471 { | |
472 /* Get some more or less random data. */ | |
473 #ifdef HAVE_GETTIMEOFDAY | |
474 { | |
475 struct timeval tv; | |
476 | |
477 gettimeofday (&tv, NULL); | |
478 local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000; | |
479 } | |
480 #else | |
481 { | |
482 time_t now = time (NULL); | |
483 | |
484 if (now != (time_t)-1) | |
485 local_tick = (unsigned) now; | |
486 } | |
487 #endif | |
488 } | |
489 else | |
490 local_tick = -1; | |
491 } | |
492 | |
493 /* Set up a default flag_random_seed and local_tick, unless the user | |
494 already specified one. Must be called after init_local_tick. */ | |
495 | |
496 static void | |
497 init_random_seed (void) | |
498 { | |
499 unsigned HOST_WIDE_INT value; | |
500 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3]; | |
501 | |
502 value = local_tick ^ getpid (); | |
503 | |
504 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value); | |
505 flag_random_seed = random_seed; | |
506 } | |
507 | |
508 /* Obtain the random_seed string. Unless NOINIT, initialize it if | |
509 it's not provided in the command line. */ | |
510 | |
511 const char * | |
512 get_random_seed (bool noinit) | |
513 { | |
514 if (!flag_random_seed && !noinit) | |
515 init_random_seed (); | |
516 return flag_random_seed; | |
517 } | |
518 | |
519 /* Modify the random_seed string to VAL. Return its previous | |
520 value. */ | |
521 | |
522 const char * | |
523 set_random_seed (const char *val) | |
524 { | |
525 const char *old = flag_random_seed; | |
526 flag_random_seed = val; | |
527 return old; | |
528 } | |
529 | |
530 /* Decode the string P as an integral parameter. | |
531 If the string is indeed an integer return its numeric value else | |
532 issue an Invalid Option error for the option PNAME and return DEFVAL. | |
533 If PNAME is zero just return DEFVAL, do not call error. */ | |
534 | |
535 int | |
536 read_integral_parameter (const char *p, const char *pname, const int defval) | |
537 { | |
538 const char *endp = p; | |
539 | |
540 while (*endp) | |
541 { | |
542 if (ISDIGIT (*endp)) | |
543 endp++; | |
544 else | |
545 break; | |
546 } | |
547 | |
548 if (*endp != 0) | |
549 { | |
550 if (pname != 0) | |
551 error ("invalid option argument %qs", pname); | |
552 return defval; | |
553 } | |
554 | |
555 return atoi (p); | |
556 } | |
557 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
558 #if GCC_VERSION < 3004 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
559 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
560 /* The functions floor_log2 and exact_log2 are defined as inline |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
561 functions in toplev.h if GCC_VERSION >= 3004. The definitions here |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
562 are used for older versions of gcc. */ |
0 | 563 |
564 /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X. | |
565 If X is 0, return -1. */ | |
566 | |
567 int | |
568 floor_log2 (unsigned HOST_WIDE_INT x) | |
569 { | |
570 int t = 0; | |
571 | |
572 if (x == 0) | |
573 return -1; | |
574 | |
575 if (HOST_BITS_PER_WIDE_INT > 64) | |
576 if (x >= (unsigned HOST_WIDE_INT) 1 << (t + 64)) | |
577 t += 64; | |
578 if (HOST_BITS_PER_WIDE_INT > 32) | |
579 if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 32)) | |
580 t += 32; | |
581 if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 16)) | |
582 t += 16; | |
583 if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 8)) | |
584 t += 8; | |
585 if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 4)) | |
586 t += 4; | |
587 if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 2)) | |
588 t += 2; | |
589 if (x >= ((unsigned HOST_WIDE_INT) 1) << (t + 1)) | |
590 t += 1; | |
591 | |
592 return t; | |
593 } | |
594 | |
595 /* Return the logarithm of X, base 2, considering X unsigned, | |
596 if X is a power of 2. Otherwise, returns -1. */ | |
597 | |
598 int | |
599 exact_log2 (unsigned HOST_WIDE_INT x) | |
600 { | |
601 if (x != (x & -x)) | |
602 return -1; | |
603 return floor_log2 (x); | |
604 } | |
605 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
606 #endif /* GCC_VERSION < 3004 */ |
0 | 607 |
608 /* Handler for fatal signals, such as SIGSEGV. These are transformed | |
609 into ICE messages, which is much more user friendly. In case the | |
610 error printer crashes, reset the signal to prevent infinite recursion. */ | |
611 | |
612 static void | |
613 crash_signal (int signo) | |
614 { | |
615 signal (signo, SIG_DFL); | |
616 | |
617 /* If we crashed while processing an ASM statement, then be a little more | |
618 graceful. It's most likely the user's fault. */ | |
619 if (this_is_asm_operands) | |
620 { | |
621 output_operand_lossage ("unrecoverable error"); | |
622 exit (FATAL_EXIT_CODE); | |
623 } | |
624 | |
625 internal_error ("%s", strsignal (signo)); | |
626 } | |
627 | |
628 /* Arrange to dump core on error. (The regular error message is still | |
629 printed first, except in the case of abort().) */ | |
630 | |
631 static void | |
632 setup_core_dumping (void) | |
633 { | |
634 #ifdef SIGABRT | |
635 signal (SIGABRT, SIG_DFL); | |
636 #endif | |
637 #if defined(HAVE_SETRLIMIT) | |
638 { | |
639 struct rlimit rlim; | |
640 if (getrlimit (RLIMIT_CORE, &rlim) != 0) | |
641 fatal_error ("getting core file size maximum limit: %m"); | |
642 rlim.rlim_cur = rlim.rlim_max; | |
643 if (setrlimit (RLIMIT_CORE, &rlim) != 0) | |
644 fatal_error ("setting core file size limit to maximum: %m"); | |
645 } | |
646 #endif | |
647 diagnostic_abort_on_error (global_dc); | |
648 } | |
649 | |
650 | |
651 /* Strip off a legitimate source ending from the input string NAME of | |
652 length LEN. Rather than having to know the names used by all of | |
653 our front ends, we strip off an ending of a period followed by | |
654 up to five characters. (Java uses ".class".) */ | |
655 | |
656 void | |
657 strip_off_ending (char *name, int len) | |
658 { | |
659 int i; | |
660 for (i = 2; i < 6 && len > i; i++) | |
661 { | |
662 if (name[len - i] == '.') | |
663 { | |
664 name[len - i] = '\0'; | |
665 break; | |
666 } | |
667 } | |
668 } | |
669 | |
670 /* Output a quoted string. */ | |
671 | |
672 void | |
673 output_quoted_string (FILE *asm_file, const char *string) | |
674 { | |
675 #ifdef OUTPUT_QUOTED_STRING | |
676 OUTPUT_QUOTED_STRING (asm_file, string); | |
677 #else | |
678 char c; | |
679 | |
680 putc ('\"', asm_file); | |
681 while ((c = *string++) != 0) | |
682 { | |
683 if (ISPRINT (c)) | |
684 { | |
685 if (c == '\"' || c == '\\') | |
686 putc ('\\', asm_file); | |
687 putc (c, asm_file); | |
688 } | |
689 else | |
690 fprintf (asm_file, "\\%03o", (unsigned char) c); | |
691 } | |
692 putc ('\"', asm_file); | |
693 #endif | |
694 } | |
695 | |
696 /* Output a file name in the form wanted by System V. */ | |
697 | |
698 void | |
699 output_file_directive (FILE *asm_file, const char *input_name) | |
700 { | |
701 int len; | |
702 const char *na; | |
703 | |
704 if (input_name == NULL) | |
705 input_name = "<stdin>"; | |
706 else | |
707 input_name = remap_debug_filename (input_name); | |
708 | |
709 len = strlen (input_name); | |
710 na = input_name + len; | |
711 | |
712 /* NA gets INPUT_NAME sans directory names. */ | |
713 while (na > input_name) | |
714 { | |
715 if (IS_DIR_SEPARATOR (na[-1])) | |
716 break; | |
717 na--; | |
718 } | |
719 | |
720 #ifdef ASM_OUTPUT_SOURCE_FILENAME | |
721 ASM_OUTPUT_SOURCE_FILENAME (asm_file, na); | |
722 #else | |
723 fprintf (asm_file, "\t.file\t"); | |
724 output_quoted_string (asm_file, na); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
725 putc ('\n', asm_file); |
0 | 726 #endif |
727 } | |
728 | |
729 /* A subroutine of wrapup_global_declarations. We've come to the end of | |
730 the compilation unit. All deferred variables should be undeferred, | |
731 and all incomplete decls should be finalized. */ | |
732 | |
733 void | |
734 wrapup_global_declaration_1 (tree decl) | |
735 { | |
736 /* We're not deferring this any longer. Assignment is conditional to | |
737 avoid needlessly dirtying PCH pages. */ | |
738 if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS) | |
739 && DECL_DEFER_OUTPUT (decl) != 0) | |
740 DECL_DEFER_OUTPUT (decl) = 0; | |
741 | |
742 if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0) | |
743 lang_hooks.finish_incomplete_decl (decl); | |
744 } | |
745 | |
746 /* A subroutine of wrapup_global_declarations. Decide whether or not DECL | |
747 needs to be output. Return true if it is output. */ | |
748 | |
749 bool | |
750 wrapup_global_declaration_2 (tree decl) | |
751 { | |
752 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl)) | |
753 return false; | |
754 | |
755 /* Don't write out static consts, unless we still need them. | |
756 | |
757 We also keep static consts if not optimizing (for debugging), | |
758 unless the user specified -fno-keep-static-consts. | |
759 ??? They might be better written into the debug information. | |
760 This is possible when using DWARF. | |
761 | |
762 A language processor that wants static constants to be always | |
763 written out (even if it is not used) is responsible for | |
764 calling rest_of_decl_compilation itself. E.g. the C front-end | |
765 calls rest_of_decl_compilation from finish_decl. | |
766 One motivation for this is that is conventional in some | |
767 environments to write things like: | |
768 static const char rcsid[] = "... version string ..."; | |
769 intending to force the string to be in the executable. | |
770 | |
771 A language processor that would prefer to have unneeded | |
772 static constants "optimized away" would just defer writing | |
773 them out until here. E.g. C++ does this, because static | |
774 constants are often defined in header files. | |
775 | |
776 ??? A tempting alternative (for both C and C++) would be | |
777 to force a constant to be written if and only if it is | |
778 defined in a main file, as opposed to an include file. */ | |
779 | |
780 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) | |
781 { | |
782 struct varpool_node *node; | |
783 bool needed = true; | |
784 node = varpool_node (decl); | |
785 | |
786 if (node->finalized) | |
787 needed = false; | |
788 else if (node->alias) | |
789 needed = false; | |
790 else if (!cgraph_global_info_ready | |
791 && (TREE_USED (decl) | |
792 || TREE_USED (DECL_ASSEMBLER_NAME (decl)))) | |
793 /* needed */; | |
794 else if (node->needed) | |
795 /* needed */; | |
796 else if (DECL_COMDAT (decl)) | |
797 needed = false; | |
798 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl) | |
799 && (optimize || !flag_keep_static_consts | |
800 || DECL_ARTIFICIAL (decl))) | |
801 needed = false; | |
802 | |
803 if (needed) | |
804 { | |
805 rest_of_decl_compilation (decl, 1, 1); | |
806 return true; | |
807 } | |
808 } | |
809 | |
810 return false; | |
811 } | |
812 | |
813 /* Do any final processing required for the declarations in VEC, of | |
814 which there are LEN. We write out inline functions and variables | |
815 that have been deferred until this point, but which are required. | |
816 Returns nonzero if anything was put out. */ | |
817 | |
818 bool | |
819 wrapup_global_declarations (tree *vec, int len) | |
820 { | |
821 bool reconsider, output_something = false; | |
822 int i; | |
823 | |
824 for (i = 0; i < len; i++) | |
825 wrapup_global_declaration_1 (vec[i]); | |
826 | |
827 /* Now emit any global variables or functions that we have been | |
828 putting off. We need to loop in case one of the things emitted | |
829 here references another one which comes earlier in the list. */ | |
830 do | |
831 { | |
832 reconsider = false; | |
833 for (i = 0; i < len; i++) | |
834 reconsider |= wrapup_global_declaration_2 (vec[i]); | |
835 if (reconsider) | |
836 output_something = true; | |
837 } | |
838 while (reconsider); | |
839 | |
840 return output_something; | |
841 } | |
842 | |
843 /* A subroutine of check_global_declarations. Issue appropriate warnings | |
844 for the global declaration DECL. */ | |
845 | |
846 void | |
847 check_global_declaration_1 (tree decl) | |
848 { | |
849 /* Warn about any function declared static but not defined. We don't | |
850 warn about variables, because many programs have static variables | |
851 that exist only to get some text into the object file. */ | |
852 if (TREE_CODE (decl) == FUNCTION_DECL | |
853 && DECL_INITIAL (decl) == 0 | |
854 && DECL_EXTERNAL (decl) | |
855 && ! DECL_ARTIFICIAL (decl) | |
856 && ! TREE_NO_WARNING (decl) | |
857 && ! TREE_PUBLIC (decl) | |
858 && (warn_unused_function | |
859 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))) | |
860 { | |
861 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) | |
862 pedwarn (input_location, 0, "%q+F used but never defined", decl); | |
863 else | |
864 warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl); | |
865 /* This symbol is effectively an "extern" declaration now. */ | |
866 TREE_PUBLIC (decl) = 1; | |
867 assemble_external (decl); | |
868 } | |
869 | |
870 /* Warn about static fns or vars defined but not used. */ | |
871 if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL) | |
872 /* We don't warn about "static const" variables because the | |
873 "rcs_id" idiom uses that construction. */ | |
874 || (warn_unused_variable | |
875 && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl))) | |
876 && ! DECL_IN_SYSTEM_HEADER (decl) | |
877 && ! TREE_USED (decl) | |
878 /* The TREE_USED bit for file-scope decls is kept in the identifier, | |
879 to handle multiple external decls in different scopes. */ | |
880 && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl))) | |
881 && ! DECL_EXTERNAL (decl) | |
882 && ! TREE_PUBLIC (decl) | |
883 /* A volatile variable might be used in some non-obvious way. */ | |
884 && ! TREE_THIS_VOLATILE (decl) | |
885 /* Global register variables must be declared to reserve them. */ | |
886 && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl)) | |
887 /* Otherwise, ask the language. */ | |
888 && lang_hooks.decls.warn_unused_global (decl)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
889 warning ((TREE_CODE (decl) == FUNCTION_DECL) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
890 ? OPT_Wunused_function |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
891 : OPT_Wunused_variable, |
0 | 892 "%q+D defined but not used", decl); |
893 } | |
894 | |
895 /* Issue appropriate warnings for the global declarations in VEC (of | |
896 which there are LEN). */ | |
897 | |
898 void | |
899 check_global_declarations (tree *vec, int len) | |
900 { | |
901 int i; | |
902 | |
903 for (i = 0; i < len; i++) | |
904 check_global_declaration_1 (vec[i]); | |
905 } | |
906 | |
907 /* Emit debugging information for all global declarations in VEC. */ | |
908 | |
909 void | |
910 emit_debug_global_declarations (tree *vec, int len) | |
911 { | |
912 int i; | |
913 | |
914 /* Avoid confusing the debug information machinery when there are errors. */ | |
915 if (errorcount != 0 || sorrycount != 0) | |
916 return; | |
917 | |
918 timevar_push (TV_SYMOUT); | |
919 for (i = 0; i < len; i++) | |
920 debug_hooks->global_decl (vec[i]); | |
921 timevar_pop (TV_SYMOUT); | |
922 } | |
923 | |
924 /* Warn about a use of an identifier which was marked deprecated. */ | |
925 void | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
926 warn_deprecated_use (tree node, tree attr) |
0 | 927 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
928 const char *msg; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
929 |
0 | 930 if (node == 0 || !warn_deprecated_decl) |
931 return; | |
932 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
933 if (!attr) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
934 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
935 if (DECL_P (node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
936 attr = DECL_ATTRIBUTES (node); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
937 else if (TYPE_P (node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
938 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
939 tree decl = TYPE_STUB_DECL (node); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
940 if (decl) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
941 attr = lookup_attribute ("deprecated", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
942 TYPE_ATTRIBUTES (TREE_TYPE (decl))); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
943 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
944 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
945 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
946 if (attr) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
947 attr = lookup_attribute ("deprecated", attr); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
948 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
949 if (attr) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
950 msg = TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
951 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
952 msg = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
953 |
0 | 954 if (DECL_P (node)) |
955 { | |
956 expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node)); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
957 if (msg) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
958 warning (OPT_Wdeprecated_declarations, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
959 "%qD is deprecated (declared at %s:%d): %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
960 node, xloc.file, xloc.line, msg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
961 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
962 warning (OPT_Wdeprecated_declarations, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
963 "%qD is deprecated (declared at %s:%d)", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
964 node, xloc.file, xloc.line); |
0 | 965 } |
966 else if (TYPE_P (node)) | |
967 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
968 tree what = NULL_TREE; |
0 | 969 tree decl = TYPE_STUB_DECL (node); |
970 | |
971 if (TYPE_NAME (node)) | |
972 { | |
973 if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
974 what = TYPE_NAME (node); |
0 | 975 else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL |
976 && DECL_NAME (TYPE_NAME (node))) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
977 what = DECL_NAME (TYPE_NAME (node)); |
0 | 978 } |
979 | |
980 if (decl) | |
981 { | |
982 expanded_location xloc | |
983 = expand_location (DECL_SOURCE_LOCATION (decl)); | |
984 if (what) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
985 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
986 if (msg) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
987 warning (OPT_Wdeprecated_declarations, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
988 "%qE is deprecated (declared at %s:%d): %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
989 what, xloc.file, xloc.line, msg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
990 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
991 warning (OPT_Wdeprecated_declarations, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
992 "%qE is deprecated (declared at %s:%d)", what, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
993 xloc.file, xloc.line); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
994 } |
0 | 995 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
996 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
997 if (msg) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
998 warning (OPT_Wdeprecated_declarations, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
999 "type is deprecated (declared at %s:%d): %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1000 xloc.file, xloc.line, msg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1001 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1002 warning (OPT_Wdeprecated_declarations, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1003 "type is deprecated (declared at %s:%d)", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1004 xloc.file, xloc.line); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1005 } |
0 | 1006 } |
1007 else | |
1008 { | |
1009 if (what) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1010 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1011 if (msg) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1012 warning (OPT_Wdeprecated_declarations, "%qE is deprecated: %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1013 what, msg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1014 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1015 warning (OPT_Wdeprecated_declarations, "%qE is deprecated", what); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1016 } |
0 | 1017 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1018 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1019 if (msg) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1020 warning (OPT_Wdeprecated_declarations, "type is deprecated: %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1021 msg); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1022 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1023 warning (OPT_Wdeprecated_declarations, "type is deprecated"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1024 } |
0 | 1025 } |
1026 } | |
1027 } | |
1028 | |
1029 /* Compile an entire translation unit. Write a file of assembly | |
1030 output and various debugging dumps. */ | |
1031 | |
1032 static void | |
1033 compile_file (void) | |
1034 { | |
1035 /* Initialize yet another pass. */ | |
1036 | |
1037 ggc_protect_identifiers = true; | |
1038 | |
1039 init_cgraph (); | |
1040 init_final (main_input_filename); | |
1041 coverage_init (aux_base_name); | |
1042 statistics_init (); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1043 invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL); |
0 | 1044 |
1045 timevar_push (TV_PARSE); | |
1046 | |
1047 /* Call the parser, which parses the entire file (calling | |
1048 rest_of_compilation for each function). */ | |
1049 lang_hooks.parse_file (set_yydebug); | |
1050 | |
1051 /* Compilation is now finished except for writing | |
1052 what's left of the symbol table output. */ | |
1053 timevar_pop (TV_PARSE); | |
1054 | |
1055 if (flag_syntax_only) | |
1056 return; | |
1057 | |
1058 ggc_protect_identifiers = false; | |
1059 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1060 /* This must also call cgraph_finalize_compilation_unit. */ |
0 | 1061 lang_hooks.decls.final_write_globals (); |
1062 | |
1063 if (errorcount || sorrycount) | |
1064 return; | |
1065 | |
1066 varpool_assemble_pending_decls (); | |
1067 finish_aliases_2 (); | |
1068 | |
1069 /* Likewise for mudflap static object registrations. */ | |
1070 if (flag_mudflap) | |
1071 mudflap_finish_file (); | |
1072 | |
1073 /* Likewise for emulated thread-local storage. */ | |
1074 if (!targetm.have_tls) | |
1075 emutls_finish (); | |
1076 | |
1077 output_shared_constant_pool (); | |
1078 output_object_blocks (); | |
1079 | |
1080 /* Write out any pending weak symbol declarations. */ | |
1081 weak_finish (); | |
1082 | |
1083 /* Do dbx symbols. */ | |
1084 timevar_push (TV_SYMOUT); | |
1085 | |
1086 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO | |
1087 if (dwarf2out_do_frame ()) | |
1088 dwarf2out_frame_finish (); | |
1089 #endif | |
1090 | |
1091 (*debug_hooks->finish) (main_input_filename); | |
1092 timevar_pop (TV_SYMOUT); | |
1093 | |
1094 /* Output some stuff at end of file if nec. */ | |
1095 | |
1096 dw2_output_indirect_constants (); | |
1097 | |
1098 /* Flush any pending external directives. */ | |
1099 process_pending_assemble_externals (); | |
1100 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1101 /* Emit LTO marker if LTO info has been previously emitted. This is |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1102 used by collect2 to determine whether an object file contains IL. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1103 We used to emit an undefined reference here, but this produces |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1104 link errors if an object file with IL is stored into a shared |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1105 library without invoking lto1. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1106 if (flag_generate_lto) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1107 fprintf (asm_out_file,"\t.comm\tgnu_lto_v1,1,1\n"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1108 |
0 | 1109 /* Attach a special .ident directive to the end of the file to identify |
1110 the version of GCC which compiled this code. The format of the .ident | |
1111 string is patterned after the ones produced by native SVR4 compilers. */ | |
1112 #ifdef IDENT_ASM_OP | |
1113 if (!flag_no_ident) | |
1114 { | |
1115 const char *pkg_version = "(GNU) "; | |
1116 | |
1117 if (strcmp ("(GCC) ", pkgversion_string)) | |
1118 pkg_version = pkgversion_string; | |
1119 fprintf (asm_out_file, "%s\"GCC: %s%s\"\n", | |
1120 IDENT_ASM_OP, pkg_version, version_string); | |
1121 } | |
1122 #endif | |
1123 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1124 /* Invoke registered plugin callbacks. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1125 invoke_plugin_callbacks (PLUGIN_FINISH_UNIT, NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1126 |
0 | 1127 /* This must be at the end. Some target ports emit end of file directives |
1128 into the assembly file here, and hence we can not output anything to the | |
1129 assembly file after this point. */ | |
1130 targetm.asm_out.file_end (); | |
1131 } | |
1132 | |
1133 /* Parse a -d... command line switch. */ | |
1134 | |
1135 void | |
1136 decode_d_option (const char *arg) | |
1137 { | |
1138 int c; | |
1139 | |
1140 while (*arg) | |
1141 switch (c = *arg++) | |
1142 { | |
1143 case 'A': | |
1144 flag_debug_asm = 1; | |
1145 break; | |
1146 case 'p': | |
1147 flag_print_asm_name = 1; | |
1148 break; | |
1149 case 'P': | |
1150 flag_dump_rtl_in_asm = 1; | |
1151 flag_print_asm_name = 1; | |
1152 break; | |
1153 case 'v': | |
1154 graph_dump_format = vcg; | |
1155 break; | |
1156 case 'x': | |
1157 rtl_dump_and_exit = 1; | |
1158 break; | |
1159 case 'y': | |
1160 set_yydebug = 1; | |
1161 break; | |
1162 case 'D': /* These are handled by the preprocessor. */ | |
1163 case 'I': | |
1164 case 'M': | |
1165 case 'N': | |
1166 case 'U': | |
1167 break; | |
1168 case 'H': | |
1169 setup_core_dumping(); | |
1170 break; | |
1171 case 'a': | |
1172 enable_rtl_dump_file (); | |
1173 break; | |
1174 | |
1175 default: | |
1176 warning (0, "unrecognized gcc debugging option: %c", c); | |
1177 break; | |
1178 } | |
1179 } | |
1180 | |
1181 /* Indexed by enum debug_info_type. */ | |
1182 const char *const debug_type_names[] = | |
1183 { | |
1184 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms" | |
1185 }; | |
1186 | |
1187 /* Print version information to FILE. | |
1188 Each line begins with INDENT (for the case where FILE is the | |
1189 assembler output file). */ | |
1190 | |
1191 void | |
1192 print_version (FILE *file, const char *indent) | |
1193 { | |
1194 static const char fmt1[] = | |
1195 #ifdef __GNUC__ | |
1196 N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ") | |
1197 #else | |
1198 N_("%s%s%s %sversion %s (%s) compiled by CC, ") | |
1199 #endif | |
1200 ; | |
1201 static const char fmt2[] = | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1202 N_("GMP version %s, MPFR version %s, MPC version %s\n"); |
0 | 1203 static const char fmt3[] = |
1204 N_("%s%swarning: %s header version %s differs from library version %s.\n"); | |
1205 static const char fmt4[] = | |
1206 N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n"); | |
1207 #ifndef __VERSION__ | |
1208 #define __VERSION__ "[?]" | |
1209 #endif | |
1210 fprintf (file, | |
1211 file == stderr ? _(fmt1) : fmt1, | |
1212 indent, *indent != 0 ? " " : "", | |
1213 lang_hooks.name, pkgversion_string, version_string, TARGET_NAME, | |
1214 indent, __VERSION__); | |
1215 | |
1216 /* We need to stringify the GMP macro values. Ugh, gmp_version has | |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
1217 two string formats, "i.j.k" and "i.j" when k is zero. As of |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
1218 gmp-4.3.0, GMP always uses the 3 number format. */ |
0 | 1219 #define GCC_GMP_STRINGIFY_VERSION3(X) #X |
1220 #define GCC_GMP_STRINGIFY_VERSION2(X) GCC_GMP_STRINGIFY_VERSION3(X) | |
19
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
1221 #define GCC_GMP_VERSION_NUM(X,Y,Z) (((X) << 16L) | ((Y) << 8) | (Z)) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
1222 #define GCC_GMP_VERSION \ |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
1223 GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL) |
58ad6c70ea60
update gcc from 4.4.0 to 4.4.1.
kent@firefly.cr.ie.u-ryukyu.ac.jp
parents:
0
diff
changeset
|
1224 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0 |
0 | 1225 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \ |
1226 GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) | |
1227 #else | |
1228 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \ | |
1229 GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) "." \ | |
1230 GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_PATCHLEVEL) | |
1231 #endif | |
1232 fprintf (file, | |
1233 file == stderr ? _(fmt2) : fmt2, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1234 GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING); |
0 | 1235 if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version)) |
1236 fprintf (file, | |
1237 file == stderr ? _(fmt3) : fmt3, | |
1238 indent, *indent != 0 ? " " : "", | |
1239 "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version); | |
1240 if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ())) | |
1241 fprintf (file, | |
1242 file == stderr ? _(fmt3) : fmt3, | |
1243 indent, *indent != 0 ? " " : "", | |
1244 "MPFR", MPFR_VERSION_STRING, mpfr_get_version ()); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1245 if (strcmp (MPC_VERSION_STRING, mpc_get_version ())) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1246 fprintf (file, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1247 file == stderr ? _(fmt3) : fmt3, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1248 indent, *indent != 0 ? " " : "", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1249 "MPC", MPC_VERSION_STRING, mpc_get_version ()); |
0 | 1250 fprintf (file, |
1251 file == stderr ? _(fmt4) : fmt4, | |
1252 indent, *indent != 0 ? " " : "", | |
1253 PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE)); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1254 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1255 print_plugins_versions (file, indent); |
0 | 1256 } |
1257 | |
1258 #ifdef ASM_COMMENT_START | |
1259 static int | |
1260 print_to_asm_out_file (print_switch_type type, const char * text) | |
1261 { | |
1262 bool prepend_sep = true; | |
1263 | |
1264 switch (type) | |
1265 { | |
1266 case SWITCH_TYPE_LINE_END: | |
1267 putc ('\n', asm_out_file); | |
1268 return 1; | |
1269 | |
1270 case SWITCH_TYPE_LINE_START: | |
1271 fputs (ASM_COMMENT_START, asm_out_file); | |
1272 return strlen (ASM_COMMENT_START); | |
1273 | |
1274 case SWITCH_TYPE_DESCRIPTIVE: | |
1275 if (ASM_COMMENT_START[0] == 0) | |
1276 prepend_sep = false; | |
1277 /* Drop through. */ | |
1278 case SWITCH_TYPE_PASSED: | |
1279 case SWITCH_TYPE_ENABLED: | |
1280 if (prepend_sep) | |
1281 fputc (' ', asm_out_file); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1282 fputs (text, asm_out_file); |
0 | 1283 /* No need to return the length here as |
1284 print_single_switch has already done it. */ | |
1285 return 0; | |
1286 | |
1287 default: | |
1288 return -1; | |
1289 } | |
1290 } | |
1291 #endif | |
1292 | |
1293 static int | |
1294 print_to_stderr (print_switch_type type, const char * text) | |
1295 { | |
1296 switch (type) | |
1297 { | |
1298 case SWITCH_TYPE_LINE_END: | |
1299 putc ('\n', stderr); | |
1300 return 1; | |
1301 | |
1302 case SWITCH_TYPE_LINE_START: | |
1303 return 0; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1304 |
0 | 1305 case SWITCH_TYPE_PASSED: |
1306 case SWITCH_TYPE_ENABLED: | |
1307 fputc (' ', stderr); | |
1308 /* Drop through. */ | |
1309 | |
1310 case SWITCH_TYPE_DESCRIPTIVE: | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1311 fputs (text, stderr); |
0 | 1312 /* No need to return the length here as |
1313 print_single_switch has already done it. */ | |
1314 return 0; | |
1315 | |
1316 default: | |
1317 return -1; | |
1318 } | |
1319 } | |
1320 | |
1321 /* Print an option value and return the adjusted position in the line. | |
1322 ??? print_fn doesn't handle errors, eg disk full; presumably other | |
1323 code will catch a disk full though. */ | |
1324 | |
1325 static int | |
1326 print_single_switch (print_switch_fn_type print_fn, | |
1327 int pos, | |
1328 print_switch_type type, | |
1329 const char * text) | |
1330 { | |
1331 /* The ultrix fprintf returns 0 on success, so compute the result | |
1332 we want here since we need it for the following test. The +1 | |
1333 is for the separator character that will probably be emitted. */ | |
1334 int len = strlen (text) + 1; | |
1335 | |
1336 if (pos != 0 | |
1337 && pos + len > MAX_LINE) | |
1338 { | |
1339 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
1340 pos = 0; | |
1341 } | |
1342 | |
1343 if (pos == 0) | |
1344 pos += print_fn (SWITCH_TYPE_LINE_START, NULL); | |
1345 | |
1346 print_fn (type, text); | |
1347 return pos + len; | |
1348 } | |
1349 | |
1350 /* Print active target switches using PRINT_FN. | |
1351 POS is the current cursor position and MAX is the size of a "line". | |
1352 Each line begins with INDENT and ends with TERM. | |
1353 Each switch is separated from the next by SEP. */ | |
1354 | |
1355 static void | |
1356 print_switch_values (print_switch_fn_type print_fn) | |
1357 { | |
1358 int pos = 0; | |
1359 size_t j; | |
1360 const char **p; | |
1361 | |
1362 /* Fill in the -frandom-seed option, if the user didn't pass it, so | |
1363 that it can be printed below. This helps reproducibility. */ | |
1364 if (!flag_random_seed) | |
1365 init_random_seed (); | |
1366 | |
1367 /* Print the options as passed. */ | |
1368 pos = print_single_switch (print_fn, pos, | |
1369 SWITCH_TYPE_DESCRIPTIVE, _("options passed: ")); | |
1370 | |
1371 for (p = &save_argv[1]; *p != NULL; p++) | |
1372 { | |
1373 if (**p == '-') | |
1374 { | |
1375 /* Ignore these. */ | |
1376 if (strcmp (*p, "-o") == 0 | |
1377 || strcmp (*p, "-dumpbase") == 0 | |
1378 || strcmp (*p, "-auxbase") == 0) | |
1379 { | |
1380 if (p[1] != NULL) | |
1381 p++; | |
1382 continue; | |
1383 } | |
1384 | |
1385 if (strcmp (*p, "-quiet") == 0 | |
1386 || strcmp (*p, "-version") == 0) | |
1387 continue; | |
1388 | |
1389 if ((*p)[1] == 'd') | |
1390 continue; | |
1391 } | |
1392 | |
1393 pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED, *p); | |
1394 } | |
1395 | |
1396 if (pos > 0) | |
1397 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
1398 | |
1399 /* Print the -f and -m options that have been enabled. | |
1400 We don't handle language specific options but printing argv | |
1401 should suffice. */ | |
1402 pos = print_single_switch (print_fn, 0, | |
1403 SWITCH_TYPE_DESCRIPTIVE, _("options enabled: ")); | |
1404 | |
1405 for (j = 0; j < cl_options_count; j++) | |
1406 if ((cl_options[j].flags & CL_REPORT) | |
1407 && option_enabled (j) > 0) | |
1408 pos = print_single_switch (print_fn, pos, | |
1409 SWITCH_TYPE_ENABLED, cl_options[j].opt_text); | |
1410 | |
1411 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
1412 } | |
1413 | |
1414 /* Open assembly code output file. Do this even if -fsyntax-only is | |
1415 on, because then the driver will have provided the name of a | |
1416 temporary file or bit bucket for us. NAME is the file specified on | |
1417 the command line, possibly NULL. */ | |
1418 static void | |
1419 init_asm_output (const char *name) | |
1420 { | |
1421 if (name == NULL && asm_file_name == 0) | |
1422 asm_out_file = stdout; | |
1423 else | |
1424 { | |
1425 if (asm_file_name == 0) | |
1426 { | |
1427 int len = strlen (dump_base_name); | |
1428 char *dumpname = XNEWVEC (char, len + 6); | |
1429 | |
1430 memcpy (dumpname, dump_base_name, len + 1); | |
1431 strip_off_ending (dumpname, len); | |
1432 strcat (dumpname, ".s"); | |
1433 asm_file_name = dumpname; | |
1434 } | |
1435 if (!strcmp (asm_file_name, "-")) | |
1436 asm_out_file = stdout; | |
1437 else | |
1438 asm_out_file = fopen (asm_file_name, "w+b"); | |
1439 if (asm_out_file == 0) | |
1440 fatal_error ("can%'t open %s for writing: %m", asm_file_name); | |
1441 } | |
1442 | |
1443 if (!flag_syntax_only) | |
1444 { | |
1445 targetm.asm_out.file_start (); | |
1446 | |
1447 if (flag_record_gcc_switches) | |
1448 { | |
1449 if (targetm.asm_out.record_gcc_switches) | |
1450 { | |
1451 /* Let the target know that we are about to start recording. */ | |
1452 targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, | |
1453 NULL); | |
1454 /* Now record the switches. */ | |
1455 print_switch_values (targetm.asm_out.record_gcc_switches); | |
1456 /* Let the target know that the recording is over. */ | |
1457 targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, | |
1458 NULL); | |
1459 } | |
1460 else | |
1461 inform (input_location, "-frecord-gcc-switches is not supported by the current target"); | |
1462 } | |
1463 | |
1464 #ifdef ASM_COMMENT_START | |
1465 if (flag_verbose_asm) | |
1466 { | |
1467 /* Print the list of switches in effect | |
1468 into the assembler file as comments. */ | |
1469 print_version (asm_out_file, ASM_COMMENT_START); | |
1470 print_switch_values (print_to_asm_out_file); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1471 putc ('\n', asm_out_file); |
0 | 1472 } |
1473 #endif | |
1474 } | |
1475 } | |
1476 | |
1477 /* Return true if the state of option OPTION should be stored in PCH files | |
1478 and checked by default_pch_valid_p. Store the option's current state | |
1479 in STATE if so. */ | |
1480 | |
1481 static inline bool | |
1482 option_affects_pch_p (int option, struct cl_option_state *state) | |
1483 { | |
1484 if ((cl_options[option].flags & CL_TARGET) == 0) | |
1485 return false; | |
1486 if (cl_options[option].flag_var == &target_flags) | |
1487 if (targetm.check_pch_target_flags) | |
1488 return false; | |
1489 return get_option_state (option, state); | |
1490 } | |
1491 | |
1492 /* Default version of get_pch_validity. | |
1493 By default, every flag difference is fatal; that will be mostly right for | |
1494 most targets, but completely right for very few. */ | |
1495 | |
1496 void * | |
1497 default_get_pch_validity (size_t *len) | |
1498 { | |
1499 struct cl_option_state state; | |
1500 size_t i; | |
1501 char *result, *r; | |
1502 | |
1503 *len = 2; | |
1504 if (targetm.check_pch_target_flags) | |
1505 *len += sizeof (target_flags); | |
1506 for (i = 0; i < cl_options_count; i++) | |
1507 if (option_affects_pch_p (i, &state)) | |
1508 *len += state.size; | |
1509 | |
1510 result = r = XNEWVEC (char, *len); | |
1511 r[0] = flag_pic; | |
1512 r[1] = flag_pie; | |
1513 r += 2; | |
1514 if (targetm.check_pch_target_flags) | |
1515 { | |
1516 memcpy (r, &target_flags, sizeof (target_flags)); | |
1517 r += sizeof (target_flags); | |
1518 } | |
1519 | |
1520 for (i = 0; i < cl_options_count; i++) | |
1521 if (option_affects_pch_p (i, &state)) | |
1522 { | |
1523 memcpy (r, state.data, state.size); | |
1524 r += state.size; | |
1525 } | |
1526 | |
1527 return result; | |
1528 } | |
1529 | |
1530 /* Return a message which says that a PCH file was created with a different | |
1531 setting of OPTION. */ | |
1532 | |
1533 static const char * | |
1534 pch_option_mismatch (const char *option) | |
1535 { | |
1536 char *r; | |
1537 | |
1538 asprintf (&r, _("created and used with differing settings of '%s'"), option); | |
1539 if (r == NULL) | |
1540 return _("out of memory"); | |
1541 return r; | |
1542 } | |
1543 | |
1544 /* Default version of pch_valid_p. */ | |
1545 | |
1546 const char * | |
1547 default_pch_valid_p (const void *data_p, size_t len) | |
1548 { | |
1549 struct cl_option_state state; | |
1550 const char *data = (const char *)data_p; | |
1551 size_t i; | |
1552 | |
1553 /* -fpic and -fpie also usually make a PCH invalid. */ | |
1554 if (data[0] != flag_pic) | |
1555 return _("created and used with different settings of -fpic"); | |
1556 if (data[1] != flag_pie) | |
1557 return _("created and used with different settings of -fpie"); | |
1558 data += 2; | |
1559 | |
1560 /* Check target_flags. */ | |
1561 if (targetm.check_pch_target_flags) | |
1562 { | |
1563 int tf; | |
1564 const char *r; | |
1565 | |
1566 memcpy (&tf, data, sizeof (target_flags)); | |
1567 data += sizeof (target_flags); | |
1568 len -= sizeof (target_flags); | |
1569 r = targetm.check_pch_target_flags (tf); | |
1570 if (r != NULL) | |
1571 return r; | |
1572 } | |
1573 | |
1574 for (i = 0; i < cl_options_count; i++) | |
1575 if (option_affects_pch_p (i, &state)) | |
1576 { | |
1577 if (memcmp (data, state.data, state.size) != 0) | |
1578 return pch_option_mismatch (cl_options[i].opt_text); | |
1579 data += state.size; | |
1580 len -= state.size; | |
1581 } | |
1582 | |
1583 return NULL; | |
1584 } | |
1585 | |
1586 /* Default tree printer. Handles declarations only. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1587 bool |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1588 default_tree_printer (pretty_printer *pp, text_info *text, const char *spec, |
0 | 1589 int precision, bool wide, bool set_locus, bool hash) |
1590 { | |
1591 tree t; | |
1592 | |
1593 /* FUTURE: %+x should set the locus. */ | |
1594 if (precision != 0 || wide || hash) | |
1595 return false; | |
1596 | |
1597 switch (*spec) | |
1598 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1599 case 'E': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1600 t = va_arg (*text->args_ptr, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1601 if (TREE_CODE (t) == IDENTIFIER_NODE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1602 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1603 pp_identifier (pp, IDENTIFIER_POINTER (t)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1604 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1605 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1606 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1607 |
0 | 1608 case 'D': |
1609 t = va_arg (*text->args_ptr, tree); | |
1610 if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) | |
1611 t = DECL_DEBUG_EXPR (t); | |
1612 break; | |
1613 | |
1614 case 'F': | |
1615 case 'T': | |
1616 t = va_arg (*text->args_ptr, tree); | |
1617 break; | |
1618 | |
1619 default: | |
1620 return false; | |
1621 } | |
1622 | |
1623 if (set_locus && text->locus) | |
1624 *text->locus = DECL_SOURCE_LOCATION (t); | |
1625 | |
1626 if (DECL_P (t)) | |
1627 { | |
1628 const char *n = DECL_NAME (t) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1629 ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1630 : _("<anonymous>"); |
0 | 1631 pp_string (pp, n); |
1632 } | |
1633 else | |
1634 dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0); | |
1635 | |
1636 return true; | |
1637 } | |
1638 | |
1639 /* A helper function; used as the reallocator function for cpp's line | |
1640 table. */ | |
1641 static void * | |
1642 realloc_for_line_map (void *ptr, size_t len) | |
1643 { | |
1644 return ggc_realloc (ptr, len); | |
1645 } | |
1646 | |
1647 /* Initialization of the front end environment, before command line | |
1648 options are parsed. Signal handlers, internationalization etc. | |
1649 ARGV0 is main's argv[0]. */ | |
1650 static void | |
1651 general_init (const char *argv0) | |
1652 { | |
1653 const char *p; | |
1654 | |
1655 p = argv0 + strlen (argv0); | |
1656 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1])) | |
1657 --p; | |
1658 progname = p; | |
1659 | |
1660 xmalloc_set_program_name (progname); | |
1661 | |
1662 hex_init (); | |
1663 | |
1664 /* Unlock the stdio streams. */ | |
1665 unlock_std_streams (); | |
1666 | |
1667 gcc_init_libintl (); | |
1668 | |
1669 /* Initialize the diagnostics reporting machinery, so option parsing | |
1670 can give warnings and errors. */ | |
1671 diagnostic_initialize (global_dc); | |
1672 /* Set a default printer. Language specific initializations will | |
1673 override it later. */ | |
1674 pp_format_decoder (global_dc->printer) = &default_tree_printer; | |
1675 | |
1676 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ | |
1677 #ifdef SIGSEGV | |
1678 signal (SIGSEGV, crash_signal); | |
1679 #endif | |
1680 #ifdef SIGILL | |
1681 signal (SIGILL, crash_signal); | |
1682 #endif | |
1683 #ifdef SIGBUS | |
1684 signal (SIGBUS, crash_signal); | |
1685 #endif | |
1686 #ifdef SIGABRT | |
1687 signal (SIGABRT, crash_signal); | |
1688 #endif | |
1689 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT) | |
1690 signal (SIGIOT, crash_signal); | |
1691 #endif | |
1692 #ifdef SIGFPE | |
1693 signal (SIGFPE, crash_signal); | |
1694 #endif | |
1695 | |
1696 /* Other host-specific signal setup. */ | |
1697 (*host_hooks.extra_signals)(); | |
1698 | |
1699 /* Initialize the garbage-collector, string pools and tree type hash | |
1700 table. */ | |
1701 init_ggc (); | |
1702 init_stringpool (); | |
1703 line_table = GGC_NEW (struct line_maps); | |
1704 linemap_init (line_table); | |
1705 line_table->reallocator = realloc_for_line_map; | |
1706 init_ttree (); | |
1707 | |
1708 /* Initialize register usage now so switches may override. */ | |
1709 init_reg_sets (); | |
1710 | |
1711 /* Register the language-independent parameters. */ | |
1712 add_params (lang_independent_params, LAST_PARAM); | |
1713 | |
1714 /* This must be done after add_params but before argument processing. */ | |
1715 init_ggc_heuristics(); | |
1716 init_optimization_passes (); | |
1717 statistics_early_init (); | |
1718 } | |
1719 | |
1720 /* Return true if the current target supports -fsection-anchors. */ | |
1721 | |
1722 static bool | |
1723 target_supports_section_anchors_p (void) | |
1724 { | |
1725 if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0) | |
1726 return false; | |
1727 | |
1728 if (targetm.asm_out.output_anchor == NULL) | |
1729 return false; | |
1730 | |
1731 return true; | |
1732 } | |
1733 | |
1734 /* Default the align_* variables to 1 if they're still unset, and | |
1735 set up the align_*_log variables. */ | |
1736 static void | |
1737 init_alignments (void) | |
1738 { | |
1739 if (align_loops <= 0) | |
1740 align_loops = 1; | |
1741 if (align_loops_max_skip > align_loops) | |
1742 align_loops_max_skip = align_loops - 1; | |
1743 align_loops_log = floor_log2 (align_loops * 2 - 1); | |
1744 if (align_jumps <= 0) | |
1745 align_jumps = 1; | |
1746 if (align_jumps_max_skip > align_jumps) | |
1747 align_jumps_max_skip = align_jumps - 1; | |
1748 align_jumps_log = floor_log2 (align_jumps * 2 - 1); | |
1749 if (align_labels <= 0) | |
1750 align_labels = 1; | |
1751 align_labels_log = floor_log2 (align_labels * 2 - 1); | |
1752 if (align_labels_max_skip > align_labels) | |
1753 align_labels_max_skip = align_labels - 1; | |
1754 if (align_functions <= 0) | |
1755 align_functions = 1; | |
1756 align_functions_log = floor_log2 (align_functions * 2 - 1); | |
1757 } | |
1758 | |
1759 /* Process the options that have been parsed. */ | |
1760 static void | |
1761 process_options (void) | |
1762 { | |
1763 /* Just in case lang_hooks.post_options ends up calling a debug_hook. | |
1764 This can happen with incorrect pre-processed input. */ | |
1765 debug_hooks = &do_nothing_debug_hooks; | |
1766 | |
1767 /* This replaces set_Wunused. */ | |
1768 if (warn_unused_function == -1) | |
1769 warn_unused_function = warn_unused; | |
1770 if (warn_unused_label == -1) | |
1771 warn_unused_label = warn_unused; | |
1772 /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled. */ | |
1773 if (warn_unused_parameter == -1) | |
1774 warn_unused_parameter = (warn_unused && extra_warnings); | |
1775 if (warn_unused_variable == -1) | |
1776 warn_unused_variable = warn_unused; | |
1777 if (warn_unused_value == -1) | |
1778 warn_unused_value = warn_unused; | |
1779 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1780 /* This replaces set_Wextra. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1781 if (warn_uninitialized == -1) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1782 warn_uninitialized = extra_warnings; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1783 |
0 | 1784 /* Allow the front end to perform consistency checks and do further |
1785 initialization based on the command line options. This hook also | |
1786 sets the original filename if appropriate (e.g. foo.i -> foo.c) | |
1787 so we can correctly initialize debug output. */ | |
1788 no_backend = lang_hooks.post_options (&main_input_filename); | |
1789 | |
1790 #ifdef OVERRIDE_OPTIONS | |
1791 /* Some machines may reject certain combinations of options. */ | |
1792 OVERRIDE_OPTIONS; | |
1793 #endif | |
1794 | |
1795 if (flag_section_anchors && !target_supports_section_anchors_p ()) | |
1796 { | |
1797 warning (OPT_fsection_anchors, | |
1798 "this target does not support %qs", "-fsection-anchors"); | |
1799 flag_section_anchors = 0; | |
1800 } | |
1801 | |
1802 if (flag_short_enums == 2) | |
1803 flag_short_enums = targetm.default_short_enums (); | |
1804 | |
1805 /* Set aux_base_name if not already set. */ | |
1806 if (aux_base_name) | |
1807 ; | |
1808 else if (main_input_filename) | |
1809 { | |
1810 char *name = xstrdup (lbasename (main_input_filename)); | |
1811 | |
1812 strip_off_ending (name, strlen (name)); | |
1813 aux_base_name = name; | |
1814 } | |
1815 else | |
1816 aux_base_name = "gccaux"; | |
1817 | |
1818 #ifndef HAVE_cloog | |
1819 if (flag_graphite | |
1820 || flag_loop_block | |
1821 || flag_loop_interchange | |
1822 || flag_loop_strip_mine | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1823 || flag_graphite_identity |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1824 || flag_loop_parallelize_all) |
0 | 1825 sorry ("Graphite loop optimizations cannot be used"); |
1826 #endif | |
1827 | |
1828 /* Unrolling all loops implies that standard loop unrolling must also | |
1829 be done. */ | |
1830 if (flag_unroll_all_loops) | |
1831 flag_unroll_loops = 1; | |
1832 | |
1833 /* The loop unrolling code assumes that cse will be run after loop. | |
1834 web and rename-registers also help when run after loop unrolling. */ | |
1835 if (flag_rerun_cse_after_loop == AUTODETECT_VALUE) | |
1836 flag_rerun_cse_after_loop = flag_unroll_loops || flag_peel_loops; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1837 |
0 | 1838 if (flag_web == AUTODETECT_VALUE) |
1839 flag_web = flag_unroll_loops || flag_peel_loops; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1840 |
0 | 1841 if (flag_rename_registers == AUTODETECT_VALUE) |
1842 flag_rename_registers = flag_unroll_loops || flag_peel_loops; | |
1843 | |
1844 if (flag_non_call_exceptions) | |
1845 flag_asynchronous_unwind_tables = 1; | |
1846 if (flag_asynchronous_unwind_tables) | |
1847 flag_unwind_tables = 1; | |
1848 | |
1849 if (flag_value_profile_transformations) | |
1850 flag_profile_values = 1; | |
1851 | |
1852 /* Warn about options that are not supported on this machine. */ | |
1853 #ifndef INSN_SCHEDULING | |
1854 if (flag_schedule_insns || flag_schedule_insns_after_reload) | |
1855 warning (0, "instruction scheduling not supported on this target machine"); | |
1856 #endif | |
1857 #ifndef DELAY_SLOTS | |
1858 if (flag_delayed_branch) | |
1859 warning (0, "this target machine does not have delayed branches"); | |
1860 #endif | |
1861 | |
1862 user_label_prefix = USER_LABEL_PREFIX; | |
1863 if (flag_leading_underscore != -1) | |
1864 { | |
1865 /* If the default prefix is more complicated than "" or "_", | |
1866 issue a warning and ignore this option. */ | |
1867 if (user_label_prefix[0] == 0 || | |
1868 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0)) | |
1869 { | |
1870 user_label_prefix = flag_leading_underscore ? "_" : ""; | |
1871 } | |
1872 else | |
1873 warning (0, "-f%sleading-underscore not supported on this target machine", | |
1874 flag_leading_underscore ? "" : "no-"); | |
1875 } | |
1876 | |
1877 /* If we are in verbose mode, write out the version and maybe all the | |
1878 option flags in use. */ | |
1879 if (version_flag) | |
1880 { | |
1881 print_version (stderr, ""); | |
1882 if (! quiet_flag) | |
1883 print_switch_values (print_to_stderr); | |
1884 } | |
1885 | |
1886 if (flag_syntax_only) | |
1887 { | |
1888 write_symbols = NO_DEBUG; | |
1889 profile_flag = 0; | |
1890 } | |
1891 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1892 if (flag_gtoggle) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1893 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1894 if (debug_info_level == DINFO_LEVEL_NONE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1895 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1896 debug_info_level = DINFO_LEVEL_NORMAL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1897 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1898 if (write_symbols == NO_DEBUG) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1899 write_symbols = PREFERRED_DEBUGGING_TYPE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1900 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1901 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1902 debug_info_level = DINFO_LEVEL_NONE; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1903 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1904 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1905 if (flag_dump_final_insns && !flag_syntax_only && !no_backend) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1906 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1907 FILE *final_output = fopen (flag_dump_final_insns, "w"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1908 if (!final_output) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1909 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1910 error ("could not open final insn dump file %qs: %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1911 flag_dump_final_insns, strerror (errno)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1912 flag_dump_final_insns = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1913 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1914 else if (fclose (final_output)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1915 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1916 error ("could not close zeroed insn dump file %qs: %s", |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1917 flag_dump_final_insns, strerror (errno)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1918 flag_dump_final_insns = NULL; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1919 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1920 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1921 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1922 /* Unless over-ridden for the target, assume that all DWARF levels |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1923 may be emitted, if DWARF2_DEBUG is selected. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1924 if (dwarf_strict < 0) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1925 dwarf_strict = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1926 |
0 | 1927 /* A lot of code assumes write_symbols == NO_DEBUG if the debugging |
1928 level is 0. */ | |
1929 if (debug_info_level == DINFO_LEVEL_NONE) | |
1930 write_symbols = NO_DEBUG; | |
1931 | |
1932 /* Now we know write_symbols, set up the debug hooks based on it. | |
1933 By default we do nothing for debug output. */ | |
1934 if (PREFERRED_DEBUGGING_TYPE == NO_DEBUG) | |
1935 default_debug_hooks = &do_nothing_debug_hooks; | |
1936 #if defined(DBX_DEBUGGING_INFO) | |
1937 else if (PREFERRED_DEBUGGING_TYPE == DBX_DEBUG) | |
1938 default_debug_hooks = &dbx_debug_hooks; | |
1939 #endif | |
1940 #if defined(XCOFF_DEBUGGING_INFO) | |
1941 else if (PREFERRED_DEBUGGING_TYPE == XCOFF_DEBUG) | |
1942 default_debug_hooks = &xcoff_debug_hooks; | |
1943 #endif | |
1944 #ifdef SDB_DEBUGGING_INFO | |
1945 else if (PREFERRED_DEBUGGING_TYPE == SDB_DEBUG) | |
1946 default_debug_hooks = &sdb_debug_hooks; | |
1947 #endif | |
1948 #ifdef DWARF2_DEBUGGING_INFO | |
1949 else if (PREFERRED_DEBUGGING_TYPE == DWARF2_DEBUG) | |
1950 default_debug_hooks = &dwarf2_debug_hooks; | |
1951 #endif | |
1952 #ifdef VMS_DEBUGGING_INFO | |
1953 else if (PREFERRED_DEBUGGING_TYPE == VMS_DEBUG | |
1954 || PREFERRED_DEBUGGING_TYPE == VMS_AND_DWARF2_DEBUG) | |
1955 default_debug_hooks = &vmsdbg_debug_hooks; | |
1956 #endif | |
1957 | |
1958 if (write_symbols == NO_DEBUG) | |
1959 ; | |
1960 #if defined(DBX_DEBUGGING_INFO) | |
1961 else if (write_symbols == DBX_DEBUG) | |
1962 debug_hooks = &dbx_debug_hooks; | |
1963 #endif | |
1964 #if defined(XCOFF_DEBUGGING_INFO) | |
1965 else if (write_symbols == XCOFF_DEBUG) | |
1966 debug_hooks = &xcoff_debug_hooks; | |
1967 #endif | |
1968 #ifdef SDB_DEBUGGING_INFO | |
1969 else if (write_symbols == SDB_DEBUG) | |
1970 debug_hooks = &sdb_debug_hooks; | |
1971 #endif | |
1972 #ifdef DWARF2_DEBUGGING_INFO | |
1973 else if (write_symbols == DWARF2_DEBUG) | |
1974 debug_hooks = &dwarf2_debug_hooks; | |
1975 #endif | |
1976 #ifdef VMS_DEBUGGING_INFO | |
1977 else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG) | |
1978 debug_hooks = &vmsdbg_debug_hooks; | |
1979 #endif | |
1980 else | |
1981 error ("target system does not support the \"%s\" debug format", | |
1982 debug_type_names[write_symbols]); | |
1983 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1984 /* We know which debug output will be used so we can set flag_var_tracking |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1985 and flag_var_tracking_uninit if the user has not specified them. */ |
0 | 1986 if (debug_info_level < DINFO_LEVEL_NORMAL |
1987 || debug_hooks->var_location == do_nothing_debug_hooks.var_location) | |
1988 { | |
1989 if (flag_var_tracking == 1 | |
1990 || flag_var_tracking_uninit == 1) | |
1991 { | |
1992 if (debug_info_level < DINFO_LEVEL_NORMAL) | |
1993 warning (0, "variable tracking requested, but useless unless " | |
1994 "producing debug info"); | |
1995 else | |
1996 warning (0, "variable tracking requested, but not supported " | |
1997 "by this debug format"); | |
1998 } | |
1999 flag_var_tracking = 0; | |
2000 flag_var_tracking_uninit = 0; | |
2001 } | |
2002 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2003 /* If the user specifically requested variable tracking with tagging |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2004 uninitialized variables, we need to turn on variable tracking. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2005 (We already determined above that variable tracking is feasible.) */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2006 if (flag_var_tracking_uninit) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2007 flag_var_tracking = 1; |
0 | 2008 |
2009 if (flag_var_tracking == AUTODETECT_VALUE) | |
2010 flag_var_tracking = optimize >= 1; | |
2011 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2012 if (flag_var_tracking_assignments == AUTODETECT_VALUE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2013 flag_var_tracking_assignments = flag_var_tracking |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2014 && !(flag_selective_scheduling || flag_selective_scheduling2); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2015 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2016 if (flag_var_tracking_assignments_toggle) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2017 flag_var_tracking_assignments = !flag_var_tracking_assignments; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2018 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2019 if (flag_var_tracking_assignments && !flag_var_tracking) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2020 flag_var_tracking = flag_var_tracking_assignments = -1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2021 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2022 if (flag_var_tracking_assignments |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2023 && (flag_selective_scheduling || flag_selective_scheduling2)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2024 warning (0, "var-tracking-assignments changes selective scheduling"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2025 |
0 | 2026 if (flag_tree_cselim == AUTODETECT_VALUE) |
2027 #ifdef HAVE_conditional_move | |
2028 flag_tree_cselim = 1; | |
2029 #else | |
2030 flag_tree_cselim = 0; | |
2031 #endif | |
2032 | |
2033 /* If auxiliary info generation is desired, open the output file. | |
2034 This goes in the same directory as the source file--unlike | |
2035 all the other output files. */ | |
2036 if (flag_gen_aux_info) | |
2037 { | |
2038 aux_info_file = fopen (aux_info_file_name, "w"); | |
2039 if (aux_info_file == 0) | |
2040 fatal_error ("can%'t open %s: %m", aux_info_file_name); | |
2041 } | |
2042 | |
2043 if (! targetm.have_named_sections) | |
2044 { | |
2045 if (flag_function_sections) | |
2046 { | |
2047 warning (0, "-ffunction-sections not supported for this target"); | |
2048 flag_function_sections = 0; | |
2049 } | |
2050 if (flag_data_sections) | |
2051 { | |
2052 warning (0, "-fdata-sections not supported for this target"); | |
2053 flag_data_sections = 0; | |
2054 } | |
2055 } | |
2056 | |
2057 if (flag_function_sections && profile_flag) | |
2058 { | |
2059 warning (0, "-ffunction-sections disabled; it makes profiling impossible"); | |
2060 flag_function_sections = 0; | |
2061 } | |
2062 | |
2063 #ifndef HAVE_prefetch | |
2064 if (flag_prefetch_loop_arrays) | |
2065 { | |
2066 warning (0, "-fprefetch-loop-arrays not supported for this target"); | |
2067 flag_prefetch_loop_arrays = 0; | |
2068 } | |
2069 #else | |
2070 if (flag_prefetch_loop_arrays && !HAVE_prefetch) | |
2071 { | |
2072 warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)"); | |
2073 flag_prefetch_loop_arrays = 0; | |
2074 } | |
2075 #endif | |
2076 | |
2077 /* This combination of options isn't handled for i386 targets and doesn't | |
2078 make much sense anyway, so don't allow it. */ | |
2079 if (flag_prefetch_loop_arrays && optimize_size) | |
2080 { | |
2081 warning (0, "-fprefetch-loop-arrays is not supported with -Os"); | |
2082 flag_prefetch_loop_arrays = 0; | |
2083 } | |
2084 | |
2085 /* The presence of IEEE signaling NaNs, implies all math can trap. */ | |
2086 if (flag_signaling_nans) | |
2087 flag_trapping_math = 1; | |
2088 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2089 /* We cannot reassociate if we want traps or signed zeros. */ |
0 | 2090 if (flag_associative_math && (flag_trapping_math || flag_signed_zeros)) |
2091 { | |
2092 warning (0, "-fassociative-math disabled; other options take precedence"); | |
2093 flag_associative_math = 0; | |
2094 } | |
2095 | |
2096 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */ | |
2097 if (flag_cx_limited_range) | |
2098 flag_complex_method = 0; | |
2099 | |
2100 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */ | |
2101 if (flag_cx_fortran_rules) | |
2102 flag_complex_method = 1; | |
2103 | |
2104 /* Targets must be able to place spill slots at lower addresses. If the | |
2105 target already uses a soft frame pointer, the transition is trivial. */ | |
2106 if (!FRAME_GROWS_DOWNWARD && flag_stack_protect) | |
2107 { | |
2108 warning (0, "-fstack-protector not supported for this target"); | |
2109 flag_stack_protect = 0; | |
2110 } | |
2111 if (!flag_stack_protect) | |
2112 warn_stack_protect = 0; | |
2113 | |
2114 /* ??? Unwind info is not correct around the CFG unless either a frame | |
2115 pointer is present or A_O_A is set. Fixing this requires rewriting | |
2116 unwind info generation to be aware of the CFG and propagating states | |
2117 around edges. */ | |
2118 if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS | |
2119 && flag_omit_frame_pointer) | |
2120 { | |
2121 warning (0, "unwind tables currently require a frame pointer " | |
2122 "for correctness"); | |
2123 flag_omit_frame_pointer = 0; | |
2124 } | |
2125 } | |
2126 | |
2127 /* This function can be called multiple times to reinitialize the compiler | |
2128 back end when register classes or instruction sets have changed, | |
2129 before each function. */ | |
2130 static void | |
2131 backend_init_target (void) | |
2132 { | |
2133 /* Initialize alignment variables. */ | |
2134 init_alignments (); | |
2135 | |
2136 /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target() | |
2137 to initialize reg_raw_mode[]. */ | |
2138 init_emit_regs (); | |
2139 | |
2140 /* This invokes target hooks to set fixed_reg[] etc, which is | |
2141 mode-dependent. */ | |
2142 init_regs (); | |
2143 | |
2144 /* This depends on stack_pointer_rtx. */ | |
2145 init_fake_stack_mems (); | |
2146 | |
2147 /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is | |
2148 mode-dependent. */ | |
2149 init_alias_target (); | |
2150 | |
2151 /* Depends on HARD_FRAME_POINTER_REGNUM. */ | |
2152 init_reload (); | |
2153 | |
2154 /* The following initialization functions need to generate rtl, so | |
2155 provide a dummy function context for them. */ | |
2156 init_dummy_function_start (); | |
2157 | |
2158 /* rtx_cost is mode-dependent, so cached values need to be recomputed | |
2159 on a mode change. */ | |
2160 init_expmed (); | |
2161 | |
2162 /* We may need to recompute regno_save_code[] and regno_restore_code[] | |
2163 after a mode change as well. */ | |
2164 if (flag_caller_saves) | |
2165 init_caller_save (); | |
2166 expand_dummy_function_end (); | |
2167 } | |
2168 | |
2169 /* Initialize the compiler back end. This function is called only once, | |
2170 when starting the compiler. */ | |
2171 static void | |
2172 backend_init (void) | |
2173 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2174 init_emit_once (); |
0 | 2175 |
2176 init_rtlanal (); | |
2177 init_inline_once (); | |
2178 init_varasm_once (); | |
2179 save_register_info (); | |
2180 | |
2181 /* Initialize the target-specific back end pieces. */ | |
2182 ira_init_once (); | |
2183 backend_init_target (); | |
2184 } | |
2185 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2186 /* Initialize excess precision settings. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2187 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2188 init_excess_precision (void) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2189 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2190 /* Adjust excess precision handling based on the target options. If |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2191 the front end cannot handle it, flag_excess_precision_cmdline |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2192 will already have been set accordingly in the post_options |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2193 hook. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2194 gcc_assert (flag_excess_precision_cmdline != EXCESS_PRECISION_DEFAULT); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2195 flag_excess_precision = flag_excess_precision_cmdline; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2196 if (flag_unsafe_math_optimizations) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2197 flag_excess_precision = EXCESS_PRECISION_FAST; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2198 if (flag_excess_precision == EXCESS_PRECISION_STANDARD) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2199 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2200 int flt_eval_method = TARGET_FLT_EVAL_METHOD; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2201 switch (flt_eval_method) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2202 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2203 case -1: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2204 case 0: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2205 /* Either the target acts unpredictably (-1) or has all the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2206 operations required not to have excess precision (0). */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2207 flag_excess_precision = EXCESS_PRECISION_FAST; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2208 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2209 case 1: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2210 case 2: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2211 /* In these cases, predictable excess precision makes |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2212 sense. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2213 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2214 default: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2215 /* Any other implementation-defined FLT_EVAL_METHOD values |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2216 require the compiler to handle the associated excess |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2217 precision rules in excess_precision_type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2218 gcc_unreachable (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2219 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2220 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2221 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2222 |
0 | 2223 /* Initialize things that are both lang-dependent and target-dependent. |
2224 This function can be called more than once if target parameters change. */ | |
2225 static void | |
2226 lang_dependent_init_target (void) | |
2227 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2228 /* This determines excess precision settings. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2229 init_excess_precision (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2230 |
0 | 2231 /* This creates various _DECL nodes, so needs to be called after the |
2232 front end is initialized. It also depends on the HAVE_xxx macros | |
2233 generated from the target machine description. */ | |
2234 init_optabs (); | |
2235 | |
2236 /* The following initialization functions need to generate rtl, so | |
2237 provide a dummy function context for them. */ | |
2238 init_dummy_function_start (); | |
2239 | |
2240 /* Do the target-specific parts of expr initialization. */ | |
2241 init_expr_target (); | |
2242 | |
2243 /* Although the actions of these functions are language-independent, | |
2244 they use optabs, so we cannot call them from backend_init. */ | |
2245 init_set_costs (); | |
2246 ira_init (); | |
2247 | |
2248 expand_dummy_function_end (); | |
2249 } | |
2250 | |
2251 /* Language-dependent initialization. Returns nonzero on success. */ | |
2252 static int | |
2253 lang_dependent_init (const char *name) | |
2254 { | |
2255 location_t save_loc = input_location; | |
2256 if (dump_base_name == 0) | |
2257 dump_base_name = name && name[0] ? name : "gccdump"; | |
2258 | |
2259 /* Other front-end initialization. */ | |
2260 input_location = BUILTINS_LOCATION; | |
2261 if (lang_hooks.init () == 0) | |
2262 return 0; | |
2263 input_location = save_loc; | |
2264 | |
2265 init_asm_output (name); | |
2266 | |
2267 /* This creates various _DECL nodes, so needs to be called after the | |
2268 front end is initialized. */ | |
2269 init_eh (); | |
2270 | |
2271 /* Do the target-specific parts of the initialization. */ | |
2272 lang_dependent_init_target (); | |
2273 | |
2274 /* If dbx symbol table desired, initialize writing it and output the | |
2275 predefined types. */ | |
2276 timevar_push (TV_SYMOUT); | |
2277 | |
2278 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO | |
2279 if (dwarf2out_do_frame ()) | |
2280 dwarf2out_frame_init (); | |
2281 #endif | |
2282 | |
2283 /* Now we have the correct original filename, we can initialize | |
2284 debug output. */ | |
2285 (*debug_hooks->init) (name); | |
2286 | |
2287 timevar_pop (TV_SYMOUT); | |
2288 | |
2289 return 1; | |
2290 } | |
2291 | |
2292 | |
2293 /* Reinitialize everything when target parameters, such as register usage, | |
2294 have changed. */ | |
2295 void | |
2296 target_reinit (void) | |
2297 { | |
2298 /* Reinitialize RTL backend. */ | |
2299 backend_init_target (); | |
2300 | |
2301 /* Reinitialize lang-dependent parts. */ | |
2302 lang_dependent_init_target (); | |
2303 } | |
2304 | |
2305 void | |
2306 dump_memory_report (bool final) | |
2307 { | |
2308 ggc_print_statistics (); | |
2309 stringpool_statistics (); | |
2310 dump_tree_statistics (); | |
2311 dump_gimple_statistics (); | |
2312 dump_rtx_statistics (); | |
2313 dump_varray_statistics (); | |
2314 dump_alloc_pool_statistics (); | |
2315 dump_bitmap_statistics (); | |
2316 dump_vec_loc_statistics (); | |
2317 dump_ggc_loc_statistics (final); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2318 dump_alias_stats (stderr); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2319 dump_pta_stats (stderr); |
0 | 2320 } |
2321 | |
2322 /* Clean up: close opened files, etc. */ | |
2323 | |
2324 static void | |
2325 finalize (void) | |
2326 { | |
2327 /* Close the dump files. */ | |
2328 if (flag_gen_aux_info) | |
2329 { | |
2330 fclose (aux_info_file); | |
2331 if (errorcount) | |
2332 unlink (aux_info_file_name); | |
2333 } | |
2334 | |
2335 /* Close non-debugging input and output files. Take special care to note | |
2336 whether fclose returns an error, since the pages might still be on the | |
2337 buffer chain while the file is open. */ | |
2338 | |
2339 if (asm_out_file) | |
2340 { | |
2341 if (ferror (asm_out_file) != 0) | |
2342 fatal_error ("error writing to %s: %m", asm_file_name); | |
2343 if (fclose (asm_out_file) != 0) | |
2344 fatal_error ("error closing %s: %m", asm_file_name); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2345 if (flag_wpa) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2346 unlink_if_ordinary (asm_file_name); |
0 | 2347 } |
2348 | |
2349 statistics_fini (); | |
2350 finish_optimization_passes (); | |
2351 | |
2352 ira_finish_once (); | |
2353 | |
2354 if (mem_report) | |
2355 dump_memory_report (true); | |
2356 | |
2357 /* Language-specific end of compilation actions. */ | |
2358 lang_hooks.finish (); | |
2359 } | |
2360 | |
2361 /* Initialize the compiler, and compile the input file. */ | |
2362 static void | |
2363 do_compile (void) | |
2364 { | |
2365 /* Initialize timing first. The C front ends read the main file in | |
2366 the post_options hook, and C++ does file timings. */ | |
2367 if (time_report || !quiet_flag || flag_detailed_statistics) | |
2368 timevar_init (); | |
2369 timevar_start (TV_TOTAL); | |
2370 | |
2371 process_options (); | |
2372 | |
2373 /* Don't do any more if an error has already occurred. */ | |
2374 if (!errorcount) | |
2375 { | |
2376 /* This must be run always, because it is needed to compute the FP | |
2377 predefined macros, such as __LDBL_MAX__, for targets using non | |
2378 default FP formats. */ | |
2379 init_adjust_machine_modes (); | |
2380 | |
2381 /* Set up the back-end if requested. */ | |
2382 if (!no_backend) | |
2383 backend_init (); | |
2384 | |
2385 /* Language-dependent initialization. Returns true on success. */ | |
2386 if (lang_dependent_init (main_input_filename)) | |
2387 compile_file (); | |
2388 | |
2389 finalize (); | |
2390 } | |
2391 | |
2392 /* Stop timing and print the times. */ | |
2393 timevar_stop (TV_TOTAL); | |
2394 timevar_print (stderr); | |
2395 } | |
2396 | |
2397 /* Entry point of cc1, cc1plus, jc1, f771, etc. | |
2398 Exit code is FATAL_EXIT_CODE if can't open files or if there were | |
2399 any errors, or SUCCESS_EXIT_CODE if compilation succeeded. | |
2400 | |
2401 It is not safe to call this function more than once. */ | |
2402 | |
2403 int | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2404 toplev_main (int argc, char **argv) |
0 | 2405 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2406 expandargv (&argc, &argv); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2407 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2408 save_argv = CONST_CAST2 (const char **, char **, argv); |
0 | 2409 |
2410 /* Initialization of GCC's environment, and diagnostics. */ | |
2411 general_init (argv[0]); | |
2412 | |
2413 /* Parse the options and do minimal processing; basically just | |
2414 enough to default flags appropriately. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2415 decode_options (argc, CONST_CAST2 (const char **, char **, argv)); |
0 | 2416 |
2417 init_local_tick (); | |
2418 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2419 initialize_plugins (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2420 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2421 if (version_flag) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2422 print_version (stderr, ""); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2423 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2424 if (help_flag) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2425 print_plugins_help (stderr, ""); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2426 |
0 | 2427 /* Exit early if we can (e.g. -help). */ |
2428 if (!exit_after_options) | |
2429 do_compile (); | |
2430 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2431 if (warningcount || errorcount) |
0 | 2432 print_ignored_options (); |
2433 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2434 /* Invoke registered plugin callbacks if any. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2435 invoke_plugin_callbacks (PLUGIN_FINISH, NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2436 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2437 finalize_plugins (); |
0 | 2438 if (errorcount || sorrycount) |
2439 return (FATAL_EXIT_CODE); | |
2440 | |
2441 return (SUCCESS_EXIT_CODE); | |
2442 } |