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