Mercurial > hg > CbC > CbC_gcc
annotate gcc/toplev.c @ 140:4e440907fcbf
copy CbC goto flang in cfgexpand
remove some CbC unnecessary code
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Nov 2018 00:24:45 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* Top level of GCC compilers (cc1, cc1plus, etc.) |
131 | 2 Copyright (C) 1987-2018 Free Software Foundation, Inc. |
0 | 3 |
4 This file is part of GCC. | |
5 | |
6 GCC is free software; you can redistribute it and/or modify it under | |
7 the terms of the GNU General Public License as published by the Free | |
8 Software Foundation; either version 3, or (at your option) any later | |
9 version. | |
10 | |
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GCC; see the file COPYING3. If not see | |
18 <http://www.gnu.org/licenses/>. */ | |
19 | |
20 /* This is the top level of cc1/c++. | |
21 It parses command args, opens files, invokes the various passes | |
22 in the proper order, and counts the time used by each. | |
23 Error messages and low-level interface to malloc also handled here. */ | |
24 | |
25 #include "config.h" | |
26 #include "system.h" | |
27 #include "coretypes.h" | |
111 | 28 #include "backend.h" |
29 #include "target.h" | |
30 #include "rtl.h" | |
0 | 31 #include "tree.h" |
111 | 32 #include "gimple.h" |
33 #include "alloc-pool.h" | |
34 #include "timevar.h" | |
35 #include "memmodel.h" | |
36 #include "tm_p.h" | |
37 #include "optabs-libfuncs.h" | |
38 #include "insn-config.h" | |
39 #include "ira.h" | |
40 #include "recog.h" | |
41 #include "cgraph.h" | |
42 #include "coverage.h" | |
43 #include "diagnostic.h" | |
44 #include "varasm.h" | |
45 #include "tree-inline.h" | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
46 #include "realmpfr.h" /* For GMP/MPFR/MPC versions, in print_version. */ |
0 | 47 #include "version.h" |
48 #include "flags.h" | |
49 #include "insn-attr.h" | |
50 #include "output.h" | |
51 #include "toplev.h" | |
52 #include "expr.h" | |
53 #include "intl.h" | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
54 #include "tree-diagnostic.h" |
0 | 55 #include "params.h" |
56 #include "reload.h" | |
111 | 57 #include "lra.h" |
0 | 58 #include "dwarf2asm.h" |
59 #include "debug.h" | |
111 | 60 #include "common/common-target.h" |
0 | 61 #include "langhooks.h" |
111 | 62 #include "cfgloop.h" /* for init_set_costs */ |
0 | 63 #include "hosthooks.h" |
64 #include "opts.h" | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
65 #include "opts-diagnostic.h" |
111 | 66 #include "stringpool.h" |
67 #include "attribs.h" | |
68 #include "asan.h" | |
69 #include "tsan.h" | |
70 #include "plugin.h" | |
71 #include "context.h" | |
72 #include "pass_manager.h" | |
73 #include "auto-profile.h" | |
74 #include "dwarf2out.h" | |
75 #include "ipa-reference.h" | |
76 #include "symbol-summary.h" | |
77 #include "tree-vrp.h" | |
78 #include "ipa-prop.h" | |
79 #include "gcse.h" | |
80 #include "omp-offload.h" | |
81 #include "hsa-common.h" | |
82 #include "edit-context.h" | |
0 | 83 #include "tree-pass.h" |
111 | 84 #include "dumpfile.h" |
131 | 85 #include "ipa-fnsummary.h" |
86 #include "optinfo-emit-json.h" | |
0 | 87 |
88 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) | |
89 #include "dbxout.h" | |
90 #endif | |
91 | |
92 #ifdef XCOFF_DEBUGGING_INFO | |
111 | 93 #include "xcoffout.h" /* Needed for external data declarations. */ |
0 | 94 #endif |
95 | |
111 | 96 #include "selftest.h" |
97 | |
98 #ifdef HAVE_isl | |
99 #include <isl/version.h> | |
100 #endif | |
101 | |
102 static void general_init (const char *, bool); | |
103 static void do_compile (); | |
0 | 104 static void process_options (void); |
105 static void backend_init (void); | |
106 static int lang_dependent_init (const char *); | |
107 static void init_asm_output (const char *); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
108 static void finalize (bool); |
0 | 109 |
110 static void crash_signal (int) ATTRIBUTE_NORETURN; | |
111 static void compile_file (void); | |
112 | |
113 /* True if we don't need a backend (e.g. preprocessing only). */ | |
114 static bool no_backend; | |
115 | |
116 /* Length of line when printing switch values. */ | |
117 #define MAX_LINE 75 | |
118 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
119 /* Decoded options, and number of such options. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
120 struct cl_decoded_option *save_decoded_options; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
121 unsigned int save_decoded_options_count; |
0 | 122 |
123 /* Used to enable -fvar-tracking, -fweb and -frename-registers according | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
124 to optimize in process_options (). */ |
0 | 125 #define AUTODETECT_VALUE 2 |
126 | |
127 /* Debug hooks - dependent upon command line options. */ | |
128 | |
129 const struct gcc_debug_hooks *debug_hooks; | |
130 | |
131 /* The FUNCTION_DECL for the function currently being compiled, | |
132 or 0 if between functions. */ | |
133 tree current_function_decl; | |
134 | |
135 /* Set to the FUNC_BEGIN label of the current function, or NULL | |
136 if none. */ | |
137 const char * current_function_func_begin_label; | |
138 | |
139 /* A random sequence of characters, unless overridden by user. */ | |
140 static const char *flag_random_seed; | |
141 | |
142 /* A local time stamp derived from the time of compilation. It will be | |
143 zero if the system cannot provide a time. It will be -1u, if the | |
144 user has specified a particular random seed. */ | |
145 unsigned local_tick; | |
146 | |
111 | 147 /* Random number for this compilation */ |
148 HOST_WIDE_INT random_seed; | |
0 | 149 |
111 | 150 /* -f flags. */ |
0 | 151 |
152 /* When non-NULL, indicates that whenever space is allocated on the | |
153 stack, the resulting stack pointer must not pass this | |
154 address---that is, for stacks that grow downward, the stack pointer | |
155 must always be greater than or equal to this address; for stacks | |
156 that grow upward, the stack pointer must be less than this address. | |
157 At present, the rtx may be either a REG or a SYMBOL_REF, although | |
158 the support provided depends on the backend. */ | |
159 rtx stack_limit_rtx; | |
160 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
161 struct target_flag_state default_target_flag_state; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
162 #if SWITCHABLE_TARGET |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
163 struct target_flag_state *this_target_flag_state = &default_target_flag_state; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
164 #else |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
165 #define this_target_flag_state (&default_target_flag_state) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
166 #endif |
0 | 167 |
168 /* The user symbol prefix after having resolved same. */ | |
169 const char *user_label_prefix; | |
170 | |
171 /* Output files for assembler code (real compiler output) | |
172 and debugging dumps. */ | |
173 | |
174 FILE *asm_out_file; | |
175 FILE *aux_info_file; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
176 FILE *stack_usage_file = NULL; |
0 | 177 |
178 /* The current working directory of a translation. It's generally the | |
179 directory from which compilation was initiated, but a preprocessed | |
180 file may specify the original directory in which it was | |
181 created. */ | |
182 | |
183 static const char *src_pwd; | |
184 | |
185 /* Initialize src_pwd with the given string, and return true. If it | |
186 was already initialized, return false. As a special case, it may | |
187 be called with a NULL argument to test whether src_pwd has NOT been | |
188 initialized yet. */ | |
189 | |
190 bool | |
191 set_src_pwd (const char *pwd) | |
192 { | |
193 if (src_pwd) | |
194 { | |
195 if (strcmp (src_pwd, pwd) == 0) | |
196 return true; | |
197 else | |
198 return false; | |
199 } | |
200 | |
201 src_pwd = xstrdup (pwd); | |
202 return true; | |
203 } | |
204 | |
205 /* Return the directory from which the translation unit was initiated, | |
206 in case set_src_pwd() was not called before to assign it a | |
207 different value. */ | |
208 | |
209 const char * | |
210 get_src_pwd (void) | |
211 { | |
212 if (! src_pwd) | |
213 { | |
214 src_pwd = getpwd (); | |
215 if (!src_pwd) | |
216 src_pwd = "."; | |
217 } | |
218 | |
219 return src_pwd; | |
220 } | |
221 | |
222 /* Called when the start of a function definition is parsed, | |
223 this function prints on stderr the name of the function. */ | |
224 void | |
225 announce_function (tree decl) | |
226 { | |
227 if (!quiet_flag) | |
228 { | |
229 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
|
230 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
|
231 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl)))); |
0 | 232 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
233 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
|
234 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2))); |
0 | 235 fflush (stderr); |
236 pp_needs_newline (global_dc->printer) = true; | |
237 diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL); | |
238 } | |
239 } | |
240 | |
241 /* Initialize local_tick with the time of day, or -1 if | |
242 flag_random_seed is set. */ | |
243 | |
244 static void | |
245 init_local_tick (void) | |
246 { | |
247 if (!flag_random_seed) | |
248 { | |
249 #ifdef HAVE_GETTIMEOFDAY | |
250 { | |
251 struct timeval tv; | |
252 | |
253 gettimeofday (&tv, NULL); | |
111 | 254 local_tick = (unsigned) tv.tv_sec * 1000 + tv.tv_usec / 1000; |
0 | 255 } |
256 #else | |
257 { | |
258 time_t now = time (NULL); | |
259 | |
260 if (now != (time_t)-1) | |
261 local_tick = (unsigned) now; | |
262 } | |
263 #endif | |
264 } | |
265 else | |
266 local_tick = -1; | |
267 } | |
268 | |
111 | 269 /* Obtain the random_seed. Unless NOINIT, initialize it if |
0 | 270 it's not provided in the command line. */ |
271 | |
111 | 272 HOST_WIDE_INT |
0 | 273 get_random_seed (bool noinit) |
274 { | |
111 | 275 if (!random_seed && !noinit) |
276 { | |
277 int fd = open ("/dev/urandom", O_RDONLY); | |
278 if (fd >= 0) | |
279 { | |
280 if (read (fd, &random_seed, sizeof (random_seed)) | |
281 != sizeof (random_seed)) | |
282 random_seed = 0; | |
283 close (fd); | |
284 } | |
285 if (!random_seed) | |
286 random_seed = local_tick ^ getpid (); | |
287 } | |
288 return random_seed; | |
0 | 289 } |
290 | |
111 | 291 /* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */ |
0 | 292 |
111 | 293 void |
0 | 294 set_random_seed (const char *val) |
295 { | |
296 flag_random_seed = val; | |
111 | 297 if (flag_random_seed) |
298 { | |
299 char *endp; | |
300 | |
301 /* When the driver passed in a hex number don't crc it again */ | |
302 random_seed = strtoul (flag_random_seed, &endp, 0); | |
303 if (!(endp > flag_random_seed && *endp == 0)) | |
304 random_seed = crc32_string (0, flag_random_seed); | |
305 } | |
0 | 306 } |
307 | |
308 /* Handler for fatal signals, such as SIGSEGV. These are transformed | |
309 into ICE messages, which is much more user friendly. In case the | |
310 error printer crashes, reset the signal to prevent infinite recursion. */ | |
311 | |
312 static void | |
313 crash_signal (int signo) | |
314 { | |
315 signal (signo, SIG_DFL); | |
316 | |
317 /* If we crashed while processing an ASM statement, then be a little more | |
318 graceful. It's most likely the user's fault. */ | |
319 if (this_is_asm_operands) | |
320 { | |
321 output_operand_lossage ("unrecoverable error"); | |
322 exit (FATAL_EXIT_CODE); | |
323 } | |
324 | |
325 internal_error ("%s", strsignal (signo)); | |
326 } | |
327 | |
328 /* A subroutine of wrapup_global_declarations. We've come to the end of | |
329 the compilation unit. All deferred variables should be undeferred, | |
330 and all incomplete decls should be finalized. */ | |
331 | |
332 void | |
333 wrapup_global_declaration_1 (tree decl) | |
334 { | |
335 /* We're not deferring this any longer. Assignment is conditional to | |
336 avoid needlessly dirtying PCH pages. */ | |
337 if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS) | |
338 && DECL_DEFER_OUTPUT (decl) != 0) | |
339 DECL_DEFER_OUTPUT (decl) = 0; | |
340 | |
111 | 341 if (VAR_P (decl) && DECL_SIZE (decl) == 0) |
0 | 342 lang_hooks.finish_incomplete_decl (decl); |
343 } | |
344 | |
345 /* A subroutine of wrapup_global_declarations. Decide whether or not DECL | |
346 needs to be output. Return true if it is output. */ | |
347 | |
348 bool | |
349 wrapup_global_declaration_2 (tree decl) | |
350 { | |
111 | 351 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl) |
352 || (VAR_P (decl) && DECL_HAS_VALUE_EXPR_P (decl))) | |
0 | 353 return false; |
354 | |
355 /* Don't write out static consts, unless we still need them. | |
356 | |
357 We also keep static consts if not optimizing (for debugging), | |
358 unless the user specified -fno-keep-static-consts. | |
359 ??? They might be better written into the debug information. | |
360 This is possible when using DWARF. | |
361 | |
362 A language processor that wants static constants to be always | |
363 written out (even if it is not used) is responsible for | |
364 calling rest_of_decl_compilation itself. E.g. the C front-end | |
365 calls rest_of_decl_compilation from finish_decl. | |
366 One motivation for this is that is conventional in some | |
367 environments to write things like: | |
368 static const char rcsid[] = "... version string ..."; | |
369 intending to force the string to be in the executable. | |
370 | |
371 A language processor that would prefer to have unneeded | |
372 static constants "optimized away" would just defer writing | |
373 them out until here. E.g. C++ does this, because static | |
374 constants are often defined in header files. | |
375 | |
376 ??? A tempting alternative (for both C and C++) would be | |
377 to force a constant to be written if and only if it is | |
378 defined in a main file, as opposed to an include file. */ | |
379 | |
111 | 380 if (VAR_P (decl) && TREE_STATIC (decl)) |
0 | 381 { |
111 | 382 varpool_node *node; |
0 | 383 bool needed = true; |
111 | 384 node = varpool_node::get (decl); |
0 | 385 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
386 if (!node && flag_ltrans) |
0 | 387 needed = false; |
111 | 388 else if (node && node->definition) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
389 needed = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
390 else if (node && node->alias) |
0 | 391 needed = false; |
111 | 392 else if (!symtab->global_info_ready |
0 | 393 && (TREE_USED (decl) |
394 || TREE_USED (DECL_ASSEMBLER_NAME (decl)))) | |
395 /* needed */; | |
111 | 396 else if (node && node->analyzed) |
0 | 397 /* needed */; |
398 else if (DECL_COMDAT (decl)) | |
399 needed = false; | |
400 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl) | |
401 && (optimize || !flag_keep_static_consts | |
402 || DECL_ARTIFICIAL (decl))) | |
403 needed = false; | |
404 | |
405 if (needed) | |
406 { | |
407 rest_of_decl_compilation (decl, 1, 1); | |
408 return true; | |
409 } | |
410 } | |
411 | |
412 return false; | |
413 } | |
414 | |
415 /* Do any final processing required for the declarations in VEC, of | |
416 which there are LEN. We write out inline functions and variables | |
417 that have been deferred until this point, but which are required. | |
418 Returns nonzero if anything was put out. */ | |
419 | |
420 bool | |
421 wrapup_global_declarations (tree *vec, int len) | |
422 { | |
423 bool reconsider, output_something = false; | |
424 int i; | |
425 | |
426 for (i = 0; i < len; i++) | |
427 wrapup_global_declaration_1 (vec[i]); | |
428 | |
429 /* Now emit any global variables or functions that we have been | |
430 putting off. We need to loop in case one of the things emitted | |
431 here references another one which comes earlier in the list. */ | |
432 do | |
433 { | |
434 reconsider = false; | |
435 for (i = 0; i < len; i++) | |
436 reconsider |= wrapup_global_declaration_2 (vec[i]); | |
437 if (reconsider) | |
438 output_something = true; | |
439 } | |
440 while (reconsider); | |
441 | |
442 return output_something; | |
443 } | |
444 | |
445 /* Compile an entire translation unit. Write a file of assembly | |
446 output and various debugging dumps. */ | |
447 | |
448 static void | |
449 compile_file (void) | |
450 { | |
111 | 451 timevar_start (TV_PHASE_PARSING); |
452 timevar_push (TV_PARSE_GLOBAL); | |
0 | 453 |
111 | 454 /* Parse entire file and generate initial debug information. */ |
455 lang_hooks.parse_file (); | |
0 | 456 |
111 | 457 timevar_pop (TV_PARSE_GLOBAL); |
458 timevar_stop (TV_PHASE_PARSING); | |
0 | 459 |
111 | 460 if (flag_dump_locations) |
461 dump_location_info (stderr); | |
0 | 462 |
463 /* Compilation is now finished except for writing | |
464 what's left of the symbol table output. */ | |
465 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
466 if (flag_syntax_only || flag_wpa) |
0 | 467 return; |
111 | 468 |
469 /* Reset maximum_field_alignment, it can be adjusted by #pragma pack | |
470 and this shouldn't influence any types built by the middle-end | |
471 from now on (like gcov_info_type). */ | |
472 maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT; | |
0 | 473 |
474 ggc_protect_identifiers = false; | |
475 | |
111 | 476 /* Run the actual compilation process. */ |
477 if (!in_lto_p) | |
478 { | |
479 timevar_start (TV_PHASE_OPT_GEN); | |
480 symtab->finalize_compilation_unit (); | |
481 timevar_stop (TV_PHASE_OPT_GEN); | |
482 } | |
483 | |
484 /* Perform any post compilation-proper parser cleanups and | |
485 processing. This is currently only needed for the C++ parser, | |
486 which can be hopefully cleaned up so this hook is no longer | |
487 necessary. */ | |
488 if (lang_hooks.decls.post_compilation_parsing_cleanups) | |
489 lang_hooks.decls.post_compilation_parsing_cleanups (); | |
0 | 490 |
131 | 491 optimization_records_finish (); |
492 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
493 if (seen_error ()) |
0 | 494 return; |
495 | |
111 | 496 timevar_start (TV_PHASE_LATE_ASM); |
0 | 497 |
111 | 498 /* Compilation unit is finalized. When producing non-fat LTO object, we are |
499 basically finished. */ | |
131 | 500 if ((in_lto_p && flag_incremental_link != INCREMENTAL_LINK_LTO) |
501 || !flag_lto || flag_fat_lto_objects) | |
111 | 502 { |
503 /* File-scope initialization for AddressSanitizer. */ | |
504 if (flag_sanitize & SANITIZE_ADDRESS) | |
505 asan_finish_file (); | |
0 | 506 |
111 | 507 if (flag_sanitize & SANITIZE_THREAD) |
508 tsan_finish_file (); | |
509 | |
510 omp_finish_file (); | |
511 | |
512 hsa_output_brig (); | |
0 | 513 |
111 | 514 output_shared_constant_pool (); |
515 output_object_blocks (); | |
516 finish_tm_clone_pairs (); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
517 |
111 | 518 /* Write out any pending weak symbol declarations. */ |
519 weak_finish (); | |
0 | 520 |
111 | 521 /* This must be at the end before unwind and debug info. |
522 Some target ports emit PIC setup thunks here. */ | |
523 targetm.asm_out.code_end (); | |
524 | |
525 /* Do dbx symbols. */ | |
526 timevar_push (TV_SYMOUT); | |
0 | 527 |
131 | 528 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO |
529 dwarf2out_frame_finish (); | |
530 #endif | |
0 | 531 |
131 | 532 debuginfo_start (); |
111 | 533 (*debug_hooks->finish) (main_input_filename); |
131 | 534 debuginfo_stop (); |
111 | 535 timevar_pop (TV_SYMOUT); |
0 | 536 |
111 | 537 /* Output some stuff at end of file if nec. */ |
538 | |
539 dw2_output_indirect_constants (); | |
0 | 540 |
111 | 541 /* Flush any pending external directives. */ |
542 process_pending_assemble_externals (); | |
543 } | |
0 | 544 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
545 /* 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
|
546 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
|
547 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
|
548 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
|
549 library without invoking lto1. */ |
111 | 550 if (flag_generate_lto || flag_generate_offload) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
551 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
552 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
553 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
554 "__gnu_lto_v1", |
111 | 555 HOST_WIDE_INT_1U, 8); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
556 #elif defined ASM_OUTPUT_ALIGNED_COMMON |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
557 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1", |
111 | 558 HOST_WIDE_INT_1U, 8); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
559 #else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
560 ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1", |
111 | 561 HOST_WIDE_INT_1U, |
562 HOST_WIDE_INT_1U); | |
563 #endif | |
564 } | |
565 | |
566 /* Let linker plugin know that this is a slim object and must be LTOed | |
567 even when user did not ask for it. */ | |
568 if (flag_generate_lto && !flag_fat_lto_objects) | |
569 { | |
570 #if defined ASM_OUTPUT_ALIGNED_DECL_COMMON | |
571 ASM_OUTPUT_ALIGNED_DECL_COMMON (asm_out_file, NULL_TREE, "__gnu_lto_slim", | |
572 HOST_WIDE_INT_1U, 8); | |
573 #elif defined ASM_OUTPUT_ALIGNED_COMMON | |
574 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_slim", | |
575 HOST_WIDE_INT_1U, 8); | |
576 #else | |
577 ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_slim", | |
578 HOST_WIDE_INT_1U, | |
579 HOST_WIDE_INT_1U); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
580 #endif |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
581 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
582 |
0 | 583 /* Attach a special .ident directive to the end of the file to identify |
584 the version of GCC which compiled this code. The format of the .ident | |
585 string is patterned after the ones produced by native SVR4 compilers. */ | |
586 if (!flag_no_ident) | |
587 { | |
588 const char *pkg_version = "(GNU) "; | |
111 | 589 char *ident_str; |
0 | 590 |
591 if (strcmp ("(GCC) ", pkgversion_string)) | |
592 pkg_version = pkgversion_string; | |
111 | 593 |
594 ident_str = ACONCAT (("GCC: ", pkg_version, version_string, NULL)); | |
595 targetm.asm_out.output_ident (ident_str); | |
0 | 596 } |
111 | 597 |
598 /* Auto profile finalization. */ | |
599 if (flag_auto_profile) | |
600 end_auto_profile (); | |
0 | 601 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
602 /* 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
|
603 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
|
604 |
0 | 605 /* This must be at the end. Some target ports emit end of file directives |
606 into the assembly file here, and hence we can not output anything to the | |
607 assembly file after this point. */ | |
608 targetm.asm_out.file_end (); | |
111 | 609 |
610 timevar_stop (TV_PHASE_LATE_ASM); | |
0 | 611 } |
612 | |
613 /* Print version information to FILE. | |
614 Each line begins with INDENT (for the case where FILE is the | |
111 | 615 assembler output file). |
616 | |
617 If SHOW_GLOBAL_STATE is true (for cc1 etc), we are within the compiler | |
618 proper and can print pertinent state (e.g. params and plugins). | |
619 | |
620 If SHOW_GLOBAL_STATE is false (for use by libgccjit), we are outside the | |
621 compiler, and we don't hold the mutex on the compiler's global state: | |
622 we can't print params and plugins, since they might not be initialized, | |
623 or might be being manipulated by a compile running in another | |
624 thread. */ | |
0 | 625 |
626 void | |
111 | 627 print_version (FILE *file, const char *indent, bool show_global_state) |
0 | 628 { |
629 static const char fmt1[] = | |
630 #ifdef __GNUC__ | |
631 N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ") | |
632 #else | |
633 N_("%s%s%s %sversion %s (%s) compiled by CC, ") | |
634 #endif | |
635 ; | |
636 static const char fmt2[] = | |
111 | 637 N_("GMP version %s, MPFR version %s, MPC version %s, isl version %s\n"); |
0 | 638 static const char fmt3[] = |
639 N_("%s%swarning: %s header version %s differs from library version %s.\n"); | |
640 static const char fmt4[] = | |
641 N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n"); | |
642 #ifndef __VERSION__ | |
643 #define __VERSION__ "[?]" | |
644 #endif | |
645 fprintf (file, | |
646 file == stderr ? _(fmt1) : fmt1, | |
647 indent, *indent != 0 ? " " : "", | |
648 lang_hooks.name, pkgversion_string, version_string, TARGET_NAME, | |
649 indent, __VERSION__); | |
650 | |
651 /* 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
|
652 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
|
653 gmp-4.3.0, GMP always uses the 3 number format. */ |
0 | 654 #define GCC_GMP_STRINGIFY_VERSION3(X) #X |
111 | 655 #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
|
656 #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
|
657 #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
|
658 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
|
659 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0 |
111 | 660 #define GCC_GMP_STRINGIFY_VERSION \ |
661 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \ | |
662 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR) | |
0 | 663 #else |
111 | 664 #define GCC_GMP_STRINGIFY_VERSION \ |
665 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION) "." \ | |
666 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_MINOR) "." \ | |
667 GCC_GMP_STRINGIFY_VERSION2 (__GNU_MP_VERSION_PATCHLEVEL) | |
0 | 668 #endif |
669 fprintf (file, | |
670 file == stderr ? _(fmt2) : fmt2, | |
111 | 671 GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING, |
672 #ifndef HAVE_isl | |
673 "none" | |
674 #else | |
675 isl_version () | |
676 #endif | |
677 ); | |
0 | 678 if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version)) |
679 fprintf (file, | |
680 file == stderr ? _(fmt3) : fmt3, | |
681 indent, *indent != 0 ? " " : "", | |
682 "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version); | |
683 if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ())) | |
684 fprintf (file, | |
685 file == stderr ? _(fmt3) : fmt3, | |
686 indent, *indent != 0 ? " " : "", | |
687 "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
|
688 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
|
689 fprintf (file, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
690 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
|
691 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
|
692 "MPC", 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
|
693 |
111 | 694 if (show_global_state) |
695 { | |
696 fprintf (file, | |
697 file == stderr ? _(fmt4) : fmt4, | |
698 indent, *indent != 0 ? " " : "", | |
699 PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE)); | |
700 | |
701 print_plugins_versions (file, indent); | |
702 } | |
0 | 703 } |
704 | |
705 static int | |
706 print_to_asm_out_file (print_switch_type type, const char * text) | |
707 { | |
708 bool prepend_sep = true; | |
709 | |
710 switch (type) | |
711 { | |
712 case SWITCH_TYPE_LINE_END: | |
713 putc ('\n', asm_out_file); | |
714 return 1; | |
715 | |
716 case SWITCH_TYPE_LINE_START: | |
717 fputs (ASM_COMMENT_START, asm_out_file); | |
718 return strlen (ASM_COMMENT_START); | |
719 | |
720 case SWITCH_TYPE_DESCRIPTIVE: | |
721 if (ASM_COMMENT_START[0] == 0) | |
722 prepend_sep = false; | |
111 | 723 /* FALLTHRU */ |
0 | 724 case SWITCH_TYPE_PASSED: |
725 case SWITCH_TYPE_ENABLED: | |
726 if (prepend_sep) | |
727 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
|
728 fputs (text, asm_out_file); |
0 | 729 /* No need to return the length here as |
730 print_single_switch has already done it. */ | |
731 return 0; | |
732 | |
733 default: | |
734 return -1; | |
735 } | |
736 } | |
737 | |
738 static int | |
739 print_to_stderr (print_switch_type type, const char * text) | |
740 { | |
741 switch (type) | |
742 { | |
743 case SWITCH_TYPE_LINE_END: | |
744 putc ('\n', stderr); | |
745 return 1; | |
746 | |
747 case SWITCH_TYPE_LINE_START: | |
748 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
|
749 |
0 | 750 case SWITCH_TYPE_PASSED: |
751 case SWITCH_TYPE_ENABLED: | |
752 fputc (' ', stderr); | |
111 | 753 /* FALLTHRU */ |
0 | 754 |
755 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
|
756 fputs (text, stderr); |
0 | 757 /* No need to return the length here as |
758 print_single_switch has already done it. */ | |
759 return 0; | |
760 | |
761 default: | |
762 return -1; | |
763 } | |
764 } | |
765 | |
766 /* Print an option value and return the adjusted position in the line. | |
767 ??? print_fn doesn't handle errors, eg disk full; presumably other | |
768 code will catch a disk full though. */ | |
769 | |
770 static int | |
771 print_single_switch (print_switch_fn_type print_fn, | |
772 int pos, | |
773 print_switch_type type, | |
774 const char * text) | |
775 { | |
776 /* The ultrix fprintf returns 0 on success, so compute the result | |
777 we want here since we need it for the following test. The +1 | |
778 is for the separator character that will probably be emitted. */ | |
779 int len = strlen (text) + 1; | |
780 | |
781 if (pos != 0 | |
782 && pos + len > MAX_LINE) | |
783 { | |
784 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
785 pos = 0; | |
786 } | |
787 | |
788 if (pos == 0) | |
789 pos += print_fn (SWITCH_TYPE_LINE_START, NULL); | |
790 | |
791 print_fn (type, text); | |
792 return pos + len; | |
793 } | |
794 | |
795 /* Print active target switches using PRINT_FN. | |
796 POS is the current cursor position and MAX is the size of a "line". | |
797 Each line begins with INDENT and ends with TERM. | |
798 Each switch is separated from the next by SEP. */ | |
799 | |
800 static void | |
801 print_switch_values (print_switch_fn_type print_fn) | |
802 { | |
803 int pos = 0; | |
804 size_t j; | |
805 | |
806 /* Print the options as passed. */ | |
807 pos = print_single_switch (print_fn, pos, | |
808 SWITCH_TYPE_DESCRIPTIVE, _("options passed: ")); | |
809 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
810 for (j = 1; j < save_decoded_options_count; j++) |
0 | 811 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
812 switch (save_decoded_options[j].opt_index) |
0 | 813 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
814 case OPT_o: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
815 case OPT_d: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
816 case OPT_dumpbase: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
817 case OPT_dumpdir: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
818 case OPT_auxbase: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
819 case OPT_quiet: |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
820 case OPT_version: |
0 | 821 /* Ignore these. */ |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
822 continue; |
0 | 823 } |
824 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
825 pos = print_single_switch (print_fn, pos, SWITCH_TYPE_PASSED, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
826 save_decoded_options[j].orig_option_with_args_text); |
0 | 827 } |
828 | |
829 if (pos > 0) | |
830 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
831 | |
832 /* Print the -f and -m options that have been enabled. | |
833 We don't handle language specific options but printing argv | |
834 should suffice. */ | |
835 pos = print_single_switch (print_fn, 0, | |
836 SWITCH_TYPE_DESCRIPTIVE, _("options enabled: ")); | |
837 | |
838 for (j = 0; j < cl_options_count; j++) | |
111 | 839 if (cl_options[j].cl_report |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
840 && option_enabled (j, &global_options) > 0) |
0 | 841 pos = print_single_switch (print_fn, pos, |
842 SWITCH_TYPE_ENABLED, cl_options[j].opt_text); | |
843 | |
844 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
845 } | |
846 | |
847 /* Open assembly code output file. Do this even if -fsyntax-only is | |
848 on, because then the driver will have provided the name of a | |
849 temporary file or bit bucket for us. NAME is the file specified on | |
850 the command line, possibly NULL. */ | |
851 static void | |
852 init_asm_output (const char *name) | |
853 { | |
854 if (name == NULL && asm_file_name == 0) | |
855 asm_out_file = stdout; | |
856 else | |
857 { | |
858 if (asm_file_name == 0) | |
859 { | |
860 int len = strlen (dump_base_name); | |
861 char *dumpname = XNEWVEC (char, len + 6); | |
862 | |
863 memcpy (dumpname, dump_base_name, len + 1); | |
864 strip_off_ending (dumpname, len); | |
865 strcat (dumpname, ".s"); | |
866 asm_file_name = dumpname; | |
867 } | |
868 if (!strcmp (asm_file_name, "-")) | |
869 asm_out_file = stdout; | |
111 | 870 else if (!canonical_filename_eq (asm_file_name, name) |
871 || !strcmp (asm_file_name, HOST_BIT_BUCKET)) | |
872 asm_out_file = fopen (asm_file_name, "w"); | |
0 | 873 else |
111 | 874 /* Use UNKOWN_LOCATION to prevent gcc from printing the first |
875 line in the current file. */ | |
876 fatal_error (UNKNOWN_LOCATION, | |
877 "input file %qs is the same as output file", | |
878 asm_file_name); | |
0 | 879 if (asm_out_file == 0) |
111 | 880 fatal_error (UNKNOWN_LOCATION, |
881 "can%'t open %qs for writing: %m", asm_file_name); | |
0 | 882 } |
883 | |
884 if (!flag_syntax_only) | |
885 { | |
886 targetm.asm_out.file_start (); | |
887 | |
888 if (flag_record_gcc_switches) | |
889 { | |
890 if (targetm.asm_out.record_gcc_switches) | |
891 { | |
892 /* Let the target know that we are about to start recording. */ | |
893 targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, | |
894 NULL); | |
895 /* Now record the switches. */ | |
896 print_switch_values (targetm.asm_out.record_gcc_switches); | |
897 /* Let the target know that the recording is over. */ | |
898 targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, | |
899 NULL); | |
900 } | |
901 else | |
111 | 902 inform (UNKNOWN_LOCATION, |
903 "-frecord-gcc-switches is not supported by " | |
904 "the current target"); | |
0 | 905 } |
906 | |
907 if (flag_verbose_asm) | |
908 { | |
909 /* Print the list of switches in effect | |
910 into the assembler file as comments. */ | |
111 | 911 print_version (asm_out_file, ASM_COMMENT_START, true); |
0 | 912 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
|
913 putc ('\n', asm_out_file); |
0 | 914 } |
915 } | |
916 } | |
917 | |
918 /* A helper function; used as the reallocator function for cpp's line | |
919 table. */ | |
920 static void * | |
921 realloc_for_line_map (void *ptr, size_t len) | |
922 { | |
111 | 923 return ggc_realloc (ptr, len); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
924 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
925 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
926 /* A helper function: used as the allocator function for |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
927 identifier_to_locale. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
928 static void * |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
929 alloc_for_identifier_to_locale (size_t len) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
930 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
931 return ggc_alloc_atomic (len); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
932 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
933 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
934 /* Output stack usage information. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
935 void |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
936 output_stack_usage (void) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
937 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
938 static bool warning_issued = false; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
939 enum stack_usage_kind_type { STATIC = 0, DYNAMIC, DYNAMIC_BOUNDED }; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
940 const char *stack_usage_kind_str[] = { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
941 "static", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
942 "dynamic", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
943 "dynamic,bounded" |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
944 }; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
945 HOST_WIDE_INT stack_usage = current_function_static_stack_size; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
946 enum stack_usage_kind_type stack_usage_kind; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
947 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
948 if (stack_usage < 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
949 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
950 if (!warning_issued) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
951 { |
111 | 952 warning (0, "stack usage computation not supported for this target"); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
953 warning_issued = true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
954 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
955 return; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
956 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
957 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
958 stack_usage_kind = STATIC; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
959 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
960 /* Add the maximum amount of space pushed onto the stack. */ |
131 | 961 if (maybe_ne (current_function_pushed_stack_size, 0)) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
962 { |
131 | 963 HOST_WIDE_INT extra; |
964 if (current_function_pushed_stack_size.is_constant (&extra)) | |
965 { | |
966 stack_usage += extra; | |
967 stack_usage_kind = DYNAMIC_BOUNDED; | |
968 } | |
969 else | |
970 { | |
971 extra = constant_lower_bound (current_function_pushed_stack_size); | |
972 stack_usage += extra; | |
973 stack_usage_kind = DYNAMIC; | |
974 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
975 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
976 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
977 /* Now on to the tricky part: dynamic stack allocation. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
978 if (current_function_allocates_dynamic_stack_space) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
979 { |
131 | 980 if (stack_usage_kind != DYNAMIC) |
981 { | |
982 if (current_function_has_unbounded_dynamic_stack_size) | |
983 stack_usage_kind = DYNAMIC; | |
984 else | |
985 stack_usage_kind = DYNAMIC_BOUNDED; | |
986 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
987 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
988 /* Add the size even in the unbounded case, this can't hurt. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
989 stack_usage += current_function_dynamic_stack_size; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
990 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
991 |
111 | 992 if (flag_stack_usage) |
993 { | |
994 expanded_location loc | |
995 = expand_location (DECL_SOURCE_LOCATION (current_function_decl)); | |
996 /* We don't want to print the full qualified name because it can be long, | |
997 so we strip the scope prefix, but we may need to deal with the suffix | |
998 created by the compiler. */ | |
999 const char *suffix | |
1000 = strchr (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)), '.'); | |
1001 const char *name | |
1002 = lang_hooks.decl_printable_name (current_function_decl, 2); | |
1003 if (suffix) | |
1004 { | |
1005 const char *dot = strchr (name, '.'); | |
1006 while (dot && strcasecmp (dot, suffix) != 0) | |
1007 { | |
1008 name = dot + 1; | |
1009 dot = strchr (name, '.'); | |
1010 } | |
1011 } | |
1012 else | |
1013 { | |
1014 const char *dot = strrchr (name, '.'); | |
1015 if (dot) | |
1016 name = dot + 1; | |
1017 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1018 |
111 | 1019 fprintf (stack_usage_file, |
1020 "%s:%d:%d:%s\t" HOST_WIDE_INT_PRINT_DEC"\t%s\n", | |
1021 lbasename (loc.file), | |
1022 loc.line, | |
1023 loc.column, | |
1024 name, | |
1025 stack_usage, | |
1026 stack_usage_kind_str[stack_usage_kind]); | |
1027 } | |
1028 | |
131 | 1029 if (warn_stack_usage >= 0 && warn_stack_usage < HOST_WIDE_INT_MAX) |
111 | 1030 { |
1031 const location_t loc = DECL_SOURCE_LOCATION (current_function_decl); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1032 |
111 | 1033 if (stack_usage_kind == DYNAMIC) |
1034 warning_at (loc, OPT_Wstack_usage_, "stack usage might be unbounded"); | |
1035 else if (stack_usage > warn_stack_usage) | |
1036 { | |
1037 if (stack_usage_kind == DYNAMIC_BOUNDED) | |
1038 warning_at (loc, | |
131 | 1039 OPT_Wstack_usage_, "stack usage might be %wu bytes", |
111 | 1040 stack_usage); |
1041 else | |
131 | 1042 warning_at (loc, OPT_Wstack_usage_, "stack usage is %wu bytes", |
111 | 1043 stack_usage); |
1044 } | |
1045 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1046 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1047 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1048 /* Open an auxiliary output file. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1049 static FILE * |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1050 open_auxiliary_file (const char *ext) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1051 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1052 char *filename; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1053 FILE *file; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1054 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1055 filename = concat (aux_base_name, ".", ext, NULL); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1056 file = fopen (filename, "w"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1057 if (!file) |
111 | 1058 fatal_error (input_location, "can%'t open %s for writing: %m", filename); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1059 free (filename); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1060 return file; |
0 | 1061 } |
1062 | |
111 | 1063 /* Alternative diagnostics callback for reentered ICE reporting. */ |
1064 | |
1065 static void | |
1066 internal_error_reentered (diagnostic_context *, const char *, va_list *) | |
1067 { | |
1068 /* Flush the dump file if emergency_dump_function itself caused an ICE. */ | |
1069 if (dump_file) | |
1070 fflush (dump_file); | |
1071 } | |
1072 | |
1073 /* Auxiliary callback for the diagnostics code. */ | |
1074 | |
1075 static void | |
1076 internal_error_function (diagnostic_context *, const char *, va_list *) | |
1077 { | |
1078 global_dc->internal_error = internal_error_reentered; | |
1079 warn_if_plugins (); | |
1080 emergency_dump_function (); | |
1081 } | |
1082 | |
0 | 1083 /* Initialization of the front end environment, before command line |
1084 options are parsed. Signal handlers, internationalization etc. | |
1085 ARGV0 is main's argv[0]. */ | |
1086 static void | |
111 | 1087 general_init (const char *argv0, bool init_signals) |
0 | 1088 { |
1089 const char *p; | |
1090 | |
1091 p = argv0 + strlen (argv0); | |
1092 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1])) | |
1093 --p; | |
1094 progname = p; | |
1095 | |
1096 xmalloc_set_program_name (progname); | |
1097 | |
1098 hex_init (); | |
1099 | |
1100 /* Unlock the stdio streams. */ | |
1101 unlock_std_streams (); | |
1102 | |
1103 gcc_init_libintl (); | |
1104 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1105 identifier_to_locale_alloc = alloc_for_identifier_to_locale; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1106 identifier_to_locale_free = ggc_free; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1107 |
0 | 1108 /* Initialize the diagnostics reporting machinery, so option parsing |
1109 can give warnings and errors. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1110 diagnostic_initialize (global_dc, N_OPTS); |
0 | 1111 /* Set a default printer. Language specific initializations will |
1112 override it later. */ | |
111 | 1113 tree_diagnostics_defaults (global_dc); |
1114 | |
1115 global_dc->show_caret | |
1116 = global_options_init.x_flag_diagnostics_show_caret; | |
131 | 1117 global_dc->show_labels_p |
1118 = global_options_init.x_flag_diagnostics_show_labels; | |
1119 global_dc->show_line_numbers_p | |
1120 = global_options_init.x_flag_diagnostics_show_line_numbers; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1121 global_dc->show_option_requested |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1122 = global_options_init.x_flag_diagnostics_show_option; |
131 | 1123 global_dc->min_margin_width |
1124 = global_options_init.x_diagnostics_minimum_margin_width; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1125 global_dc->show_column |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1126 = global_options_init.x_flag_show_column; |
111 | 1127 global_dc->internal_error = internal_error_function; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1128 global_dc->option_enabled = option_enabled; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1129 global_dc->option_state = &global_options; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1130 global_dc->option_name = option_name; |
0 | 1131 |
111 | 1132 if (init_signals) |
1133 { | |
1134 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ | |
0 | 1135 #ifdef SIGSEGV |
111 | 1136 signal (SIGSEGV, crash_signal); |
0 | 1137 #endif |
1138 #ifdef SIGILL | |
111 | 1139 signal (SIGILL, crash_signal); |
0 | 1140 #endif |
1141 #ifdef SIGBUS | |
111 | 1142 signal (SIGBUS, crash_signal); |
0 | 1143 #endif |
1144 #ifdef SIGABRT | |
111 | 1145 signal (SIGABRT, crash_signal); |
0 | 1146 #endif |
1147 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT) | |
111 | 1148 signal (SIGIOT, crash_signal); |
0 | 1149 #endif |
1150 #ifdef SIGFPE | |
111 | 1151 signal (SIGFPE, crash_signal); |
0 | 1152 #endif |
1153 | |
111 | 1154 /* Other host-specific signal setup. */ |
1155 (*host_hooks.extra_signals)(); | |
1156 } | |
0 | 1157 |
1158 /* Initialize the garbage-collector, string pools and tree type hash | |
1159 table. */ | |
1160 init_ggc (); | |
1161 init_stringpool (); | |
111 | 1162 input_location = UNKNOWN_LOCATION; |
1163 line_table = ggc_alloc<line_maps> (); | |
1164 linemap_init (line_table, BUILTINS_LOCATION); | |
0 | 1165 line_table->reallocator = realloc_for_line_map; |
111 | 1166 line_table->round_alloc_size = ggc_round_alloc_size; |
1167 line_table->default_range_bits = 5; | |
0 | 1168 init_ttree (); |
1169 | |
1170 /* Initialize register usage now so switches may override. */ | |
1171 init_reg_sets (); | |
1172 | |
1173 /* Register the language-independent parameters. */ | |
111 | 1174 global_init_params (); |
1175 | |
1176 /* This must be done after global_init_params but before argument | |
1177 processing. */ | |
1178 init_ggc_heuristics (); | |
1179 | |
1180 /* Create the singleton holder for global state. This creates the | |
1181 dump manager. */ | |
1182 g = new gcc::context (); | |
0 | 1183 |
111 | 1184 /* Allow languages and middle-end to register their dumps before the |
1185 optimization passes. */ | |
1186 g->get_dumps ()->register_dumps (); | |
1187 | |
1188 /* Create the passes. */ | |
1189 g->set_passes (new gcc::pass_manager (g)); | |
1190 | |
1191 symtab = new (ggc_cleared_alloc <symbol_table> ()) symbol_table (); | |
1192 | |
0 | 1193 statistics_early_init (); |
131 | 1194 debuginfo_early_init (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1195 finish_params (); |
0 | 1196 } |
1197 | |
1198 /* Return true if the current target supports -fsection-anchors. */ | |
1199 | |
1200 static bool | |
1201 target_supports_section_anchors_p (void) | |
1202 { | |
1203 if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0) | |
1204 return false; | |
1205 | |
1206 if (targetm.asm_out.output_anchor == NULL) | |
1207 return false; | |
1208 | |
1209 return true; | |
1210 } | |
1211 | |
131 | 1212 /* Parse "N[:M][:...]" into struct align_flags A. |
1213 VALUES contains parsed values (in reverse order), all processed | |
1214 values are popped. */ | |
1215 | |
0 | 1216 static void |
131 | 1217 read_log_maxskip (auto_vec<unsigned> &values, align_flags_tuple *a) |
1218 { | |
1219 unsigned n = values.pop (); | |
1220 if (n != 0) | |
1221 a->log = floor_log2 (n * 2 - 1); | |
1222 | |
1223 if (values.is_empty ()) | |
1224 a->maxskip = n ? n - 1 : 0; | |
1225 else | |
1226 { | |
1227 unsigned m = values.pop (); | |
1228 /* -falign-foo=N:M means M-1 max bytes of padding, not M. */ | |
1229 if (m > 0) | |
1230 m--; | |
1231 a->maxskip = m; | |
1232 } | |
1233 | |
1234 /* Normalize the tuple. */ | |
1235 a->normalize (); | |
1236 } | |
1237 | |
1238 /* Parse "N[:M[:N2[:M2]]]" string FLAG into a pair of struct align_flags. */ | |
1239 | |
1240 static void | |
1241 parse_N_M (const char *flag, align_flags &a) | |
0 | 1242 { |
131 | 1243 if (flag) |
1244 { | |
1245 static hash_map <nofree_string_hash, align_flags> cache; | |
1246 align_flags *entry = cache.get (flag); | |
1247 if (entry) | |
1248 { | |
1249 a = *entry; | |
1250 return; | |
1251 } | |
1252 | |
1253 auto_vec<unsigned> result_values; | |
1254 bool r = parse_and_check_align_values (flag, NULL, result_values, false, | |
1255 UNKNOWN_LOCATION); | |
1256 if (!r) | |
1257 return; | |
1258 | |
1259 /* Reverse values for easier manipulation. */ | |
1260 result_values.reverse (); | |
1261 | |
1262 read_log_maxskip (result_values, &a.levels[0]); | |
1263 if (!result_values.is_empty ()) | |
1264 read_log_maxskip (result_values, &a.levels[1]); | |
1265 #ifdef SUBALIGN_LOG | |
1266 else | |
1267 { | |
1268 /* N2[:M2] is not specified. This arch has a default for N2. | |
1269 Before -falign-foo=N:M:N2:M2 was introduced, x86 had a tweak. | |
1270 -falign-functions=N with N > 8 was adding secondary alignment. | |
1271 -falign-functions=10 was emitting this before every function: | |
1272 .p2align 4,,9 | |
1273 .p2align 3 | |
1274 Now this behavior (and more) can be explicitly requested: | |
1275 -falign-functions=16:10:8 | |
1276 Retain old behavior if N2 is missing: */ | |
1277 | |
1278 int align = 1 << a.levels[0].log; | |
1279 int subalign = 1 << SUBALIGN_LOG; | |
1280 | |
1281 if (a.levels[0].log > SUBALIGN_LOG | |
1282 && a.levels[0].maxskip >= subalign - 1) | |
1283 { | |
1284 /* Set N2 unless subalign can never have any effect. */ | |
1285 if (align > a.levels[0].maxskip + 1) | |
1286 { | |
1287 a.levels[1].log = SUBALIGN_LOG; | |
1288 a.levels[1].normalize (); | |
1289 } | |
1290 } | |
1291 } | |
1292 #endif | |
1293 | |
1294 /* Cache seen value. */ | |
1295 cache.put (flag, a); | |
1296 } | |
1297 } | |
1298 | |
1299 /* Process -falign-foo=N[:M[:N2[:M2]]] options. */ | |
1300 | |
1301 void | |
1302 parse_alignment_opts (void) | |
1303 { | |
1304 parse_N_M (str_align_loops, align_loops); | |
1305 parse_N_M (str_align_jumps, align_jumps); | |
1306 parse_N_M (str_align_labels, align_labels); | |
1307 parse_N_M (str_align_functions, align_functions); | |
0 | 1308 } |
1309 | |
1310 /* Process the options that have been parsed. */ | |
1311 static void | |
1312 process_options (void) | |
1313 { | |
1314 /* Just in case lang_hooks.post_options ends up calling a debug_hook. | |
1315 This can happen with incorrect pre-processed input. */ | |
1316 debug_hooks = &do_nothing_debug_hooks; | |
1317 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1318 maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1319 |
0 | 1320 /* Allow the front end to perform consistency checks and do further |
1321 initialization based on the command line options. This hook also | |
1322 sets the original filename if appropriate (e.g. foo.i -> foo.c) | |
1323 so we can correctly initialize debug output. */ | |
1324 no_backend = lang_hooks.post_options (&main_input_filename); | |
1325 | |
1326 /* Some machines may reject certain combinations of options. */ | |
111 | 1327 location_t saved_location = input_location; |
1328 input_location = UNKNOWN_LOCATION; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1329 targetm.target_option.override (); |
111 | 1330 input_location = saved_location; |
1331 | |
1332 if (flag_diagnostics_generate_patch) | |
1333 global_dc->edit_context_ptr = new edit_context (); | |
0 | 1334 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1335 /* Avoid any informative notes in the second run of -fcompare-debug. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1336 if (flag_compare_debug) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1337 diagnostic_inhibit_notes (global_dc); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1338 |
0 | 1339 if (flag_section_anchors && !target_supports_section_anchors_p ()) |
1340 { | |
111 | 1341 warning_at (UNKNOWN_LOCATION, OPT_fsection_anchors, |
1342 "this target does not support %qs", | |
1343 "-fsection-anchors"); | |
0 | 1344 flag_section_anchors = 0; |
1345 } | |
1346 | |
1347 if (flag_short_enums == 2) | |
1348 flag_short_enums = targetm.default_short_enums (); | |
1349 | |
1350 /* Set aux_base_name if not already set. */ | |
1351 if (aux_base_name) | |
1352 ; | |
1353 else if (main_input_filename) | |
1354 { | |
1355 char *name = xstrdup (lbasename (main_input_filename)); | |
1356 | |
1357 strip_off_ending (name, strlen (name)); | |
1358 aux_base_name = name; | |
1359 } | |
1360 else | |
1361 aux_base_name = "gccaux"; | |
1362 | |
111 | 1363 #ifndef HAVE_isl |
0 | 1364 if (flag_graphite |
111 | 1365 || flag_loop_nest_optimize |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1366 || flag_graphite_identity |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1367 || flag_loop_parallelize_all) |
111 | 1368 sorry ("Graphite loop optimizations cannot be used (isl is not available) " |
1369 "(-fgraphite, -fgraphite-identity, -floop-nest-optimize, " | |
1370 "-floop-parallelize-all)"); | |
0 | 1371 #endif |
1372 | |
111 | 1373 if (flag_cf_protection != CF_NONE |
1374 && !(flag_cf_protection & CF_SET)) | |
1375 { | |
1376 if (flag_cf_protection == CF_FULL) | |
1377 { | |
1378 error_at (UNKNOWN_LOCATION, | |
1379 "%<-fcf-protection=full%> is not supported for this " | |
1380 "target"); | |
1381 flag_cf_protection = CF_NONE; | |
1382 } | |
1383 if (flag_cf_protection == CF_BRANCH) | |
1384 { | |
1385 error_at (UNKNOWN_LOCATION, | |
1386 "%<-fcf-protection=branch%> is not supported for this " | |
1387 "target"); | |
1388 flag_cf_protection = CF_NONE; | |
1389 } | |
1390 if (flag_cf_protection == CF_RETURN) | |
1391 { | |
1392 error_at (UNKNOWN_LOCATION, | |
1393 "%<-fcf-protection=return%> is not supported for this " | |
1394 "target"); | |
1395 flag_cf_protection = CF_NONE; | |
1396 } | |
1397 } | |
1398 | |
1399 /* One region RA really helps to decrease the code size. */ | |
1400 if (flag_ira_region == IRA_REGION_AUTODETECT) | |
1401 flag_ira_region | |
1402 = optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED; | |
1403 | |
1404 if (!abi_version_at_least (2)) | |
1405 { | |
1406 /* -fabi-version=1 support was removed after GCC 4.9. */ | |
1407 error_at (UNKNOWN_LOCATION, | |
1408 "%<-fabi-version=1%> is no longer supported"); | |
1409 flag_abi_version = 2; | |
1410 } | |
1411 | |
0 | 1412 /* Unrolling all loops implies that standard loop unrolling must also |
1413 be done. */ | |
1414 if (flag_unroll_all_loops) | |
1415 flag_unroll_loops = 1; | |
1416 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1417 /* web and rename-registers help when run after loop unrolling. */ |
0 | 1418 if (flag_web == AUTODETECT_VALUE) |
111 | 1419 flag_web = flag_unroll_loops; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1420 |
0 | 1421 if (flag_rename_registers == AUTODETECT_VALUE) |
111 | 1422 flag_rename_registers = flag_unroll_loops; |
0 | 1423 |
1424 if (flag_non_call_exceptions) | |
1425 flag_asynchronous_unwind_tables = 1; | |
1426 if (flag_asynchronous_unwind_tables) | |
1427 flag_unwind_tables = 1; | |
1428 | |
1429 if (flag_value_profile_transformations) | |
1430 flag_profile_values = 1; | |
1431 | |
1432 /* Warn about options that are not supported on this machine. */ | |
1433 #ifndef INSN_SCHEDULING | |
1434 if (flag_schedule_insns || flag_schedule_insns_after_reload) | |
111 | 1435 warning_at (UNKNOWN_LOCATION, 0, |
1436 "instruction scheduling not supported on this target machine"); | |
0 | 1437 #endif |
111 | 1438 if (!DELAY_SLOTS && flag_delayed_branch) |
1439 warning_at (UNKNOWN_LOCATION, 0, | |
1440 "this target machine does not have delayed branches"); | |
0 | 1441 |
1442 user_label_prefix = USER_LABEL_PREFIX; | |
1443 if (flag_leading_underscore != -1) | |
1444 { | |
1445 /* If the default prefix is more complicated than "" or "_", | |
1446 issue a warning and ignore this option. */ | |
1447 if (user_label_prefix[0] == 0 || | |
1448 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0)) | |
1449 { | |
1450 user_label_prefix = flag_leading_underscore ? "_" : ""; | |
1451 } | |
1452 else | |
111 | 1453 warning_at (UNKNOWN_LOCATION, 0, |
1454 "-f%sleading-underscore not supported on this " | |
1455 "target machine", flag_leading_underscore ? "" : "no-"); | |
0 | 1456 } |
1457 | |
1458 /* If we are in verbose mode, write out the version and maybe all the | |
1459 option flags in use. */ | |
1460 if (version_flag) | |
1461 { | |
111 | 1462 print_version (stderr, "", true); |
0 | 1463 if (! quiet_flag) |
1464 print_switch_values (print_to_stderr); | |
1465 } | |
1466 | |
1467 if (flag_syntax_only) | |
1468 { | |
1469 write_symbols = NO_DEBUG; | |
1470 profile_flag = 0; | |
1471 } | |
1472 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1473 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
|
1474 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1475 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
|
1476 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1477 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
|
1478 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1479 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
|
1480 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
|
1481 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1482 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1483 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
|
1484 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1485 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1486 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
|
1487 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1488 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
|
1489 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
|
1490 { |
111 | 1491 error_at (UNKNOWN_LOCATION, |
1492 "could not open final insn dump file %qs: %m", | |
1493 flag_dump_final_insns); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1494 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
|
1495 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1496 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
|
1497 { |
111 | 1498 error_at (UNKNOWN_LOCATION, |
1499 "could not close zeroed insn dump file %qs: %m", | |
1500 flag_dump_final_insns); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1501 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
|
1502 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1503 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1504 |
0 | 1505 /* A lot of code assumes write_symbols == NO_DEBUG if the debugging |
1506 level is 0. */ | |
1507 if (debug_info_level == DINFO_LEVEL_NONE) | |
1508 write_symbols = NO_DEBUG; | |
1509 | |
1510 if (write_symbols == NO_DEBUG) | |
1511 ; | |
1512 #if defined(DBX_DEBUGGING_INFO) | |
1513 else if (write_symbols == DBX_DEBUG) | |
1514 debug_hooks = &dbx_debug_hooks; | |
1515 #endif | |
1516 #if defined(XCOFF_DEBUGGING_INFO) | |
1517 else if (write_symbols == XCOFF_DEBUG) | |
1518 debug_hooks = &xcoff_debug_hooks; | |
1519 #endif | |
1520 #ifdef DWARF2_DEBUGGING_INFO | |
1521 else if (write_symbols == DWARF2_DEBUG) | |
1522 debug_hooks = &dwarf2_debug_hooks; | |
1523 #endif | |
1524 #ifdef VMS_DEBUGGING_INFO | |
1525 else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG) | |
1526 debug_hooks = &vmsdbg_debug_hooks; | |
1527 #endif | |
111 | 1528 #ifdef DWARF2_LINENO_DEBUGGING_INFO |
1529 else if (write_symbols == DWARF2_DEBUG) | |
1530 debug_hooks = &dwarf2_lineno_debug_hooks; | |
1531 #endif | |
0 | 1532 else |
111 | 1533 error_at (UNKNOWN_LOCATION, |
1534 "target system does not support the %qs debug format", | |
1535 debug_type_names[write_symbols]); | |
0 | 1536 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1537 /* 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
|
1538 and flag_var_tracking_uninit if the user has not specified them. */ |
0 | 1539 if (debug_info_level < DINFO_LEVEL_NORMAL |
1540 || debug_hooks->var_location == do_nothing_debug_hooks.var_location) | |
1541 { | |
1542 if (flag_var_tracking == 1 | |
1543 || flag_var_tracking_uninit == 1) | |
1544 { | |
1545 if (debug_info_level < DINFO_LEVEL_NORMAL) | |
111 | 1546 warning_at (UNKNOWN_LOCATION, 0, |
1547 "variable tracking requested, but useless unless " | |
1548 "producing debug info"); | |
0 | 1549 else |
111 | 1550 warning_at (UNKNOWN_LOCATION, 0, |
1551 "variable tracking requested, but not supported " | |
1552 "by this debug format"); | |
0 | 1553 } |
1554 flag_var_tracking = 0; | |
1555 flag_var_tracking_uninit = 0; | |
1556 } | |
1557 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1558 /* The debug hooks are used to implement -fdump-go-spec because it |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1559 gives a simple and stable API for all the information we need to |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1560 dump. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1561 if (flag_dump_go_spec != NULL) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1562 debug_hooks = dump_go_spec_init (flag_dump_go_spec, debug_hooks); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1563 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1564 /* 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
|
1565 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
|
1566 (We already determined above that variable tracking is feasible.) */ |
111 | 1567 if (flag_var_tracking_uninit == 1) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1568 flag_var_tracking = 1; |
0 | 1569 |
1570 if (flag_var_tracking == AUTODETECT_VALUE) | |
1571 flag_var_tracking = optimize >= 1; | |
1572 | |
111 | 1573 if (flag_var_tracking_uninit == AUTODETECT_VALUE) |
1574 flag_var_tracking_uninit = flag_var_tracking; | |
1575 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1576 if (flag_var_tracking_assignments == AUTODETECT_VALUE) |
131 | 1577 flag_var_tracking_assignments |
1578 = (flag_var_tracking | |
1579 && !(flag_selective_scheduling || flag_selective_scheduling2)); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1580 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1581 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
|
1582 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
|
1583 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1584 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
|
1585 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
|
1586 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1587 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
|
1588 && (flag_selective_scheduling || flag_selective_scheduling2)) |
111 | 1589 warning_at (UNKNOWN_LOCATION, 0, |
1590 "var-tracking-assignments changes selective scheduling"); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1591 |
131 | 1592 if (debug_nonbind_markers_p == AUTODETECT_VALUE) |
1593 debug_nonbind_markers_p | |
1594 = (optimize | |
1595 && debug_info_level >= DINFO_LEVEL_NORMAL | |
1596 && (write_symbols == DWARF2_DEBUG | |
1597 || write_symbols == VMS_AND_DWARF2_DEBUG) | |
1598 && !(flag_selective_scheduling || flag_selective_scheduling2)); | |
1599 | |
1600 if (dwarf2out_as_loc_support == AUTODETECT_VALUE) | |
1601 dwarf2out_as_loc_support | |
1602 = dwarf2out_default_as_loc_support (); | |
1603 if (dwarf2out_as_locview_support == AUTODETECT_VALUE) | |
1604 dwarf2out_as_locview_support | |
1605 = dwarf2out_default_as_locview_support (); | |
1606 | |
1607 if (debug_variable_location_views == AUTODETECT_VALUE) | |
1608 { | |
1609 debug_variable_location_views | |
1610 = (flag_var_tracking | |
1611 && debug_info_level >= DINFO_LEVEL_NORMAL | |
1612 && (write_symbols == DWARF2_DEBUG | |
1613 || write_symbols == VMS_AND_DWARF2_DEBUG) | |
1614 && !dwarf_strict | |
1615 && dwarf2out_as_loc_support | |
1616 && dwarf2out_as_locview_support); | |
1617 } | |
1618 else if (debug_variable_location_views == -1 && dwarf_version != 5) | |
1619 { | |
1620 warning_at (UNKNOWN_LOCATION, 0, | |
1621 "without -gdwarf-5, -gvariable-location-views=incompat5 " | |
1622 "is equivalent to -gvariable-location-views"); | |
1623 debug_variable_location_views = 1; | |
1624 } | |
1625 | |
1626 if (debug_internal_reset_location_views == 2) | |
1627 { | |
1628 debug_internal_reset_location_views | |
1629 = (debug_variable_location_views | |
1630 && targetm.reset_location_view); | |
1631 } | |
1632 else if (debug_internal_reset_location_views | |
1633 && !debug_variable_location_views) | |
1634 { | |
1635 warning_at (UNKNOWN_LOCATION, 0, | |
1636 "-ginternal-reset-location-views is forced disabled " | |
1637 "without -gvariable-location-views"); | |
1638 debug_internal_reset_location_views = 0; | |
1639 } | |
1640 | |
1641 if (debug_inline_points == AUTODETECT_VALUE) | |
1642 debug_inline_points = debug_variable_location_views; | |
1643 else if (debug_inline_points && !debug_nonbind_markers_p) | |
1644 { | |
1645 warning_at (UNKNOWN_LOCATION, 0, | |
1646 "-ginline-points is forced disabled without " | |
1647 "-gstatement-frontiers"); | |
1648 debug_inline_points = 0; | |
1649 } | |
1650 | |
0 | 1651 if (flag_tree_cselim == AUTODETECT_VALUE) |
111 | 1652 { |
1653 if (HAVE_conditional_move) | |
1654 flag_tree_cselim = 1; | |
1655 else | |
1656 flag_tree_cselim = 0; | |
1657 } | |
0 | 1658 |
1659 /* If auxiliary info generation is desired, open the output file. | |
1660 This goes in the same directory as the source file--unlike | |
1661 all the other output files. */ | |
1662 if (flag_gen_aux_info) | |
1663 { | |
1664 aux_info_file = fopen (aux_info_file_name, "w"); | |
1665 if (aux_info_file == 0) | |
111 | 1666 fatal_error (UNKNOWN_LOCATION, |
1667 "can%'t open %s: %m", aux_info_file_name); | |
0 | 1668 } |
1669 | |
111 | 1670 if (!targetm_common.have_named_sections) |
0 | 1671 { |
1672 if (flag_function_sections) | |
1673 { | |
111 | 1674 warning_at (UNKNOWN_LOCATION, 0, |
1675 "-ffunction-sections not supported for this target"); | |
0 | 1676 flag_function_sections = 0; |
1677 } | |
1678 if (flag_data_sections) | |
1679 { | |
111 | 1680 warning_at (UNKNOWN_LOCATION, 0, |
1681 "-fdata-sections not supported for this target"); | |
0 | 1682 flag_data_sections = 0; |
1683 } | |
1684 } | |
1685 | |
111 | 1686 if (flag_prefetch_loop_arrays > 0 && !targetm.code_for_prefetch) |
0 | 1687 { |
111 | 1688 warning_at (UNKNOWN_LOCATION, 0, |
1689 "-fprefetch-loop-arrays not supported for this target"); | |
0 | 1690 flag_prefetch_loop_arrays = 0; |
1691 } | |
111 | 1692 else if (flag_prefetch_loop_arrays > 0 && !targetm.have_prefetch ()) |
0 | 1693 { |
111 | 1694 warning_at (UNKNOWN_LOCATION, 0, |
1695 "-fprefetch-loop-arrays not supported for this target " | |
1696 "(try -march switches)"); | |
0 | 1697 flag_prefetch_loop_arrays = 0; |
1698 } | |
1699 | |
1700 /* This combination of options isn't handled for i386 targets and doesn't | |
1701 make much sense anyway, so don't allow it. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1702 if (flag_prefetch_loop_arrays > 0 && optimize_size) |
0 | 1703 { |
111 | 1704 warning_at (UNKNOWN_LOCATION, 0, |
1705 "-fprefetch-loop-arrays is not supported with -Os"); | |
0 | 1706 flag_prefetch_loop_arrays = 0; |
1707 } | |
1708 | |
1709 /* The presence of IEEE signaling NaNs, implies all math can trap. */ | |
1710 if (flag_signaling_nans) | |
1711 flag_trapping_math = 1; | |
1712 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1713 /* We cannot reassociate if we want traps or signed zeros. */ |
0 | 1714 if (flag_associative_math && (flag_trapping_math || flag_signed_zeros)) |
1715 { | |
111 | 1716 warning_at (UNKNOWN_LOCATION, 0, |
1717 "-fassociative-math disabled; other options take " | |
1718 "precedence"); | |
0 | 1719 flag_associative_math = 0; |
1720 } | |
1721 | |
111 | 1722 /* -fstack-clash-protection is not currently supported on targets |
1723 where the stack grows up. */ | |
1724 if (flag_stack_clash_protection && !STACK_GROWS_DOWNWARD) | |
1725 { | |
1726 warning_at (UNKNOWN_LOCATION, 0, | |
1727 "%<-fstack-clash-protection%> is not supported on targets " | |
1728 "where the stack grows from lower to higher addresses"); | |
1729 flag_stack_clash_protection = 0; | |
1730 } | |
1731 | |
1732 /* We can not support -fstack-check= and -fstack-clash-protection at | |
1733 the same time. */ | |
1734 if (flag_stack_check != NO_STACK_CHECK && flag_stack_clash_protection) | |
1735 { | |
1736 warning_at (UNKNOWN_LOCATION, 0, | |
1737 "%<-fstack-check=%> and %<-fstack-clash_protection%> are " | |
1738 "mutually exclusive. Disabling %<-fstack-check=%>"); | |
1739 flag_stack_check = NO_STACK_CHECK; | |
1740 } | |
1741 | |
0 | 1742 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */ |
1743 if (flag_cx_limited_range) | |
1744 flag_complex_method = 0; | |
1745 | |
1746 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */ | |
1747 if (flag_cx_fortran_rules) | |
1748 flag_complex_method = 1; | |
1749 | |
1750 /* Targets must be able to place spill slots at lower addresses. If the | |
1751 target already uses a soft frame pointer, the transition is trivial. */ | |
1752 if (!FRAME_GROWS_DOWNWARD && flag_stack_protect) | |
1753 { | |
111 | 1754 warning_at (UNKNOWN_LOCATION, 0, |
1755 "-fstack-protector not supported for this target"); | |
0 | 1756 flag_stack_protect = 0; |
1757 } | |
1758 if (!flag_stack_protect) | |
1759 warn_stack_protect = 0; | |
1760 | |
111 | 1761 /* Address Sanitizer needs porting to each target architecture. */ |
1762 | |
1763 if ((flag_sanitize & SANITIZE_ADDRESS) | |
1764 && !FRAME_GROWS_DOWNWARD) | |
0 | 1765 { |
111 | 1766 warning_at (UNKNOWN_LOCATION, 0, |
1767 "-fsanitize=address and -fsanitize=kernel-address " | |
1768 "are not supported for this target"); | |
1769 flag_sanitize &= ~SANITIZE_ADDRESS; | |
1770 } | |
1771 | |
1772 if ((flag_sanitize & SANITIZE_USER_ADDRESS) | |
1773 && targetm.asan_shadow_offset == NULL) | |
1774 { | |
1775 warning_at (UNKNOWN_LOCATION, 0, | |
1776 "-fsanitize=address not supported for this target"); | |
1777 flag_sanitize &= ~SANITIZE_ADDRESS; | |
0 | 1778 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1779 |
111 | 1780 /* Do not use IPA optimizations for register allocation if profiler is active |
1781 or patchable function entries are inserted for run-time instrumentation | |
1782 or port does not emit prologue and epilogue as RTL. */ | |
1783 if (profile_flag || function_entry_patch_area_size | |
1784 || !targetm.have_prologue () || !targetm.have_epilogue ()) | |
1785 flag_ipa_ra = 0; | |
1786 | |
1787 /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error | |
1788 have not been set. */ | |
1789 if (!global_options_set.x_warnings_are_errors | |
1790 && warn_coverage_mismatch | |
1791 && (global_dc->classify_diagnostic[OPT_Wcoverage_mismatch] == | |
1792 DK_UNSPECIFIED)) | |
1793 diagnostic_classify_diagnostic (global_dc, OPT_Wcoverage_mismatch, | |
1794 DK_ERROR, UNKNOWN_LOCATION); | |
1795 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1796 /* Save the current optimization options. */ |
111 | 1797 optimization_default_node = build_optimization_node (&global_options); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1798 optimization_current_node = optimization_default_node; |
111 | 1799 |
1800 /* Please don't change global_options after this point, those changes won't | |
1801 be reflected in optimization_{default,current}_node. */ | |
0 | 1802 } |
1803 | |
1804 /* This function can be called multiple times to reinitialize the compiler | |
1805 back end when register classes or instruction sets have changed, | |
1806 before each function. */ | |
1807 static void | |
1808 backend_init_target (void) | |
1809 { | |
1810 /* This depends on stack_pointer_rtx. */ | |
1811 init_fake_stack_mems (); | |
1812 | |
1813 /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is | |
1814 mode-dependent. */ | |
1815 init_alias_target (); | |
1816 | |
1817 /* Depends on HARD_FRAME_POINTER_REGNUM. */ | |
111 | 1818 if (!ira_use_lra_p) |
1819 init_reload (); | |
1820 | |
1821 /* Depends on the enabled attribute. */ | |
1822 recog_init (); | |
0 | 1823 |
1824 /* The following initialization functions need to generate rtl, so | |
1825 provide a dummy function context for them. */ | |
1826 init_dummy_function_start (); | |
1827 | |
1828 /* rtx_cost is mode-dependent, so cached values need to be recomputed | |
1829 on a mode change. */ | |
1830 init_expmed (); | |
111 | 1831 init_lower_subreg (); |
1832 init_set_costs (); | |
1833 | |
1834 init_expr_target (); | |
1835 ira_init (); | |
0 | 1836 |
1837 /* We may need to recompute regno_save_code[] and regno_restore_code[] | |
1838 after a mode change as well. */ | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1839 caller_save_initialized_p = false; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1840 |
0 | 1841 expand_dummy_function_end (); |
1842 } | |
1843 | |
1844 /* Initialize the compiler back end. This function is called only once, | |
1845 when starting the compiler. */ | |
1846 static void | |
1847 backend_init (void) | |
1848 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1849 init_emit_once (); |
0 | 1850 |
1851 init_rtlanal (); | |
1852 init_inline_once (); | |
1853 init_varasm_once (); | |
1854 save_register_info (); | |
1855 | |
111 | 1856 /* Middle end needs this initialization for default mem attributes |
1857 used by early calls to make_decl_rtl. */ | |
1858 init_emit_regs (); | |
1859 | |
1860 /* Middle end needs this initialization for mode tables used to assign | |
1861 modes to vector variables. */ | |
1862 init_regs (); | |
0 | 1863 } |
1864 | |
111 | 1865 /* Initialize excess precision settings. |
1866 | |
1867 We have no need to modify anything here, just keep track of what the | |
1868 user requested. We'll figure out any appropriate relaxations | |
1869 later. */ | |
1870 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1871 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1872 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
|
1873 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1874 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
|
1875 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
|
1876 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1877 |
0 | 1878 /* Initialize things that are both lang-dependent and target-dependent. |
1879 This function can be called more than once if target parameters change. */ | |
1880 static void | |
1881 lang_dependent_init_target (void) | |
1882 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1883 /* 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
|
1884 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
|
1885 |
0 | 1886 /* This creates various _DECL nodes, so needs to be called after the |
1887 front end is initialized. It also depends on the HAVE_xxx macros | |
1888 generated from the target machine description. */ | |
1889 init_optabs (); | |
1890 | |
111 | 1891 gcc_assert (!this_target_rtl->target_specific_initialized); |
1892 } | |
1893 | |
1894 /* Perform initializations that are lang-dependent or target-dependent. | |
1895 but matters only for late optimizations and RTL generation. */ | |
0 | 1896 |
111 | 1897 static int rtl_initialized; |
1898 | |
1899 void | |
1900 initialize_rtl (void) | |
1901 { | |
1902 auto_timevar tv (g_timer, TV_INITIALIZE_RTL); | |
0 | 1903 |
111 | 1904 /* Initialization done just once per compilation, but delayed |
1905 till code generation. */ | |
1906 if (!rtl_initialized) | |
1907 ira_init_once (); | |
1908 rtl_initialized = true; | |
0 | 1909 |
111 | 1910 /* Target specific RTL backend initialization. */ |
1911 if (!this_target_rtl->target_specific_initialized) | |
1912 { | |
1913 backend_init_target (); | |
1914 this_target_rtl->target_specific_initialized = true; | |
1915 } | |
0 | 1916 } |
1917 | |
1918 /* Language-dependent initialization. Returns nonzero on success. */ | |
1919 static int | |
1920 lang_dependent_init (const char *name) | |
1921 { | |
1922 location_t save_loc = input_location; | |
1923 if (dump_base_name == 0) | |
1924 dump_base_name = name && name[0] ? name : "gccdump"; | |
1925 | |
1926 /* Other front-end initialization. */ | |
1927 input_location = BUILTINS_LOCATION; | |
1928 if (lang_hooks.init () == 0) | |
1929 return 0; | |
1930 input_location = save_loc; | |
1931 | |
111 | 1932 if (!flag_wpa) |
1933 { | |
1934 init_asm_output (name); | |
0 | 1935 |
111 | 1936 /* If stack usage information is desired, open the output file. */ |
1937 if (flag_stack_usage) | |
1938 stack_usage_file = open_auxiliary_file ("su"); | |
1939 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1940 |
0 | 1941 /* This creates various _DECL nodes, so needs to be called after the |
1942 front end is initialized. */ | |
1943 init_eh (); | |
1944 | |
1945 /* Do the target-specific parts of the initialization. */ | |
1946 lang_dependent_init_target (); | |
1947 | |
111 | 1948 if (!flag_wpa) |
1949 { | |
1950 /* If dbx symbol table desired, initialize writing it and output the | |
1951 predefined types. */ | |
1952 timevar_push (TV_SYMOUT); | |
0 | 1953 |
111 | 1954 /* Now we have the correct original filename, we can initialize |
1955 debug output. */ | |
1956 (*debug_hooks->init) (name); | |
0 | 1957 |
111 | 1958 timevar_pop (TV_SYMOUT); |
1959 } | |
0 | 1960 |
1961 return 1; | |
1962 } | |
1963 | |
1964 | |
1965 /* Reinitialize everything when target parameters, such as register usage, | |
1966 have changed. */ | |
1967 void | |
1968 target_reinit (void) | |
1969 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1970 struct rtl_data saved_x_rtl; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1971 rtx *saved_regno_reg_rtx; |
111 | 1972 tree saved_optimization_current_node; |
1973 struct target_optabs *saved_this_fn_optabs; | |
1974 | |
1975 /* Temporarily switch to the default optimization node, so that | |
1976 *this_target_optabs is set to the default, not reflecting | |
1977 whatever a previous function used for the optimize | |
1978 attribute. */ | |
1979 saved_optimization_current_node = optimization_current_node; | |
1980 saved_this_fn_optabs = this_fn_optabs; | |
1981 if (saved_optimization_current_node != optimization_default_node) | |
1982 { | |
1983 optimization_current_node = optimization_default_node; | |
1984 cl_optimization_restore | |
1985 (&global_options, | |
1986 TREE_OPTIMIZATION (optimization_default_node)); | |
1987 } | |
1988 this_fn_optabs = this_target_optabs; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1989 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1990 /* Save *crtl and regno_reg_rtx around the reinitialization |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1991 to allow target_reinit being called even after prepare_function_start. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1992 saved_regno_reg_rtx = regno_reg_rtx; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1993 if (saved_regno_reg_rtx) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1994 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1995 saved_x_rtl = *crtl; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1996 memset (crtl, '\0', sizeof (*crtl)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1997 regno_reg_rtx = NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1998 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1999 |
111 | 2000 this_target_rtl->target_specific_initialized = false; |
2001 | |
2002 /* This initializes hard_frame_pointer, and calls init_reg_modes_target() | |
2003 to initialize reg_raw_mode[]. */ | |
2004 init_emit_regs (); | |
2005 | |
2006 /* This invokes target hooks to set fixed_reg[] etc, which is | |
2007 mode-dependent. */ | |
2008 init_regs (); | |
0 | 2009 |
2010 /* Reinitialize lang-dependent parts. */ | |
2011 lang_dependent_init_target (); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2012 |
111 | 2013 /* Restore the original optimization node. */ |
2014 if (saved_optimization_current_node != optimization_default_node) | |
2015 { | |
2016 optimization_current_node = saved_optimization_current_node; | |
2017 cl_optimization_restore (&global_options, | |
2018 TREE_OPTIMIZATION (optimization_current_node)); | |
2019 } | |
2020 this_fn_optabs = saved_this_fn_optabs; | |
2021 | |
2022 /* Restore regno_reg_rtx at the end, as free_after_compilation from | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2023 expand_dummy_function_end clears it. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2024 if (saved_regno_reg_rtx) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2025 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2026 *crtl = saved_x_rtl; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2027 regno_reg_rtx = saved_regno_reg_rtx; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2028 saved_regno_reg_rtx = NULL; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2029 } |
0 | 2030 } |
2031 | |
2032 void | |
2033 dump_memory_report (bool final) | |
2034 { | |
111 | 2035 dump_line_table_statistics (); |
0 | 2036 ggc_print_statistics (); |
2037 stringpool_statistics (); | |
2038 dump_tree_statistics (); | |
2039 dump_gimple_statistics (); | |
2040 dump_rtx_statistics (); | |
2041 dump_alloc_pool_statistics (); | |
2042 dump_bitmap_statistics (); | |
111 | 2043 dump_hash_table_loc_statistics (); |
0 | 2044 dump_vec_loc_statistics (); |
2045 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
|
2046 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
|
2047 dump_pta_stats (stderr); |
0 | 2048 } |
2049 | |
2050 /* Clean up: close opened files, etc. */ | |
2051 | |
2052 static void | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2053 finalize (bool no_backend) |
0 | 2054 { |
2055 /* Close the dump files. */ | |
2056 if (flag_gen_aux_info) | |
2057 { | |
2058 fclose (aux_info_file); | |
111 | 2059 aux_info_file = NULL; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2060 if (seen_error ()) |
0 | 2061 unlink (aux_info_file_name); |
2062 } | |
2063 | |
2064 /* Close non-debugging input and output files. Take special care to note | |
2065 whether fclose returns an error, since the pages might still be on the | |
2066 buffer chain while the file is open. */ | |
2067 | |
2068 if (asm_out_file) | |
2069 { | |
2070 if (ferror (asm_out_file) != 0) | |
111 | 2071 fatal_error (input_location, "error writing to %s: %m", asm_file_name); |
0 | 2072 if (fclose (asm_out_file) != 0) |
111 | 2073 fatal_error (input_location, "error closing %s: %m", asm_file_name); |
2074 asm_out_file = NULL; | |
0 | 2075 } |
2076 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2077 if (stack_usage_file) |
111 | 2078 { |
2079 fclose (stack_usage_file); | |
2080 stack_usage_file = NULL; | |
2081 } | |
2082 | |
2083 if (seen_error ()) | |
2084 coverage_remove_note_file (); | |
0 | 2085 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2086 if (!no_backend) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2087 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2088 statistics_fini (); |
131 | 2089 debuginfo_fini (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2090 |
111 | 2091 g->get_passes ()->finish_optimization_passes (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2092 |
111 | 2093 lra_finish_once (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2094 } |
0 | 2095 |
2096 if (mem_report) | |
2097 dump_memory_report (true); | |
2098 | |
111 | 2099 if (profile_report) |
2100 dump_profile_report (); | |
2101 | |
0 | 2102 /* Language-specific end of compilation actions. */ |
2103 lang_hooks.finish (); | |
2104 } | |
2105 | |
111 | 2106 static bool |
2107 standard_type_bitsize (int bitsize) | |
2108 { | |
2109 /* As a special exception, we always want __int128 enabled if possible. */ | |
2110 if (bitsize == 128) | |
2111 return false; | |
2112 if (bitsize == CHAR_TYPE_SIZE | |
2113 || bitsize == SHORT_TYPE_SIZE | |
2114 || bitsize == INT_TYPE_SIZE | |
2115 || bitsize == LONG_TYPE_SIZE | |
2116 || bitsize == LONG_LONG_TYPE_SIZE) | |
2117 return true; | |
2118 return false; | |
2119 } | |
2120 | |
0 | 2121 /* Initialize the compiler, and compile the input file. */ |
2122 static void | |
111 | 2123 do_compile () |
0 | 2124 { |
2125 process_options (); | |
2126 | |
2127 /* Don't do any more if an error has already occurred. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2128 if (!seen_error ()) |
0 | 2129 { |
111 | 2130 int i; |
2131 | |
2132 timevar_start (TV_PHASE_SETUP); | |
2133 | |
131 | 2134 optimization_records_start (); |
2135 | |
0 | 2136 /* This must be run always, because it is needed to compute the FP |
2137 predefined macros, such as __LDBL_MAX__, for targets using non | |
2138 default FP formats. */ | |
2139 init_adjust_machine_modes (); | |
111 | 2140 init_derived_machine_modes (); |
2141 | |
2142 /* This must happen after the backend has a chance to process | |
2143 command line options, but before the parsers are | |
2144 initialized. */ | |
2145 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
2146 if (targetm.scalar_mode_supported_p (int_n_data[i].m) | |
2147 && ! standard_type_bitsize (int_n_data[i].bitsize)) | |
2148 int_n_enabled_p[i] = true; | |
2149 else | |
2150 int_n_enabled_p[i] = false; | |
0 | 2151 |
2152 /* Set up the back-end if requested. */ | |
2153 if (!no_backend) | |
2154 backend_init (); | |
2155 | |
2156 /* Language-dependent initialization. Returns true on success. */ | |
2157 if (lang_dependent_init (main_input_filename)) | |
111 | 2158 { |
2159 /* Initialize yet another pass. */ | |
2160 | |
2161 ggc_protect_identifiers = true; | |
2162 | |
2163 symtab->initialize (); | |
2164 init_final (main_input_filename); | |
2165 coverage_init (aux_base_name); | |
2166 statistics_init (); | |
131 | 2167 debuginfo_init (); |
111 | 2168 invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL); |
2169 | |
2170 timevar_stop (TV_PHASE_SETUP); | |
2171 | |
2172 compile_file (); | |
2173 } | |
2174 else | |
2175 { | |
2176 timevar_stop (TV_PHASE_SETUP); | |
2177 } | |
2178 | |
2179 timevar_start (TV_PHASE_FINALIZE); | |
0 | 2180 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2181 finalize (no_backend); |
111 | 2182 |
2183 timevar_stop (TV_PHASE_FINALIZE); | |
0 | 2184 } |
111 | 2185 } |
2186 | |
2187 toplev::toplev (timer *external_timer, | |
2188 bool init_signals) | |
2189 : m_use_TV_TOTAL (external_timer == NULL), | |
2190 m_init_signals (init_signals) | |
2191 { | |
2192 if (external_timer) | |
2193 g_timer = external_timer; | |
2194 } | |
2195 | |
2196 toplev::~toplev () | |
2197 { | |
2198 if (g_timer && m_use_TV_TOTAL) | |
2199 { | |
2200 g_timer->stop (TV_TOTAL); | |
2201 g_timer->print (stderr); | |
2202 delete g_timer; | |
2203 g_timer = NULL; | |
2204 } | |
2205 } | |
2206 | |
2207 /* Potentially call timevar_init (which will create g_timevars if it | |
2208 doesn't already exist). */ | |
0 | 2209 |
111 | 2210 void |
2211 toplev::start_timevars () | |
2212 { | |
2213 if (time_report || !quiet_flag || flag_detailed_statistics) | |
2214 timevar_init (); | |
2215 | |
2216 timevar_start (TV_TOTAL); | |
2217 } | |
2218 | |
2219 /* Handle -fself-test. */ | |
2220 | |
2221 void | |
2222 toplev::run_self_tests () | |
2223 { | |
2224 if (no_backend) | |
2225 { | |
2226 error_at (UNKNOWN_LOCATION, "self-tests incompatible with -E"); | |
2227 return; | |
2228 } | |
2229 #if CHECKING_P | |
2230 /* Reset some state. */ | |
2231 input_location = UNKNOWN_LOCATION; | |
2232 bitmap_obstack_initialize (NULL); | |
2233 | |
2234 /* Run the tests; any failures will lead to an abort of the process. | |
2235 Use "make selftests-gdb" to run under the debugger. */ | |
2236 ::selftest::run_tests (); | |
2237 | |
2238 /* Cleanup. */ | |
2239 bitmap_obstack_release (NULL); | |
2240 #else | |
2241 inform (UNKNOWN_LOCATION, "self-tests are not enabled in this build"); | |
2242 #endif /* #if CHECKING_P */ | |
0 | 2243 } |
2244 | |
2245 /* Entry point of cc1, cc1plus, jc1, f771, etc. | |
2246 Exit code is FATAL_EXIT_CODE if can't open files or if there were | |
2247 any errors, or SUCCESS_EXIT_CODE if compilation succeeded. | |
2248 | |
2249 It is not safe to call this function more than once. */ | |
2250 | |
2251 int | |
111 | 2252 toplev::main (int argc, char **argv) |
0 | 2253 { |
111 | 2254 /* Parsing and gimplification sometimes need quite large stack. |
2255 Increase stack size limits if possible. */ | |
2256 stack_limit_increase (64 * 1024 * 1024); | |
2257 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2258 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
|
2259 |
0 | 2260 /* Initialization of GCC's environment, and diagnostics. */ |
111 | 2261 general_init (argv[0], m_init_signals); |
0 | 2262 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2263 /* One-off initialization of options that does not need to be |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2264 repeated when options are added for particular functions. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2265 init_options_once (); |
111 | 2266 init_opts_obstack (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2267 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2268 /* Initialize global options structures; this must be repeated for |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2269 each structure used for parsing options. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2270 init_options_struct (&global_options, &global_options_set); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2271 lang_hooks.init_options_struct (&global_options); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2272 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2273 /* Convert the options to an array. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2274 decode_cmdline_options_to_array_default_mask (argc, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2275 CONST_CAST2 (const char **, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2276 char **, argv), |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2277 &save_decoded_options, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2278 &save_decoded_options_count); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2279 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2280 /* Perform language-specific options initialization. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2281 lang_hooks.init_options (save_decoded_options_count, save_decoded_options); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2282 |
0 | 2283 /* Parse the options and do minimal processing; basically just |
2284 enough to default flags appropriately. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2285 decode_options (&global_options, &global_options_set, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2286 save_decoded_options, save_decoded_options_count, |
111 | 2287 UNKNOWN_LOCATION, global_dc, |
2288 targetm.target_option.override); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2289 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2290 handle_common_deferred_options (); |
0 | 2291 |
2292 init_local_tick (); | |
2293 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2294 initialize_plugins (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2295 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2296 if (version_flag) |
111 | 2297 print_version (stderr, "", true); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2298 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2299 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
|
2300 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
|
2301 |
0 | 2302 /* Exit early if we can (e.g. -help). */ |
2303 if (!exit_after_options) | |
111 | 2304 { |
2305 if (m_use_TV_TOTAL) | |
2306 start_timevars (); | |
2307 do_compile (); | |
2308 } | |
2309 | |
2310 if (warningcount || errorcount || werrorcount) | |
2311 print_ignored_options (); | |
2312 | |
2313 if (flag_self_test) | |
2314 run_self_tests (); | |
0 | 2315 |
111 | 2316 /* Invoke registered plugin callbacks if any. Some plugins could |
2317 emit some diagnostics here. */ | |
2318 invoke_plugin_callbacks (PLUGIN_FINISH, NULL); | |
2319 | |
2320 if (flag_diagnostics_generate_patch) | |
2321 { | |
2322 gcc_assert (global_dc->edit_context_ptr); | |
2323 | |
2324 pretty_printer pp; | |
2325 pp_show_color (&pp) = pp_show_color (global_dc->printer); | |
2326 global_dc->edit_context_ptr->print_diff (&pp, true); | |
2327 pp_flush (&pp); | |
2328 } | |
2329 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2330 diagnostic_finish (global_dc); |
0 | 2331 |
111 | 2332 finalize_plugins (); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2333 |
111 | 2334 after_memory_report = true; |
2335 | |
2336 if (seen_error () || werrorcount) | |
0 | 2337 return (FATAL_EXIT_CODE); |
2338 | |
2339 return (SUCCESS_EXIT_CODE); | |
2340 } | |
111 | 2341 |
2342 /* For those that want to, this function aims to clean up enough state that | |
2343 you can call toplev::main again. */ | |
2344 void | |
2345 toplev::finalize (void) | |
2346 { | |
2347 rtl_initialized = false; | |
2348 this_target_rtl->target_specific_initialized = false; | |
2349 | |
2350 /* Needs to be called before cgraph_c_finalize since it uses symtab. */ | |
2351 ipa_reference_c_finalize (); | |
131 | 2352 ipa_fnsummary_c_finalize (); |
111 | 2353 |
2354 cgraph_c_finalize (); | |
2355 cgraphunit_c_finalize (); | |
2356 dwarf2out_c_finalize (); | |
2357 gcse_c_finalize (); | |
2358 ipa_cp_c_finalize (); | |
2359 ira_costs_c_finalize (); | |
2360 params_c_finalize (); | |
2361 | |
2362 finalize_options_struct (&global_options); | |
2363 finalize_options_struct (&global_options_set); | |
2364 | |
2365 /* save_decoded_options uses opts_obstack, so these must | |
2366 be cleaned up together. */ | |
2367 obstack_free (&opts_obstack, NULL); | |
2368 XDELETEVEC (save_decoded_options); | |
2369 save_decoded_options = NULL; | |
2370 save_decoded_options_count = 0; | |
2371 | |
2372 /* Clean up the context (and pass_manager etc). */ | |
2373 delete g; | |
2374 g = NULL; | |
2375 | |
2376 } |