Mercurial > hg > CbC > CbC_gcc
annotate gcc/toplev.c @ 88:f214c1d5b862
merge 89
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 20 Dec 2011 18:53:46 +0900 |
parents | f6334be47118 |
children | 04ced10e8804 |
rev | line source |
---|---|
0 | 1 /* Top level of GCC compilers (cc1, cc1plus, etc.) |
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
4 2011 Free Software Foundation, Inc. |
0 | 5 |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 /* This is the top level of cc1/c++. | |
23 It parses command args, opens files, invokes the various passes | |
24 in the proper order, and counts the time used by each. | |
25 Error messages and low-level interface to malloc also handled here. */ | |
26 | |
27 #include "config.h" | |
28 #include "system.h" | |
29 #include "coretypes.h" | |
30 #include "tm.h" | |
31 #include "line-map.h" | |
32 #include "input.h" | |
33 #include "tree.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
|
34 #include "realmpfr.h" /* For GMP/MPFR/MPC versions, in print_version. */ |
0 | 35 #include "version.h" |
36 #include "rtl.h" | |
37 #include "tm_p.h" | |
38 #include "flags.h" | |
39 #include "insn-attr.h" | |
40 #include "insn-config.h" | |
41 #include "insn-flags.h" | |
42 #include "hard-reg-set.h" | |
43 #include "recog.h" | |
44 #include "output.h" | |
45 #include "except.h" | |
46 #include "function.h" | |
47 #include "toplev.h" | |
48 #include "expr.h" | |
49 #include "basic-block.h" | |
50 #include "intl.h" | |
51 #include "ggc.h" | |
52 #include "graph.h" | |
53 #include "regs.h" | |
54 #include "timevar.h" | |
55 #include "diagnostic.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
|
56 #include "tree-diagnostic.h" |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
57 #include "tree-pretty-print.h" |
0 | 58 #include "params.h" |
59 #include "reload.h" | |
60 #include "ira.h" | |
61 #include "dwarf2asm.h" | |
62 #include "integrate.h" | |
63 #include "debug.h" | |
64 #include "target.h" | |
65 #include "langhooks.h" | |
66 #include "cfglayout.h" | |
67 #include "cfgloop.h" | |
68 #include "hosthooks.h" | |
69 #include "cgraph.h" | |
70 #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
|
71 #include "opts-diagnostic.h" |
0 | 72 #include "coverage.h" |
73 #include "value-prof.h" | |
74 #include "alloc-pool.h" | |
75 #include "tree-mudflap.h" | |
76 #include "tree-pass.h" | |
77 #include "gimple.h" | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
78 #include "tree-ssa-alias.h" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
79 #include "plugin.h" |
0 | 80 |
81 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) | |
82 #include "dwarf2out.h" | |
83 #endif | |
84 | |
85 #if defined(DBX_DEBUGGING_INFO) || defined(XCOFF_DEBUGGING_INFO) | |
86 #include "dbxout.h" | |
87 #endif | |
88 | |
89 #ifdef SDB_DEBUGGING_INFO | |
90 #include "sdbout.h" | |
91 #endif | |
92 | |
93 #ifdef XCOFF_DEBUGGING_INFO | |
94 #include "xcoffout.h" /* Needed for external data | |
95 declarations for e.g. AIX 4.x. */ | |
96 #endif | |
97 | |
98 static void general_init (const char *); | |
99 static void do_compile (void); | |
100 static void process_options (void); | |
101 static void backend_init (void); | |
102 static int lang_dependent_init (const char *); | |
103 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
|
104 static void finalize (bool); |
0 | 105 |
106 static void crash_signal (int) ATTRIBUTE_NORETURN; | |
107 static void compile_file (void); | |
108 | |
109 /* True if we don't need a backend (e.g. preprocessing only). */ | |
110 static bool no_backend; | |
111 | |
112 /* Length of line when printing switch values. */ | |
113 #define MAX_LINE 75 | |
114 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
115 /* 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
|
116 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
|
117 unsigned int save_decoded_options_count; |
0 | 118 |
119 /* 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
|
120 to optimize in process_options (). */ |
0 | 121 #define AUTODETECT_VALUE 2 |
122 | |
123 /* Debug hooks - dependent upon command line options. */ | |
124 | |
125 const struct gcc_debug_hooks *debug_hooks; | |
126 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
127 /* True if this is the lto front end. This is used to disable |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
128 gimple generation and lowering passes that are normally run on the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
129 output of a front end. These passes must be bypassed for lto since |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
130 they have already been done before the gimple was written. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
131 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
132 bool in_lto_p = false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
133 |
0 | 134 /* The FUNCTION_DECL for the function currently being compiled, |
135 or 0 if between functions. */ | |
136 tree current_function_decl; | |
137 | |
138 /* Set to the FUNC_BEGIN label of the current function, or NULL | |
139 if none. */ | |
140 const char * current_function_func_begin_label; | |
141 | |
142 /* A random sequence of characters, unless overridden by user. */ | |
143 static const char *flag_random_seed; | |
144 | |
145 /* A local time stamp derived from the time of compilation. It will be | |
146 zero if the system cannot provide a time. It will be -1u, if the | |
147 user has specified a particular random seed. */ | |
148 unsigned local_tick; | |
149 | |
150 /* -f flags. */ | |
151 | |
152 /* Generate code for GNU or NeXT Objective-C runtime environment. */ | |
153 | |
154 #ifdef NEXT_OBJC_RUNTIME | |
155 int flag_next_runtime = 1; | |
156 #else | |
157 int flag_next_runtime = 0; | |
158 #endif | |
159 | |
160 /* Nonzero means make permerror produce warnings instead of errors. */ | |
161 | |
162 int flag_permissive = 0; | |
163 | |
164 /* When non-NULL, indicates that whenever space is allocated on the | |
165 stack, the resulting stack pointer must not pass this | |
166 address---that is, for stacks that grow downward, the stack pointer | |
167 must always be greater than or equal to this address; for stacks | |
168 that grow upward, the stack pointer must be less than this address. | |
169 At present, the rtx may be either a REG or a SYMBOL_REF, although | |
170 the support provided depends on the backend. */ | |
171 rtx stack_limit_rtx; | |
172 | |
173 /* True if the user has tagged the function with the 'section' | |
174 attribute. */ | |
175 | |
176 bool user_defined_section_attribute = false; | |
177 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
178 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
|
179 #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
|
180 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
|
181 #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
|
182 #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
|
183 #endif |
0 | 184 |
185 typedef struct | |
186 { | |
187 const char *const string; | |
188 int *const variable; | |
189 const int on_value; | |
190 } | |
191 lang_independent_options; | |
192 | |
193 /* The user symbol prefix after having resolved same. */ | |
194 const char *user_label_prefix; | |
195 | |
196 static const param_info lang_independent_params[] = { | |
197 #define DEFPARAM(ENUM, OPTION, HELP, DEFAULT, MIN, MAX) \ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
198 { OPTION, DEFAULT, MIN, MAX, HELP }, |
0 | 199 #include "params.def" |
200 #undef DEFPARAM | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
201 { NULL, 0, 0, 0, NULL } |
0 | 202 }; |
203 | |
204 /* Output files for assembler code (real compiler output) | |
205 and debugging dumps. */ | |
206 | |
207 FILE *asm_out_file; | |
208 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
|
209 FILE *stack_usage_file = NULL; |
0 | 210 FILE *dump_file = NULL; |
211 const char *dump_file_name; | |
212 | |
213 /* The current working directory of a translation. It's generally the | |
214 directory from which compilation was initiated, but a preprocessed | |
215 file may specify the original directory in which it was | |
216 created. */ | |
217 | |
218 static const char *src_pwd; | |
219 | |
220 /* Initialize src_pwd with the given string, and return true. If it | |
221 was already initialized, return false. As a special case, it may | |
222 be called with a NULL argument to test whether src_pwd has NOT been | |
223 initialized yet. */ | |
224 | |
225 bool | |
226 set_src_pwd (const char *pwd) | |
227 { | |
228 if (src_pwd) | |
229 { | |
230 if (strcmp (src_pwd, pwd) == 0) | |
231 return true; | |
232 else | |
233 return false; | |
234 } | |
235 | |
236 src_pwd = xstrdup (pwd); | |
237 return true; | |
238 } | |
239 | |
240 /* Return the directory from which the translation unit was initiated, | |
241 in case set_src_pwd() was not called before to assign it a | |
242 different value. */ | |
243 | |
244 const char * | |
245 get_src_pwd (void) | |
246 { | |
247 if (! src_pwd) | |
248 { | |
249 src_pwd = getpwd (); | |
250 if (!src_pwd) | |
251 src_pwd = "."; | |
252 } | |
253 | |
254 return src_pwd; | |
255 } | |
256 | |
257 /* Called when the start of a function definition is parsed, | |
258 this function prints on stderr the name of the function. */ | |
259 void | |
260 announce_function (tree decl) | |
261 { | |
262 if (!quiet_flag) | |
263 { | |
264 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
|
265 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
|
266 identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (decl)))); |
0 | 267 else |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
268 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
|
269 identifier_to_locale (lang_hooks.decl_printable_name (decl, 2))); |
0 | 270 fflush (stderr); |
271 pp_needs_newline (global_dc->printer) = true; | |
272 diagnostic_set_last_function (global_dc, (diagnostic_info *) NULL); | |
273 } | |
274 } | |
275 | |
276 /* Initialize local_tick with the time of day, or -1 if | |
277 flag_random_seed is set. */ | |
278 | |
279 static void | |
280 init_local_tick (void) | |
281 { | |
282 if (!flag_random_seed) | |
283 { | |
284 /* Get some more or less random data. */ | |
285 #ifdef HAVE_GETTIMEOFDAY | |
286 { | |
287 struct timeval tv; | |
288 | |
289 gettimeofday (&tv, NULL); | |
290 local_tick = tv.tv_sec * 1000 + tv.tv_usec / 1000; | |
291 } | |
292 #else | |
293 { | |
294 time_t now = time (NULL); | |
295 | |
296 if (now != (time_t)-1) | |
297 local_tick = (unsigned) now; | |
298 } | |
299 #endif | |
300 } | |
301 else | |
302 local_tick = -1; | |
303 } | |
304 | |
305 /* Set up a default flag_random_seed and local_tick, unless the user | |
306 already specified one. Must be called after init_local_tick. */ | |
307 | |
308 static void | |
309 init_random_seed (void) | |
310 { | |
311 unsigned HOST_WIDE_INT value; | |
312 static char random_seed[HOST_BITS_PER_WIDE_INT / 4 + 3]; | |
313 | |
314 value = local_tick ^ getpid (); | |
315 | |
316 sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value); | |
317 flag_random_seed = random_seed; | |
318 } | |
319 | |
320 /* Obtain the random_seed string. Unless NOINIT, initialize it if | |
321 it's not provided in the command line. */ | |
322 | |
323 const char * | |
324 get_random_seed (bool noinit) | |
325 { | |
326 if (!flag_random_seed && !noinit) | |
327 init_random_seed (); | |
328 return flag_random_seed; | |
329 } | |
330 | |
331 /* Modify the random_seed string to VAL. Return its previous | |
332 value. */ | |
333 | |
334 const char * | |
335 set_random_seed (const char *val) | |
336 { | |
337 const char *old = flag_random_seed; | |
338 flag_random_seed = val; | |
339 return old; | |
340 } | |
341 | |
342 /* Handler for fatal signals, such as SIGSEGV. These are transformed | |
343 into ICE messages, which is much more user friendly. In case the | |
344 error printer crashes, reset the signal to prevent infinite recursion. */ | |
345 | |
346 static void | |
347 crash_signal (int signo) | |
348 { | |
349 signal (signo, SIG_DFL); | |
350 | |
351 /* If we crashed while processing an ASM statement, then be a little more | |
352 graceful. It's most likely the user's fault. */ | |
353 if (this_is_asm_operands) | |
354 { | |
355 output_operand_lossage ("unrecoverable error"); | |
356 exit (FATAL_EXIT_CODE); | |
357 } | |
358 | |
359 internal_error ("%s", strsignal (signo)); | |
360 } | |
361 | |
362 /* A subroutine of wrapup_global_declarations. We've come to the end of | |
363 the compilation unit. All deferred variables should be undeferred, | |
364 and all incomplete decls should be finalized. */ | |
365 | |
366 void | |
367 wrapup_global_declaration_1 (tree decl) | |
368 { | |
369 /* We're not deferring this any longer. Assignment is conditional to | |
370 avoid needlessly dirtying PCH pages. */ | |
371 if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS) | |
372 && DECL_DEFER_OUTPUT (decl) != 0) | |
373 DECL_DEFER_OUTPUT (decl) = 0; | |
374 | |
375 if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0) | |
376 lang_hooks.finish_incomplete_decl (decl); | |
377 } | |
378 | |
379 /* A subroutine of wrapup_global_declarations. Decide whether or not DECL | |
380 needs to be output. Return true if it is output. */ | |
381 | |
382 bool | |
383 wrapup_global_declaration_2 (tree decl) | |
384 { | |
385 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl)) | |
386 return false; | |
387 | |
388 /* Don't write out static consts, unless we still need them. | |
389 | |
390 We also keep static consts if not optimizing (for debugging), | |
391 unless the user specified -fno-keep-static-consts. | |
392 ??? They might be better written into the debug information. | |
393 This is possible when using DWARF. | |
394 | |
395 A language processor that wants static constants to be always | |
396 written out (even if it is not used) is responsible for | |
397 calling rest_of_decl_compilation itself. E.g. the C front-end | |
398 calls rest_of_decl_compilation from finish_decl. | |
399 One motivation for this is that is conventional in some | |
400 environments to write things like: | |
401 static const char rcsid[] = "... version string ..."; | |
402 intending to force the string to be in the executable. | |
403 | |
404 A language processor that would prefer to have unneeded | |
405 static constants "optimized away" would just defer writing | |
406 them out until here. E.g. C++ does this, because static | |
407 constants are often defined in header files. | |
408 | |
409 ??? A tempting alternative (for both C and C++) would be | |
410 to force a constant to be written if and only if it is | |
411 defined in a main file, as opposed to an include file. */ | |
412 | |
413 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)) | |
414 { | |
415 struct varpool_node *node; | |
416 bool needed = true; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
417 node = varpool_get_node (decl); |
0 | 418 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
419 if (!node && flag_ltrans) |
0 | 420 needed = false; |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
421 else if (node && node->finalized) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
422 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
|
423 else if (node && node->alias) |
0 | 424 needed = false; |
425 else if (!cgraph_global_info_ready | |
426 && (TREE_USED (decl) | |
427 || TREE_USED (DECL_ASSEMBLER_NAME (decl)))) | |
428 /* needed */; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
429 else if (node && node->needed) |
0 | 430 /* needed */; |
431 else if (DECL_COMDAT (decl)) | |
432 needed = false; | |
433 else if (TREE_READONLY (decl) && !TREE_PUBLIC (decl) | |
434 && (optimize || !flag_keep_static_consts | |
435 || DECL_ARTIFICIAL (decl))) | |
436 needed = false; | |
437 | |
438 if (needed) | |
439 { | |
440 rest_of_decl_compilation (decl, 1, 1); | |
441 return true; | |
442 } | |
443 } | |
444 | |
445 return false; | |
446 } | |
447 | |
448 /* Do any final processing required for the declarations in VEC, of | |
449 which there are LEN. We write out inline functions and variables | |
450 that have been deferred until this point, but which are required. | |
451 Returns nonzero if anything was put out. */ | |
452 | |
453 bool | |
454 wrapup_global_declarations (tree *vec, int len) | |
455 { | |
456 bool reconsider, output_something = false; | |
457 int i; | |
458 | |
459 for (i = 0; i < len; i++) | |
460 wrapup_global_declaration_1 (vec[i]); | |
461 | |
462 /* Now emit any global variables or functions that we have been | |
463 putting off. We need to loop in case one of the things emitted | |
464 here references another one which comes earlier in the list. */ | |
465 do | |
466 { | |
467 reconsider = false; | |
468 for (i = 0; i < len; i++) | |
469 reconsider |= wrapup_global_declaration_2 (vec[i]); | |
470 if (reconsider) | |
471 output_something = true; | |
472 } | |
473 while (reconsider); | |
474 | |
475 return output_something; | |
476 } | |
477 | |
478 /* A subroutine of check_global_declarations. Issue appropriate warnings | |
479 for the global declaration DECL. */ | |
480 | |
481 void | |
482 check_global_declaration_1 (tree decl) | |
483 { | |
484 /* Warn about any function declared static but not defined. We don't | |
485 warn about variables, because many programs have static variables | |
486 that exist only to get some text into the object file. */ | |
487 if (TREE_CODE (decl) == FUNCTION_DECL | |
488 && DECL_INITIAL (decl) == 0 | |
489 && DECL_EXTERNAL (decl) | |
490 && ! DECL_ARTIFICIAL (decl) | |
491 && ! TREE_NO_WARNING (decl) | |
492 && ! TREE_PUBLIC (decl) | |
493 && (warn_unused_function | |
494 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))) | |
495 { | |
496 if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))) | |
497 pedwarn (input_location, 0, "%q+F used but never defined", decl); | |
498 else | |
499 warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl); | |
500 /* This symbol is effectively an "extern" declaration now. */ | |
501 TREE_PUBLIC (decl) = 1; | |
502 assemble_external (decl); | |
503 } | |
504 | |
505 /* Warn about static fns or vars defined but not used. */ | |
506 if (((warn_unused_function && TREE_CODE (decl) == FUNCTION_DECL) | |
507 /* We don't warn about "static const" variables because the | |
508 "rcs_id" idiom uses that construction. */ | |
509 || (warn_unused_variable | |
510 && TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl))) | |
511 && ! DECL_IN_SYSTEM_HEADER (decl) | |
512 && ! TREE_USED (decl) | |
513 /* The TREE_USED bit for file-scope decls is kept in the identifier, | |
514 to handle multiple external decls in different scopes. */ | |
515 && ! (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl))) | |
516 && ! DECL_EXTERNAL (decl) | |
517 && ! TREE_PUBLIC (decl) | |
518 /* A volatile variable might be used in some non-obvious way. */ | |
519 && ! TREE_THIS_VOLATILE (decl) | |
520 /* Global register variables must be declared to reserve them. */ | |
521 && ! (TREE_CODE (decl) == VAR_DECL && DECL_REGISTER (decl)) | |
522 /* Otherwise, ask the language. */ | |
523 && lang_hooks.decls.warn_unused_global (decl)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
524 warning ((TREE_CODE (decl) == FUNCTION_DECL) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
525 ? OPT_Wunused_function |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
526 : OPT_Wunused_variable, |
0 | 527 "%q+D defined but not used", decl); |
528 } | |
529 | |
530 /* Issue appropriate warnings for the global declarations in VEC (of | |
531 which there are LEN). */ | |
532 | |
533 void | |
534 check_global_declarations (tree *vec, int len) | |
535 { | |
536 int i; | |
537 | |
538 for (i = 0; i < len; i++) | |
539 check_global_declaration_1 (vec[i]); | |
540 } | |
541 | |
542 /* Emit debugging information for all global declarations in VEC. */ | |
543 | |
544 void | |
545 emit_debug_global_declarations (tree *vec, int len) | |
546 { | |
547 int i; | |
548 | |
549 /* Avoid confusing the debug information machinery when there are 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
|
550 if (seen_error ()) |
0 | 551 return; |
552 | |
553 timevar_push (TV_SYMOUT); | |
554 for (i = 0; i < len; i++) | |
555 debug_hooks->global_decl (vec[i]); | |
556 timevar_pop (TV_SYMOUT); | |
557 } | |
558 | |
559 /* Compile an entire translation unit. Write a file of assembly | |
560 output and various debugging dumps. */ | |
561 | |
562 static void | |
563 compile_file (void) | |
564 { | |
565 /* Initialize yet another pass. */ | |
566 | |
567 ggc_protect_identifiers = true; | |
568 | |
569 init_cgraph (); | |
570 init_final (main_input_filename); | |
571 coverage_init (aux_base_name); | |
572 statistics_init (); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
573 invoke_plugin_callbacks (PLUGIN_START_UNIT, NULL); |
0 | 574 |
575 timevar_push (TV_PARSE); | |
576 | |
577 /* Call the parser, which parses the entire file (calling | |
578 rest_of_compilation for each 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
|
579 lang_hooks.parse_file (); |
0 | 580 |
581 /* Compilation is now finished except for writing | |
582 what's left of the symbol table output. */ | |
583 timevar_pop (TV_PARSE); | |
584 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
585 if (flag_syntax_only || flag_wpa) |
0 | 586 return; |
587 | |
588 ggc_protect_identifiers = false; | |
589 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
590 /* This must also call cgraph_finalize_compilation_unit. */ |
0 | 591 lang_hooks.decls.final_write_globals (); |
592 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
593 if (seen_error ()) |
0 | 594 return; |
595 | |
596 varpool_assemble_pending_decls (); | |
597 finish_aliases_2 (); | |
598 | |
599 /* Likewise for mudflap static object registrations. */ | |
600 if (flag_mudflap) | |
601 mudflap_finish_file (); | |
602 | |
603 output_shared_constant_pool (); | |
604 output_object_blocks (); | |
605 | |
606 /* Write out any pending weak symbol declarations. */ | |
607 weak_finish (); | |
608 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
609 /* This must be at the end before unwind and debug info. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
610 Some target ports emit PIC setup thunks here. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
611 targetm.asm_out.code_end (); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
612 |
0 | 613 /* Do dbx symbols. */ |
614 timevar_push (TV_SYMOUT); | |
615 | |
616 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO | |
617 if (dwarf2out_do_frame ()) | |
618 dwarf2out_frame_finish (); | |
619 #endif | |
620 | |
621 (*debug_hooks->finish) (main_input_filename); | |
622 timevar_pop (TV_SYMOUT); | |
623 | |
624 /* Output some stuff at end of file if nec. */ | |
625 | |
626 dw2_output_indirect_constants (); | |
627 | |
628 /* Flush any pending external directives. */ | |
629 process_pending_assemble_externals (); | |
630 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
631 /* 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
|
632 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
|
633 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
|
634 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
|
635 library without invoking lto1. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
636 if (flag_generate_lto) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
637 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
638 #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
|
639 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
|
640 "__gnu_lto_v1", |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
641 (unsigned HOST_WIDE_INT) 1, 8); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
642 #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
|
643 ASM_OUTPUT_ALIGNED_COMMON (asm_out_file, "__gnu_lto_v1", |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
644 (unsigned HOST_WIDE_INT) 1, 8); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
645 #else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
646 ASM_OUTPUT_COMMON (asm_out_file, "__gnu_lto_v1", |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
647 (unsigned HOST_WIDE_INT) 1, |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
648 (unsigned HOST_WIDE_INT) 1); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
649 #endif |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
650 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
651 |
0 | 652 /* Attach a special .ident directive to the end of the file to identify |
653 the version of GCC which compiled this code. The format of the .ident | |
654 string is patterned after the ones produced by native SVR4 compilers. */ | |
655 #ifdef IDENT_ASM_OP | |
656 if (!flag_no_ident) | |
657 { | |
658 const char *pkg_version = "(GNU) "; | |
659 | |
660 if (strcmp ("(GCC) ", pkgversion_string)) | |
661 pkg_version = pkgversion_string; | |
662 fprintf (asm_out_file, "%s\"GCC: %s%s\"\n", | |
663 IDENT_ASM_OP, pkg_version, version_string); | |
664 } | |
665 #endif | |
666 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
667 /* 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
|
668 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
|
669 |
0 | 670 /* This must be at the end. Some target ports emit end of file directives |
671 into the assembly file here, and hence we can not output anything to the | |
672 assembly file after this point. */ | |
673 targetm.asm_out.file_end (); | |
674 } | |
675 | |
676 /* Indexed by enum debug_info_type. */ | |
677 const char *const debug_type_names[] = | |
678 { | |
679 "none", "stabs", "coff", "dwarf-2", "xcoff", "vms" | |
680 }; | |
681 | |
682 /* Print version information to FILE. | |
683 Each line begins with INDENT (for the case where FILE is the | |
684 assembler output file). */ | |
685 | |
686 void | |
687 print_version (FILE *file, const char *indent) | |
688 { | |
689 static const char fmt1[] = | |
690 #ifdef __GNUC__ | |
691 N_("%s%s%s %sversion %s (%s)\n%s\tcompiled by GNU C version %s, ") | |
692 #else | |
693 N_("%s%s%s %sversion %s (%s) compiled by CC, ") | |
694 #endif | |
695 ; | |
696 static const char fmt2[] = | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
697 N_("GMP version %s, MPFR version %s, MPC version %s\n"); |
0 | 698 static const char fmt3[] = |
699 N_("%s%swarning: %s header version %s differs from library version %s.\n"); | |
700 static const char fmt4[] = | |
701 N_("%s%sGGC heuristics: --param ggc-min-expand=%d --param ggc-min-heapsize=%d\n"); | |
702 #ifndef __VERSION__ | |
703 #define __VERSION__ "[?]" | |
704 #endif | |
705 fprintf (file, | |
706 file == stderr ? _(fmt1) : fmt1, | |
707 indent, *indent != 0 ? " " : "", | |
708 lang_hooks.name, pkgversion_string, version_string, TARGET_NAME, | |
709 indent, __VERSION__); | |
710 | |
711 /* 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
|
712 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
|
713 gmp-4.3.0, GMP always uses the 3 number format. */ |
0 | 714 #define GCC_GMP_STRINGIFY_VERSION3(X) #X |
715 #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
|
716 #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
|
717 #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
|
718 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
|
719 #if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4,3,0) && __GNU_MP_VERSION_PATCHLEVEL == 0 |
0 | 720 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \ |
721 GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) | |
722 #else | |
723 #define GCC_GMP_STRINGIFY_VERSION GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION) "." \ | |
724 GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_MINOR) "." \ | |
725 GCC_GMP_STRINGIFY_VERSION2(__GNU_MP_VERSION_PATCHLEVEL) | |
726 #endif | |
727 fprintf (file, | |
728 file == stderr ? _(fmt2) : fmt2, | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
729 GCC_GMP_STRINGIFY_VERSION, MPFR_VERSION_STRING, MPC_VERSION_STRING); |
0 | 730 if (strcmp (GCC_GMP_STRINGIFY_VERSION, gmp_version)) |
731 fprintf (file, | |
732 file == stderr ? _(fmt3) : fmt3, | |
733 indent, *indent != 0 ? " " : "", | |
734 "GMP", GCC_GMP_STRINGIFY_VERSION, gmp_version); | |
735 if (strcmp (MPFR_VERSION_STRING, mpfr_get_version ())) | |
736 fprintf (file, | |
737 file == stderr ? _(fmt3) : fmt3, | |
738 indent, *indent != 0 ? " " : "", | |
739 "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
|
740 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
|
741 fprintf (file, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
742 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
|
743 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
|
744 "MPC", MPC_VERSION_STRING, mpc_get_version ()); |
0 | 745 fprintf (file, |
746 file == stderr ? _(fmt4) : fmt4, | |
747 indent, *indent != 0 ? " " : "", | |
748 PARAM_VALUE (GGC_MIN_EXPAND), PARAM_VALUE (GGC_MIN_HEAPSIZE)); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
749 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
750 print_plugins_versions (file, indent); |
0 | 751 } |
752 | |
753 #ifdef ASM_COMMENT_START | |
754 static int | |
755 print_to_asm_out_file (print_switch_type type, const char * text) | |
756 { | |
757 bool prepend_sep = true; | |
758 | |
759 switch (type) | |
760 { | |
761 case SWITCH_TYPE_LINE_END: | |
762 putc ('\n', asm_out_file); | |
763 return 1; | |
764 | |
765 case SWITCH_TYPE_LINE_START: | |
766 fputs (ASM_COMMENT_START, asm_out_file); | |
767 return strlen (ASM_COMMENT_START); | |
768 | |
769 case SWITCH_TYPE_DESCRIPTIVE: | |
770 if (ASM_COMMENT_START[0] == 0) | |
771 prepend_sep = false; | |
772 /* Drop through. */ | |
773 case SWITCH_TYPE_PASSED: | |
774 case SWITCH_TYPE_ENABLED: | |
775 if (prepend_sep) | |
776 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
|
777 fputs (text, asm_out_file); |
0 | 778 /* No need to return the length here as |
779 print_single_switch has already done it. */ | |
780 return 0; | |
781 | |
782 default: | |
783 return -1; | |
784 } | |
785 } | |
786 #endif | |
787 | |
788 static int | |
789 print_to_stderr (print_switch_type type, const char * text) | |
790 { | |
791 switch (type) | |
792 { | |
793 case SWITCH_TYPE_LINE_END: | |
794 putc ('\n', stderr); | |
795 return 1; | |
796 | |
797 case SWITCH_TYPE_LINE_START: | |
798 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
|
799 |
0 | 800 case SWITCH_TYPE_PASSED: |
801 case SWITCH_TYPE_ENABLED: | |
802 fputc (' ', stderr); | |
803 /* Drop through. */ | |
804 | |
805 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
|
806 fputs (text, stderr); |
0 | 807 /* No need to return the length here as |
808 print_single_switch has already done it. */ | |
809 return 0; | |
810 | |
811 default: | |
812 return -1; | |
813 } | |
814 } | |
815 | |
816 /* Print an option value and return the adjusted position in the line. | |
817 ??? print_fn doesn't handle errors, eg disk full; presumably other | |
818 code will catch a disk full though. */ | |
819 | |
820 static int | |
821 print_single_switch (print_switch_fn_type print_fn, | |
822 int pos, | |
823 print_switch_type type, | |
824 const char * text) | |
825 { | |
826 /* The ultrix fprintf returns 0 on success, so compute the result | |
827 we want here since we need it for the following test. The +1 | |
828 is for the separator character that will probably be emitted. */ | |
829 int len = strlen (text) + 1; | |
830 | |
831 if (pos != 0 | |
832 && pos + len > MAX_LINE) | |
833 { | |
834 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
835 pos = 0; | |
836 } | |
837 | |
838 if (pos == 0) | |
839 pos += print_fn (SWITCH_TYPE_LINE_START, NULL); | |
840 | |
841 print_fn (type, text); | |
842 return pos + len; | |
843 } | |
844 | |
845 /* Print active target switches using PRINT_FN. | |
846 POS is the current cursor position and MAX is the size of a "line". | |
847 Each line begins with INDENT and ends with TERM. | |
848 Each switch is separated from the next by SEP. */ | |
849 | |
850 static void | |
851 print_switch_values (print_switch_fn_type print_fn) | |
852 { | |
853 int pos = 0; | |
854 size_t j; | |
855 | |
856 /* Fill in the -frandom-seed option, if the user didn't pass it, so | |
857 that it can be printed below. This helps reproducibility. */ | |
858 if (!flag_random_seed) | |
859 init_random_seed (); | |
860 | |
861 /* Print the options as passed. */ | |
862 pos = print_single_switch (print_fn, pos, | |
863 SWITCH_TYPE_DESCRIPTIVE, _("options passed: ")); | |
864 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
865 for (j = 1; j < save_decoded_options_count; j++) |
0 | 866 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
867 switch (save_decoded_options[j].opt_index) |
0 | 868 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
869 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
|
870 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
|
871 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
|
872 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
|
873 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
|
874 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
|
875 case OPT_version: |
0 | 876 /* 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
|
877 continue; |
0 | 878 } |
879 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
880 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
|
881 save_decoded_options[j].orig_option_with_args_text); |
0 | 882 } |
883 | |
884 if (pos > 0) | |
885 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
886 | |
887 /* Print the -f and -m options that have been enabled. | |
888 We don't handle language specific options but printing argv | |
889 should suffice. */ | |
890 pos = print_single_switch (print_fn, 0, | |
891 SWITCH_TYPE_DESCRIPTIVE, _("options enabled: ")); | |
892 | |
893 for (j = 0; j < cl_options_count; j++) | |
894 if ((cl_options[j].flags & 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
|
895 && option_enabled (j, &global_options) > 0) |
0 | 896 pos = print_single_switch (print_fn, pos, |
897 SWITCH_TYPE_ENABLED, cl_options[j].opt_text); | |
898 | |
899 print_fn (SWITCH_TYPE_LINE_END, NULL); | |
900 } | |
901 | |
902 /* Open assembly code output file. Do this even if -fsyntax-only is | |
903 on, because then the driver will have provided the name of a | |
904 temporary file or bit bucket for us. NAME is the file specified on | |
905 the command line, possibly NULL. */ | |
906 static void | |
907 init_asm_output (const char *name) | |
908 { | |
909 if (name == NULL && asm_file_name == 0) | |
910 asm_out_file = stdout; | |
911 else | |
912 { | |
913 if (asm_file_name == 0) | |
914 { | |
915 int len = strlen (dump_base_name); | |
916 char *dumpname = XNEWVEC (char, len + 6); | |
917 | |
918 memcpy (dumpname, dump_base_name, len + 1); | |
919 strip_off_ending (dumpname, len); | |
920 strcat (dumpname, ".s"); | |
921 asm_file_name = dumpname; | |
922 } | |
923 if (!strcmp (asm_file_name, "-")) | |
924 asm_out_file = stdout; | |
925 else | |
926 asm_out_file = fopen (asm_file_name, "w+b"); | |
927 if (asm_out_file == 0) | |
928 fatal_error ("can%'t open %s for writing: %m", asm_file_name); | |
929 } | |
930 | |
931 if (!flag_syntax_only) | |
932 { | |
933 targetm.asm_out.file_start (); | |
934 | |
935 if (flag_record_gcc_switches) | |
936 { | |
937 if (targetm.asm_out.record_gcc_switches) | |
938 { | |
939 /* Let the target know that we are about to start recording. */ | |
940 targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, | |
941 NULL); | |
942 /* Now record the switches. */ | |
943 print_switch_values (targetm.asm_out.record_gcc_switches); | |
944 /* Let the target know that the recording is over. */ | |
945 targetm.asm_out.record_gcc_switches (SWITCH_TYPE_DESCRIPTIVE, | |
946 NULL); | |
947 } | |
948 else | |
949 inform (input_location, "-frecord-gcc-switches is not supported by the current target"); | |
950 } | |
951 | |
952 #ifdef ASM_COMMENT_START | |
953 if (flag_verbose_asm) | |
954 { | |
955 /* Print the list of switches in effect | |
956 into the assembler file as comments. */ | |
957 print_version (asm_out_file, ASM_COMMENT_START); | |
958 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
|
959 putc ('\n', asm_out_file); |
0 | 960 } |
961 #endif | |
962 } | |
963 } | |
964 | |
965 /* Default tree printer. Handles declarations only. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
966 bool |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
967 default_tree_printer (pretty_printer *pp, text_info *text, const char *spec, |
0 | 968 int precision, bool wide, bool set_locus, bool hash) |
969 { | |
970 tree t; | |
971 | |
972 /* FUTURE: %+x should set the locus. */ | |
973 if (precision != 0 || wide || hash) | |
974 return false; | |
975 | |
976 switch (*spec) | |
977 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
978 case 'E': |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
979 t = va_arg (*text->args_ptr, tree); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
980 if (TREE_CODE (t) == IDENTIFIER_NODE) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
981 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
982 pp_identifier (pp, IDENTIFIER_POINTER (t)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
983 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
984 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
985 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
986 |
0 | 987 case 'D': |
988 t = va_arg (*text->args_ptr, tree); | |
989 if (DECL_DEBUG_EXPR_IS_FROM (t) && DECL_DEBUG_EXPR (t)) | |
990 t = DECL_DEBUG_EXPR (t); | |
991 break; | |
992 | |
993 case 'F': | |
994 case 'T': | |
995 t = va_arg (*text->args_ptr, tree); | |
996 break; | |
997 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
998 case 'K': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
999 percent_K_format (text); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1000 return true; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1001 |
0 | 1002 default: |
1003 return false; | |
1004 } | |
1005 | |
1006 if (set_locus && text->locus) | |
1007 *text->locus = DECL_SOURCE_LOCATION (t); | |
1008 | |
1009 if (DECL_P (t)) | |
1010 { | |
1011 const char *n = DECL_NAME (t) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1012 ? identifier_to_locale (lang_hooks.decl_printable_name (t, 2)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1013 : _("<anonymous>"); |
0 | 1014 pp_string (pp, n); |
1015 } | |
1016 else | |
1017 dump_generic_node (pp, t, 0, TDF_DIAGNOSTIC, 0); | |
1018 | |
1019 return true; | |
1020 } | |
1021 | |
1022 /* A helper function; used as the reallocator function for cpp's line | |
1023 table. */ | |
1024 static void * | |
1025 realloc_for_line_map (void *ptr, size_t len) | |
1026 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1027 return GGC_RESIZEVAR (void, ptr, 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
|
1028 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1029 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1030 /* 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
|
1031 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
|
1032 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
|
1033 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
|
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 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
|
1036 } |
f6334be47118
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 |
f6334be47118
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 /* 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
|
1039 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
|
1040 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
|
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 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
|
1043 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
|
1044 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
|
1045 "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
|
1046 "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
|
1047 "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
|
1048 }; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1049 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
|
1050 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
|
1051 expanded_location loc; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1052 const char *raw_id, *id; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1053 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1054 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
|
1055 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1056 if (!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
|
1057 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1058 warning (0, "-fstack-usage not supported for this 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
|
1059 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
|
1060 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1061 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
|
1062 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1063 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1064 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
|
1065 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1066 /* 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
|
1067 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
|
1068 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1069 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
|
1070 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
|
1071 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1072 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1073 /* 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
|
1074 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
|
1075 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1076 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
|
1077 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
|
1078 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
|
1079 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
|
1080 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1081 /* 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
|
1082 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
|
1083 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1084 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1085 loc = expand_location (DECL_SOURCE_LOCATION (current_function_decl)); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1086 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1087 /* Strip the scope prefix if any. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1088 raw_id = lang_hooks.decl_printable_name (current_function_decl, 2); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1089 id = strrchr (raw_id, '.'); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1090 if (id) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1091 id++; |
f6334be47118
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 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
|
1093 id = raw_id; |
f6334be47118
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 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1095 fprintf (stack_usage_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
|
1096 "%s:%d:%d:%s\t"HOST_WIDE_INT_PRINT_DEC"\t%s\n", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1097 lbasename (loc.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
|
1098 loc.line, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1099 loc.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
|
1100 id, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1101 stack_usage, |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1102 stack_usage_kind_str[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
|
1103 } |
f6334be47118
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 |
f6334be47118
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 /* 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
|
1106 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
|
1107 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
|
1108 { |
f6334be47118
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 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
|
1110 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
|
1111 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1112 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
|
1113 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
|
1114 if (!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
|
1115 fatal_error ("can%'t open %s for writing: %m", 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
|
1116 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
|
1117 return file; |
0 | 1118 } |
1119 | |
1120 /* Initialization of the front end environment, before command line | |
1121 options are parsed. Signal handlers, internationalization etc. | |
1122 ARGV0 is main's argv[0]. */ | |
1123 static void | |
1124 general_init (const char *argv0) | |
1125 { | |
1126 const char *p; | |
1127 | |
1128 p = argv0 + strlen (argv0); | |
1129 while (p != argv0 && !IS_DIR_SEPARATOR (p[-1])) | |
1130 --p; | |
1131 progname = p; | |
1132 | |
1133 xmalloc_set_program_name (progname); | |
1134 | |
1135 hex_init (); | |
1136 | |
1137 /* Unlock the stdio streams. */ | |
1138 unlock_std_streams (); | |
1139 | |
1140 gcc_init_libintl (); | |
1141 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1142 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
|
1143 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
|
1144 |
0 | 1145 /* Initialize the diagnostics reporting machinery, so option parsing |
1146 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
|
1147 diagnostic_initialize (global_dc, N_OPTS); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1148 diagnostic_starter (global_dc) = default_tree_diagnostic_starter; |
0 | 1149 /* Set a default printer. Language specific initializations will |
1150 override it later. */ | |
1151 pp_format_decoder (global_dc->printer) = &default_tree_printer; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1152 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
|
1153 = 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
|
1154 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
|
1155 = global_options_init.x_flag_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
|
1156 global_dc->internal_error = plugins_internal_error_function; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1157 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
|
1158 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
|
1159 global_dc->option_name = option_name; |
0 | 1160 |
1161 /* Trap fatal signals, e.g. SIGSEGV, and convert them to ICE messages. */ | |
1162 #ifdef SIGSEGV | |
1163 signal (SIGSEGV, crash_signal); | |
1164 #endif | |
1165 #ifdef SIGILL | |
1166 signal (SIGILL, crash_signal); | |
1167 #endif | |
1168 #ifdef SIGBUS | |
1169 signal (SIGBUS, crash_signal); | |
1170 #endif | |
1171 #ifdef SIGABRT | |
1172 signal (SIGABRT, crash_signal); | |
1173 #endif | |
1174 #if defined SIGIOT && (!defined SIGABRT || SIGABRT != SIGIOT) | |
1175 signal (SIGIOT, crash_signal); | |
1176 #endif | |
1177 #ifdef SIGFPE | |
1178 signal (SIGFPE, crash_signal); | |
1179 #endif | |
1180 | |
1181 /* Other host-specific signal setup. */ | |
1182 (*host_hooks.extra_signals)(); | |
1183 | |
1184 /* Initialize the garbage-collector, string pools and tree type hash | |
1185 table. */ | |
1186 init_ggc (); | |
1187 init_stringpool (); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1188 line_table = ggc_alloc_line_maps (); |
0 | 1189 linemap_init (line_table); |
1190 line_table->reallocator = realloc_for_line_map; | |
1191 init_ttree (); | |
1192 | |
1193 /* Initialize register usage now so switches may override. */ | |
1194 init_reg_sets (); | |
1195 | |
1196 /* Register the language-independent parameters. */ | |
1197 add_params (lang_independent_params, LAST_PARAM); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1198 targetm.target_option.default_params (); |
0 | 1199 |
1200 /* This must be done after add_params but before argument processing. */ | |
1201 init_ggc_heuristics(); | |
1202 init_optimization_passes (); | |
1203 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
|
1204 finish_params (); |
0 | 1205 } |
1206 | |
1207 /* Return true if the current target supports -fsection-anchors. */ | |
1208 | |
1209 static bool | |
1210 target_supports_section_anchors_p (void) | |
1211 { | |
1212 if (targetm.min_anchor_offset == 0 && targetm.max_anchor_offset == 0) | |
1213 return false; | |
1214 | |
1215 if (targetm.asm_out.output_anchor == NULL) | |
1216 return false; | |
1217 | |
1218 return true; | |
1219 } | |
1220 | |
1221 /* Default the align_* variables to 1 if they're still unset, and | |
1222 set up the align_*_log variables. */ | |
1223 static void | |
1224 init_alignments (void) | |
1225 { | |
1226 if (align_loops <= 0) | |
1227 align_loops = 1; | |
1228 if (align_loops_max_skip > align_loops) | |
1229 align_loops_max_skip = align_loops - 1; | |
1230 align_loops_log = floor_log2 (align_loops * 2 - 1); | |
1231 if (align_jumps <= 0) | |
1232 align_jumps = 1; | |
1233 if (align_jumps_max_skip > align_jumps) | |
1234 align_jumps_max_skip = align_jumps - 1; | |
1235 align_jumps_log = floor_log2 (align_jumps * 2 - 1); | |
1236 if (align_labels <= 0) | |
1237 align_labels = 1; | |
1238 align_labels_log = floor_log2 (align_labels * 2 - 1); | |
1239 if (align_labels_max_skip > align_labels) | |
1240 align_labels_max_skip = align_labels - 1; | |
1241 if (align_functions <= 0) | |
1242 align_functions = 1; | |
1243 align_functions_log = floor_log2 (align_functions * 2 - 1); | |
1244 } | |
1245 | |
1246 /* Process the options that have been parsed. */ | |
1247 static void | |
1248 process_options (void) | |
1249 { | |
1250 /* Just in case lang_hooks.post_options ends up calling a debug_hook. | |
1251 This can happen with incorrect pre-processed input. */ | |
1252 debug_hooks = &do_nothing_debug_hooks; | |
1253 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1254 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
|
1255 |
0 | 1256 /* This replaces set_Wunused. */ |
1257 if (warn_unused_function == -1) | |
1258 warn_unused_function = warn_unused; | |
1259 if (warn_unused_label == -1) | |
1260 warn_unused_label = warn_unused; | |
1261 /* Wunused-parameter is enabled if both -Wunused -Wextra are enabled. */ | |
1262 if (warn_unused_parameter == -1) | |
1263 warn_unused_parameter = (warn_unused && extra_warnings); | |
1264 if (warn_unused_variable == -1) | |
1265 warn_unused_variable = warn_unused; | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1266 /* Wunused-but-set-parameter is enabled if both -Wunused -Wextra are |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1267 enabled. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1268 if (warn_unused_but_set_parameter == -1) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1269 warn_unused_but_set_parameter = (warn_unused && extra_warnings); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1270 if (warn_unused_but_set_variable == -1) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1271 warn_unused_but_set_variable = warn_unused; |
0 | 1272 if (warn_unused_value == -1) |
1273 warn_unused_value = warn_unused; | |
1274 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1275 /* This replaces set_Wextra. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1276 if (warn_uninitialized == -1) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1277 warn_uninitialized = extra_warnings; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1278 |
0 | 1279 /* Allow the front end to perform consistency checks and do further |
1280 initialization based on the command line options. This hook also | |
1281 sets the original filename if appropriate (e.g. foo.i -> foo.c) | |
1282 so we can correctly initialize debug output. */ | |
1283 no_backend = lang_hooks.post_options (&main_input_filename); | |
1284 | |
1285 /* Some machines may reject certain combinations of options. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1286 targetm.target_option.override (); |
0 | 1287 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1288 /* 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
|
1289 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
|
1290 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
|
1291 |
0 | 1292 if (flag_section_anchors && !target_supports_section_anchors_p ()) |
1293 { | |
1294 warning (OPT_fsection_anchors, | |
1295 "this target does not support %qs", "-fsection-anchors"); | |
1296 flag_section_anchors = 0; | |
1297 } | |
1298 | |
1299 if (flag_short_enums == 2) | |
1300 flag_short_enums = targetm.default_short_enums (); | |
1301 | |
1302 /* Set aux_base_name if not already set. */ | |
1303 if (aux_base_name) | |
1304 ; | |
1305 else if (main_input_filename) | |
1306 { | |
1307 char *name = xstrdup (lbasename (main_input_filename)); | |
1308 | |
1309 strip_off_ending (name, strlen (name)); | |
1310 aux_base_name = name; | |
1311 } | |
1312 else | |
1313 aux_base_name = "gccaux"; | |
1314 | |
1315 #ifndef HAVE_cloog | |
1316 if (flag_graphite | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1317 || flag_graphite_identity |
0 | 1318 || flag_loop_block |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1319 || flag_loop_flatten |
0 | 1320 || flag_loop_interchange |
1321 || flag_loop_strip_mine | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1322 || flag_loop_parallelize_all) |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1323 sorry ("Graphite loop optimizations cannot be used (-fgraphite, " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1324 "-fgraphite-identity, -floop-block, -floop-flatten, " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1325 "-floop-interchange, -floop-strip-mine, -floop-parallelize-all, " |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1326 "and -ftree-loop-linear)"); |
0 | 1327 #endif |
1328 | |
1329 /* Unrolling all loops implies that standard loop unrolling must also | |
1330 be done. */ | |
1331 if (flag_unroll_all_loops) | |
1332 flag_unroll_loops = 1; | |
1333 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1334 /* web and rename-registers help when run after loop unrolling. */ |
0 | 1335 if (flag_web == AUTODETECT_VALUE) |
1336 flag_web = flag_unroll_loops || flag_peel_loops; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1337 |
0 | 1338 if (flag_rename_registers == AUTODETECT_VALUE) |
1339 flag_rename_registers = flag_unroll_loops || flag_peel_loops; | |
1340 | |
1341 if (flag_non_call_exceptions) | |
1342 flag_asynchronous_unwind_tables = 1; | |
1343 if (flag_asynchronous_unwind_tables) | |
1344 flag_unwind_tables = 1; | |
1345 | |
1346 if (flag_value_profile_transformations) | |
1347 flag_profile_values = 1; | |
1348 | |
1349 /* Warn about options that are not supported on this machine. */ | |
1350 #ifndef INSN_SCHEDULING | |
1351 if (flag_schedule_insns || flag_schedule_insns_after_reload) | |
1352 warning (0, "instruction scheduling not supported on this target machine"); | |
1353 #endif | |
1354 #ifndef DELAY_SLOTS | |
1355 if (flag_delayed_branch) | |
1356 warning (0, "this target machine does not have delayed branches"); | |
1357 #endif | |
1358 | |
1359 user_label_prefix = USER_LABEL_PREFIX; | |
1360 if (flag_leading_underscore != -1) | |
1361 { | |
1362 /* If the default prefix is more complicated than "" or "_", | |
1363 issue a warning and ignore this option. */ | |
1364 if (user_label_prefix[0] == 0 || | |
1365 (user_label_prefix[0] == '_' && user_label_prefix[1] == 0)) | |
1366 { | |
1367 user_label_prefix = flag_leading_underscore ? "_" : ""; | |
1368 } | |
1369 else | |
1370 warning (0, "-f%sleading-underscore not supported on this target machine", | |
1371 flag_leading_underscore ? "" : "no-"); | |
1372 } | |
1373 | |
1374 /* If we are in verbose mode, write out the version and maybe all the | |
1375 option flags in use. */ | |
1376 if (version_flag) | |
1377 { | |
1378 print_version (stderr, ""); | |
1379 if (! quiet_flag) | |
1380 print_switch_values (print_to_stderr); | |
1381 } | |
1382 | |
1383 if (flag_syntax_only) | |
1384 { | |
1385 write_symbols = NO_DEBUG; | |
1386 profile_flag = 0; | |
1387 } | |
1388 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1389 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
|
1390 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1391 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
|
1392 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1393 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
|
1394 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1395 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
|
1396 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
|
1397 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1398 else |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1399 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
|
1400 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1401 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1402 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
|
1403 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1404 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
|
1405 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
|
1406 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1407 error ("could not open final insn dump file %qs: %m", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1408 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
|
1409 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
|
1410 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1411 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
|
1412 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1413 error ("could not close zeroed insn dump file %qs: %m", |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1414 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
|
1415 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
|
1416 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1417 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1418 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1419 /* Unless over-ridden for the target, assume that all DWARF levels |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1420 may be emitted, if DWARF2_DEBUG is selected. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1421 if (dwarf_strict < 0) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1422 dwarf_strict = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1423 |
0 | 1424 /* A lot of code assumes write_symbols == NO_DEBUG if the debugging |
1425 level is 0. */ | |
1426 if (debug_info_level == DINFO_LEVEL_NONE) | |
1427 write_symbols = NO_DEBUG; | |
1428 | |
1429 if (write_symbols == NO_DEBUG) | |
1430 ; | |
1431 #if defined(DBX_DEBUGGING_INFO) | |
1432 else if (write_symbols == DBX_DEBUG) | |
1433 debug_hooks = &dbx_debug_hooks; | |
1434 #endif | |
1435 #if defined(XCOFF_DEBUGGING_INFO) | |
1436 else if (write_symbols == XCOFF_DEBUG) | |
1437 debug_hooks = &xcoff_debug_hooks; | |
1438 #endif | |
1439 #ifdef SDB_DEBUGGING_INFO | |
1440 else if (write_symbols == SDB_DEBUG) | |
1441 debug_hooks = &sdb_debug_hooks; | |
1442 #endif | |
1443 #ifdef DWARF2_DEBUGGING_INFO | |
1444 else if (write_symbols == DWARF2_DEBUG) | |
1445 debug_hooks = &dwarf2_debug_hooks; | |
1446 #endif | |
1447 #ifdef VMS_DEBUGGING_INFO | |
1448 else if (write_symbols == VMS_DEBUG || write_symbols == VMS_AND_DWARF2_DEBUG) | |
1449 debug_hooks = &vmsdbg_debug_hooks; | |
1450 #endif | |
1451 else | |
1452 error ("target system does not support the \"%s\" debug format", | |
1453 debug_type_names[write_symbols]); | |
1454 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1455 /* 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
|
1456 and flag_var_tracking_uninit if the user has not specified them. */ |
0 | 1457 if (debug_info_level < DINFO_LEVEL_NORMAL |
1458 || debug_hooks->var_location == do_nothing_debug_hooks.var_location) | |
1459 { | |
1460 if (flag_var_tracking == 1 | |
1461 || flag_var_tracking_uninit == 1) | |
1462 { | |
1463 if (debug_info_level < DINFO_LEVEL_NORMAL) | |
1464 warning (0, "variable tracking requested, but useless unless " | |
1465 "producing debug info"); | |
1466 else | |
1467 warning (0, "variable tracking requested, but not supported " | |
1468 "by this debug format"); | |
1469 } | |
1470 flag_var_tracking = 0; | |
1471 flag_var_tracking_uninit = 0; | |
1472 } | |
1473 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1474 /* 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
|
1475 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
|
1476 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
|
1477 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
|
1478 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
|
1479 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1480 /* 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
|
1481 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
|
1482 (We already determined above that variable tracking is feasible.) */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1483 if (flag_var_tracking_uninit) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1484 flag_var_tracking = 1; |
0 | 1485 |
1486 if (flag_var_tracking == AUTODETECT_VALUE) | |
1487 flag_var_tracking = optimize >= 1; | |
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 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
|
1490 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
|
1491 && !(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
|
1492 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1493 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
|
1494 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
|
1495 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1496 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
|
1497 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
|
1498 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1499 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
|
1500 && (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
|
1501 warning (0, "var-tracking-assignments changes selective scheduling"); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1502 |
0 | 1503 if (flag_tree_cselim == AUTODETECT_VALUE) |
1504 #ifdef HAVE_conditional_move | |
1505 flag_tree_cselim = 1; | |
1506 #else | |
1507 flag_tree_cselim = 0; | |
1508 #endif | |
1509 | |
1510 /* If auxiliary info generation is desired, open the output file. | |
1511 This goes in the same directory as the source file--unlike | |
1512 all the other output files. */ | |
1513 if (flag_gen_aux_info) | |
1514 { | |
1515 aux_info_file = fopen (aux_info_file_name, "w"); | |
1516 if (aux_info_file == 0) | |
1517 fatal_error ("can%'t open %s: %m", aux_info_file_name); | |
1518 } | |
1519 | |
1520 if (! targetm.have_named_sections) | |
1521 { | |
1522 if (flag_function_sections) | |
1523 { | |
1524 warning (0, "-ffunction-sections not supported for this target"); | |
1525 flag_function_sections = 0; | |
1526 } | |
1527 if (flag_data_sections) | |
1528 { | |
1529 warning (0, "-fdata-sections not supported for this target"); | |
1530 flag_data_sections = 0; | |
1531 } | |
1532 } | |
1533 | |
1534 if (flag_function_sections && profile_flag) | |
1535 { | |
1536 warning (0, "-ffunction-sections disabled; it makes profiling impossible"); | |
1537 flag_function_sections = 0; | |
1538 } | |
1539 | |
1540 #ifndef HAVE_prefetch | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1541 if (flag_prefetch_loop_arrays > 0) |
0 | 1542 { |
1543 warning (0, "-fprefetch-loop-arrays not supported for this target"); | |
1544 flag_prefetch_loop_arrays = 0; | |
1545 } | |
1546 #else | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1547 if (flag_prefetch_loop_arrays > 0 && !HAVE_prefetch) |
0 | 1548 { |
1549 warning (0, "-fprefetch-loop-arrays not supported for this target (try -march switches)"); | |
1550 flag_prefetch_loop_arrays = 0; | |
1551 } | |
1552 #endif | |
1553 | |
1554 /* This combination of options isn't handled for i386 targets and doesn't | |
1555 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
|
1556 if (flag_prefetch_loop_arrays > 0 && optimize_size) |
0 | 1557 { |
1558 warning (0, "-fprefetch-loop-arrays is not supported with -Os"); | |
1559 flag_prefetch_loop_arrays = 0; | |
1560 } | |
1561 | |
1562 /* The presence of IEEE signaling NaNs, implies all math can trap. */ | |
1563 if (flag_signaling_nans) | |
1564 flag_trapping_math = 1; | |
1565 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1566 /* We cannot reassociate if we want traps or signed zeros. */ |
0 | 1567 if (flag_associative_math && (flag_trapping_math || flag_signed_zeros)) |
1568 { | |
1569 warning (0, "-fassociative-math disabled; other options take precedence"); | |
1570 flag_associative_math = 0; | |
1571 } | |
1572 | |
1573 /* With -fcx-limited-range, we do cheap and quick complex arithmetic. */ | |
1574 if (flag_cx_limited_range) | |
1575 flag_complex_method = 0; | |
1576 | |
1577 /* With -fcx-fortran-rules, we do something in-between cheap and C99. */ | |
1578 if (flag_cx_fortran_rules) | |
1579 flag_complex_method = 1; | |
1580 | |
1581 /* Targets must be able to place spill slots at lower addresses. If the | |
1582 target already uses a soft frame pointer, the transition is trivial. */ | |
1583 if (!FRAME_GROWS_DOWNWARD && flag_stack_protect) | |
1584 { | |
1585 warning (0, "-fstack-protector not supported for this target"); | |
1586 flag_stack_protect = 0; | |
1587 } | |
1588 if (!flag_stack_protect) | |
1589 warn_stack_protect = 0; | |
1590 | |
1591 /* ??? Unwind info is not correct around the CFG unless either a frame | |
1592 pointer is present or A_O_A is set. Fixing this requires rewriting | |
1593 unwind info generation to be aware of the CFG and propagating states | |
1594 around edges. */ | |
1595 if (flag_unwind_tables && !ACCUMULATE_OUTGOING_ARGS | |
1596 && flag_omit_frame_pointer) | |
1597 { | |
1598 warning (0, "unwind tables currently require a frame pointer " | |
1599 "for correctness"); | |
1600 flag_omit_frame_pointer = 0; | |
1601 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1602 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1603 /* Save the current optimization options. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1604 optimization_default_node = build_optimization_node (); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1605 optimization_current_node = optimization_default_node; |
0 | 1606 } |
1607 | |
1608 /* This function can be called multiple times to reinitialize the compiler | |
1609 back end when register classes or instruction sets have changed, | |
1610 before each function. */ | |
1611 static void | |
1612 backend_init_target (void) | |
1613 { | |
1614 /* Initialize alignment variables. */ | |
1615 init_alignments (); | |
1616 | |
1617 /* This reinitializes hard_frame_pointer, and calls init_reg_modes_target() | |
1618 to initialize reg_raw_mode[]. */ | |
1619 init_emit_regs (); | |
1620 | |
1621 /* This invokes target hooks to set fixed_reg[] etc, which is | |
1622 mode-dependent. */ | |
1623 init_regs (); | |
1624 | |
1625 /* This depends on stack_pointer_rtx. */ | |
1626 init_fake_stack_mems (); | |
1627 | |
1628 /* Sets static_base_value[HARD_FRAME_POINTER_REGNUM], which is | |
1629 mode-dependent. */ | |
1630 init_alias_target (); | |
1631 | |
1632 /* Depends on HARD_FRAME_POINTER_REGNUM. */ | |
1633 init_reload (); | |
1634 | |
1635 /* The following initialization functions need to generate rtl, so | |
1636 provide a dummy function context for them. */ | |
1637 init_dummy_function_start (); | |
1638 | |
1639 /* rtx_cost is mode-dependent, so cached values need to be recomputed | |
1640 on a mode change. */ | |
1641 init_expmed (); | |
1642 | |
1643 /* We may need to recompute regno_save_code[] and regno_restore_code[] | |
1644 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
|
1645 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
|
1646 |
0 | 1647 expand_dummy_function_end (); |
1648 } | |
1649 | |
1650 /* Initialize the compiler back end. This function is called only once, | |
1651 when starting the compiler. */ | |
1652 static void | |
1653 backend_init (void) | |
1654 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1655 init_emit_once (); |
0 | 1656 |
1657 init_rtlanal (); | |
1658 init_inline_once (); | |
1659 init_varasm_once (); | |
1660 save_register_info (); | |
1661 | |
1662 /* Initialize the target-specific back end pieces. */ | |
1663 ira_init_once (); | |
1664 backend_init_target (); | |
1665 } | |
1666 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1667 /* Initialize excess precision settings. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1668 static void |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1669 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
|
1670 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1671 /* Adjust excess precision handling based on the target options. If |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1672 the front end cannot handle it, flag_excess_precision_cmdline |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1673 will already have been set accordingly in the post_options |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1674 hook. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1675 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
|
1676 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
|
1677 if (flag_unsafe_math_optimizations) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1678 flag_excess_precision = EXCESS_PRECISION_FAST; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1679 if (flag_excess_precision == EXCESS_PRECISION_STANDARD) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1680 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1681 int flt_eval_method = TARGET_FLT_EVAL_METHOD; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1682 switch (flt_eval_method) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1683 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1684 case -1: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1685 case 0: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1686 /* Either the target acts unpredictably (-1) or has all the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1687 operations required not to have excess precision (0). */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1688 flag_excess_precision = EXCESS_PRECISION_FAST; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1689 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1690 case 1: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1691 case 2: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1692 /* In these cases, predictable excess precision makes |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1693 sense. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1694 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1695 default: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1696 /* Any other implementation-defined FLT_EVAL_METHOD values |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1697 require the compiler to handle the associated excess |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1698 precision rules in excess_precision_type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1699 gcc_unreachable (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1700 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1701 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1702 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1703 |
0 | 1704 /* Initialize things that are both lang-dependent and target-dependent. |
1705 This function can be called more than once if target parameters change. */ | |
1706 static void | |
1707 lang_dependent_init_target (void) | |
1708 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1709 /* 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
|
1710 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
|
1711 |
0 | 1712 /* This creates various _DECL nodes, so needs to be called after the |
1713 front end is initialized. It also depends on the HAVE_xxx macros | |
1714 generated from the target machine description. */ | |
1715 init_optabs (); | |
1716 | |
1717 /* The following initialization functions need to generate rtl, so | |
1718 provide a dummy function context for them. */ | |
1719 init_dummy_function_start (); | |
1720 | |
1721 /* Do the target-specific parts of expr initialization. */ | |
1722 init_expr_target (); | |
1723 | |
1724 /* Although the actions of these functions are language-independent, | |
1725 they use optabs, so we cannot call them from backend_init. */ | |
1726 init_set_costs (); | |
1727 ira_init (); | |
1728 | |
1729 expand_dummy_function_end (); | |
1730 } | |
1731 | |
1732 /* Language-dependent initialization. Returns nonzero on success. */ | |
1733 static int | |
1734 lang_dependent_init (const char *name) | |
1735 { | |
1736 location_t save_loc = input_location; | |
1737 if (dump_base_name == 0) | |
1738 dump_base_name = name && name[0] ? name : "gccdump"; | |
1739 | |
1740 /* Other front-end initialization. */ | |
1741 input_location = BUILTINS_LOCATION; | |
1742 if (lang_hooks.init () == 0) | |
1743 return 0; | |
1744 input_location = save_loc; | |
1745 | |
1746 init_asm_output (name); | |
1747 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1748 /* If stack usage information is desired, open the 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
|
1749 if (flag_stack_usage) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1750 stack_usage_file = open_auxiliary_file ("su"); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1751 |
0 | 1752 /* This creates various _DECL nodes, so needs to be called after the |
1753 front end is initialized. */ | |
1754 init_eh (); | |
1755 | |
1756 /* Do the target-specific parts of the initialization. */ | |
1757 lang_dependent_init_target (); | |
1758 | |
1759 /* If dbx symbol table desired, initialize writing it and output the | |
1760 predefined types. */ | |
1761 timevar_push (TV_SYMOUT); | |
1762 | |
1763 #if defined DWARF2_DEBUGGING_INFO || defined DWARF2_UNWIND_INFO | |
1764 if (dwarf2out_do_frame ()) | |
1765 dwarf2out_frame_init (); | |
1766 #endif | |
1767 | |
1768 /* Now we have the correct original filename, we can initialize | |
1769 debug output. */ | |
1770 (*debug_hooks->init) (name); | |
1771 | |
1772 timevar_pop (TV_SYMOUT); | |
1773 | |
1774 return 1; | |
1775 } | |
1776 | |
1777 | |
1778 /* Reinitialize everything when target parameters, such as register usage, | |
1779 have changed. */ | |
1780 void | |
1781 target_reinit (void) | |
1782 { | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1783 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
|
1784 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
|
1785 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1786 /* 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
|
1787 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
|
1788 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
|
1789 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
|
1790 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1791 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
|
1792 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
|
1793 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
|
1794 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1795 |
0 | 1796 /* Reinitialize RTL backend. */ |
1797 backend_init_target (); | |
1798 | |
1799 /* Reinitialize lang-dependent parts. */ | |
1800 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
|
1801 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1802 /* And restore it at the end, as free_after_compilation from |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1803 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
|
1804 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
|
1805 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1806 *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
|
1807 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
|
1808 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
|
1809 } |
0 | 1810 } |
1811 | |
1812 void | |
1813 dump_memory_report (bool final) | |
1814 { | |
1815 ggc_print_statistics (); | |
1816 stringpool_statistics (); | |
1817 dump_tree_statistics (); | |
1818 dump_gimple_statistics (); | |
1819 dump_rtx_statistics (); | |
1820 dump_alloc_pool_statistics (); | |
1821 dump_bitmap_statistics (); | |
1822 dump_vec_loc_statistics (); | |
1823 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
|
1824 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
|
1825 dump_pta_stats (stderr); |
0 | 1826 } |
1827 | |
1828 /* Clean up: close opened files, etc. */ | |
1829 | |
1830 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
|
1831 finalize (bool no_backend) |
0 | 1832 { |
1833 /* Close the dump files. */ | |
1834 if (flag_gen_aux_info) | |
1835 { | |
1836 fclose (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
|
1837 if (seen_error ()) |
0 | 1838 unlink (aux_info_file_name); |
1839 } | |
1840 | |
1841 /* Close non-debugging input and output files. Take special care to note | |
1842 whether fclose returns an error, since the pages might still be on the | |
1843 buffer chain while the file is open. */ | |
1844 | |
1845 if (asm_out_file) | |
1846 { | |
1847 if (ferror (asm_out_file) != 0) | |
1848 fatal_error ("error writing to %s: %m", asm_file_name); | |
1849 if (fclose (asm_out_file) != 0) | |
1850 fatal_error ("error closing %s: %m", asm_file_name); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1851 if (flag_wpa) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1852 unlink_if_ordinary (asm_file_name); |
0 | 1853 } |
1854 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1855 if (stack_usage_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
|
1856 fclose (stack_usage_file); |
0 | 1857 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1858 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
|
1859 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1860 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
|
1861 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1862 finish_optimization_passes (); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1863 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1864 ira_finish_once (); |
f6334be47118
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 } |
0 | 1866 |
1867 if (mem_report) | |
1868 dump_memory_report (true); | |
1869 | |
1870 /* Language-specific end of compilation actions. */ | |
1871 lang_hooks.finish (); | |
1872 } | |
1873 | |
1874 /* Initialize the compiler, and compile the input file. */ | |
1875 static void | |
1876 do_compile (void) | |
1877 { | |
1878 /* Initialize timing first. The C front ends read the main file in | |
1879 the post_options hook, and C++ does file timings. */ | |
1880 if (time_report || !quiet_flag || flag_detailed_statistics) | |
1881 timevar_init (); | |
1882 timevar_start (TV_TOTAL); | |
1883 | |
1884 process_options (); | |
1885 | |
1886 /* 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
|
1887 if (!seen_error ()) |
0 | 1888 { |
1889 /* This must be run always, because it is needed to compute the FP | |
1890 predefined macros, such as __LDBL_MAX__, for targets using non | |
1891 default FP formats. */ | |
1892 init_adjust_machine_modes (); | |
1893 | |
1894 /* Set up the back-end if requested. */ | |
1895 if (!no_backend) | |
1896 backend_init (); | |
1897 | |
1898 /* Language-dependent initialization. Returns true on success. */ | |
1899 if (lang_dependent_init (main_input_filename)) | |
1900 compile_file (); | |
1901 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1902 finalize (no_backend); |
0 | 1903 } |
1904 | |
1905 /* Stop timing and print the times. */ | |
1906 timevar_stop (TV_TOTAL); | |
1907 timevar_print (stderr); | |
1908 } | |
1909 | |
1910 /* Entry point of cc1, cc1plus, jc1, f771, etc. | |
1911 Exit code is FATAL_EXIT_CODE if can't open files or if there were | |
1912 any errors, or SUCCESS_EXIT_CODE if compilation succeeded. | |
1913 | |
1914 It is not safe to call this function more than once. */ | |
1915 | |
1916 int | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1917 toplev_main (int argc, char **argv) |
0 | 1918 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1919 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
|
1920 |
0 | 1921 /* Initialization of GCC's environment, and diagnostics. */ |
1922 general_init (argv[0]); | |
1923 | |
67
f6334be47118
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 /* 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
|
1925 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
|
1926 init_options_once (); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1927 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1928 /* 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
|
1929 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
|
1930 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
|
1931 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
|
1932 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1933 /* 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
|
1934 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
|
1935 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
|
1936 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
|
1937 &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
|
1938 &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
|
1939 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1940 /* 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
|
1941 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
|
1942 |
0 | 1943 /* Parse the options and do minimal processing; basically just |
1944 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
|
1945 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
|
1946 save_decoded_options, 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
|
1947 UNKNOWN_LOCATION, global_dc); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1948 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1949 handle_common_deferred_options (); |
0 | 1950 |
1951 init_local_tick (); | |
1952 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1953 initialize_plugins (); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1954 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1955 if (version_flag) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1956 print_version (stderr, ""); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1957 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1958 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
|
1959 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
|
1960 |
0 | 1961 /* Exit early if we can (e.g. -help). */ |
1962 if (!exit_after_options) | |
1963 do_compile (); | |
1964 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1965 if (warningcount || errorcount) |
0 | 1966 print_ignored_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
|
1967 diagnostic_finish (global_dc); |
0 | 1968 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1969 /* Invoke registered plugin callbacks if any. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1970 invoke_plugin_callbacks (PLUGIN_FINISH, NULL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1971 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
1972 finalize_plugins (); |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1973 if (seen_error ()) |
0 | 1974 return (FATAL_EXIT_CODE); |
1975 | |
1976 return (SUCCESS_EXIT_CODE); | |
1977 } |