Mercurial > hg > CbC > CbC_gcc
annotate gcc/toplev.c @ 127:4c56639505ff
fix function.c and add CbC-example Makefile
author | mir3636 |
---|---|
date | Wed, 11 Apr 2018 18:46:58 +0900 |
parents | 04ced10e8804 |
children | 84e7813d76e9 |
rev | line source |
---|---|
0 | 1 /* Top level of GCC compilers (cc1, cc1plus, etc.) |
111 | 2 Copyright (C) 1987-2017 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 "tree-chkp.h" | |
81 #include "omp-offload.h" | |
82 #include "hsa-common.h" | |
83 #include "edit-context.h" | |
0 | 84 #include "tree-pass.h" |
111 | 85 #include "dumpfile.h" |
0 | 86 |
87 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) | |
88 #include "dbxout.h" | |
89 #endif | |
90 | |
91 #include "sdbout.h" | |
92 | |
93 #ifdef XCOFF_DEBUGGING_INFO | |
111 | 94 #include "xcoffout.h" /* Needed for external data declarations. */ |
0 | 95 #endif |
96 | |
111 | 97 #include "selftest.h" |
98 | |
99 #ifdef HAVE_isl | |
100 #include <isl/version.h> | |
101 #endif | |
102 | |
103 static void general_init (const char *, bool); | |
104 static void do_compile (); | |
0 | 105 static void process_options (void); |
106 static void backend_init (void); | |
107 static int lang_dependent_init (const char *); | |
108 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
|
109 static void finalize (bool); |
0 | 110 |
111 static void crash_signal (int) ATTRIBUTE_NORETURN; | |
112 static void compile_file (void); | |
113 | |
114 /* True if we don't need a backend (e.g. preprocessing only). */ | |
115 static bool no_backend; | |
116 | |
117 /* Length of line when printing switch values. */ | |
118 #define MAX_LINE 75 | |
119 | |
67
f6334be47118
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 /* 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
|
121 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
|
122 unsigned int save_decoded_options_count; |
0 | 123 |
124 /* 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
|
125 to optimize in process_options (). */ |
0 | 126 #define AUTODETECT_VALUE 2 |
127 | |
128 /* Debug hooks - dependent upon command line options. */ | |
129 | |
130 const struct gcc_debug_hooks *debug_hooks; | |
131 | |
132 /* The FUNCTION_DECL for the function currently being compiled, | |
133 or 0 if between functions. */ | |
134 tree current_function_decl; | |
135 | |
136 /* Set to the FUNC_BEGIN label of the current function, or NULL | |
137 if none. */ | |
138 const char * current_function_func_begin_label; | |
139 | |
140 /* A random sequence of characters, unless overridden by user. */ | |
141 static const char *flag_random_seed; | |
142 | |
143 /* A local time stamp derived from the time of compilation. It will be | |
144 zero if the system cannot provide a time. It will be -1u, if the | |
145 user has specified a particular random seed. */ | |
146 unsigned local_tick; | |
147 | |
111 | 148 /* Random number for this compilation */ |
149 HOST_WIDE_INT random_seed; | |
0 | 150 |
111 | 151 /* -f flags. */ |
0 | 152 |
153 /* When non-NULL, indicates that whenever space is allocated on the | |
154 stack, the resulting stack pointer must not pass this | |
155 address---that is, for stacks that grow downward, the stack pointer | |
156 must always be greater than or equal to this address; for stacks | |
157 that grow upward, the stack pointer must be less than this address. | |
158 At present, the rtx may be either a REG or a SYMBOL_REF, although | |
159 the support provided depends on the backend. */ | |
160 rtx stack_limit_rtx; | |
161 | |
67
f6334be47118
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 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
|
163 #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
|
164 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
|
165 #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
|
166 #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
|
167 #endif |
0 | 168 |
169 /* The user symbol prefix after having resolved same. */ | |
170 const char *user_label_prefix; | |
171 | |
172 /* Output files for assembler code (real compiler output) | |
173 and debugging dumps. */ | |
174 | |
175 FILE *asm_out_file; | |
176 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
|
177 FILE *stack_usage_file = NULL; |
0 | 178 |
179 /* The current working directory of a translation. It's generally the | |
180 directory from which compilation was initiated, but a preprocessed | |
181 file may specify the original directory in which it was | |
182 created. */ | |
183 | |
184 static const char *src_pwd; | |
185 | |
186 /* Initialize src_pwd with the given string, and return true. If it | |
187 was already initialized, return false. As a special case, it may | |
188 be called with a NULL argument to test whether src_pwd has NOT been | |
189 initialized yet. */ | |
190 | |
191 bool | |
192 set_src_pwd (const char *pwd) | |
193 { | |
194 if (src_pwd) | |
195 { | |
196 if (strcmp (src_pwd, pwd) == 0) | |
197 return true; | |
198 else | |
199 return false; | |
200 } | |
201 | |
202 src_pwd = xstrdup (pwd); | |
203 return true; | |
204 } | |
205 | |
206 /* Return the directory from which the translation unit was initiated, | |
207 in case set_src_pwd() was not called before to assign it a | |
208 different value. */ | |
209 | |
210 const char * | |
211 get_src_pwd (void) | |
212 { | |
213 if (! src_pwd) | |
214 { | |
215 src_pwd = getpwd (); | |
216 if (!src_pwd) | |
217 src_pwd = "."; | |
218 } | |
219 | |
220 return src_pwd; | |
221 } | |
222 | |
223 /* Called when the start of a function definition is parsed, | |
224 this function prints on stderr the name of the function. */ | |
225 void | |
226 announce_function (tree decl) | |
227 { | |
228 if (!quiet_flag) | |
229 { | |
230 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
|
231 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
|
232 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl)))); |
0 | 233 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
234 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
|
235 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2))); |
0 | 236 fflush (stderr); |
237 pp_needs_newline (global_dc->printer) = true; | |
238 diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL); | |
239 } | |
240 } | |
241 | |
242 /* Initialize local_tick with the time of day, or -1 if | |
243 flag_random_seed is set. */ | |
244 | |
245 static void | |
246 init_local_tick (void) | |
247 { | |
248 if (!flag_random_seed) | |
249 { | |
250 #ifdef HAVE_GETTIMEOFDAY | |
251 { | |
252 struct timeval tv; | |
253 | |
254 gettimeofday (&tv, NULL); | |
111 | 255 local_tick = (unsigned) tv.tv_sec * 1000 + tv.tv_usec / 1000; |
0 | 256 } |
257 #else | |
258 { | |
259 time_t now = time (NULL); | |
260 | |
261 if (now != (time_t)-1) | |
262 local_tick = (unsigned) now; | |
263 } | |
264 #endif | |
265 } | |
266 else | |
267 local_tick = -1; | |
268 } | |
269 | |
111 | 270 /* Obtain the random_seed. Unless NOINIT, initialize it if |
0 | 271 it's not provided in the command line. */ |
272 | |
111 | 273 HOST_WIDE_INT |
0 | 274 get_random_seed (bool noinit) |
275 { | |
111 | 276 if (!random_seed && !noinit) |
277 { | |
278 int fd = open ("/dev/urandom", O_RDONLY); | |
279 if (fd >= 0) | |
280 { | |
281 if (read (fd, &random_seed, sizeof (random_seed)) | |
282 != sizeof (random_seed)) | |
283 random_seed = 0; | |
284 close (fd); | |
285 } | |
286 if (!random_seed) | |
287 random_seed = local_tick ^ getpid (); | |
288 } | |
289 return random_seed; | |
0 | 290 } |
291 | |
111 | 292 /* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */ |
0 | 293 |
111 | 294 void |
0 | 295 set_random_seed (const char *val) |
296 { | |
297 flag_random_seed = val; | |
111 | 298 if (flag_random_seed) |
299 { | |
300 char *endp; | |
301 | |
302 /* When the driver passed in a hex number don't crc it again */ | |
303 random_seed = strtoul (flag_random_seed, &endp, 0); | |
304 if (!(endp > flag_random_seed && *endp == 0)) | |
305 random_seed = crc32_string (0, flag_random_seed); | |
306 } | |
0 | 307 } |
308 | |
309 /* Handler for fatal signals, such as SIGSEGV. These are transformed | |
310 into ICE messages, which is much more user friendly. In case the | |
311 error printer crashes, reset the signal to prevent infinite recursion. */ | |
312 | |
313 static void | |
314 crash_signal (int signo) | |
315 { | |
316 signal (signo, SIG_DFL); | |
317 | |
318 /* If we crashed while processing an ASM statement, then be a little more | |
319 graceful. It's most likely the user's fault. */ | |
320 if (this_is_asm_operands) | |
321 { | |
322 output_operand_lossage ("unrecoverable error"); | |
323 exit (FATAL_EXIT_CODE); | |
324 } | |
325 | |
326 internal_error ("%s", strsignal (signo)); | |
327 } | |
328 | |
329 /* A subroutine of wrapup_global_declarations. We've come to the end of | |
330 the compilation unit. All deferred variables should be undeferred, | |
331 and all incomplete decls should be finalized. */ | |
332 | |
333 void | |
334 wrapup_global_declaration_1 (tree decl) | |
335 { | |
336 /* We're not deferring this any longer. Assignment is conditional to | |
337 avoid needlessly dirtying PCH pages. */ | |
338 if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS) | |
339 && DECL_DEFER_OUTPUT (decl) != 0) | |
340 DECL_DEFER_OUTPUT (decl) = 0; | |
341 | |
111 | 342 if (VAR_P (decl) && DECL_SIZE (decl) == 0) |
0 | 343 lang_hooks.finish_incomplete_decl (decl); |
344 } | |
345 | |
346 /* A subroutine of wrapup_global_declarations. Decide whether or not DECL | |
347 needs to be output. Return true if it is output. */ | |
348 | |
349 bool | |
350 wrapup_global_declaration_2 (tree decl) | |
351 { | |
111 | 352 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl) |
353 || (VAR_P (decl) && DECL_HAS_VALUE_EXPR_P (decl))) | |
0 | 354 return false; |
355 | |
356 /* Don't write out static consts, unless we still need them. | |
357 | |
358 We also keep static consts if not optimizing (for debugging), | |
359 unless the user specified -fno-keep-static-consts. | |
360 ??? They might be better written into the debug information. | |
361 This is possible when using DWARF. | |
362 | |
363 A language processor that wants static constants to be always | |
364 written out (even if it is not used) is responsible for | |
365 calling rest_of_decl_compilation itself. E.g. the C front-end | |
366 calls rest_of_decl_compilation from finish_decl. | |
367 One motivation for this is that is conventional in some | |
368 environments to write things like: | |
369 static const char rcsid[] = "... version string ..."; | |
370 intending to force the string to be in the executable. | |
371 | |
372 A language processor that would prefer to have unneeded | |
373 static constants "optimized away" would just defer writing | |
374 them out until here. E.g. C++ does this, because static | |
375 constants are often defined in header files. | |
376 | |
377 ??? A tempting alternative (for both C and C++) would be | |
378 to force a constant to be written if and only if it is | |
379 defined in a main file, as opposed to an include file. */ | |
380 | |
111 | 381 if (VAR_P (decl) && TREE_STATIC (decl)) |
0 | 382 { |
111 | 383 varpool_node *node; |
0 | 384 bool needed = true; |
111 | 385 node = varpool_node::get (decl); |
0 | 386 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
387 if (!node && flag_ltrans) |
0 | 388 needed = false; |
111 | 389 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
|
390 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
|
391 else if (node && node->alias) |
0 | 392 needed = false; |
111 | 393 else if (!symtab->global_info_ready |
0 | 394 && (TREE_USED (decl) |
395 || TREE_USED (DECL_ASSEMBLER_NAME (decl)))) | |
396 /* needed */; | |
111 | 397 else if (node && node->analyzed) |
0 | 398 /* needed */; |
399 else if (DECL_COMDAT (decl)) | |
400 needed = false; | |
401 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl) | |
402 && (optimize || !flag_keep_static_consts | |
403 || DECL_ARTIFICIAL (decl))) | |
404 needed = false; | |
405 | |
406 if (needed) | |
407 { | |
408 rest_of_decl_compilation (decl, 1, 1); | |
409 return true; | |
410 } | |
411 } | |
412 | |
413 return false; | |
414 } | |
415 | |
416 /* Do any final processing required for the declarations in VEC, of | |
417 which there are LEN. We write out inline functions and variables | |
418 that have been deferred until this point, but which are required. | |
419 Returns nonzero if anything was put out. */ | |
420 | |
421 bool | |
422 wrapup_global_declarations (tree *vec, int len) | |
423 { | |
424 bool reconsider, output_something = false; | |
425 int i; | |
426 | |
427 for (i = 0; i < len; i++) | |
428 wrapup_global_declaration_1 (vec[i]); | |
429 | |
430 /* Now emit any global variables or functions that we have been | |
431 putting off. We need to loop in case one of the things emitted | |
432 here references another one which comes earlier in the list. */ | |
433 do | |
434 { | |
435 reconsider = false; | |
436 for (i = 0; i < len; i++) | |
437 reconsider |= wrapup_global_declaration_2 (vec[i]); | |
438 if (reconsider) | |
439 output_something = true; | |
440 } | |
441 while (reconsider); | |
442 | |
443 return output_something; | |
444 } | |
445 | |
446 /* Compile an entire translation unit. Write a file of assembly | |
447 output and various debugging dumps. */ | |
448 | |
449 static void | |
450 compile_file (void) | |
451 { | |
111 | 452 timevar_start (TV_PHASE_PARSING); |
453 timevar_push (TV_PARSE_GLOBAL); | |
0 | 454 |
111 | 455 /* Parse entire file and generate initial debug information. */ |
456 lang_hooks.parse_file (); | |
0 | 457 |
111 | 458 timevar_pop (TV_PARSE_GLOBAL); |
459 timevar_stop (TV_PHASE_PARSING); | |
0 | 460 |
111 | 461 if (flag_dump_locations) |
462 dump_location_info (stderr); | |
0 | 463 |
464 /* Compilation is now finished except for writing | |
465 what's left of the symbol table output. */ | |
466 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
467 if (flag_syntax_only || flag_wpa) |
0 | 468 return; |
111 | 469 |
470 /* Reset maximum_field_alignment, it can be adjusted by #pragma pack | |
471 and this shouldn't influence any types built by the middle-end | |
472 from now on (like gcov_info_type). */ | |
473 maximum_field_alignment = initial_max_fld_align * BITS_PER_UNIT; | |
0 | 474 |
475 ggc_protect_identifiers = false; | |
476 | |
111 | 477 /* Run the actual compilation process. */ |
478 if (!in_lto_p) | |
479 { | |
480 timevar_start (TV_PHASE_OPT_GEN); | |
481 symtab->finalize_compilation_unit (); | |
482 timevar_stop (TV_PHASE_OPT_GEN); | |
483 } | |
484 | |
485 /* Perform any post compilation-proper parser cleanups and | |
486 processing. This is currently only needed for the C++ parser, | |
487 which can be hopefully cleaned up so this hook is no longer | |
488 necessary. */ | |
489 if (lang_hooks.decls.post_compilation_parsing_cleanups) | |
490 lang_hooks.decls.post_compilation_parsing_cleanups (); | |
0 | 491 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
492 if (seen_error ()) |
0 | 493 return; |
494 | |
111 | 495 timevar_start (TV_PHASE_LATE_ASM); |
0 | 496 |
111 | 497 /* Compilation unit is finalized. When producing non-fat LTO object, we are |
498 basically finished. */ | |
499 if (in_lto_p || !flag_lto || flag_fat_lto_objects) | |
500 { | |
501 /* File-scope initialization for AddressSanitizer. */ | |
502 if (flag_sanitize & SANITIZE_ADDRESS) | |
503 asan_finish_file (); | |
0 | 504 |
111 | 505 if (flag_sanitize & SANITIZE_THREAD) |
506 tsan_finish_file (); | |
507 | |
508 if (flag_check_pointer_bounds) | |
509 chkp_finish_file (); | |
0 | 510 |
111 | 511 omp_finish_file (); |
512 | |
513 hsa_output_brig (); | |
0 | 514 |
111 | 515 output_shared_constant_pool (); |
516 output_object_blocks (); | |
517 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
|
518 |
111 | 519 /* Write out any pending weak symbol declarations. */ |
520 weak_finish (); | |
0 | 521 |
111 | 522 /* This must be at the end before unwind and debug info. |
523 Some target ports emit PIC setup thunks here. */ | |
524 targetm.asm_out.code_end (); | |
525 | |
526 /* Do dbx symbols. */ | |
527 timevar_push (TV_SYMOUT); | |
0 | 528 |
111 | 529 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO |
530 if (dwarf2out_do_frame ()) | |
531 dwarf2out_frame_finish (); | |
532 #endif | |
0 | 533 |
111 | 534 (*debug_hooks->finish) (main_input_filename); |
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. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
961 if (current_function_pushed_stack_size > 0) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
962 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
963 stack_usage += current_function_pushed_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
|
964 stack_usage_kind = 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
|
965 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
966 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
967 /* 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
|
968 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
|
969 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
970 if (current_function_has_unbounded_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
|
971 stack_usage_kind = 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
|
972 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
|
973 stack_usage_kind = 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
|
974 |
f6334be47118
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 /* 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
|
976 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
|
977 } |
f6334be47118
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 |
111 | 979 if (flag_stack_usage) |
980 { | |
981 expanded_location loc | |
982 = expand_location (DECL_SOURCE_LOCATION (current_function_decl)); | |
983 /* We don't want to print the full qualified name because it can be long, | |
984 so we strip the scope prefix, but we may need to deal with the suffix | |
985 created by the compiler. */ | |
986 const char *suffix | |
987 = strchr (IDENTIFIER_POINTER (DECL_NAME (current_function_decl)), '.'); | |
988 const char *name | |
989 = lang_hooks.decl_printable_name (current_function_decl, 2); | |
990 if (suffix) | |
991 { | |
992 const char *dot = strchr (name, '.'); | |
993 while (dot && strcasecmp (dot, suffix) != 0) | |
994 { | |
995 name = dot + 1; | |
996 dot = strchr (name, '.'); | |
997 } | |
998 } | |
999 else | |
1000 { | |
1001 const char *dot = strrchr (name, '.'); | |
1002 if (dot) | |
1003 name = dot + 1; | |
1004 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1005 |
111 | 1006 fprintf (stack_usage_file, |
1007 "%s:%d:%d:%s\t" HOST_WIDE_INT_PRINT_DEC"\t%s\n", | |
1008 lbasename (loc.file), | |
1009 loc.line, | |
1010 loc.column, | |
1011 name, | |
1012 stack_usage, | |
1013 stack_usage_kind_str[stack_usage_kind]); | |
1014 } | |
1015 | |
1016 if (warn_stack_usage >= 0) | |
1017 { | |
1018 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
|
1019 |
111 | 1020 if (stack_usage_kind == DYNAMIC) |
1021 warning_at (loc, OPT_Wstack_usage_, "stack usage might be unbounded"); | |
1022 else if (stack_usage > warn_stack_usage) | |
1023 { | |
1024 if (stack_usage_kind == DYNAMIC_BOUNDED) | |
1025 warning_at (loc, | |
1026 OPT_Wstack_usage_, "stack usage might be %wd bytes", | |
1027 stack_usage); | |
1028 else | |
1029 warning_at (loc, OPT_Wstack_usage_, "stack usage is %wd bytes", | |
1030 stack_usage); | |
1031 } | |
1032 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1033 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1034 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1035 /* 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
|
1036 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
|
1037 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
|
1038 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1039 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
|
1040 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
|
1041 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1042 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
|
1043 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
|
1044 if (!file) |
111 | 1045 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
|
1046 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
|
1047 return file; |
0 | 1048 } |
1049 | |
111 | 1050 /* Alternative diagnostics callback for reentered ICE reporting. */ |
1051 | |
1052 static void | |
1053 internal_error_reentered (diagnostic_context *, const char *, va_list *) | |
1054 { | |
1055 /* Flush the dump file if emergency_dump_function itself caused an ICE. */ | |
1056 if (dump_file) | |
1057 fflush (dump_file); | |
1058 } | |
1059 | |
1060 /* Auxiliary callback for the diagnostics code. */ | |
1061 | |
1062 static void | |
1063 internal_error_function (diagnostic_context *, const char *, va_list *) | |
1064 { | |
1065 global_dc->internal_error = internal_error_reentered; | |
1066 warn_if_plugins (); | |
1067 emergency_dump_function (); | |
1068 } | |
1069 | |
0 | 1070 /* Initialization of the front end environment, before command line |
1071 options are parsed. Signal handlers, internationalization etc. | |
1072 ARGV0 is main's argv[0]. */ | |
1073 static void | |
111 | 1074 general_init (const char *argv0, bool init_signals) |
0 | 1075 { |
1076 const char *p; | |
1077 | |
1078 p = argv0 + strlen (argv0); | |
1079 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1])) | |
1080 --p; | |
1081 progname = p; | |
1082 | |
1083 xmalloc_set_program_name (progname); | |
1084 | |
1085 hex_init (); | |
1086 | |
1087 /* Unlock the stdio streams. */ | |
1088 unlock_std_streams (); | |
1089 | |
1090 gcc_init_libintl (); | |
1091 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1092 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
|
1093 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
|
1094 |
0 | 1095 /* Initialize the diagnostics reporting machinery, so option parsing |
1096 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
|
1097 diagnostic_initialize (global_dc, N_OPTS); |
0 | 1098 /* Set a default printer. Language specific initializations will |
1099 override it later. */ | |
111 | 1100 tree_diagnostics_defaults (global_dc); |
1101 | |
1102 global_dc->show_caret | |
1103 = global_options_init.x_flag_diagnostics_show_caret; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1104 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
|
1105 = global_options_init.x_flag_diagnostics_show_option; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1106 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
|
1107 = global_options_init.x_flag_show_column; |
111 | 1108 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
|
1109 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
|
1110 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
|
1111 global_dc->option_name = option_name; |
0 | 1112 |
111 | 1113 if (init_signals) |
1114 { | |
1115 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ | |
0 | 1116 #ifdef SIGSEGV |
111 | 1117 signal (SIGSEGV, crash_signal); |
0 | 1118 #endif |
1119 #ifdef SIGILL | |
111 | 1120 signal (SIGILL, crash_signal); |
0 | 1121 #endif |
1122 #ifdef SIGBUS | |
111 | 1123 signal (SIGBUS, crash_signal); |
0 | 1124 #endif |
1125 #ifdef SIGABRT | |
111 | 1126 signal (SIGABRT, crash_signal); |
0 | 1127 #endif |
1128 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT) | |
111 | 1129 signal (SIGIOT, crash_signal); |
0 | 1130 #endif |
1131 #ifdef SIGFPE | |
111 | 1132 signal (SIGFPE, crash_signal); |
0 | 1133 #endif |
1134 | |
111 | 1135 /* Other host-specific signal setup. */ |
1136 (*host_hooks.extra_signals)(); | |
1137 } | |
0 | 1138 |
1139 /* Initialize the garbage-collector, string pools and tree type hash | |
1140 table. */ | |
1141 init_ggc (); | |
1142 init_stringpool (); | |
111 | 1143 input_location = UNKNOWN_LOCATION; |
1144 line_table = ggc_alloc<line_maps> (); | |
1145 linemap_init (line_table, BUILTINS_LOCATION); | |
0 | 1146 line_table->reallocator = realloc_for_line_map; |
111 | 1147 line_table->round_alloc_size = ggc_round_alloc_size; |
1148 line_table->default_range_bits = 5; | |
0 | 1149 init_ttree (); |
1150 | |
1151 /* Initialize register usage now so switches may override. */ | |
1152 init_reg_sets (); | |
1153 | |
1154 /* Register the language-independent parameters. */ | |
111 | 1155 global_init_params (); |
1156 | |
1157 /* This must be done after global_init_params but before argument | |
1158 processing. */ | |
1159 init_ggc_heuristics (); | |
1160 | |
1161 /* Create the singleton holder for global state. This creates the | |
1162 dump manager. */ | |
1163 g = new gcc::context (); | |
0 | 1164 |
111 | 1165 /* Allow languages and middle-end to register their dumps before the |
1166 optimization passes. */ | |
1167 g->get_dumps ()->register_dumps (); | |
1168 | |
1169 /* Create the passes. */ | |
1170 g->set_passes (new gcc::pass_manager (g)); | |
1171 | |
1172 symtab = new (ggc_cleared_alloc <symbol_table> ()) symbol_table (); | |
1173 | |
0 | 1174 statistics_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
|
1175 finish_params (); |
0 | 1176 } |
1177 | |
1178 /* Return true if the current target supports -fsection-anchors. */ | |
1179 | |
1180 static bool | |
1181 target_supports_section_anchors_p (void) | |
1182 { | |
1183 if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0) | |
1184 return false; | |
1185 | |
1186 if (targetm.asm_out.output_anchor == NULL) | |
1187 return false; | |
1188 | |
1189 return true; | |
1190 } | |
1191 | |
1192 /* Default the align_* variables to 1 if they're still unset, and | |
1193 set up the align_*_log variables. */ | |
1194 static void | |
1195 init_alignments (void) | |
1196 { | |
1197 if (align_loops <= 0) | |
1198 align_loops = 1; | |
1199 if (align_loops_max_skip > align_loops) | |
1200 align_loops_max_skip = align_loops - 1; | |
1201 align_loops_log = floor_log2 (align_loops * 2 - 1); | |
1202 if (align_jumps <= 0) | |
1203 align_jumps = 1; | |
1204 if (align_jumps_max_skip > align_jumps) | |
1205 align_jumps_max_skip = align_jumps - 1; | |
1206 align_jumps_log = floor_log2 (align_jumps * 2 - 1); | |
1207 if (align_labels <= 0) | |
1208 align_labels = 1; | |
1209 align_labels_log = floor_log2 (align_labels * 2 - 1); | |
1210 if (align_labels_max_skip > align_labels) | |
1211 align_labels_max_skip = align_labels - 1; | |
1212 if (align_functions <= 0) | |
1213 align_functions = 1; | |
1214 align_functions_log = floor_log2 (align_functions * 2 - 1); | |
1215 } | |
1216 | |
1217 /* Process the options that have been parsed. */ | |
1218 static void | |
1219 process_options (void) | |
1220 { | |
1221 /* Just in case lang_hooks.post_options ends up calling a debug_hook. | |
1222 This can happen with incorrect pre-processed input. */ | |
1223 debug_hooks = &do_nothing_debug_hooks; | |
1224 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1225 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
|
1226 |
0 | 1227 /* Allow the front end to perform consistency checks and do further |
1228 initialization based on the command line options. This hook also | |
1229 sets the original filename if appropriate (e.g. foo.i -> foo.c) | |
1230 so we can correctly initialize debug output. */ | |
1231 no_backend = lang_hooks.post_options (&main_input_filename); | |
1232 | |
1233 /* Some machines may reject certain combinations of options. */ | |
111 | 1234 location_t saved_location = input_location; |
1235 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
|
1236 targetm.target_option.override (); |
111 | 1237 input_location = saved_location; |
1238 | |
1239 if (flag_diagnostics_generate_patch) | |
1240 global_dc->edit_context_ptr = new edit_context (); | |
0 | 1241 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1242 /* 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
|
1243 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
|
1244 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
|
1245 |
0 | 1246 if (flag_section_anchors && !target_supports_section_anchors_p ()) |
1247 { | |
111 | 1248 warning_at (UNKNOWN_LOCATION, OPT_fsection_anchors, |
1249 "this target does not support %qs", | |
1250 "-fsection-anchors"); | |
0 | 1251 flag_section_anchors = 0; |
1252 } | |
1253 | |
1254 if (flag_short_enums == 2) | |
1255 flag_short_enums = targetm.default_short_enums (); | |
1256 | |
1257 /* Set aux_base_name if not already set. */ | |
1258 if (aux_base_name) | |
1259 ; | |
1260 else if (main_input_filename) | |
1261 { | |
1262 char *name = xstrdup (lbasename (main_input_filename)); | |
1263 | |
1264 strip_off_ending (name, strlen (name)); | |
1265 aux_base_name = name; | |
1266 } | |
1267 else | |
1268 aux_base_name = "gccaux"; | |
1269 | |
111 | 1270 #ifndef HAVE_isl |
0 | 1271 if (flag_graphite |
111 | 1272 || 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
|
1273 || 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
|
1274 || flag_loop_parallelize_all) |
111 | 1275 sorry ("Graphite loop optimizations cannot be used (isl is not available) " |
1276 "(-fgraphite, -fgraphite-identity, -floop-nest-optimize, " | |
1277 "-floop-parallelize-all)"); | |
0 | 1278 #endif |
1279 | |
111 | 1280 if (flag_cf_protection != CF_NONE |
1281 && !(flag_cf_protection & CF_SET)) | |
1282 { | |
1283 if (flag_cf_protection == CF_FULL) | |
1284 { | |
1285 error_at (UNKNOWN_LOCATION, | |
1286 "%<-fcf-protection=full%> is not supported for this " | |
1287 "target"); | |
1288 flag_cf_protection = CF_NONE; | |
1289 } | |
1290 if (flag_cf_protection == CF_BRANCH) | |
1291 { | |
1292 error_at (UNKNOWN_LOCATION, | |
1293 "%<-fcf-protection=branch%> is not supported for this " | |
1294 "target"); | |
1295 flag_cf_protection = CF_NONE; | |
1296 } | |
1297 if (flag_cf_protection == CF_RETURN) | |
1298 { | |
1299 error_at (UNKNOWN_LOCATION, | |
1300 "%<-fcf-protection=return%> is not supported for this " | |
1301 "target"); | |
1302 flag_cf_protection = CF_NONE; | |
1303 } | |
1304 } | |
1305 | |
1306 if (flag_check_pointer_bounds) | |
1307 { | |
1308 if (targetm.chkp_bound_mode () == VOIDmode) | |
1309 { | |
1310 error_at (UNKNOWN_LOCATION, | |
1311 "%<-fcheck-pointer-bounds%> is not supported for this " | |
1312 "target"); | |
1313 flag_check_pointer_bounds = 0; | |
1314 } | |
1315 | |
1316 if (flag_sanitize & SANITIZE_BOUNDS_STRICT) | |
1317 { | |
1318 error_at (UNKNOWN_LOCATION, | |
1319 "%<-fcheck-pointer-bounds%> is not supported with " | |
1320 "%<-fsanitize=bounds-strict%>"); | |
1321 flag_check_pointer_bounds = 0; | |
1322 } | |
1323 else if (flag_sanitize & SANITIZE_BOUNDS) | |
1324 { | |
1325 error_at (UNKNOWN_LOCATION, | |
1326 "%<-fcheck-pointer-bounds%> is not supported with " | |
1327 "%<-fsanitize=bounds%>"); | |
1328 flag_check_pointer_bounds = 0; | |
1329 } | |
1330 | |
1331 if (flag_sanitize & SANITIZE_ADDRESS) | |
1332 { | |
1333 error_at (UNKNOWN_LOCATION, | |
1334 "%<-fcheck-pointer-bounds%> is not supported with " | |
1335 "Address Sanitizer"); | |
1336 flag_check_pointer_bounds = 0; | |
1337 } | |
1338 | |
1339 if (flag_sanitize & SANITIZE_THREAD) | |
1340 { | |
1341 error_at (UNKNOWN_LOCATION, | |
1342 "%<-fcheck-pointer-bounds%> is not supported with " | |
1343 "Thread Sanitizer"); | |
1344 | |
1345 flag_check_pointer_bounds = 0; | |
1346 } | |
1347 } | |
1348 | |
1349 /* One region RA really helps to decrease the code size. */ | |
1350 if (flag_ira_region == IRA_REGION_AUTODETECT) | |
1351 flag_ira_region | |
1352 = optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED; | |
1353 | |
1354 if (!abi_version_at_least (2)) | |
1355 { | |
1356 /* -fabi-version=1 support was removed after GCC 4.9. */ | |
1357 error_at (UNKNOWN_LOCATION, | |
1358 "%<-fabi-version=1%> is no longer supported"); | |
1359 flag_abi_version = 2; | |
1360 } | |
1361 | |
0 | 1362 /* Unrolling all loops implies that standard loop unrolling must also |
1363 be done. */ | |
1364 if (flag_unroll_all_loops) | |
1365 flag_unroll_loops = 1; | |
1366 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1367 /* web and rename-registers help when run after loop unrolling. */ |
0 | 1368 if (flag_web == AUTODETECT_VALUE) |
111 | 1369 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
|
1370 |
0 | 1371 if (flag_rename_registers == AUTODETECT_VALUE) |
111 | 1372 flag_rename_registers = flag_unroll_loops; |
0 | 1373 |
1374 if (flag_non_call_exceptions) | |
1375 flag_asynchronous_unwind_tables = 1; | |
1376 if (flag_asynchronous_unwind_tables) | |
1377 flag_unwind_tables = 1; | |
1378 | |
1379 if (flag_value_profile_transformations) | |
1380 flag_profile_values = 1; | |
1381 | |
1382 /* Warn about options that are not supported on this machine. */ | |
1383 #ifndef INSN_SCHEDULING | |
1384 if (flag_schedule_insns || flag_schedule_insns_after_reload) | |
111 | 1385 warning_at (UNKNOWN_LOCATION, 0, |
1386 "instruction scheduling not supported on this target machine"); | |
0 | 1387 #endif |
111 | 1388 if (!DELAY_SLOTS && flag_delayed_branch) |
1389 warning_at (UNKNOWN_LOCATION, 0, | |
1390 "this target machine does not have delayed branches"); | |
0 | 1391 |
1392 user_label_prefix = USER_LABEL_PREFIX; | |
1393 if (flag_leading_underscore != -1) | |
1394 { | |
1395 /* If the default prefix is more complicated than "" or "_", | |
1396 issue a warning and ignore this option. */ | |
1397 if (user_label_prefix[0] == 0 || | |
1398 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0)) | |
1399 { | |
1400 user_label_prefix = flag_leading_underscore ? "_" : ""; | |
1401 } | |
1402 else | |
111 | 1403 warning_at (UNKNOWN_LOCATION, 0, |
1404 "-f%sleading-underscore not supported on this " | |
1405 "target machine", flag_leading_underscore ? "" : "no-"); | |
0 | 1406 } |
1407 | |
1408 /* If we are in verbose mode, write out the version and maybe all the | |
1409 option flags in use. */ | |
1410 if (version_flag) | |
1411 { | |
111 | 1412 print_version (stderr, "", true); |
0 | 1413 if (! quiet_flag) |
1414 print_switch_values (print_to_stderr); | |
1415 } | |
1416 | |
1417 if (flag_syntax_only) | |
1418 { | |
1419 write_symbols = NO_DEBUG; | |
1420 profile_flag = 0; | |
1421 } | |
1422 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1423 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
|
1424 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1425 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
|
1426 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1427 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
|
1428 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1429 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
|
1430 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
|
1431 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1432 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1433 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
|
1434 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1435 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1436 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
|
1437 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1438 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
|
1439 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
|
1440 { |
111 | 1441 error_at (UNKNOWN_LOCATION, |
1442 "could not open final insn dump file %qs: %m", | |
1443 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
|
1444 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
|
1445 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1446 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
|
1447 { |
111 | 1448 error_at (UNKNOWN_LOCATION, |
1449 "could not close zeroed insn dump file %qs: %m", | |
1450 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
|
1451 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
|
1452 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1453 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1454 |
0 | 1455 /* A lot of code assumes write_symbols == NO_DEBUG if the debugging |
1456 level is 0. */ | |
1457 if (debug_info_level == DINFO_LEVEL_NONE) | |
1458 write_symbols = NO_DEBUG; | |
1459 | |
1460 if (write_symbols == NO_DEBUG) | |
1461 ; | |
1462 #if defined(DBX_DEBUGGING_INFO) | |
1463 else if (write_symbols == DBX_DEBUG) | |
1464 debug_hooks = &dbx_debug_hooks; | |
1465 #endif | |
1466 #if defined(XCOFF_DEBUGGING_INFO) | |
1467 else if (write_symbols == XCOFF_DEBUG) | |
1468 debug_hooks = &xcoff_debug_hooks; | |
1469 #endif | |
111 | 1470 else if (SDB_DEBUGGING_INFO && write_symbols == SDB_DEBUG) |
0 | 1471 debug_hooks = &sdb_debug_hooks; |
1472 #ifdef DWARF2_DEBUGGING_INFO | |
1473 else if (write_symbols == DWARF2_DEBUG) | |
1474 debug_hooks = &dwarf2_debug_hooks; | |
1475 #endif | |
1476 #ifdef VMS_DEBUGGING_INFO | |
1477 else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG) | |
1478 debug_hooks = &vmsdbg_debug_hooks; | |
1479 #endif | |
111 | 1480 #ifdef DWARF2_LINENO_DEBUGGING_INFO |
1481 else if (write_symbols == DWARF2_DEBUG) | |
1482 debug_hooks = &dwarf2_lineno_debug_hooks; | |
1483 #endif | |
0 | 1484 else |
111 | 1485 error_at (UNKNOWN_LOCATION, |
1486 "target system does not support the %qs debug format", | |
1487 debug_type_names[write_symbols]); | |
0 | 1488 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1489 /* 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
|
1490 and flag_var_tracking_uninit if the user has not specified them. */ |
0 | 1491 if (debug_info_level < DINFO_LEVEL_NORMAL |
1492 || debug_hooks->var_location == do_nothing_debug_hooks.var_location) | |
1493 { | |
1494 if (flag_var_tracking == 1 | |
1495 || flag_var_tracking_uninit == 1) | |
1496 { | |
1497 if (debug_info_level < DINFO_LEVEL_NORMAL) | |
111 | 1498 warning_at (UNKNOWN_LOCATION, 0, |
1499 "variable tracking requested, but useless unless " | |
1500 "producing debug info"); | |
0 | 1501 else |
111 | 1502 warning_at (UNKNOWN_LOCATION, 0, |
1503 "variable tracking requested, but not supported " | |
1504 "by this debug format"); | |
0 | 1505 } |
1506 flag_var_tracking = 0; | |
1507 flag_var_tracking_uninit = 0; | |
1508 } | |
1509 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1510 /* 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
|
1511 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
|
1512 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
|
1513 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
|
1514 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
|
1515 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1516 /* 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
|
1517 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
|
1518 (We already determined above that variable tracking is feasible.) */ |
111 | 1519 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
|
1520 flag_var_tracking = 1; |
0 | 1521 |
1522 if (flag_var_tracking == AUTODETECT_VALUE) | |
1523 flag_var_tracking = optimize >= 1; | |
1524 | |
111 | 1525 if (flag_var_tracking_uninit == AUTODETECT_VALUE) |
1526 flag_var_tracking_uninit = flag_var_tracking; | |
1527 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1528 if (flag_var_tracking_assignments == AUTODETECT_VALUE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1529 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
|
1530 && !(flag_selective_scheduling || flag_selective_scheduling2); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1531 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1532 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
|
1533 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
|
1534 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1535 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
|
1536 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
|
1537 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1538 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
|
1539 && (flag_selective_scheduling || flag_selective_scheduling2)) |
111 | 1540 warning_at (UNKNOWN_LOCATION, 0, |
1541 "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
|
1542 |
0 | 1543 if (flag_tree_cselim == AUTODETECT_VALUE) |
111 | 1544 { |
1545 if (HAVE_conditional_move) | |
1546 flag_tree_cselim = 1; | |
1547 else | |
1548 flag_tree_cselim = 0; | |
1549 } | |
0 | 1550 |
1551 /* If auxiliary info generation is desired, open the output file. | |
1552 This goes in the same directory as the source file--unlike | |
1553 all the other output files. */ | |
1554 if (flag_gen_aux_info) | |
1555 { | |
1556 aux_info_file = fopen (aux_info_file_name, "w"); | |
1557 if (aux_info_file == 0) | |
111 | 1558 fatal_error (UNKNOWN_LOCATION, |
1559 "can%'t open %s: %m", aux_info_file_name); | |
0 | 1560 } |
1561 | |
111 | 1562 if (!targetm_common.have_named_sections) |
0 | 1563 { |
1564 if (flag_function_sections) | |
1565 { | |
111 | 1566 warning_at (UNKNOWN_LOCATION, 0, |
1567 "-ffunction-sections not supported for this target"); | |
0 | 1568 flag_function_sections = 0; |
1569 } | |
1570 if (flag_data_sections) | |
1571 { | |
111 | 1572 warning_at (UNKNOWN_LOCATION, 0, |
1573 "-fdata-sections not supported for this target"); | |
0 | 1574 flag_data_sections = 0; |
1575 } | |
1576 } | |
1577 | |
111 | 1578 if (flag_prefetch_loop_arrays > 0 && !targetm.code_for_prefetch) |
0 | 1579 { |
111 | 1580 warning_at (UNKNOWN_LOCATION, 0, |
1581 "-fprefetch-loop-arrays not supported for this target"); | |
0 | 1582 flag_prefetch_loop_arrays = 0; |
1583 } | |
111 | 1584 else if (flag_prefetch_loop_arrays > 0 && !targetm.have_prefetch ()) |
0 | 1585 { |
111 | 1586 warning_at (UNKNOWN_LOCATION, 0, |
1587 "-fprefetch-loop-arrays not supported for this target " | |
1588 "(try -march switches)"); | |
0 | 1589 flag_prefetch_loop_arrays = 0; |
1590 } | |
1591 | |
1592 /* This combination of options isn't handled for i386 targets and doesn't | |
1593 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
|
1594 if (flag_prefetch_loop_arrays > 0 && optimize_size) |
0 | 1595 { |
111 | 1596 warning_at (UNKNOWN_LOCATION, 0, |
1597 "-fprefetch-loop-arrays is not supported with -Os"); | |
0 | 1598 flag_prefetch_loop_arrays = 0; |
1599 } | |
1600 | |
1601 /* The presence of IEEE signaling NaNs, implies all math can trap. */ | |
1602 if (flag_signaling_nans) | |
1603 flag_trapping_math = 1; | |
1604 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1605 /* We cannot reassociate if we want traps or signed zeros. */ |
0 | 1606 if (flag_associative_math && (flag_trapping_math || flag_signed_zeros)) |
1607 { | |
111 | 1608 warning_at (UNKNOWN_LOCATION, 0, |
1609 "-fassociative-math disabled; other options take " | |
1610 "precedence"); | |
0 | 1611 flag_associative_math = 0; |
1612 } | |
1613 | |
111 | 1614 /* -fstack-clash-protection is not currently supported on targets |
1615 where the stack grows up. */ | |
1616 if (flag_stack_clash_protection && !STACK_GROWS_DOWNWARD) | |
1617 { | |
1618 warning_at (UNKNOWN_LOCATION, 0, | |
1619 "%<-fstack-clash-protection%> is not supported on targets " | |
1620 "where the stack grows from lower to higher addresses"); | |
1621 flag_stack_clash_protection = 0; | |
1622 } | |
1623 | |
1624 /* We can not support -fstack-check= and -fstack-clash-protection at | |
1625 the same time. */ | |
1626 if (flag_stack_check != NO_STACK_CHECK && flag_stack_clash_protection) | |
1627 { | |
1628 warning_at (UNKNOWN_LOCATION, 0, | |
1629 "%<-fstack-check=%> and %<-fstack-clash_protection%> are " | |
1630 "mutually exclusive. Disabling %<-fstack-check=%>"); | |
1631 flag_stack_check = NO_STACK_CHECK; | |
1632 } | |
1633 | |
0 | 1634 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */ |
1635 if (flag_cx_limited_range) | |
1636 flag_complex_method = 0; | |
1637 | |
1638 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */ | |
1639 if (flag_cx_fortran_rules) | |
1640 flag_complex_method = 1; | |
1641 | |
1642 /* Targets must be able to place spill slots at lower addresses. If the | |
1643 target already uses a soft frame pointer, the transition is trivial. */ | |
1644 if (!FRAME_GROWS_DOWNWARD && flag_stack_protect) | |
1645 { | |
111 | 1646 warning_at (UNKNOWN_LOCATION, 0, |
1647 "-fstack-protector not supported for this target"); | |
0 | 1648 flag_stack_protect = 0; |
1649 } | |
1650 if (!flag_stack_protect) | |
1651 warn_stack_protect = 0; | |
1652 | |
111 | 1653 /* Address Sanitizer needs porting to each target architecture. */ |
1654 | |
1655 if ((flag_sanitize & SANITIZE_ADDRESS) | |
1656 && !FRAME_GROWS_DOWNWARD) | |
0 | 1657 { |
111 | 1658 warning_at (UNKNOWN_LOCATION, 0, |
1659 "-fsanitize=address and -fsanitize=kernel-address " | |
1660 "are not supported for this target"); | |
1661 flag_sanitize &= ~SANITIZE_ADDRESS; | |
1662 } | |
1663 | |
1664 if ((flag_sanitize & SANITIZE_USER_ADDRESS) | |
1665 && targetm.asan_shadow_offset == NULL) | |
1666 { | |
1667 warning_at (UNKNOWN_LOCATION, 0, | |
1668 "-fsanitize=address not supported for this target"); | |
1669 flag_sanitize &= ~SANITIZE_ADDRESS; | |
0 | 1670 } |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1671 |
111 | 1672 /* Do not use IPA optimizations for register allocation if profiler is active |
1673 or patchable function entries are inserted for run-time instrumentation | |
1674 or port does not emit prologue and epilogue as RTL. */ | |
1675 if (profile_flag || function_entry_patch_area_size | |
1676 || !targetm.have_prologue () || !targetm.have_epilogue ()) | |
1677 flag_ipa_ra = 0; | |
1678 | |
1679 /* Enable -Werror=coverage-mismatch when -Werror and -Wno-error | |
1680 have not been set. */ | |
1681 if (!global_options_set.x_warnings_are_errors | |
1682 && warn_coverage_mismatch | |
1683 && (global_dc->classify_diagnostic[OPT_Wcoverage_mismatch] == | |
1684 DK_UNSPECIFIED)) | |
1685 diagnostic_classify_diagnostic (global_dc, OPT_Wcoverage_mismatch, | |
1686 DK_ERROR, UNKNOWN_LOCATION); | |
1687 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1688 /* Save the current optimization options. */ |
111 | 1689 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
|
1690 optimization_current_node = optimization_default_node; |
111 | 1691 |
1692 /* Please don't change global_options after this point, those changes won't | |
1693 be reflected in optimization_{default,current}_node. */ | |
0 | 1694 } |
1695 | |
1696 /* This function can be called multiple times to reinitialize the compiler | |
1697 back end when register classes or instruction sets have changed, | |
1698 before each function. */ | |
1699 static void | |
1700 backend_init_target (void) | |
1701 { | |
1702 /* Initialize alignment variables. */ | |
1703 init_alignments (); | |
1704 | |
1705 /* This depends on stack_pointer_rtx. */ | |
1706 init_fake_stack_mems (); | |
1707 | |
1708 /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is | |
1709 mode-dependent. */ | |
1710 init_alias_target (); | |
1711 | |
1712 /* Depends on HARD_FRAME_POINTER_REGNUM. */ | |
111 | 1713 if (!ira_use_lra_p) |
1714 init_reload (); | |
1715 | |
1716 /* Depends on the enabled attribute. */ | |
1717 recog_init (); | |
0 | 1718 |
1719 /* The following initialization functions need to generate rtl, so | |
1720 provide a dummy function context for them. */ | |
1721 init_dummy_function_start (); | |
1722 | |
1723 /* rtx_cost is mode-dependent, so cached values need to be recomputed | |
1724 on a mode change. */ | |
1725 init_expmed (); | |
111 | 1726 init_lower_subreg (); |
1727 init_set_costs (); | |
1728 | |
1729 init_expr_target (); | |
1730 ira_init (); | |
0 | 1731 |
1732 /* We may need to recompute regno_save_code[] and regno_restore_code[] | |
1733 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
|
1734 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
|
1735 |
0 | 1736 expand_dummy_function_end (); |
1737 } | |
1738 | |
1739 /* Initialize the compiler back end. This function is called only once, | |
1740 when starting the compiler. */ | |
1741 static void | |
1742 backend_init (void) | |
1743 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1744 init_emit_once (); |
0 | 1745 |
1746 init_rtlanal (); | |
1747 init_inline_once (); | |
1748 init_varasm_once (); | |
1749 save_register_info (); | |
1750 | |
111 | 1751 /* Middle end needs this initialization for default mem attributes |
1752 used by early calls to make_decl_rtl. */ | |
1753 init_emit_regs (); | |
1754 | |
1755 /* Middle end needs this initialization for mode tables used to assign | |
1756 modes to vector variables. */ | |
1757 init_regs (); | |
0 | 1758 } |
1759 | |
111 | 1760 /* Initialize excess precision settings. |
1761 | |
1762 We have no need to modify anything here, just keep track of what the | |
1763 user requested. We'll figure out any appropriate relaxations | |
1764 later. */ | |
1765 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1766 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1767 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
|
1768 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1769 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
|
1770 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
|
1771 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1772 |
0 | 1773 /* Initialize things that are both lang-dependent and target-dependent. |
1774 This function can be called more than once if target parameters change. */ | |
1775 static void | |
1776 lang_dependent_init_target (void) | |
1777 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1778 /* 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
|
1779 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
|
1780 |
0 | 1781 /* This creates various _DECL nodes, so needs to be called after the |
1782 front end is initialized. It also depends on the HAVE_xxx macros | |
1783 generated from the target machine description. */ | |
1784 init_optabs (); | |
1785 | |
111 | 1786 gcc_assert (!this_target_rtl->target_specific_initialized); |
1787 } | |
1788 | |
1789 /* Perform initializations that are lang-dependent or target-dependent. | |
1790 but matters only for late optimizations and RTL generation. */ | |
0 | 1791 |
111 | 1792 static int rtl_initialized; |
1793 | |
1794 void | |
1795 initialize_rtl (void) | |
1796 { | |
1797 auto_timevar tv (g_timer, TV_INITIALIZE_RTL); | |
0 | 1798 |
111 | 1799 /* Initialization done just once per compilation, but delayed |
1800 till code generation. */ | |
1801 if (!rtl_initialized) | |
1802 ira_init_once (); | |
1803 rtl_initialized = true; | |
0 | 1804 |
111 | 1805 /* Target specific RTL backend initialization. */ |
1806 if (!this_target_rtl->target_specific_initialized) | |
1807 { | |
1808 backend_init_target (); | |
1809 this_target_rtl->target_specific_initialized = true; | |
1810 } | |
0 | 1811 } |
1812 | |
1813 /* Language-dependent initialization. Returns nonzero on success. */ | |
1814 static int | |
1815 lang_dependent_init (const char *name) | |
1816 { | |
1817 location_t save_loc = input_location; | |
1818 if (dump_base_name == 0) | |
1819 dump_base_name = name && name[0] ? name : "gccdump"; | |
1820 | |
1821 /* Other front-end initialization. */ | |
1822 input_location = BUILTINS_LOCATION; | |
1823 if (lang_hooks.init () == 0) | |
1824 return 0; | |
1825 input_location = save_loc; | |
1826 | |
111 | 1827 if (!flag_wpa) |
1828 { | |
1829 init_asm_output (name); | |
0 | 1830 |
111 | 1831 /* If stack usage information is desired, open the output file. */ |
1832 if (flag_stack_usage) | |
1833 stack_usage_file = open_auxiliary_file ("su"); | |
1834 } | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1835 |
0 | 1836 /* This creates various _DECL nodes, so needs to be called after the |
1837 front end is initialized. */ | |
1838 init_eh (); | |
1839 | |
1840 /* Do the target-specific parts of the initialization. */ | |
1841 lang_dependent_init_target (); | |
1842 | |
111 | 1843 if (!flag_wpa) |
1844 { | |
1845 /* If dbx symbol table desired, initialize writing it and output the | |
1846 predefined types. */ | |
1847 timevar_push (TV_SYMOUT); | |
0 | 1848 |
111 | 1849 /* Now we have the correct original filename, we can initialize |
1850 debug output. */ | |
1851 (*debug_hooks->init) (name); | |
0 | 1852 |
111 | 1853 timevar_pop (TV_SYMOUT); |
1854 } | |
0 | 1855 |
1856 return 1; | |
1857 } | |
1858 | |
1859 | |
1860 /* Reinitialize everything when target parameters, such as register usage, | |
1861 have changed. */ | |
1862 void | |
1863 target_reinit (void) | |
1864 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1865 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
|
1866 rtx *saved_regno_reg_rtx; |
111 | 1867 tree saved_optimization_current_node; |
1868 struct target_optabs *saved_this_fn_optabs; | |
1869 | |
1870 /* Temporarily switch to the default optimization node, so that | |
1871 *this_target_optabs is set to the default, not reflecting | |
1872 whatever a previous function used for the optimize | |
1873 attribute. */ | |
1874 saved_optimization_current_node = optimization_current_node; | |
1875 saved_this_fn_optabs = this_fn_optabs; | |
1876 if (saved_optimization_current_node != optimization_default_node) | |
1877 { | |
1878 optimization_current_node = optimization_default_node; | |
1879 cl_optimization_restore | |
1880 (&global_options, | |
1881 TREE_OPTIMIZATION (optimization_default_node)); | |
1882 } | |
1883 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
|
1884 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1885 /* 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
|
1886 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
|
1887 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
|
1888 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
|
1889 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1890 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
|
1891 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
|
1892 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
|
1893 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1894 |
111 | 1895 this_target_rtl->target_specific_initialized = false; |
1896 | |
1897 /* This initializes hard_frame_pointer, and calls init_reg_modes_target() | |
1898 to initialize reg_raw_mode[]. */ | |
1899 init_emit_regs (); | |
1900 | |
1901 /* This invokes target hooks to set fixed_reg[] etc, which is | |
1902 mode-dependent. */ | |
1903 init_regs (); | |
0 | 1904 |
1905 /* Reinitialize lang-dependent parts. */ | |
1906 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
|
1907 |
111 | 1908 /* Restore the original optimization node. */ |
1909 if (saved_optimization_current_node != optimization_default_node) | |
1910 { | |
1911 optimization_current_node = saved_optimization_current_node; | |
1912 cl_optimization_restore (&global_options, | |
1913 TREE_OPTIMIZATION (optimization_current_node)); | |
1914 } | |
1915 this_fn_optabs = saved_this_fn_optabs; | |
1916 | |
1917 /* 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
|
1918 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
|
1919 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
|
1920 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1921 *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
|
1922 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
|
1923 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
|
1924 } |
0 | 1925 } |
1926 | |
1927 void | |
1928 dump_memory_report (bool final) | |
1929 { | |
111 | 1930 dump_line_table_statistics (); |
0 | 1931 ggc_print_statistics (); |
1932 stringpool_statistics (); | |
1933 dump_tree_statistics (); | |
1934 dump_gimple_statistics (); | |
1935 dump_rtx_statistics (); | |
1936 dump_alloc_pool_statistics (); | |
1937 dump_bitmap_statistics (); | |
111 | 1938 dump_hash_table_loc_statistics (); |
0 | 1939 dump_vec_loc_statistics (); |
1940 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
|
1941 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
|
1942 dump_pta_stats (stderr); |
0 | 1943 } |
1944 | |
1945 /* Clean up: close opened files, etc. */ | |
1946 | |
1947 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
|
1948 finalize (bool no_backend) |
0 | 1949 { |
1950 /* Close the dump files. */ | |
1951 if (flag_gen_aux_info) | |
1952 { | |
1953 fclose (aux_info_file); | |
111 | 1954 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
|
1955 if (seen_error ()) |
0 | 1956 unlink (aux_info_file_name); |
1957 } | |
1958 | |
1959 /* Close non-debugging input and output files. Take special care to note | |
1960 whether fclose returns an error, since the pages might still be on the | |
1961 buffer chain while the file is open. */ | |
1962 | |
1963 if (asm_out_file) | |
1964 { | |
1965 if (ferror (asm_out_file) != 0) | |
111 | 1966 fatal_error (input_location, "error writing to %s: %m", asm_file_name); |
0 | 1967 if (fclose (asm_out_file) != 0) |
111 | 1968 fatal_error (input_location, "error closing %s: %m", asm_file_name); |
1969 asm_out_file = NULL; | |
0 | 1970 } |
1971 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1972 if (stack_usage_file) |
111 | 1973 { |
1974 fclose (stack_usage_file); | |
1975 stack_usage_file = NULL; | |
1976 } | |
1977 | |
1978 if (seen_error ()) | |
1979 coverage_remove_note_file (); | |
0 | 1980 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1981 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
|
1982 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1983 statistics_fini (); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1984 |
111 | 1985 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
|
1986 |
111 | 1987 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
|
1988 } |
0 | 1989 |
1990 if (mem_report) | |
1991 dump_memory_report (true); | |
1992 | |
111 | 1993 if (profile_report) |
1994 dump_profile_report (); | |
1995 | |
0 | 1996 /* Language-specific end of compilation actions. */ |
1997 lang_hooks.finish (); | |
1998 } | |
1999 | |
111 | 2000 static bool |
2001 standard_type_bitsize (int bitsize) | |
2002 { | |
2003 /* As a special exception, we always want __int128 enabled if possible. */ | |
2004 if (bitsize == 128) | |
2005 return false; | |
2006 if (bitsize == CHAR_TYPE_SIZE | |
2007 || bitsize == SHORT_TYPE_SIZE | |
2008 || bitsize == INT_TYPE_SIZE | |
2009 || bitsize == LONG_TYPE_SIZE | |
2010 || bitsize == LONG_LONG_TYPE_SIZE) | |
2011 return true; | |
2012 return false; | |
2013 } | |
2014 | |
0 | 2015 /* Initialize the compiler, and compile the input file. */ |
2016 static void | |
111 | 2017 do_compile () |
0 | 2018 { |
2019 process_options (); | |
2020 | |
2021 /* 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
|
2022 if (!seen_error ()) |
0 | 2023 { |
111 | 2024 int i; |
2025 | |
2026 timevar_start (TV_PHASE_SETUP); | |
2027 | |
0 | 2028 /* This must be run always, because it is needed to compute the FP |
2029 predefined macros, such as __LDBL_MAX__, for targets using non | |
2030 default FP formats. */ | |
2031 init_adjust_machine_modes (); | |
111 | 2032 init_derived_machine_modes (); |
2033 | |
2034 /* This must happen after the backend has a chance to process | |
2035 command line options, but before the parsers are | |
2036 initialized. */ | |
2037 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
2038 if (targetm.scalar_mode_supported_p (int_n_data[i].m) | |
2039 && ! standard_type_bitsize (int_n_data[i].bitsize)) | |
2040 int_n_enabled_p[i] = true; | |
2041 else | |
2042 int_n_enabled_p[i] = false; | |
0 | 2043 |
2044 /* Set up the back-end if requested. */ | |
2045 if (!no_backend) | |
2046 backend_init (); | |
2047 | |
2048 /* Language-dependent initialization. Returns true on success. */ | |
2049 if (lang_dependent_init (main_input_filename)) | |
111 | 2050 { |
2051 /* Initialize yet another pass. */ | |
2052 | |
2053 ggc_protect_identifiers = true; | |
2054 | |
2055 symtab->initialize (); | |
2056 init_final (main_input_filename); | |
2057 coverage_init (aux_base_name); | |
2058 statistics_init (); | |
2059 invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL); | |
2060 | |
2061 timevar_stop (TV_PHASE_SETUP); | |
2062 | |
2063 compile_file (); | |
2064 } | |
2065 else | |
2066 { | |
2067 timevar_stop (TV_PHASE_SETUP); | |
2068 } | |
2069 | |
2070 timevar_start (TV_PHASE_FINALIZE); | |
0 | 2071 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2072 finalize (no_backend); |
111 | 2073 |
2074 timevar_stop (TV_PHASE_FINALIZE); | |
0 | 2075 } |
111 | 2076 } |
2077 | |
2078 toplev::toplev (timer *external_timer, | |
2079 bool init_signals) | |
2080 : m_use_TV_TOTAL (external_timer == NULL), | |
2081 m_init_signals (init_signals) | |
2082 { | |
2083 if (external_timer) | |
2084 g_timer = external_timer; | |
2085 } | |
2086 | |
2087 toplev::~toplev () | |
2088 { | |
2089 if (g_timer && m_use_TV_TOTAL) | |
2090 { | |
2091 g_timer->stop (TV_TOTAL); | |
2092 g_timer->print (stderr); | |
2093 delete g_timer; | |
2094 g_timer = NULL; | |
2095 } | |
2096 } | |
2097 | |
2098 /* Potentially call timevar_init (which will create g_timevars if it | |
2099 doesn't already exist). */ | |
0 | 2100 |
111 | 2101 void |
2102 toplev::start_timevars () | |
2103 { | |
2104 if (time_report || !quiet_flag || flag_detailed_statistics) | |
2105 timevar_init (); | |
2106 | |
2107 timevar_start (TV_TOTAL); | |
2108 } | |
2109 | |
2110 /* Handle -fself-test. */ | |
2111 | |
2112 void | |
2113 toplev::run_self_tests () | |
2114 { | |
2115 if (no_backend) | |
2116 { | |
2117 error_at (UNKNOWN_LOCATION, "self-tests incompatible with -E"); | |
2118 return; | |
2119 } | |
2120 #if CHECKING_P | |
2121 /* Reset some state. */ | |
2122 input_location = UNKNOWN_LOCATION; | |
2123 bitmap_obstack_initialize (NULL); | |
2124 | |
2125 /* Run the tests; any failures will lead to an abort of the process. | |
2126 Use "make selftests-gdb" to run under the debugger. */ | |
2127 ::selftest::run_tests (); | |
2128 | |
2129 /* Cleanup. */ | |
2130 bitmap_obstack_release (NULL); | |
2131 #else | |
2132 inform (UNKNOWN_LOCATION, "self-tests are not enabled in this build"); | |
2133 #endif /* #if CHECKING_P */ | |
0 | 2134 } |
2135 | |
2136 /* Entry point of cc1, cc1plus, jc1, f771, etc. | |
2137 Exit code is FATAL_EXIT_CODE if can't open files or if there were | |
2138 any errors, or SUCCESS_EXIT_CODE if compilation succeeded. | |
2139 | |
2140 It is not safe to call this function more than once. */ | |
2141 | |
2142 int | |
111 | 2143 toplev::main (int argc, char **argv) |
0 | 2144 { |
111 | 2145 /* Parsing and gimplification sometimes need quite large stack. |
2146 Increase stack size limits if possible. */ | |
2147 stack_limit_increase (64 * 1024 * 1024); | |
2148 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2149 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
|
2150 |
0 | 2151 /* Initialization of GCC's environment, and diagnostics. */ |
111 | 2152 general_init (argv[0], m_init_signals); |
0 | 2153 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2154 /* 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
|
2155 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
|
2156 init_options_once (); |
111 | 2157 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
|
2158 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2159 /* 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
|
2160 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
|
2161 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
|
2162 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
|
2163 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2164 /* 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
|
2165 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
|
2166 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
|
2167 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
|
2168 &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
|
2169 &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
|
2170 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2171 /* 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
|
2172 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
|
2173 |
0 | 2174 /* Parse the options and do minimal processing; basically just |
2175 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
|
2176 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
|
2177 save_decoded_options, save_decoded_options_count, |
111 | 2178 UNKNOWN_LOCATION, global_dc, |
2179 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
|
2180 |
f6334be47118
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 handle_common_deferred_options (); |
0 | 2182 |
2183 init_local_tick (); | |
2184 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2185 initialize_plugins (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2186 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2187 if (version_flag) |
111 | 2188 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
|
2189 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
2190 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
|
2191 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
|
2192 |
0 | 2193 /* Exit early if we can (e.g. -help). */ |
2194 if (!exit_after_options) | |
111 | 2195 { |
2196 if (m_use_TV_TOTAL) | |
2197 start_timevars (); | |
2198 do_compile (); | |
2199 } | |
2200 | |
2201 if (warningcount || errorcount || werrorcount) | |
2202 print_ignored_options (); | |
2203 | |
2204 if (flag_self_test) | |
2205 run_self_tests (); | |
0 | 2206 |
111 | 2207 /* Invoke registered plugin callbacks if any. Some plugins could |
2208 emit some diagnostics here. */ | |
2209 invoke_plugin_callbacks (PLUGIN_FINISH, NULL); | |
2210 | |
2211 if (flag_diagnostics_generate_patch) | |
2212 { | |
2213 gcc_assert (global_dc->edit_context_ptr); | |
2214 | |
2215 pretty_printer pp; | |
2216 pp_show_color (&pp) = pp_show_color (global_dc->printer); | |
2217 global_dc->edit_context_ptr->print_diff (&pp, true); | |
2218 pp_flush (&pp); | |
2219 } | |
2220 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2221 diagnostic_finish (global_dc); |
0 | 2222 |
111 | 2223 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
|
2224 |
111 | 2225 after_memory_report = true; |
2226 | |
2227 if (seen_error () || werrorcount) | |
0 | 2228 return (FATAL_EXIT_CODE); |
2229 | |
2230 return (SUCCESS_EXIT_CODE); | |
2231 } | |
111 | 2232 |
2233 /* For those that want to, this function aims to clean up enough state that | |
2234 you can call toplev::main again. */ | |
2235 void | |
2236 toplev::finalize (void) | |
2237 { | |
2238 rtl_initialized = false; | |
2239 this_target_rtl->target_specific_initialized = false; | |
2240 | |
2241 /* Needs to be called before cgraph_c_finalize since it uses symtab. */ | |
2242 ipa_reference_c_finalize (); | |
2243 | |
2244 cgraph_c_finalize (); | |
2245 cgraphunit_c_finalize (); | |
2246 dwarf2out_c_finalize (); | |
2247 gcse_c_finalize (); | |
2248 ipa_cp_c_finalize (); | |
2249 ira_costs_c_finalize (); | |
2250 params_c_finalize (); | |
2251 | |
2252 finalize_options_struct (&global_options); | |
2253 finalize_options_struct (&global_options_set); | |
2254 | |
2255 /* save_decoded_options uses opts_obstack, so these must | |
2256 be cleaned up together. */ | |
2257 obstack_free (&opts_obstack, NULL); | |
2258 XDELETEVEC (save_decoded_options); | |
2259 save_decoded_options = NULL; | |
2260 save_decoded_options_count = 0; | |
2261 | |
2262 /* Clean up the context (and pass_manager etc). */ | |
2263 delete g; | |
2264 g = NULL; | |
2265 | |
2266 } |