|
|
1.1 root 1: /* Top level of GNU C compiler
2: Copyright (C) 1987, 1988, 1989, 1992 Free Software Foundation, Inc.
3:
4: This file is part of GNU CC.
5:
6: GNU CC is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: GNU CC is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GNU CC; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: /* This is the top level of cc1/c++.
22: It parses command args, opens files, invokes the various passes
23: in the proper order, and counts the time used by each.
24: Error messages and low-level interface to malloc also handled here. */
25:
26: #include "config.h"
27: #include <sys/types.h>
28: #include <stdio.h>
29: #include <signal.h>
30: #include <setjmp.h>
31:
32: #include <sys/stat.h>
33:
34: #ifdef USG
35: #undef FLOAT
36: #include <sys/param.h>
37: /* This is for hpux. It is a real screw. They should change hpux. */
38: #undef FLOAT
39: #include <sys/times.h>
40: #include <time.h> /* Correct for hpux at least. Is it good on other USG? */
41: #undef FFS /* Some systems define this in param.h. */
42: #else
43: #ifndef VMS
44: #include <sys/time.h>
45: #include <sys/resource.h>
46: #endif
47: #endif
48:
49: #include "input.h"
50: #include "tree.h"
51: /* #include "c-tree.h" */
52: #include "rtl.h"
53: #include "flags.h"
54: #include "insn-attr.h"
55:
56: #ifdef VMS
57: /* The extra parameters substantially improve the I/O performance. */
58: static FILE *
59: VMS_fopen (fname, type)
60: char * fname;
61: char * type;
62: {
63: if (strcmp (type, "w") == 0)
64: return fopen (fname, type, "mbc=16", "deq=64", "fop=tef", "shr=nil");
65: return fopen (fname, type, "mbc=16");
66: }
67: #define fopen VMS_fopen
68: #endif
69:
70: #ifndef DEFAULT_GDB_EXTENSIONS
71: #define DEFAULT_GDB_EXTENSIONS 1
72: #endif
73:
74: extern int rtx_equal_function_value_matters;
75:
76: extern char **environ;
77: extern char *version_string, *language_string;
78:
79: extern void init_lex ();
80: extern void init_decl_processing ();
81: extern void init_obstacks ();
82: extern void init_tree_codes ();
83: extern void init_rtl ();
84: extern void init_optabs ();
85: extern void init_stmt ();
86: extern void init_reg_sets ();
87: extern void dump_flow_info ();
88: extern void dump_sched_info ();
89: extern void dump_local_alloc ();
90:
91: void rest_of_decl_compilation ();
92: void error ();
93: void error_with_file_and_line ();
94: void fancy_abort ();
95: #ifndef abort
96: void abort ();
97: #endif
98: void set_target_switch ();
99: static void print_switch_values ();
100: static char *decl_name ();
101:
102: /* Name of program invoked, sans directories. */
103:
104: char *progname;
105:
106: /* Copy of arguments to main. */
107: int save_argc;
108: char **save_argv;
109:
110: /* Name of current original source file (what was input to cpp).
111: This comes from each #-command in the actual input. */
112:
113: char *input_filename;
114:
115: /* Name of top-level original source file (what was input to cpp).
116: This comes from the #-command at the beginning of the actual input.
117: If there isn't any there, then this is the cc1 input file name. */
118:
119: char *main_input_filename;
120:
121: /* Stream for reading from the input file. */
122:
123: FILE *finput;
124:
125: /* Current line number in real source file. */
126:
127: int lineno;
128:
129: /* Stack of currently pending input files. */
130:
131: struct file_stack *input_file_stack;
132:
133: /* Incremented on each change to input_file_stack. */
134: int input_file_stack_tick;
135:
136: /* FUNCTION_DECL for function now being parsed or compiled. */
137:
138: extern tree current_function_decl;
139:
140: /* Name to use as base of names for dump output files. */
141:
142: char *dump_base_name;
143:
144: /* Bit flags that specify the machine subtype we are compiling for.
145: Bits are tested using macros TARGET_... defined in the tm.h file
146: and set by `-m...' switches. Must be defined in rtlanal.c. */
147:
148: extern int target_flags;
149:
150: /* Flags saying which kinds of debugging dump have been requested. */
151:
152: int rtl_dump = 0;
153: int rtl_dump_and_exit = 0;
154: int jump_opt_dump = 0;
155: int cse_dump = 0;
156: int loop_dump = 0;
157: int cse2_dump = 0;
158: int flow_dump = 0;
159: int combine_dump = 0;
160: int sched_dump = 0;
161: int local_reg_dump = 0;
162: int global_reg_dump = 0;
163: int sched2_dump = 0;
164: int jump2_opt_dump = 0;
165: int dbr_sched_dump = 0;
166: int flag_print_asm_name = 0;
167: int stack_reg_dump = 0;
168:
169: /* Name for output file of assembly code, specified with -o. */
170:
171: char *asm_file_name;
172:
173: /* Value of the -G xx switch, and whether it was passed or not. */
174: int g_switch_value;
175: int g_switch_set;
176:
177: /* Type(s) of debugging information we are producing (if any).
178: See flags.h for the definitions of the different possible
179: types of debugging information. */
180: enum debug_info_type write_symbols = NO_DEBUG;
181:
182: /* Level of debugging information we are producing. See flags.h
183: for the definitions of the different possible levels. */
184: enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
185:
186: #ifdef DBX_DEBUGGING_INFO
187: /* Nonzero means can use our own extensions to DBX format.
188: Relevant only when write_symbols == DBX_DEBUG. */
189: int use_gdb_dbx_extensions = 0;
190: #endif
191:
192: /* Nonzero means do optimizations. -O.
193: Particular numeric values stand for particular amounts of optimization;
194: thus, -O2 stores 2 here. However, the optimizations beyond the basic
195: ones are not controlled directly by this variable. Instead, they are
196: controlled by individual `flag_...' variables that are defaulted
197: based on this variable. */
198:
199: int optimize = 0;
200:
201: /* Number of error messages and warning messages so far. */
202:
203: int errorcount = 0;
204: int warningcount = 0;
205: int sorrycount = 0;
206:
207: /* Pointer to function to compute the name to use to print a declaration. */
208:
209: char *(*decl_printable_name) ();
210:
211: /* Pointer to function to compute rtl for a language-specific tree code. */
212:
213: struct rtx_def *(*lang_expand_expr) ();
214:
215: /* Nonzero if generating code to do profiling. */
216:
217: int profile_flag = 0;
218:
219: /* Nonzero if generating code to do profiling on a line-by-line basis. */
220:
221: int profile_block_flag;
222:
223: /* Nonzero for -pedantic switch: warn about anything
224: that standard spec forbids. */
225:
226: int pedantic = 0;
227:
228: /* Temporarily suppress certain warnings.
229: This is set while reading code from a system header file. */
230:
231: int in_system_header = 0;
232:
233: /* Nonzero means do stupid register allocation.
234: Currently, this is 1 if `optimize' is 0. */
235:
236: int obey_regdecls = 0;
237:
238: /* Don't print functions as they are compiled and don't print
239: times taken by the various passes. -quiet. */
240:
241: int quiet_flag = 0;
242:
243: /* -f flags. */
244:
245: /* Nonzero means `char' should be signed. */
246:
247: int flag_signed_char;
248:
249: /* Nonzero means give an enum type only as many bytes as it needs. */
250:
251: int flag_short_enums;
252:
253: /* Nonzero for -fcaller-saves: allocate values in regs that need to
254: be saved across function calls, if that produces overall better code.
255: Optional now, so people can test it. */
256:
257: #ifdef DEFAULT_CALLER_SAVES
258: int flag_caller_saves = 1;
259: #else
260: int flag_caller_saves = 0;
261: #endif
262:
263: /* Nonzero for -fpcc-struct-return: return values the same way PCC does. */
264:
265: int flag_pcc_struct_return = 0;
266:
267: /* Nonzero for -fforce-mem: load memory value into a register
268: before arithmetic on it. This makes better cse but slower compilation. */
269:
270: int flag_force_mem = 0;
271:
272: /* Nonzero for -fforce-addr: load memory address into a register before
273: reference to memory. This makes better cse but slower compilation. */
274:
275: int flag_force_addr = 0;
276:
277: /* Nonzero for -fdefer-pop: don't pop args after each function call;
278: instead save them up to pop many calls' args with one insns. */
279:
280: int flag_defer_pop = 1;
281:
282: /* Nonzero for -ffloat-store: don't allocate floats and doubles
283: in extended-precision registers. */
284:
285: int flag_float_store = 0;
286:
287: /* Nonzero for -fcse-follow-jumps:
288: have cse follow jumps to do a more extensive job. */
289:
290: int flag_cse_follow_jumps;
291:
292: /* Nonzero for -fexpensive-optimizations:
293: perform miscellaneous relatively-expensive optimizations. */
294: int flag_expensive_optimizations;
295:
296: /* Nonzero for -fthread-jumps:
297: have jump optimize output of loop. */
298:
299: int flag_thread_jumps;
300:
301: /* Nonzero enables strength-reduction in loop.c. */
302:
303: int flag_strength_reduce = 0;
304:
305: /* Nonzero enables loop unrolling in unroll.c. Only loops for which the
306: number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
307: UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
308: unrolled. */
309:
310: int flag_unroll_loops;
311:
312: /* Nonzero enables loop unrolling in unroll.c. All loops are unrolled.
313: This is generally not a win. */
314:
315: int flag_unroll_all_loops;
316:
317: /* Nonzero for -fwritable-strings:
318: store string constants in data segment and don't uniquize them. */
319:
320: int flag_writable_strings = 0;
321:
322: /* Nonzero means don't put addresses of constant functions in registers.
323: Used for compiling the Unix kernel, where strange substitutions are
324: done on the assembly output. */
325:
326: int flag_no_function_cse = 0;
327:
328: /* Nonzero for -fomit-frame-pointer:
329: don't make a frame pointer in simple functions that don't require one. */
330:
331: int flag_omit_frame_pointer = 0;
332:
333: /* Nonzero to inhibit use of define_optimization peephole opts. */
334:
335: int flag_no_peephole = 0;
336:
337: /* Nonzero means all references through pointers are volatile. */
338:
339: int flag_volatile;
340:
341: /* Nonzero means just do syntax checking; don't output anything. */
342:
343: int flag_syntax_only = 0;
344:
345: /* Nonzero means to rerun cse after loop optimization. This increases
346: compilation time about 20% and picks up a few more common expressions. */
347:
348: static int flag_rerun_cse_after_loop;
349:
350: /* Nonzero for -finline-functions: ok to inline functions that look like
351: good inline candidates. */
352:
353: int flag_inline_functions;
354:
355: /* Nonzero for -fkeep-inline-functions: even if we make a function
356: go inline everywhere, keep its defintion around for debugging
357: purposes. */
358:
359: int flag_keep_inline_functions;
360:
361: /* Nonzero means that functions declared `inline' will be treated
362: as `static'. Prevents generation of zillions of copies of unused
363: static inline functions; instead, `inlines' are written out
364: only when actually used. Used in conjunction with -g. Also
365: does the right thing with #pragma interface. */
366:
367: int flag_no_inline;
368:
369: /* Nonzero means we should be saving declaration info into a .X file. */
370:
371: int flag_gen_aux_info = 0;
372:
373: /* Nonzero means make the text shared if supported. */
374:
375: int flag_shared_data;
376:
377: /* Nonzero means schedule into delayed branch slots if supported. */
378:
379: int flag_delayed_branch;
380:
381: /* Nonzero if we are compiling pure (sharable) code.
382: Value is 1 if we are doing reasonable (i.e. simple
383: offset into offset table) pic. Value is 2 if we can
384: only perform register offsets. */
385:
386: int flag_pic;
387:
388: /* Nonzero means place uninitialized global data in the bss section. */
389:
390: int flag_no_common;
391:
392: /* Nonzero means pretend it is OK to examine bits of target floats,
393: even if that isn't true. The resulting code will have incorrect constants,
394: but the same series of instructions that the native compiler would make. */
395:
396: int flag_pretend_float;
397:
398: /* Nonzero means change certain warnings into errors.
399: Usually these are warnings about failure to conform to some standard. */
400:
401: int flag_pedantic_errors = 0;
402:
403: /* flag_schedule_insns means schedule insns within basic blocks (before
404: local_alloc).
405: flag_schedule_insns_after_reload means schedule insns after
406: global_alloc. */
407:
408: int flag_schedule_insns = 0;
409: int flag_schedule_insns_after_reload = 0;
410:
411: /* -finhibit-size-directive inhibits output of .size for ELF.
412: This is used only for compiling crtstuff.c,
413: and it may be extended to other effects
414: needed for crtstuff.c on other systems. */
415: int flag_inhibit_size_directive = 0;
416:
417: /* -fgnu-linker specifies use of the GNU linker for initializations.
418: -fno-gnu-linker says that collect will be used. */
419: int flag_gnu_linker = 1;
420:
421: /* Table of language-independent -f options.
422: STRING is the option name. VARIABLE is the address of the variable.
423: ON_VALUE is the value to store in VARIABLE
424: if `-fSTRING' is seen as an option.
425: (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
426:
427: struct { char *string; int *variable; int on_value;} f_options[] =
428: {
429: {"float-store", &flag_float_store, 1},
430: {"volatile", &flag_volatile, 1},
431: {"defer-pop", &flag_defer_pop, 1},
432: {"omit-frame-pointer", &flag_omit_frame_pointer, 1},
433: {"cse-follow-jumps", &flag_cse_follow_jumps, 1},
434: {"expensive-optimizations", &flag_expensive_optimizations, 1},
435: {"thread-jumps", &flag_thread_jumps, 1},
436: {"strength-reduce", &flag_strength_reduce, 1},
437: {"unroll-loops", &flag_unroll_loops, 1},
438: {"unroll-all-loops", &flag_unroll_all_loops, 1},
439: {"writable-strings", &flag_writable_strings, 1},
440: {"peephole", &flag_no_peephole, 0},
441: {"force-mem", &flag_force_mem, 1},
442: {"force-addr", &flag_force_addr, 1},
443: {"function-cse", &flag_no_function_cse, 0},
444: {"inline-functions", &flag_inline_functions, 1},
445: {"keep-inline-functions", &flag_keep_inline_functions, 1},
446: {"inline", &flag_no_inline, 0},
447: {"syntax-only", &flag_syntax_only, 1},
448: {"gen-aux-info", &flag_gen_aux_info, 1},
449: {"shared-data", &flag_shared_data, 1},
450: {"caller-saves", &flag_caller_saves, 1},
451: {"pcc-struct-return", &flag_pcc_struct_return, 1},
452: {"delayed-branch", &flag_delayed_branch, 1},
453: {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1},
454: {"pretend-float", &flag_pretend_float, 1},
455: {"schedule-insns", &flag_schedule_insns, 1},
456: {"schedule-insns2", &flag_schedule_insns_after_reload, 1},
457: {"pic", &flag_pic, 1},
458: {"PIC", &flag_pic, 2},
459: {"common", &flag_no_common, 0},
460: {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
461: {"gnu-linker", &flag_gnu_linker, 1}
462: };
463:
464: /* Options controlling warnings */
465:
466: /* Don't print warning messages. -w. */
467:
468: int inhibit_warnings = 0;
469:
470: /* Print various extra warnings. -W. */
471:
472: int extra_warnings = 0;
473:
474: /* Treat warnings as errors. -Werror. */
475:
476: int warnings_are_errors = 0;
477:
478: /* Nonzero to warn about unused local variables. */
479:
480: int warn_unused;
481:
482: /* Nonzero to warn about variables used before they are initialized. */
483:
484: int warn_uninitialized;
485:
486: /* Nonzero means warn about all declarations which shadow others. */
487:
488: int warn_shadow;
489:
490: /* Warn if a switch on an enum fails to have a case for every enum value. */
491:
492: int warn_switch;
493:
494: /* Nonzero means warn about function definitions that default the return type
495: or that use a null return and have a return-type other than void. */
496:
497: int warn_return_type;
498:
499: /* Nonzero means warn about pointer casts that increase the required
500: alignment of the target type (and might therefore lead to a crash
501: due to a misaligned access). */
502:
503: int warn_cast_align;
504:
505: /* Nonzero means warn about any identifiers that match in the first N
506: characters. The value N is in `id_clash_len'. */
507:
508: int warn_id_clash;
509: int id_clash_len;
510:
511: /* Nonzero means warn if inline function is too large. */
512:
513: int warn_inline;
514:
515: /* Warn if a function returns an aggregate,
516: since there are often incompatible calling conventions for doing this. */
517:
518: int warn_aggregate_return;
519:
520: /* Likewise for -W. */
521:
522: struct { char *string; int *variable; int on_value;} W_options[] =
523: {
524: {"unused", &warn_unused, 1},
525: {"error", &warnings_are_errors, 1},
526: {"shadow", &warn_shadow, 1},
527: {"switch", &warn_switch, 1},
528: {"return-type", &warn_return_type, 1},
529: {"aggregate-return", &warn_aggregate_return, 1},
530: {"cast-align", &warn_cast_align, 1},
531: {"uninitialized", &warn_uninitialized, 1}
532: };
533:
534: /* Output files for assembler code (real compiler output)
535: and debugging dumps. */
536:
537: FILE *asm_out_file;
538: FILE *aux_info_file;
539: FILE *rtl_dump_file;
540: FILE *jump_opt_dump_file;
541: FILE *cse_dump_file;
542: FILE *loop_dump_file;
543: FILE *cse2_dump_file;
544: FILE *flow_dump_file;
545: FILE *combine_dump_file;
546: FILE *sched_dump_file;
547: FILE *local_reg_dump_file;
548: FILE *global_reg_dump_file;
549: FILE *sched2_dump_file;
550: FILE *jump2_opt_dump_file;
551: FILE *dbr_sched_dump_file;
552: FILE *stack_reg_dump_file;
553:
554: /* Time accumulators, to count the total time spent in various passes. */
555:
556: int parse_time;
557: int varconst_time;
558: int integration_time;
559: int jump_time;
560: int cse_time;
561: int loop_time;
562: int cse2_time;
563: int flow_time;
564: int combine_time;
565: int sched_time;
566: int local_alloc_time;
567: int global_alloc_time;
568: int sched2_time;
569: int dbr_sched_time;
570: int shorten_branch_time;
571: int stack_reg_time;
572: int final_time;
573: int symout_time;
574: int dump_time;
575:
576: /* Return time used so far, in microseconds. */
577:
578: int
579: get_run_time ()
580: {
581: #ifdef USG
582: struct tms tms;
583: #else
584: #ifndef VMS
585: struct rusage rusage;
586: #else /* VMS */
587: struct
588: {
589: int proc_user_time;
590: int proc_system_time;
591: int child_user_time;
592: int child_system_time;
593: } vms_times;
594: #endif
595: #endif
596:
597: if (quiet_flag)
598: return 0;
599:
600: #ifdef USG
601: times (&tms);
602: return (tms.tms_utime + tms.tms_stime) * (1000000 / HZ);
603: #else
604: #ifndef VMS
605: getrusage (0, &rusage);
606: return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec
607: + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec);
608: #else /* VMS */
609: times (&vms_times);
610: return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000;
611: #endif
612: #endif
613: }
614:
615: #define TIMEVAR(VAR, BODY) \
616: do { int otime = get_run_time (); BODY; VAR += get_run_time () - otime; } while (0)
617:
618: void
619: print_time (str, total)
620: char *str;
621: int total;
622: {
623: fprintf (stderr,
624: "time in %s: %d.%06d\n",
625: str, total / 1000000, total % 1000000);
626: }
627:
628: /* Count an error or warning. Return 1 if the message should be printed. */
629:
630: int
631: count_error (warningp)
632: int warningp;
633: {
634: if (warningp && inhibit_warnings)
635: return 0;
636:
637: if (warningp && !warnings_are_errors)
638: warningcount++;
639: else
640: {
641: static int warning_message = 0;
642:
643: if (warningp && !warning_message)
644: {
645: fprintf (stderr, "%s: warnings being treated as errors\n", progname);
646: warning_message = 1;
647: }
648: errorcount++;
649: }
650:
651: return 1;
652: }
653:
654: /* Print a fatal error message. NAME is the text.
655: Also include a system error message based on `errno'. */
656:
657: void
658: pfatal_with_name (name)
659: char *name;
660: {
661: fprintf (stderr, "%s: ", progname);
662: perror (name);
663: exit (35);
664: }
665:
666: void
667: fatal_io_error (name)
668: char *name;
669: {
670: fprintf (stderr, "%s: %s: I/O error\n", progname, name);
671: exit (35);
672: }
673:
674: void
675: fatal (s, v)
676: char *s;
677: int v;
678: {
679: error (s, v);
680: exit (34);
681: }
682:
683: /* Called to give a better error message when we don't have an insn to match
684: what we are looking for or if the insn's constraints aren't satisfied,
685: rather than just calling abort(). */
686:
687: void
688: fatal_insn_not_found (insn)
689: rtx insn;
690: {
691: if (INSN_CODE (insn) < 0)
692: error ("internal error--unrecognizable insn:", 0);
693: else
694: error ("internal error--insn does not satisfy its constraints:", 0);
695: debug_rtx (insn);
696: if (asm_out_file)
697: fflush (asm_out_file);
698: if (aux_info_file)
699: fflush (aux_info_file);
700: if (rtl_dump_file)
701: fflush (rtl_dump_file);
702: if (jump_opt_dump_file)
703: fflush (jump_opt_dump_file);
704: if (cse_dump_file)
705: fflush (cse_dump_file);
706: if (loop_dump_file)
707: fflush (loop_dump_file);
708: if (cse2_dump_file)
709: fflush (cse2_dump_file);
710: if (flow_dump_file)
711: fflush (flow_dump_file);
712: if (combine_dump_file)
713: fflush (combine_dump_file);
714: if (sched_dump_file)
715: fflush (sched_dump_file);
716: if (local_reg_dump_file)
717: fflush (local_reg_dump_file);
718: if (global_reg_dump_file)
719: fflush (global_reg_dump_file);
720: if (sched2_dump_file)
721: fflush (sched2_dump_file);
722: if (jump2_opt_dump_file)
723: fflush (jump2_opt_dump_file);
724: if (dbr_sched_dump_file)
725: fflush (dbr_sched_dump_file);
726: if (stack_reg_dump_file)
727: fflush (stack_reg_dump_file);
728: abort ();
729: }
730:
731: /* This is the default decl_printable_name function. */
732:
733: static char *
734: decl_name (decl, kind)
735: tree decl;
736: char **kind;
737: {
738: return IDENTIFIER_POINTER (DECL_NAME (decl));
739: }
740:
741: static int need_error_newline;
742:
743: /* Function of last error message;
744: more generally, function such that if next error message is in it
745: then we don't have to mention the function name. */
746: static tree last_error_function = NULL;
747:
748: /* Used to detect when input_file_stack has changed since last described. */
749: static int last_error_tick;
750:
751: /* Called when the start of a function definition is parsed,
752: this function prints on stderr the name of the function. */
753:
754: void
755: announce_function (decl)
756: tree decl;
757: {
758: if (! quiet_flag)
759: {
760: char *junk;
761: if (rtl_dump_and_exit)
762: fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
763: else
764: fprintf (stderr, " %s", (*decl_printable_name) (decl, &junk));
765: fflush (stderr);
766: need_error_newline = 1;
767: last_error_function = current_function_decl;
768: }
769: }
770:
771: /* Prints out, if necessary, the name of the current function
772: which caused an error. Called from all error and warning functions. */
773:
774: void
775: report_error_function (file)
776: char *file;
777: {
778: struct file_stack *p;
779:
780: if (need_error_newline)
781: {
782: fprintf (stderr, "\n");
783: need_error_newline = 0;
784: }
785:
786: if (last_error_function != current_function_decl)
787: {
788: char *kind = "function";
789: if (current_function_decl != 0
790: && TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
791: kind = "method";
792:
793: if (file)
794: fprintf (stderr, "%s: ", file);
795:
796: if (current_function_decl == NULL)
797: fprintf (stderr, "At top level:\n");
798: else
799: {
800: char *name = (*decl_printable_name) (current_function_decl, &kind);
801: fprintf (stderr, "In %s `%s':\n", kind, name);
802: }
803:
804: last_error_function = current_function_decl;
805: }
806: if (input_file_stack && input_file_stack->next != 0
807: && input_file_stack_tick != last_error_tick)
808: {
809: fprintf (stderr, "In file included");
810: for (p = input_file_stack->next; p; p = p->next)
811: {
812: fprintf (stderr, " from %s:%d", p->name, p->line);
813: if (p->next)
814: fprintf (stderr, ",");
815: }
816: fprintf (stderr, ":\n");
817: last_error_tick = input_file_stack_tick;
818: }
819: }
820:
821: /* Report an error at the current line number.
822: S and V are a string and an arg for `printf'. */
823:
824: void
825: error (s, v, v2)
826: char *s;
827: int v; /* @@also used as pointer */
828: int v2; /* @@also used as pointer */
829: {
830: error_with_file_and_line (input_filename, lineno, s, v, v2);
831: }
832:
833: /* Report an error at line LINE of file FILE.
834: S and V are a string and an arg for `printf'. */
835:
836: void
837: error_with_file_and_line (file, line, s, v, v2)
838: char *file;
839: int line;
840: char *s;
841: int v;
842: int v2;
843: {
844: count_error (0);
845:
846: report_error_function (file);
847:
848: if (file)
849: fprintf (stderr, "%s:%d: ", file, line);
850: else
851: fprintf (stderr, "%s: ", progname);
852: fprintf (stderr, s, v, v2);
853: fprintf (stderr, "\n");
854: }
855:
856: /* Report an error at the declaration DECL.
857: S and V are a string and an arg which uses %s to substitute the declaration name. */
858:
859: void
860: error_with_decl (decl, s, v)
861: tree decl;
862: char *s;
863: int v;
864: {
865: char *junk;
866: count_error (0);
867:
868: report_error_function (DECL_SOURCE_FILE (decl));
869:
870: fprintf (stderr, "%s:%d: ",
871: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
872:
873: if (DECL_NAME (decl))
874: fprintf (stderr, s, (*decl_printable_name) (decl, &junk), v);
875: else
876: fprintf (stderr, s, "((anonymous))", v);
877: fprintf (stderr, "\n");
878: }
879:
880: /* Report an error at the line number of the insn INSN.
881: S and V are a string and an arg for `printf'.
882: This is used only when INSN is an `asm' with operands,
883: and each ASM_OPERANDS records its own source file and line. */
884:
885: void
886: error_for_asm (insn, s, v, v2)
887: rtx insn;
888: char *s;
889: int v; /* @@also used as pointer */
890: int v2; /* @@also used as pointer */
891: {
892: char *filename;
893: int line;
894: rtx body = PATTERN (insn);
895: rtx asmop;
896:
897: /* Find the (or one of the) ASM_OPERANDS in the insn. */
898: if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
899: asmop = SET_SRC (body);
900: else if (GET_CODE (body) == ASM_OPERANDS)
901: asmop = body;
902: else if (GET_CODE (body) == PARALLEL
903: && GET_CODE (XVECEXP (body, 0, 0)) == SET)
904: asmop = SET_SRC (XVECEXP (body, 0, 0));
905: else if (GET_CODE (body) == PARALLEL
906: && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
907: asmop = XVECEXP (body, 0, 0);
908:
909: filename = ASM_OPERANDS_SOURCE_FILE (asmop);
910: line = ASM_OPERANDS_SOURCE_LINE (asmop);
911:
912: error_with_file_and_line (filename, line, s, v, v2);
913: }
914:
915: /* Report a warning at line LINE.
916: S and V are a string and an arg for `printf'. */
917:
918: void
919: warning_with_file_and_line (file, line, s, v, v2, v3)
920: char *file;
921: int line;
922: char *s;
923: int v;
924: int v2;
925: int v3;
926: {
927: if (count_error (1) == 0)
928: return;
929:
930: report_error_function (file);
931:
932: if (file)
933: fprintf (stderr, "%s:%d: ", file, line);
934: else
935: fprintf (stderr, "%s: ", progname);
936:
937: fprintf (stderr, "warning: ");
938: fprintf (stderr, s, v, v2, v3);
939: fprintf (stderr, "\n");
940: }
941:
942: /* Report a warning at the current line number.
943: S and V are a string and an arg for `printf'. */
944:
945: void
946: warning (s, v, v2, v3)
947: char *s;
948: int v; /* @@also used as pointer */
949: int v2;
950: int v3;
951: {
952: warning_with_file_and_line (input_filename, lineno, s, v, v2, v3);
953: }
954:
955: /* Report a warning at the declaration DECL.
956: S is string which uses %s to substitute the declaration name.
957: V is a second parameter that S can refer to. */
958:
959: void
960: warning_with_decl (decl, s, v)
961: tree decl;
962: char *s;
963: int v;
964: {
965: char *junk;
966:
967: if (count_error (1) == 0)
968: return;
969:
970: report_error_function (DECL_SOURCE_FILE (decl));
971:
972: fprintf (stderr, "%s:%d: ",
973: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
974:
975: fprintf (stderr, "warning: ");
976: if (DECL_NAME (decl))
977: fprintf (stderr, s, (*decl_printable_name) (decl, &junk), v);
978: else
979: fprintf (stderr, s, "((anonymous))", v);
980: fprintf (stderr, "\n");
981: }
982:
983: /* Report a warning at the line number of the insn INSN.
984: S and V are a string and an arg for `printf'.
985: This is used only when INSN is an `asm' with operands,
986: and each ASM_OPERANDS records its own source file and line. */
987:
988: void
989: warning_for_asm (insn, s, v, v2)
990: rtx insn;
991: char *s;
992: int v; /* @@also used as pointer */
993: int v2; /* @@also used as pointer */
994: {
995: char *filename;
996: int line;
997: rtx body = PATTERN (insn);
998: rtx asmop;
999:
1000: /* Find the (or one of the) ASM_OPERANDS in the insn. */
1001: if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1002: asmop = SET_SRC (body);
1003: else if (GET_CODE (body) == ASM_OPERANDS)
1004: asmop = body;
1005: else if (GET_CODE (body) == PARALLEL
1006: && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1007: asmop = SET_SRC (XVECEXP (body, 0, 0));
1008: else if (GET_CODE (body) == PARALLEL
1009: && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1010: asmop = XVECEXP (body, 0, 0);
1011:
1012: filename = ASM_OPERANDS_SOURCE_FILE (asmop);
1013: line = ASM_OPERANDS_SOURCE_LINE (asmop);
1014:
1015: warning_with_file_and_line (filename, line, s, v, v2);
1016: }
1017:
1018: /* These functions issue either warnings or errors depending on
1019: -pedantic-errors. */
1020:
1021: void
1022: pedwarn (s, v, v2)
1023: char *s;
1024: int v; /* @@also used as pointer */
1025: int v2;
1026: {
1027: if (flag_pedantic_errors)
1028: error (s, v, v2);
1029: else
1030: warning (s, v, v2);
1031: }
1032:
1033: void
1034: pedwarn_with_decl (decl, s, v)
1035: tree decl;
1036: char *s;
1037: int v;
1038: {
1039: if (flag_pedantic_errors)
1040: error_with_decl (decl, s, v);
1041: else
1042: warning_with_decl (decl, s, v);
1043: }
1044:
1045: void
1046: pedwarn_with_file_and_line (file, line, s, v, v2)
1047: char *file;
1048: int line;
1049: char *s;
1050: int v;
1051: int v2;
1052: {
1053: if (flag_pedantic_errors)
1054: error_with_file_and_line (file, line, s, v, v2);
1055: else
1056: warning_with_file_and_line (file, line, s, v, v2);
1057: }
1058:
1059: /* Apologize for not implementing some feature.
1060: S, V, and V2 are a string and args for `printf'. */
1061:
1062: void
1063: sorry (s, v, v2)
1064: char *s;
1065: int v, v2;
1066: {
1067: sorrycount++;
1068: if (input_filename)
1069: fprintf (stderr, "%s:%d: ", input_filename, lineno);
1070: else
1071: fprintf (stderr, "%s: ", progname);
1072:
1073: fprintf (stderr, "sorry, not implemented: ");
1074: fprintf (stderr, s, v, v2);
1075: fprintf (stderr, "\n");
1076: }
1077:
1078: /* Apologize for not implementing some feature, then quit.
1079: S, V, and V2 are a string and args for `printf'. */
1080:
1081: void
1082: really_sorry (s, v, v2)
1083: char *s;
1084: int v, v2;
1085: {
1086: if (input_filename)
1087: fprintf (stderr, "%s:%d: ", input_filename, lineno);
1088: else
1089: fprintf (stderr, "c++: ");
1090:
1091: fprintf (stderr, "sorry, not implemented: ");
1092: fprintf (stderr, s, v, v2);
1093: fatal (" (fatal)\n");
1094: }
1095:
1096: /* More 'friendly' abort that prints the line and file.
1097: config.h can #define abort fancy_abort if you like that sort of thing.
1098:
1099: I don't think this is actually a good idea.
1100: Other sorts of crashes will look a certain way.
1101: It is a good thing if crashes from calling abort look the same way.
1102: -- RMS */
1103:
1104: void
1105: fancy_abort ()
1106: {
1107: fatal ("internal gcc abort");
1108: }
1109:
1110: /* This calls abort and is used to avoid problems when abort if a macro.
1111: It is used when we need to pass the address of abort. */
1112:
1113: void
1114: do_abort ()
1115: {
1116: abort ();
1117: }
1118:
1119: /* When `malloc.c' is compiled with `rcheck' defined,
1120: it calls this function to report clobberage. */
1121:
1122: void
1123: botch (s)
1124: {
1125: abort ();
1126: }
1127:
1128: /* Same as `malloc' but report error if no memory available. */
1129:
1130: int
1131: xmalloc (size)
1132: unsigned size;
1133: {
1134: register int value = (int) malloc (size);
1135: if (value == 0)
1136: fatal ("virtual memory exhausted");
1137: return value;
1138: }
1139:
1140: /* Same as `realloc' but report error if no memory available. */
1141:
1142: int
1143: xrealloc (ptr, size)
1144: char *ptr;
1145: int size;
1146: {
1147: int result = realloc (ptr, size);
1148: if (!result)
1149: fatal ("virtual memory exhausted");
1150: return result;
1151: }
1152:
1153: /* Return the logarithm of X, base 2, considering X unsigned,
1154: if X is a power of 2. Otherwise, returns -1. */
1155:
1156: int
1157: exact_log2 (x)
1158: register unsigned int x;
1159: {
1160: register int log = 0;
1161: /* Test for 0 or a power of 2. */
1162: if (x == 0 || x != (x & -x))
1163: return -1;
1164: while ((x >>= 1) != 0)
1165: log++;
1166: return log;
1167: }
1168:
1169: /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1170: If X is 0, return -1. */
1171:
1172: int
1173: floor_log2 (x)
1174: register unsigned int x;
1175: {
1176: register int log = -1;
1177: while (x != 0)
1178: log++,
1179: x >>= 1;
1180: return log;
1181: }
1182:
1183: int float_handled;
1184: jmp_buf float_handler;
1185:
1186: /* Specify where to longjmp to when a floating arithmetic error happens.
1187: If HANDLER is 0, it means don't handle the errors any more. */
1188:
1189: void
1190: set_float_handler (handler)
1191: jmp_buf handler;
1192: {
1193: float_handled = (handler != 0);
1194: if (handler)
1195: bcopy (handler, float_handler, sizeof (float_handler));
1196: }
1197:
1198: /* Signals actually come here. */
1199:
1200: static void
1201: float_signal (signo)
1202: /* If this is missing, some compilers complain. */
1203: int signo;
1204: {
1205: if (float_handled == 0)
1206: abort ();
1207: #if defined (USG) || defined (hpux)
1208: signal (SIGFPE, float_signal); /* re-enable the signal catcher */
1209: #endif
1210: float_handled = 0;
1211: signal (SIGFPE, float_signal);
1212: longjmp (float_handler, 1);
1213: }
1214:
1215: /* Handler for SIGPIPE. */
1216:
1217: static void
1218: pipe_closed (signo)
1219: /* If this is missing, some compilers complain. */
1220: int signo;
1221: {
1222: fatal ("output pipe has been closed");
1223: }
1224:
1225: /* Strip off a legitimate source ending from the input string NAME of
1226: length LEN. */
1227:
1228: void
1229: strip_off_ending (name, len)
1230: char *name;
1231: int len;
1232: {
1233: if (len > 2 && ! strcmp (".c", name + len - 2))
1234: name[len - 2] = 0;
1235: else if (len > 2 && ! strcmp (".m", name + len - 2))
1236: name[len - 2] = 0;
1237: else if (len > 2 && ! strcmp (".i", name + len - 2))
1238: name[len - 2] = 0;
1239: else if (len > 3 && ! strcmp (".ii", name + len - 3))
1240: name[len - 3] = 0;
1241: else if (len > 3 && ! strcmp (".co", name + len - 3))
1242: name[len - 3] = 0;
1243: else if (len > 3 && ! strcmp (".cc", name + len - 3))
1244: name[len - 3] = 0;
1245: else if (len > 2 && ! strcmp (".f", name + len - 2))
1246: name[len - 2] = 0;
1247: else if (len > 4 && ! strcmp (".ada", name + len - 4))
1248: name[len - 4] = 0;
1249: }
1250:
1251: /* Output a file name in the form wanted by System V. */
1252:
1253: void
1254: output_file_directive (asm_file, input_name)
1255: FILE *asm_file;
1256: char *input_name;
1257: {
1258: int len = strlen (input_name);
1259: char *na = input_name + len;
1260:
1261: /* NA gets INPUT_NAME sans directory names. */
1262: while (na > input_name)
1263: {
1264: if (na[-1] == '/')
1265: break;
1266: na--;
1267: }
1268:
1269: #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1270: ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1271: #else
1272: #ifdef ASM_OUTPUT_SOURCE_FILENAME
1273: ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1274: #else
1275: fprintf (asm_file, "\t.file\t\"%s\"\n", na);
1276: #endif
1277: #endif
1278: }
1279:
1280: /* Compile an entire file of output from cpp, named NAME.
1281: Write a file of assembly output and various debugging dumps. */
1282:
1283: static void
1284: compile_file (name)
1285: char *name;
1286: {
1287: tree globals;
1288: int start_time;
1289: int dump_base_name_length;
1290: char *aux_info_file_name;
1291:
1292: int name_specified = name != 0;
1293:
1294: if (dump_base_name == 0)
1295: dump_base_name = name ? name : "gccdump";
1296: dump_base_name_length = strlen (dump_base_name);
1297:
1298: parse_time = 0;
1299: varconst_time = 0;
1300: integration_time = 0;
1301: jump_time = 0;
1302: cse_time = 0;
1303: loop_time = 0;
1304: cse2_time = 0;
1305: flow_time = 0;
1306: combine_time = 0;
1307: sched_time = 0;
1308: local_alloc_time = 0;
1309: global_alloc_time = 0;
1310: sched2_time = 0;
1311: dbr_sched_time = 0;
1312: shorten_branch_time = 0;
1313: stack_reg_time = 0;
1314: final_time = 0;
1315: symout_time = 0;
1316: dump_time = 0;
1317:
1318: /* Open input file. */
1319:
1320: if (name == 0 || !strcmp (name, "-"))
1321: {
1322: finput = stdin;
1323: name = "stdin";
1324: }
1325: else
1326: finput = fopen (name, "r");
1327: if (finput == 0)
1328: pfatal_with_name (name);
1329:
1330: /* Initialize data in various passes. */
1331:
1332: init_obstacks ();
1333: init_tree_codes ();
1334: init_lex ();
1335: init_rtl ();
1336: init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
1337: || debug_info_level == DINFO_LEVEL_VERBOSE);
1338: init_decl_processing ();
1339: init_optabs ();
1340: init_stmt ();
1341: init_expmed ();
1342: init_loop ();
1343: init_reload ();
1344:
1345: if (flag_caller_saves)
1346: init_caller_save ();
1347:
1348: /* If auxilliary info generation is desired, open the output file. */
1349: if (flag_gen_aux_info)
1350: {
1351: aux_info_file_name = (char *) xmalloc (dump_base_name_length + 6);
1352: strcpy (aux_info_file_name, dump_base_name);
1353: strcat (aux_info_file_name, ".X");
1354: aux_info_file = fopen (aux_info_file_name, "w");
1355: if (aux_info_file == 0)
1356: pfatal_with_name (aux_info_file_name);
1357: }
1358:
1359: /* If rtl dump desired, open the output file. */
1360: if (rtl_dump)
1361: {
1362: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1363: strcpy (dumpname, dump_base_name);
1364: strcat (dumpname, ".rtl");
1365: rtl_dump_file = fopen (dumpname, "w");
1366: if (rtl_dump_file == 0)
1367: pfatal_with_name (dumpname);
1368: }
1369:
1370: /* If jump_opt dump desired, open the output file. */
1371: if (jump_opt_dump)
1372: {
1373: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1374: strcpy (dumpname, dump_base_name);
1375: strcat (dumpname, ".jump");
1376: jump_opt_dump_file = fopen (dumpname, "w");
1377: if (jump_opt_dump_file == 0)
1378: pfatal_with_name (dumpname);
1379: }
1380:
1381: /* If cse dump desired, open the output file. */
1382: if (cse_dump)
1383: {
1384: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1385: strcpy (dumpname, dump_base_name);
1386: strcat (dumpname, ".cse");
1387: cse_dump_file = fopen (dumpname, "w");
1388: if (cse_dump_file == 0)
1389: pfatal_with_name (dumpname);
1390: }
1391:
1392: /* If loop dump desired, open the output file. */
1393: if (loop_dump)
1394: {
1395: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1396: strcpy (dumpname, dump_base_name);
1397: strcat (dumpname, ".loop");
1398: loop_dump_file = fopen (dumpname, "w");
1399: if (loop_dump_file == 0)
1400: pfatal_with_name (dumpname);
1401: }
1402:
1403: /* If cse2 dump desired, open the output file. */
1404: if (cse2_dump)
1405: {
1406: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1407: strcpy (dumpname, dump_base_name);
1408: strcat (dumpname, ".cse2");
1409: cse2_dump_file = fopen (dumpname, "w");
1410: if (cse2_dump_file == 0)
1411: pfatal_with_name (dumpname);
1412: }
1413:
1414: /* If flow dump desired, open the output file. */
1415: if (flow_dump)
1416: {
1417: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1418: strcpy (dumpname, dump_base_name);
1419: strcat (dumpname, ".flow");
1420: flow_dump_file = fopen (dumpname, "w");
1421: if (flow_dump_file == 0)
1422: pfatal_with_name (dumpname);
1423: }
1424:
1425: /* If combine dump desired, open the output file. */
1426: if (combine_dump)
1427: {
1428: register char *dumpname = (char *) xmalloc (dump_base_name_length + 10);
1429: strcpy (dumpname, dump_base_name);
1430: strcat (dumpname, ".combine");
1431: combine_dump_file = fopen (dumpname, "w");
1432: if (combine_dump_file == 0)
1433: pfatal_with_name (dumpname);
1434: }
1435:
1436: /* If scheduling dump desired, open the output file. */
1437: if (sched_dump)
1438: {
1439: register char *dumpname = (char *) xmalloc (dump_base_name_length + 7);
1440: strcpy (dumpname, dump_base_name);
1441: strcat (dumpname, ".sched");
1442: sched_dump_file = fopen (dumpname, "w");
1443: if (sched_dump_file == 0)
1444: pfatal_with_name (dumpname);
1445: }
1446:
1447: /* If local_reg dump desired, open the output file. */
1448: if (local_reg_dump)
1449: {
1450: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1451: strcpy (dumpname, dump_base_name);
1452: strcat (dumpname, ".lreg");
1453: local_reg_dump_file = fopen (dumpname, "w");
1454: if (local_reg_dump_file == 0)
1455: pfatal_with_name (dumpname);
1456: }
1457:
1458: /* If global_reg dump desired, open the output file. */
1459: if (global_reg_dump)
1460: {
1461: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1462: strcpy (dumpname, dump_base_name);
1463: strcat (dumpname, ".greg");
1464: global_reg_dump_file = fopen (dumpname, "w");
1465: if (global_reg_dump_file == 0)
1466: pfatal_with_name (dumpname);
1467: }
1468:
1469: /* If 2nd scheduling dump desired, open the output file. */
1470: if (sched2_dump)
1471: {
1472: register char *dumpname = (char *) xmalloc (dump_base_name_length + 8);
1473: strcpy (dumpname, dump_base_name);
1474: strcat (dumpname, ".sched2");
1475: sched2_dump_file = fopen (dumpname, "w");
1476: if (sched2_dump_file == 0)
1477: pfatal_with_name (dumpname);
1478: }
1479:
1480: /* If jump2_opt dump desired, open the output file. */
1481: if (jump2_opt_dump)
1482: {
1483: register char *dumpname = (char *) xmalloc (dump_base_name_length + 7);
1484: strcpy (dumpname, dump_base_name);
1485: strcat (dumpname, ".jump2");
1486: jump2_opt_dump_file = fopen (dumpname, "w");
1487: if (jump2_opt_dump_file == 0)
1488: pfatal_with_name (dumpname);
1489: }
1490:
1491: /* If dbr_sched dump desired, open the output file. */
1492: if (dbr_sched_dump)
1493: {
1494: register char *dumpname = (char *) xmalloc (dump_base_name_length + 7);
1495: strcpy (dumpname, dump_base_name);
1496: strcat (dumpname, ".dbr");
1497: dbr_sched_dump_file = fopen (dumpname, "w");
1498: if (dbr_sched_dump_file == 0)
1499: pfatal_with_name (dumpname);
1500: }
1501:
1502: #ifdef STACK_REGS
1503:
1504: /* If stack_reg dump desired, open the output file. */
1505: if (stack_reg_dump)
1506: {
1507: register char *dumpname = (char *) xmalloc (dump_base_name_length + 10);
1508: strcpy (dumpname, dump_base_name);
1509: strcat (dumpname, ".stack");
1510: stack_reg_dump_file = fopen (dumpname, "w");
1511: if (stack_reg_dump_file == 0)
1512: pfatal_with_name (dumpname);
1513: }
1514:
1515: #endif
1516:
1517: /* Open assembler code output file. */
1518:
1519: if (! name_specified && asm_file_name == 0)
1520: asm_out_file = stdout;
1521: else
1522: {
1523: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1524: int len = strlen (dump_base_name);
1525: strcpy (dumpname, dump_base_name);
1526: strip_off_ending (dumpname, len);
1527: strcat (dumpname, ".s");
1528: if (asm_file_name == 0)
1529: {
1530: asm_file_name = (char *) xmalloc (strlen (dumpname) + 1);
1531: strcpy (asm_file_name, dumpname);
1532: }
1533: if (!strcmp (asm_file_name, "-"))
1534: asm_out_file = stdout;
1535: else
1536: asm_out_file = fopen (asm_file_name, "w");
1537: if (asm_out_file == 0)
1538: pfatal_with_name (asm_file_name);
1539: }
1540:
1541: input_filename = name;
1542:
1543: /* Perform language-specific initialization.
1544: This may set main_input_filename. */
1545: lang_init ();
1546:
1547: /* If the input doesn't start with a #line, use the input name
1548: as the official input file name. */
1549: if (main_input_filename == 0)
1550: main_input_filename = name;
1551:
1552: /* Put an entry on the input file stack for the main input file. */
1553: input_file_stack
1554: = (struct file_stack *) xmalloc (sizeof (struct file_stack));
1555: input_file_stack->next = 0;
1556: input_file_stack->name = input_filename;
1557:
1558: ASM_FILE_START (asm_out_file);
1559:
1560: /* Output something to inform GDB that this compilation was by GCC. */
1561: #ifndef ASM_IDENTIFY_GCC
1562: fprintf (asm_out_file, "gcc2_compiled.:\n");
1563: #else
1564: ASM_IDENTIFY_GCC (asm_out_file);
1565: #endif
1566: /* Don't let the first function fall at the same address
1567: as gcc_compiled., if profiling. */
1568: if (profile_flag || profile_block_flag)
1569: assemble_zeros (UNITS_PER_WORD);
1570:
1571: /* If dbx symbol table desired, initialize writing it
1572: and output the predefined types. */
1573: #ifdef DBX_DEBUGGING_INFO
1574: if (write_symbols == DBX_DEBUG)
1575: TIMEVAR (symout_time, dbxout_init (asm_out_file, main_input_filename,
1576: getdecls ()));
1577: #endif
1578: #ifdef SDB_DEBUGGING_INFO
1579: if (write_symbols == SDB_DEBUG)
1580: TIMEVAR (symout_time, sdbout_init (asm_out_file, main_input_filename,
1581: getdecls ()));
1582: #endif
1583: #ifdef DWARF_DEBUGGING_INFO
1584: if (write_symbols == DWARF_DEBUG)
1585: TIMEVAR (symout_time, dwarfout_init (asm_out_file, main_input_filename));
1586: #endif
1587:
1588: /* Initialize yet another pass. */
1589:
1590: init_final (main_input_filename);
1591:
1592: start_time = get_run_time ();
1593:
1594: /* Call the parser, which parses the entire file
1595: (calling rest_of_compilation for each function). */
1596:
1597: if (yyparse () != 0)
1598: if (errorcount == 0)
1599: fprintf (stderr, "Errors detected in input file (your bison.simple is out of date)");
1600:
1601: /* Compilation is now finished except for writing
1602: what's left of the symbol table output. */
1603:
1604: parse_time += get_run_time () - start_time;
1605:
1606: parse_time -= integration_time;
1607: parse_time -= varconst_time;
1608:
1609: globals = getdecls ();
1610:
1611: /* Really define vars that have had only a tentative definition.
1612: Really output inline functions that must actually be callable
1613: and have not been output so far. */
1614:
1615: {
1616: int len = list_length (globals);
1617: tree *vec = (tree *) alloca (sizeof (tree) * len);
1618: int i;
1619: tree decl;
1620:
1621: /* Process the decls in reverse order--earliest first.
1622: Put them into VEC from back to front, then take out from front. */
1623:
1624: for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
1625: vec[len - i - 1] = decl;
1626:
1627: for (i = 0; i < len; i++)
1628: {
1629: decl = vec[i];
1630: if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
1631: && ! TREE_ASM_WRITTEN (decl))
1632: {
1633: /* Don't write out static consts, unless we used them.
1634: (This used to write them out only if the address was
1635: taken, but that was wrong; if the variable was simply
1636: referred to, it still needs to exist or else it will
1637: be undefined in the linker.) */
1638: if (! TREE_READONLY (decl)
1639: || TREE_PUBLIC (decl)
1640: || TREE_USED (decl)
1641: || TREE_ADDRESSABLE (decl)
1642: || TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl)))
1643: rest_of_decl_compilation (decl, 0, 1, 1);
1644: else
1645: /* Cancel the RTL for this decl so that, if debugging info
1646: output for global variables is still to come,
1647: this one will be omitted. */
1648: DECL_RTL (decl) = NULL;
1649: }
1650:
1651: if (TREE_CODE (decl) == FUNCTION_DECL
1652: && ! TREE_ASM_WRITTEN (decl)
1653: && DECL_INITIAL (decl) != 0
1654: && (TREE_ADDRESSABLE (decl)
1655: || TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl)))
1656: && ! TREE_EXTERNAL (decl))
1657: output_inline_function (decl);
1658:
1659: /* Warn about any function or variable
1660: declared static but not defined. */
1661: if ((warn_unused
1662: || TREE_USED (decl)
1663: || (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl))))
1664: /* && TREE_CODE (decl) == FUNCTION_DECL */
1665: && DECL_INITIAL (decl) == 0
1666: && TREE_EXTERNAL (decl)
1667: && ! TREE_PUBLIC (decl))
1668: warning_with_decl (decl, "`%s' declared `static' but never defined");
1669: /* Warn about static fns or vars defined but not used,
1670: but not about inline functions
1671: since unused inline statics is normal practice. */
1672: if (warn_unused
1673: && (TREE_CODE (decl) == FUNCTION_DECL
1674: || TREE_CODE (decl) == VAR_DECL)
1675: && ! TREE_EXTERNAL (decl)
1676: && ! TREE_PUBLIC (decl)
1677: && ! TREE_USED (decl)
1678: && ! TREE_INLINE (decl)
1679: /* The TREE_USED bit for file-scope decls
1680: is kept in the identifier, to handle multiple
1681: external decls in different scopes. */
1682: && ! TREE_USED (DECL_NAME (decl)))
1683: warning_with_decl (decl, "`%s' defined but not used");
1684:
1685: #ifdef SDB_DEBUGGING_INFO
1686: /* The COFF linker can move initialized global vars to the end.
1687: And that can screw up the symbol ordering.
1688: By putting the symbols in that order to begin with,
1689: we avoid a problem. [email protected]. */
1690: if (write_symbols == SDB_DEBUG && TREE_CODE (decl) == VAR_DECL
1691: && TREE_PUBLIC (decl) && DECL_INITIAL (decl)
1692: && DECL_RTL (decl) != 0)
1693: TIMEVAR (symout_time, sdbout_symbol (decl, 0));
1694:
1695: /* Output COFF information for non-global
1696: file-scope initialized variables. */
1697: if (write_symbols == SDB_DEBUG
1698: && TREE_CODE (decl) == VAR_DECL
1699: && DECL_INITIAL (decl)
1700: && DECL_RTL (decl) != 0
1701: && GET_CODE (DECL_RTL (decl)) == MEM)
1702: TIMEVAR (symout_time, sdbout_toplevel_data (decl));
1703: #endif /* SDB_DEBUGGING_INFO */
1704: #ifdef DWARF_DEBUGGING_INFO
1705: /* Output DWARF information for file-scope tenative data object
1706: declarations, file-scope (extern) function declarations (which
1707: had no corresponding body) and file-scope tagged type declarations
1708: and definitions which have not yet been forced out. */
1709:
1710: if (write_symbols == DWARF_DEBUG
1711: && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
1712: TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 1));
1713: #endif
1714: }
1715: }
1716:
1717: /* Do dbx symbols */
1718: #ifdef DBX_DEBUGGING_INFO
1719: if (write_symbols == DBX_DEBUG)
1720: TIMEVAR (symout_time,
1721: {
1722: dbxout_finish (asm_out_file, main_input_filename);
1723: });
1724: #endif
1725:
1726: #ifdef DWARF_DEBUGGING_INFO
1727: if (write_symbols == DWARF_DEBUG)
1728: TIMEVAR (symout_time,
1729: {
1730: dwarfout_finish ();
1731: });
1732: #endif
1733:
1734: /* Output some stuff at end of file if nec. */
1735:
1736: end_final (main_input_filename);
1737:
1738: #ifdef ASM_FILE_END
1739: ASM_FILE_END (asm_out_file);
1740: #endif
1741:
1742: after_finish_compilation:
1743:
1744: /* Language-specific end of compilation actions. */
1745:
1746: lang_finish ();
1747:
1748: /* Close the dump files. */
1749:
1750: if (flag_gen_aux_info)
1751: {
1752: fclose (aux_info_file);
1753: if (errorcount)
1754: unlink (aux_info_file_name);
1755: }
1756:
1757: if (rtl_dump)
1758: fclose (rtl_dump_file);
1759:
1760: if (jump_opt_dump)
1761: fclose (jump_opt_dump_file);
1762:
1763: if (cse_dump)
1764: fclose (cse_dump_file);
1765:
1766: if (loop_dump)
1767: fclose (loop_dump_file);
1768:
1769: if (cse2_dump)
1770: fclose (cse2_dump_file);
1771:
1772: if (flow_dump)
1773: fclose (flow_dump_file);
1774:
1775: if (combine_dump)
1776: {
1777: dump_combine_total_stats (combine_dump_file);
1778: fclose (combine_dump_file);
1779: }
1780:
1781: if (sched_dump)
1782: fclose (sched_dump_file);
1783:
1784: if (local_reg_dump)
1785: fclose (local_reg_dump_file);
1786:
1787: if (global_reg_dump)
1788: fclose (global_reg_dump_file);
1789:
1790: if (sched2_dump)
1791: fclose (sched2_dump_file);
1792:
1793: if (jump2_opt_dump)
1794: fclose (jump2_opt_dump_file);
1795:
1796: if (dbr_sched_dump)
1797: fclose (dbr_sched_dump_file);
1798:
1799: #ifdef STACK_REGS
1800: if (stack_reg_dump)
1801: fclose (stack_reg_dump_file);
1802: #endif
1803:
1804: /* Close non-debugging input and output files. Take special care to note
1805: whether fclose returns an error, since the pages might still be on the
1806: buffer chain while the file is open. */
1807:
1808: fclose (finput);
1809: if (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0)
1810: fatal_io_error (asm_file_name);
1811:
1812: /* Print the times. */
1813:
1814: if (! quiet_flag)
1815: {
1816: fprintf (stderr,"\n");
1817: print_time ("parse", parse_time);
1818: print_time ("integration", integration_time);
1819: print_time ("jump", jump_time);
1820: print_time ("cse", cse_time);
1821: print_time ("loop", loop_time);
1822: print_time ("cse2", cse2_time);
1823: print_time ("flow", flow_time);
1824: print_time ("combine", combine_time);
1825: print_time ("sched", sched_time);
1826: print_time ("local-alloc", local_alloc_time);
1827: print_time ("global-alloc", global_alloc_time);
1828: print_time ("sched2", sched2_time);
1829: print_time ("dbranch", dbr_sched_time);
1830: print_time ("shorten-branch", shorten_branch_time);
1831: print_time ("stack-reg", stack_reg_time);
1832: print_time ("final", final_time);
1833: print_time ("varconst", varconst_time);
1834: print_time ("symout", symout_time);
1835: print_time ("dump", dump_time);
1836: }
1837: }
1838:
1839: /* This is called from various places for FUNCTION_DECL, VAR_DECL,
1840: and TYPE_DECL nodes.
1841:
1842: This does nothing for local (non-static) variables.
1843: Otherwise, it sets up the RTL and outputs any assembler code
1844: (label definition, storage allocation and initialization).
1845:
1846: DECL is the declaration. If ASMSPEC is nonzero, it specifies
1847: the assembler symbol name to be used. TOP_LEVEL is nonzero
1848: if this declaration is not within a function. */
1849:
1850: void
1851: rest_of_decl_compilation (decl, asmspec, top_level, at_end)
1852: tree decl;
1853: char *asmspec;
1854: int top_level;
1855: int at_end;
1856: {
1857: /* Declarations of variables, and of functions defined elsewhere. */
1858:
1859: /* Forward declarations for nested functions are not "external",
1860: but we need to treat them as if they were. */
1861: if (TREE_STATIC (decl) || TREE_EXTERNAL (decl)
1862: || TREE_CODE (decl) == FUNCTION_DECL)
1863: TIMEVAR (varconst_time,
1864: {
1865: make_decl_rtl (decl, asmspec, top_level);
1866: /* Don't output anything
1867: when a tentative file-scope definition is seen.
1868: But at end of compilation, do output code for them. */
1869: if (! (! at_end && top_level
1870: && (DECL_INITIAL (decl) == 0
1871: || DECL_INITIAL (decl) == error_mark_node)))
1872: assemble_variable (decl, top_level, at_end);
1873: });
1874: else if (TREE_REGDECL (decl) && asmspec != 0)
1875: {
1876: if (decode_reg_name (asmspec) >= 0)
1877: {
1878: DECL_RTL (decl) = 0;
1879: make_decl_rtl (decl, asmspec, top_level);
1880: }
1881: else
1882: error ("invalid register name `%s' for register variable", asmspec);
1883: }
1884: #ifdef DBX_DEBUGGING_INFO
1885: else if (write_symbols == DBX_DEBUG && TREE_CODE (decl) == TYPE_DECL)
1886: TIMEVAR (symout_time, dbxout_symbol (decl, 0));
1887: #endif
1888: #ifdef SDB_DEBUGGING_INFO
1889: else if (write_symbols == SDB_DEBUG && top_level
1890: && TREE_CODE (decl) == TYPE_DECL)
1891: TIMEVAR (symout_time, sdbout_symbol (decl, 0));
1892: #endif
1893: }
1894:
1895: /* Called after finishing a record, union or enumeral type. */
1896:
1897: void
1898: rest_of_type_compilation (type, toplev)
1899: tree type;
1900: int toplev;
1901: {
1902: #ifdef DBX_DEBUGGING_INFO
1903: if (write_symbols == DBX_DEBUG)
1904: TIMEVAR (symout_time, dbxout_symbol (TYPE_STUB_DECL (type), !toplev));
1905: #endif
1906: #ifdef SDB_DEBUGGING_INFO
1907: if (write_symbols == SDB_DEBUG)
1908: TIMEVAR (symout_time, sdbout_symbol (TYPE_STUB_DECL (type), !toplev));
1909: #endif
1910: }
1911:
1912: /* This is called from finish_function (within yyparse)
1913: after each top-level definition is parsed.
1914: It is supposed to compile that function or variable
1915: and output the assembler code for it.
1916: After we return, the tree storage is freed. */
1917:
1918: void
1919: rest_of_compilation (decl)
1920: tree decl;
1921: {
1922: register rtx insns;
1923: int start_time = get_run_time ();
1924: int tem;
1925: /* Nonzero if we have saved the original DECL_INITIAL of the function,
1926: to be restored after we finish compiling the function
1927: (for use when compiling inline calls to this function). */
1928: tree saved_block_tree = 0;
1929:
1930: /* If we are reconsidering an inline function
1931: at the end of compilation, skip the stuff for making it inline. */
1932:
1933: if (DECL_SAVED_INSNS (decl) == 0)
1934: {
1935: int specd = TREE_INLINE (decl);
1936: char *lose;
1937:
1938: /* If requested, consider whether to make this function inline. */
1939: if (specd || flag_inline_functions)
1940: TIMEVAR (integration_time,
1941: {
1942: lose = function_cannot_inline_p (decl);
1943: if (lose)
1944: {
1945: if (warn_inline && specd)
1946: warning_with_decl (decl, lose);
1947: TREE_INLINE (decl) = 0;
1948: }
1949: else
1950: TREE_INLINE (decl) = 1;
1951: });
1952:
1953: insns = get_insns ();
1954:
1955: /* Dump the rtl code if we are dumping rtl. */
1956:
1957: if (rtl_dump)
1958: TIMEVAR (dump_time,
1959: {
1960: fprintf (rtl_dump_file, "\n;; Function %s\n\n",
1961: IDENTIFIER_POINTER (DECL_NAME (decl)));
1962: if (DECL_SAVED_INSNS (decl))
1963: fprintf (rtl_dump_file, ";; (integrable)\n\n");
1964: print_rtl (rtl_dump_file, insns);
1965: fflush (rtl_dump_file);
1966: });
1967:
1968: /* If function is inline, and we don't yet know whether to
1969: compile it by itself, defer decision till end of compilation.
1970: finish_compilation will call rest_of_compilation again
1971: for those functions that need to be output. */
1972:
1973: if (TREE_INLINE (decl)
1974: && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
1975: && ! flag_keep_inline_functions)
1976: || TREE_EXTERNAL (decl)))
1977: {
1978: TIMEVAR (integration_time, save_for_inline_nocopy (decl));
1979: goto exit_rest_of_compilation;
1980: }
1981:
1982: /* If we have to compile the function now, save its rtl
1983: so that its compilation will not affect what others get. */
1984: if (TREE_INLINE (decl))
1985: {
1986: saved_block_tree = DECL_INITIAL (decl);
1987: TIMEVAR (integration_time, save_for_inline_copying (decl));
1988: }
1989: }
1990:
1991: /* Suppress warnings for unused static functions
1992: defined (not just declared) in system headers. */
1993: if (in_system_header && TREE_STATIC (decl) && !TREE_INLINE (decl))
1994: TREE_USED (decl) = 1;
1995:
1996: TREE_ASM_WRITTEN (decl) = 1;
1997:
1998: /* Now that integrate will no longer see our rtl, we need not distinguish
1999: between the return value of this function and the return value of called
2000: functions. */
2001: rtx_equal_function_value_matters = 0;
2002:
2003: if (rtl_dump_and_exit || flag_syntax_only)
2004: {
2005: goto exit_rest_of_compilation;
2006: }
2007:
2008: /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
2009: Note that that may have been done above, in save_for_inline_copying.
2010: The call to resume_temporary_allocation near the end of this function
2011: goes back to the usual state of affairs. */
2012:
2013: rtl_in_current_obstack ();
2014:
2015: #ifdef FINALIZE_PIC
2016: /* If we are doing position-independent code generation, now
2017: is the time to output special prologues and epilogues.
2018: We do not want to do this earlier, because it just clutters
2019: up inline functions with meaningless insns. */
2020: if (flag_pic)
2021: FINALIZE_PIC;
2022: #endif
2023:
2024: insns = get_insns ();
2025:
2026: /* Copy any shared structure that should not be shared. */
2027:
2028: unshare_all_rtl (insns);
2029:
2030: /* Instantiate all virtual registers. */
2031:
2032: instantiate_virtual_regs (current_function_decl, get_insns ());
2033:
2034: /* See if we have allocated stack slots that are not directly addressable.
2035: If so, scan all the insns and create explicit address computation
2036: for all references to such slots. */
2037: /* fixup_stack_slots (); */
2038:
2039: /* Do jump optimization the first time, if -opt.
2040: Also do it if -W, but in that case it doesn't change the rtl code,
2041: it only computes whether control can drop off the end of the function. */
2042:
2043: if (optimize > 0 || extra_warnings || warn_return_type
2044: /* If function is `volatile', we should warn if it tries to return. */
2045: || TREE_THIS_VOLATILE (decl))
2046: {
2047: TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
2048: TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
2049: }
2050:
2051: /* Dump rtl code after jump, if we are doing that. */
2052:
2053: if (jump_opt_dump)
2054: TIMEVAR (dump_time,
2055: {
2056: fprintf (jump_opt_dump_file, "\n;; Function %s\n\n",
2057: IDENTIFIER_POINTER (DECL_NAME (decl)));
2058: print_rtl (jump_opt_dump_file, insns);
2059: fflush (jump_opt_dump_file);
2060: });
2061:
2062: /* Perform common subexpression elimination.
2063: Nonzero value from `cse_main' means that jumps were simplified
2064: and some code may now be unreachable, so do
2065: jump optimization again. */
2066:
2067: if (cse_dump)
2068: TIMEVAR (dump_time,
2069: {
2070: fprintf (cse_dump_file, "\n;; Function %s\n\n",
2071: IDENTIFIER_POINTER (DECL_NAME (decl)));
2072: });
2073:
2074: if (optimize > 0)
2075: {
2076: TIMEVAR (cse_time, reg_scan (insns, max_reg_num (), 1));
2077:
2078: if (flag_thread_jumps)
2079: /* Hacks by tiemann & kenner. */
2080: TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
2081:
2082: TIMEVAR (cse_time, tem = cse_main (insns, max_reg_num (),
2083: 0, cse_dump_file));
2084: TIMEVAR (cse_time, delete_dead_from_cse (insns, max_reg_num ()));
2085:
2086: if (tem)
2087: TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
2088: }
2089:
2090: /* Dump rtl code after cse, if we are doing that. */
2091:
2092: if (cse_dump)
2093: TIMEVAR (dump_time,
2094: {
2095: print_rtl (cse_dump_file, insns);
2096: fflush (cse_dump_file);
2097: });
2098:
2099: if (loop_dump)
2100: TIMEVAR (dump_time,
2101: {
2102: fprintf (loop_dump_file, "\n;; Function %s\n\n",
2103: IDENTIFIER_POINTER (DECL_NAME (decl)));
2104: });
2105:
2106: /* Move constant computations out of loops. */
2107:
2108: if (optimize > 0)
2109: {
2110: TIMEVAR (loop_time,
2111: {
2112: loop_optimize (insns, loop_dump ? loop_dump_file : 0);
2113: });
2114: }
2115:
2116: /* Dump rtl code after loop opt, if we are doing that. */
2117:
2118: if (loop_dump)
2119: TIMEVAR (dump_time,
2120: {
2121: print_rtl (loop_dump_file, insns);
2122: fflush (loop_dump_file);
2123: });
2124:
2125: if (cse2_dump)
2126: TIMEVAR (dump_time,
2127: {
2128: fprintf (cse2_dump_file, "\n;; Function %s\n\n",
2129: IDENTIFIER_POINTER (DECL_NAME (decl)));
2130: });
2131:
2132: if (optimize > 0 && flag_rerun_cse_after_loop)
2133: {
2134: TIMEVAR (cse2_time, reg_scan (insns, max_reg_num (), 0));
2135:
2136: TIMEVAR (cse2_time, tem = cse_main (insns, max_reg_num (),
2137: 1, cse2_dump_file));
2138: if (tem)
2139: TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
2140: }
2141:
2142: if (optimize > 0 && flag_thread_jumps)
2143: /* This pass of jump threading straightens out code
2144: that was kinked by loop optimization. */
2145: TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
2146:
2147: /* Dump rtl code after cse, if we are doing that. */
2148:
2149: if (cse2_dump)
2150: TIMEVAR (dump_time,
2151: {
2152: print_rtl (cse2_dump_file, insns);
2153: fflush (cse2_dump_file);
2154: });
2155:
2156: /* We are no longer anticipating cse in this function, at least. */
2157:
2158: cse_not_expected = 1;
2159:
2160: /* Now we choose between stupid (pcc-like) register allocation
2161: (if we got the -noreg switch and not -opt)
2162: and smart register allocation. */
2163:
2164: if (optimize > 0) /* Stupid allocation probably won't work */
2165: obey_regdecls = 0; /* if optimizations being done. */
2166:
2167: regclass_init ();
2168:
2169: /* Print function header into flow dump now
2170: because doing the flow analysis makes some of the dump. */
2171:
2172: if (flow_dump)
2173: TIMEVAR (dump_time,
2174: {
2175: fprintf (flow_dump_file, "\n;; Function %s\n\n",
2176: IDENTIFIER_POINTER (DECL_NAME (decl)));
2177: });
2178:
2179: if (obey_regdecls)
2180: {
2181: TIMEVAR (flow_time,
2182: {
2183: regclass (insns, max_reg_num ());
2184: stupid_life_analysis (insns, max_reg_num (),
2185: flow_dump_file);
2186: });
2187: }
2188: else
2189: {
2190: /* Do control and data flow analysis,
2191: and write some of the results to dump file. */
2192:
2193: TIMEVAR (flow_time, flow_analysis (insns, max_reg_num (),
2194: flow_dump_file));
2195: if (warn_uninitialized)
2196: {
2197: uninitialized_vars_warning (DECL_INITIAL (decl));
2198: setjmp_args_warning ();
2199: }
2200: }
2201:
2202: /* Dump rtl after flow analysis. */
2203:
2204: if (flow_dump)
2205: TIMEVAR (dump_time,
2206: {
2207: print_rtl (flow_dump_file, insns);
2208: fflush (flow_dump_file);
2209: });
2210:
2211: /* If -opt, try combining insns through substitution. */
2212:
2213: if (optimize > 0)
2214: TIMEVAR (combine_time, combine_instructions (insns, max_reg_num ()));
2215:
2216: /* Dump rtl code after insn combination. */
2217:
2218: if (combine_dump)
2219: TIMEVAR (dump_time,
2220: {
2221: fprintf (combine_dump_file, "\n;; Function %s\n\n",
2222: IDENTIFIER_POINTER (DECL_NAME (decl)));
2223: dump_combine_stats (combine_dump_file);
2224: print_rtl (combine_dump_file, insns);
2225: fflush (combine_dump_file);
2226: });
2227:
2228: /* Print function header into sched dump now
2229: because doing the sched analysis makes some of the dump. */
2230:
2231: if (sched_dump)
2232: TIMEVAR (dump_time,
2233: {
2234: fprintf (sched_dump_file, "\n;; Function %s\n\n",
2235: IDENTIFIER_POINTER (DECL_NAME (decl)));
2236: });
2237:
2238: if (optimize > 0 && flag_schedule_insns)
2239: {
2240: /* Do control and data sched analysis,
2241: and write some of the results to dump file. */
2242:
2243: TIMEVAR (sched_time, schedule_insns (sched_dump_file));
2244: }
2245:
2246: /* Dump rtl after instruction scheduling. */
2247:
2248: if (sched_dump)
2249: TIMEVAR (dump_time,
2250: {
2251: print_rtl (sched_dump_file, insns);
2252: fflush (sched_dump_file);
2253: });
2254:
2255: /* Unless we did stupid register allocation,
2256: allocate pseudo-regs that are used only within 1 basic block. */
2257:
2258: if (!obey_regdecls)
2259: TIMEVAR (local_alloc_time,
2260: {
2261: regclass (insns, max_reg_num ());
2262: local_alloc ();
2263: });
2264:
2265: /* Dump rtl code after allocating regs within basic blocks. */
2266:
2267: if (local_reg_dump)
2268: TIMEVAR (dump_time,
2269: {
2270: fprintf (local_reg_dump_file, "\n;; Function %s\n\n",
2271: IDENTIFIER_POINTER (DECL_NAME (decl)));
2272: dump_flow_info (local_reg_dump_file);
2273: dump_local_alloc (local_reg_dump_file);
2274: print_rtl (local_reg_dump_file, insns);
2275: fflush (local_reg_dump_file);
2276: });
2277:
2278: if (global_reg_dump)
2279: TIMEVAR (dump_time,
2280: fprintf (global_reg_dump_file, "\n;; Function %s\n\n",
2281: IDENTIFIER_POINTER (DECL_NAME (decl))));
2282:
2283: /* Unless we did stupid register allocation,
2284: allocate remaining pseudo-regs, then do the reload pass
2285: fixing up any insns that are invalid. */
2286:
2287: TIMEVAR (global_alloc_time,
2288: {
2289: if (!obey_regdecls)
2290: global_alloc (global_reg_dump ? global_reg_dump_file : 0);
2291: else
2292: reload (insns, 0,
2293: global_reg_dump ? global_reg_dump_file : 0);
2294: });
2295:
2296: if (global_reg_dump)
2297: TIMEVAR (dump_time,
2298: {
2299: dump_global_regs (global_reg_dump_file);
2300: print_rtl (global_reg_dump_file, insns);
2301: fflush (global_reg_dump_file);
2302: });
2303:
2304: reload_completed = 1;
2305:
2306: if (optimize > 0 && flag_schedule_insns_after_reload)
2307: {
2308: if (sched2_dump)
2309: TIMEVAR (dump_time,
2310: {
2311: fprintf (sched2_dump_file, "\n;; Function %s\n\n",
2312: IDENTIFIER_POINTER (DECL_NAME (decl)));
2313: });
2314:
2315: /* Do control and data sched analysis again,
2316: and write some more of the results to dump file. */
2317:
2318: TIMEVAR (sched2_time, schedule_insns (sched2_dump_file));
2319:
2320: /* Dump rtl after post-reorder instruction scheduling. */
2321:
2322: if (sched2_dump)
2323: TIMEVAR (dump_time,
2324: {
2325: print_rtl (sched2_dump_file, insns);
2326: fflush (sched2_dump_file);
2327: });
2328: }
2329:
2330: #ifdef LEAF_REGISTERS
2331: leaf_function = 0;
2332: if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
2333: leaf_function = 1;
2334: #endif
2335:
2336: /* One more attempt to remove jumps to .+1
2337: left by dead-store-elimination.
2338: Also do cross-jumping this time
2339: and delete no-op move insns. */
2340:
2341: if (optimize > 0)
2342: {
2343: TIMEVAR (jump_time, jump_optimize (insns, 1, 1, 0));
2344: }
2345:
2346: /* Dump rtl code after jump, if we are doing that. */
2347:
2348: if (jump2_opt_dump)
2349: TIMEVAR (dump_time,
2350: {
2351: fprintf (jump2_opt_dump_file, "\n;; Function %s\n\n",
2352: IDENTIFIER_POINTER (DECL_NAME (decl)));
2353: print_rtl (jump2_opt_dump_file, insns);
2354: fflush (jump2_opt_dump_file);
2355: });
2356:
2357: /* If a scheduling pass for delayed branches is to be done,
2358: call the scheduling code. */
2359:
2360: #ifdef DELAY_SLOTS
2361: if (optimize > 0 && flag_delayed_branch)
2362: {
2363: TIMEVAR (dbr_sched_time, dbr_schedule (insns, dbr_sched_dump_file));
2364: if (dbr_sched_dump)
2365: {
2366: TIMEVAR (dump_time,
2367: {
2368: fprintf (dbr_sched_dump_file, "\n;; Function %s\n\n",
2369: IDENTIFIER_POINTER (DECL_NAME (decl)));
2370: print_rtl (dbr_sched_dump_file, insns);
2371: fflush (dbr_sched_dump_file);
2372: });
2373: }
2374: }
2375: #endif
2376:
2377: if (optimize > 0)
2378: /* Shorten branches. */
2379: TIMEVAR (shorten_branch_time,
2380: {
2381: shorten_branches (get_insns ());
2382: });
2383:
2384: #ifdef STACK_REGS
2385: TIMEVAR (stack_reg_time, reg_to_stack (insns, stack_reg_dump_file));
2386: if (stack_reg_dump)
2387: {
2388: TIMEVAR (dump_time,
2389: {
2390: fprintf (stack_reg_dump_file, "\n;; Function %s\n\n",
2391: IDENTIFIER_POINTER (DECL_NAME (decl)));
2392: print_rtl (stack_reg_dump_file, insns);
2393: fflush (stack_reg_dump_file);
2394: });
2395: }
2396: #endif
2397:
2398: /* Now turn the rtl into assembler code. */
2399:
2400: TIMEVAR (final_time,
2401: {
2402: rtx x;
2403: char *fnname;
2404:
2405: /* Get the function's name, as described by its RTL.
2406: This may be different from the DECL_NAME name used
2407: in the source file. */
2408:
2409: x = DECL_RTL (decl);
2410: if (GET_CODE (x) != MEM)
2411: abort ();
2412: x = XEXP (x, 0);
2413: if (GET_CODE (x) != SYMBOL_REF)
2414: abort ();
2415: fnname = XSTR (x, 0);
2416:
2417: assemble_start_function (decl, fnname);
2418: final_start_function (insns, asm_out_file, optimize);
2419: final (insns, asm_out_file, optimize, 0);
2420: final_end_function (insns, asm_out_file, optimize);
2421: assemble_end_function (decl, fnname);
2422: fflush (asm_out_file);
2423: });
2424:
2425: /* Write DBX symbols if requested */
2426:
2427: /* Note that for those inline functions where we don't initially
2428: know for certain that we will be generating an out-of-line copy,
2429: the first invocation of this routine (rest_of_compilation) will
2430: skip over this code by doing a `goto exit_rest_of_compilation;'.
2431: Later on, finish_compilation will call rest_of_compilation again
2432: for those inline functions that need to have out-of-line copies
2433: generated. During that call, we *will* be routed past here. */
2434:
2435: #ifdef DBX_DEBUGGING_INFO
2436: if (write_symbols == DBX_DEBUG)
2437: TIMEVAR (symout_time, dbxout_function (decl));
2438: #endif
2439:
2440: #ifdef DWARF_DEBUGGING_INFO
2441: if (write_symbols == DWARF_DEBUG)
2442: TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2443: #endif
2444:
2445: exit_rest_of_compilation:
2446:
2447: /* Put back the tree of subblocks from before we copied it.
2448: Code generation and the output of debugging info may have modified
2449: the copy, but the original is unchanged. */
2450:
2451: if (saved_block_tree != 0)
2452: DECL_INITIAL (decl) = saved_block_tree;
2453:
2454: reload_completed = 0;
2455:
2456: /* Clear out the real_constant_chain before some of the rtx's
2457: it runs through become garbage. */
2458:
2459: clear_const_double_mem ();
2460:
2461: /* Cancel the effect of rtl_in_current_obstack. */
2462:
2463: resume_temporary_allocation ();
2464:
2465: /* The parsing time is all the time spent in yyparse
2466: *except* what is spent in this function. */
2467:
2468: parse_time -= get_run_time () - start_time;
2469: }
2470:
2471: /* Entry point of cc1/c++. Decode command args, then call compile_file.
2472: Exit code is 35 if can't open files, 34 if fatal error,
2473: 33 if had nonfatal errors, else success. */
2474:
2475: int
2476: main (argc, argv, envp)
2477: int argc;
2478: char **argv;
2479: char **envp;
2480: {
2481: register int i;
2482: char *filename = 0;
2483: int flag_print_mem = 0;
2484: int version_flag = 0;
2485: char *p;
2486:
2487: /* save in case md file wants to emit args as a comment. */
2488: save_argc = argc;
2489: save_argv = argv;
2490:
2491: p = argv[0] + strlen (argv[0]);
2492: while (p != argv[0] && p[-1] != '/') --p;
2493: progname = p;
2494:
2495: #ifdef RLIMIT_STACK
2496: /* Get rid of any avoidable limit on stack size. */
2497: {
2498: struct rlimit rlim;
2499:
2500: /* Set the stack limit huge so that alloca does not fail. */
2501: getrlimit (RLIMIT_STACK, &rlim);
2502: rlim.rlim_cur = rlim.rlim_max;
2503: setrlimit (RLIMIT_STACK, &rlim);
2504: }
2505: #endif /* RLIMIT_STACK */
2506:
2507: signal (SIGFPE, float_signal);
2508:
2509: signal (SIGPIPE, pipe_closed);
2510:
2511: decl_printable_name = decl_name;
2512: lang_expand_expr = (struct rtx_def *(*)()) do_abort;
2513:
2514: /* Initialize whether `char' is signed. */
2515: flag_signed_char = DEFAULT_SIGNED_CHAR;
2516: #ifdef DEFAULT_SHORT_ENUMS
2517: /* Initialize how much space enums occupy, by default. */
2518: flag_short_enums = DEFAULT_SHORT_ENUMS;
2519: #endif
2520:
2521: /* Scan to see what optimization level has been specified. That will
2522: determine the default value of many flags. */
2523: for (i = 1; i < argc; i++)
2524: {
2525: if (!strcmp (argv[i], "-O"))
2526: {
2527: optimize = 1;
2528: }
2529: else if (argv[i][0] == '-' && argv[i][1] == 'O')
2530: {
2531: /* Handle -O2, -O3, -O69, ... */
2532: char *p = &argv[i][2];
2533: int c;
2534:
2535: while (c = *p++)
2536: if (! (c >= '0' && c <= '9'))
2537: break;
2538: if (c == 0)
2539: optimize = atoi (&argv[i][2]);
2540: }
2541: }
2542:
2543: obey_regdecls = (optimize == 0);
2544: flag_no_inline = (optimize == 0);
2545: if (flag_no_inline)
2546: warn_inline = 0;
2547:
2548: if (optimize >= 1)
2549: {
2550: flag_thread_jumps = 1;
2551: #ifdef DELAY_SLOTS
2552: flag_delayed_branch = 1;
2553: #endif
2554: }
2555:
2556: if (optimize >= 2)
2557: {
2558: flag_cse_follow_jumps = 1;
2559: flag_expensive_optimizations = 1;
2560: flag_strength_reduce = 1;
2561: flag_rerun_cse_after_loop = 1;
2562: #ifdef INSN_SCHEDULING
2563: flag_schedule_insns = 1;
2564: flag_schedule_insns_after_reload = 1;
2565: #endif
2566: }
2567:
2568: #ifdef OPTIMIZATION_OPTIONS
2569: /* Allow default optimizations to be specified on a per-machine basis. */
2570: OPTIMIZATION_OPTIONS (optimize);
2571: #endif
2572:
2573: /* Initialize register usage now so switches may override. */
2574: init_reg_sets ();
2575:
2576: target_flags = 0;
2577: set_target_switch ("");
2578:
2579: for (i = 1; i < argc; i++)
2580: {
2581: if (argv[i][0] == '-' && argv[i][1] != 0)
2582: {
2583: register char *str = argv[i] + 1;
2584: if (str[0] == 'Y')
2585: str++;
2586:
2587: if (str[0] == 'm')
2588: set_target_switch (&str[1]);
2589: else if (!strcmp (str, "dumpbase"))
2590: {
2591: dump_base_name = argv[++i];
2592: }
2593: else if (str[0] == 'd')
2594: {
2595: register char *p = &str[1];
2596: while (*p)
2597: switch (*p++)
2598: {
2599: case 'a':
2600: combine_dump = 1;
2601: dbr_sched_dump = 1;
2602: flow_dump = 1;
2603: global_reg_dump = 1;
2604: jump_opt_dump = 1;
2605: jump2_opt_dump = 1;
2606: local_reg_dump = 1;
2607: loop_dump = 1;
2608: rtl_dump = 1;
2609: cse_dump = 1, cse2_dump = 1;
2610: sched_dump = 1;
2611: sched2_dump = 1;
2612: stack_reg_dump = 1;
2613: break;
2614: case 'k':
2615: stack_reg_dump = 1;
2616: break;
2617: case 'c':
2618: combine_dump = 1;
2619: break;
2620: case 'd':
2621: dbr_sched_dump = 1;
2622: break;
2623: case 'f':
2624: flow_dump = 1;
2625: break;
2626: case 'g':
2627: global_reg_dump = 1;
2628: break;
2629: case 'j':
2630: jump_opt_dump = 1;
2631: break;
2632: case 'J':
2633: jump2_opt_dump = 1;
2634: break;
2635: case 'l':
2636: local_reg_dump = 1;
2637: break;
2638: case 'L':
2639: loop_dump = 1;
2640: break;
2641: case 'm':
2642: flag_print_mem = 1;
2643: break;
2644: case 'p':
2645: flag_print_asm_name = 1;
2646: break;
2647: case 'r':
2648: rtl_dump = 1;
2649: break;
2650: case 's':
2651: cse_dump = 1;
2652: break;
2653: case 't':
2654: cse2_dump = 1;
2655: break;
2656: case 'S':
2657: sched_dump = 1;
2658: break;
2659: case 'R':
2660: sched2_dump = 1;
2661: break;
2662: case 'y':
2663: set_yydebug (1);
2664: break;
2665:
2666: case 'x':
2667: rtl_dump_and_exit = 1;
2668: break;
2669: }
2670: }
2671: else if (str[0] == 'f')
2672: {
2673: int j;
2674: register char *p = &str[1];
2675: int found = 0;
2676:
2677: /* Some kind of -f option.
2678: P's value is the option sans `-f'.
2679: Search for it in the table of options. */
2680:
2681: for (j = 0;
2682: !found && j < sizeof (f_options) / sizeof (f_options[0]);
2683: j++)
2684: {
2685: if (!strcmp (p, f_options[j].string))
2686: {
2687: *f_options[j].variable = f_options[j].on_value;
2688: /* A goto here would be cleaner,
2689: but breaks the vax pcc. */
2690: found = 1;
2691: }
2692: if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
2693: && ! strcmp (p+3, f_options[j].string))
2694: {
2695: *f_options[j].variable = ! f_options[j].on_value;
2696: found = 1;
2697: }
2698: }
2699:
2700: if (found)
2701: ;
2702: else if (!strncmp (p, "fixed-", 6))
2703: fix_register (&p[6], 1, 1);
2704: else if (!strncmp (p, "call-used-", 10))
2705: fix_register (&p[10], 0, 1);
2706: else if (!strncmp (p, "call-saved-", 11))
2707: fix_register (&p[11], 0, 0);
2708: else if (! lang_decode_option (argv[i]))
2709: error ("Invalid option `%s'", argv[i]);
2710: }
2711: else if (str[0] == 'O')
2712: {
2713: register char *p = str+1;
2714: while (*p && *p >= '0' && *p <= '9')
2715: p++;
2716: if (*p == '\0')
2717: ;
2718: else
2719: error ("Invalid option `%s'", argv[i]);
2720: }
2721: else if (!strcmp (str, "pedantic"))
2722: pedantic = 1;
2723: else if (!strcmp (str, "pedantic-errors"))
2724: flag_pedantic_errors = pedantic = 1;
2725: else if (lang_decode_option (argv[i]))
2726: ;
2727: else if (!strcmp (str, "quiet"))
2728: quiet_flag = 1;
2729: else if (!strcmp (str, "version"))
2730: version_flag = 1;
2731: else if (!strcmp (str, "w"))
2732: inhibit_warnings = 1;
2733: else if (!strcmp (str, "W"))
2734: {
2735: extra_warnings = 1;
2736: warn_uninitialized = 1;
2737: }
2738: else if (str[0] == 'W')
2739: {
2740: int j;
2741: register char *p = &str[1];
2742: int found = 0;
2743:
2744: /* Some kind of -W option.
2745: P's value is the option sans `-W'.
2746: Search for it in the table of options. */
2747:
2748: for (j = 0;
2749: !found && j < sizeof (W_options) / sizeof (W_options[0]);
2750: j++)
2751: {
2752: if (!strcmp (p, W_options[j].string))
2753: {
2754: *W_options[j].variable = W_options[j].on_value;
2755: /* A goto here would be cleaner,
2756: but breaks the vax pcc. */
2757: found = 1;
2758: }
2759: if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
2760: && ! strcmp (p+3, W_options[j].string))
2761: {
2762: *W_options[j].variable = ! W_options[j].on_value;
2763: found = 1;
2764: }
2765: }
2766:
2767: if (found)
2768: ;
2769: else if (!strncmp (p, "id-clash-", 9))
2770: {
2771: char *endp = p + 9;
2772:
2773: while (*endp)
2774: {
2775: if (*endp >= '0' && *endp <= '9')
2776: endp++;
2777: else
2778: error ("Invalid option `%s'", argv[i]);
2779: }
2780: warn_id_clash = 1;
2781: id_clash_len = atoi (str + 10);
2782: }
2783: else
2784: error ("Invalid option `%s'", argv[i]);
2785: }
2786: else if (!strcmp (str, "p"))
2787: profile_flag = 1;
2788: else if (!strcmp (str, "a"))
2789: {
2790: #if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
2791: warning ("`-a' option (basic block profile) not supported");
2792: #else
2793: profile_block_flag = 1;
2794: #endif
2795: }
2796: else if (str[0] == 'g')
2797: {
2798: char *p = str + 1;
2799: char *q;
2800: unsigned len;
2801: unsigned level;
2802:
2803: while (*p && (*p < '0' || *p > '9'))
2804: p++;
2805: len = p - str;
2806: q = p;
2807: while (*q && (*q >= '0' && *q <= '9'))
2808: q++;
2809: if (*p)
2810: level = atoi (p);
2811: else
2812: level = 2; /* default debugging info level */
2813: if (*q || level > 3)
2814: {
2815: warning ("invalid debug level specification in option: `-%s'",
2816: str);
2817: warning ("no debugging information will be generated");
2818: level = 0;
2819: }
2820:
2821: /* If more than one debugging type is supported,
2822: you must define PREFERRED_DEBUGGING_TYPE
2823: to choose a format in a system-dependent way. */
2824: #if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) \
2825: + defined (DWARF_DEBUGGING_INFO))
2826: #ifdef PREFERRED_DEBUGGING_TYPE
2827: if (!strncmp (str, "ggdb", len))
2828: write_symbols = PREFERRED_DEBUGGING_TYPE;
2829: #else /* no PREFERRED_DEBUGGING_TYPE */
2830: You Lose! You must define PREFERRED_DEBUGGING_TYPE!
2831: #endif /* no PREFERRED_DEBUGGING_TYPE */
2832: #endif /* More than one debugger format enabled. */
2833: #ifdef DBX_DEBUGGING_INFO
2834: if (write_symbols != NO_DEBUG)
2835: ;
2836: else if (!strncmp (str, "ggdb", len))
2837: write_symbols = DBX_DEBUG;
2838: else if (!strncmp (str, "gstabs", len))
2839: write_symbols = DBX_DEBUG;
2840:
2841: /* Always enable extensions for -ggdb or -gstabs+,
2842: always disable for -gstabs.
2843: For plain -g, use system-specific default. */
2844: if (write_symbols == DBX_DEBUG && !strncmp (str, "ggdb", len)
2845: && len >= 2)
2846: use_gdb_dbx_extensions = 1;
2847: else if (write_symbols == DBX_DEBUG && !strcmp (str, "gstabs+"))
2848: use_gdb_dbx_extensions = 1;
2849: else if (write_symbols == DBX_DEBUG
2850: && !strncmp (str, "gstabs", len) && len >= 2)
2851: use_gdb_dbx_extensions = 0;
2852: else
2853: use_gdb_dbx_extensions = DEFAULT_GDB_EXTENSIONS;
2854: #endif /* DBX_DEBUGGING_INFO */
2855: #ifdef DWARF_DEBUGGING_INFO
2856: if (write_symbols != NO_DEBUG)
2857: ;
2858: else if (!strncmp (str, "ggdb", len))
2859: write_symbols = DWARF_DEBUG;
2860: /* For orthogonality. */
2861: else if (!strncmp (str, "gdwarf", len))
2862: write_symbols = DWARF_DEBUG;
2863: #endif
2864: #ifdef SDB_DEBUGGING_INFO
2865: if (write_symbols != NO_DEBUG)
2866: ;
2867: else if (!strncmp (str, "ggdb", len))
2868: write_symbols = SDB_DEBUG;
2869: else if (!strncmp (str, "gcoff", len))
2870: write_symbols = SDB_DEBUG;
2871: #endif /* SDB_DEBUGGING_INFO */
2872: if (write_symbols == NO_DEBUG)
2873: warning ("`-%s' option not supported on this version of GCC", str);
2874: else if (level == 0)
2875: write_symbols = NO_DEBUG;
2876: else
2877: debug_info_level = level;
2878: }
2879: else if (!strcmp (str, "o"))
2880: {
2881: asm_file_name = argv[++i];
2882: }
2883: else if (str[0] == 'G')
2884: {
2885: g_switch_set = TRUE;
2886: g_switch_value = atoi ((str[1] != '\0') ? str+1 : argv[++i]);
2887: }
2888: else
2889: error ("Invalid option `%s'", argv[i]);
2890: }
2891: else if (argv[i][0] == '+')
2892: {
2893: if (lang_decode_option (argv[i]))
2894: ;
2895: else
2896: error ("Invalid option `%s'", argv[i]);
2897: }
2898: else
2899: filename = argv[i];
2900: }
2901:
2902: #ifdef OVERRIDE_OPTIONS
2903: /* Some machines may reject certain combinations of options. */
2904: OVERRIDE_OPTIONS;
2905: #endif
2906:
2907: /* Unrolling all loops implies that standard loop unrolling must also
2908: be done. */
2909: if (flag_unroll_all_loops)
2910: flag_unroll_loops = 1;
2911: /* Loop unrolling requires that strength_reduction be on also. Silently
2912: turn on strength reduction here if it isn't already on. Also, the loop
2913: unrolling code assumes that cse will be run after loop, so that must
2914: be turned on also. */
2915: if (flag_unroll_loops)
2916: {
2917: flag_strength_reduce = 1;
2918: flag_rerun_cse_after_loop = 1;
2919: }
2920:
2921: /* Warn about options that are not supported on this machine. */
2922: #ifndef INSN_SCHEDULING
2923: if (flag_schedule_insns || flag_schedule_insns_after_reload)
2924: warning ("instruction scheduling not supported on this target machine");
2925: #endif
2926: #ifndef DELAY_SLOTS
2927: if (flag_delayed_branch)
2928: warning ("this target machine does not have delayed branches");
2929: #endif
2930:
2931: /* If we are in verbose mode, write out the version and maybe all the
2932: option flags in use. */
2933: if (version_flag)
2934: {
2935: fprintf (stderr, "%s version %s", language_string, version_string);
2936: #ifdef TARGET_VERSION
2937: TARGET_VERSION;
2938: #endif
2939: #ifdef __GNUC__
2940: #ifndef __VERSION__
2941: #define __VERSION__ "[unknown]"
2942: #endif
2943: fprintf (stderr, " compiled by GNU C version %s.\n", __VERSION__);
2944: #else
2945: fprintf (stderr, " compiled by CC.\n");
2946: #endif
2947: if (! quiet_flag)
2948: print_switch_values ();
2949: }
2950:
2951: /* Now that register usage is specified, convert it to HARD_REG_SETs. */
2952: init_reg_sets_1 ();
2953:
2954: compile_file (filename);
2955:
2956: #ifndef VMS
2957: if (flag_print_mem)
2958: {
2959: char *lim = (char *) sbrk (0);
2960:
2961: fprintf (stderr, "Data size %d.\n",
2962: (int) lim - (int) &environ);
2963: fflush (stderr);
2964:
2965: #ifdef USG
2966: system ("ps -l 1>&2");
2967: #else /* not USG */
2968: system ("ps v");
2969: #endif /* not USG */
2970: }
2971: #endif /* not VMS */
2972:
2973: if (errorcount)
2974: exit (FATAL_EXIT_CODE);
2975: if (sorrycount)
2976: exit (FATAL_EXIT_CODE);
2977: exit (SUCCESS_EXIT_CODE);
2978: return 34;
2979: }
2980:
2981: /* Decode -m switches. */
2982:
2983: /* Here is a table, controlled by the tm.h file, listing each -m switch
2984: and which bits in `target_switches' it should set or clear.
2985: If VALUE is positive, it is bits to set.
2986: If VALUE is negative, -VALUE is bits to clear.
2987: (The sign bit is not used so there is no confusion.) */
2988:
2989: struct {char *name; int value;} target_switches []
2990: = TARGET_SWITCHES;
2991:
2992: /* This table is similar, but allows the switch to have a value. */
2993:
2994: #ifdef TARGET_OPTIONS
2995: struct {char *prefix; char ** variable;} target_options []
2996: = TARGET_OPTIONS;
2997: #endif
2998:
2999: /* Decode the switch -mNAME. */
3000:
3001: void
3002: set_target_switch (name)
3003: char *name;
3004: {
3005: register int j;
3006: int valid = 0;
3007:
3008: for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
3009: if (!strcmp (target_switches[j].name, name))
3010: {
3011: if (target_switches[j].value < 0)
3012: target_flags &= ~-target_switches[j].value;
3013: else
3014: target_flags |= target_switches[j].value;
3015: valid = 1;
3016: }
3017:
3018: #ifdef TARGET_OPTIONS
3019: if (!valid)
3020: for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
3021: {
3022: int len = strlen (target_options[j].prefix);
3023: if (!strncmp (target_options[j].prefix, name, len))
3024: {
3025: *target_options[j].variable = name + len;
3026: valid = 1;
3027: }
3028: }
3029: #endif
3030:
3031: if (!valid)
3032: error ("Invalid option `%s'", name);
3033: }
3034:
3035: /* Variable used for communication between the following two routines. */
3036:
3037: static int line_position;
3038:
3039: /* Print an option value and adjust the position in the line. */
3040:
3041: static void
3042: print_single_switch (type, name)
3043: char *type, *name;
3044: {
3045: fprintf (stderr, " %s%s", type, name);
3046:
3047: line_position += strlen (type) + strlen (name) + 1;
3048:
3049: if (line_position > 65)
3050: {
3051: fprintf (stderr, "\n\t");
3052: line_position = 8;
3053: }
3054: }
3055:
3056: /* Print default target switches for -version. */
3057:
3058: static void
3059: print_switch_values ()
3060: {
3061: register int j;
3062:
3063: fprintf (stderr, "enabled:");
3064: line_position = 8;
3065:
3066: for (j = 0; j < sizeof f_options / sizeof f_options[0]; j++)
3067: if (*f_options[j].variable == f_options[j].on_value)
3068: print_single_switch ("-f", f_options[j].string);
3069:
3070: for (j = 0; j < sizeof W_options / sizeof W_options[0]; j++)
3071: if (*W_options[j].variable == W_options[j].on_value)
3072: print_single_switch ("-W", W_options[j].string);
3073:
3074: for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
3075: if (target_switches[j].name[0] != '\0'
3076: && target_switches[j].value > 0
3077: && ((target_switches[j].value & target_flags)
3078: == target_switches[j].value))
3079: print_single_switch ("-m", target_switches[j].name);
3080:
3081: fprintf (stderr, "\n");
3082: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.