|
|
1.1 root 1: /* Top level of GNU C compiler
2: Copyright (C) 1987, 1988, 1989, 1992, 1993 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: #ifdef REPORT_EVENT
32: #include <errno.h>
33: #endif /* REPORT_EVENT */
34:
35: #include <sys/stat.h>
36:
37: #ifdef USG
38: #undef FLOAT
39: #include <sys/param.h>
40: /* This is for hpux. It is a real screw. They should change hpux. */
41: #undef FLOAT
42: #include <sys/times.h>
43: #include <time.h> /* Correct for hpux at least. Is it good on other USG? */
44: #undef FFS /* Some systems define this in param.h. */
45: #else
46: #ifndef VMS
47: #include <sys/time.h>
48: #include <sys/resource.h>
49: #endif
50: #endif
51:
52: #include "input.h"
53: #include "tree.h"
54: #include "c-tree.h" /* needed for maybe_objc_method_name */
55: #include "rtl.h"
56: #include "flags.h"
57: #include "insn-attr.h"
58: #include "insn-flags.h"
59: #include "defaults.h"
60:
61: #ifdef XCOFF_DEBUGGING_INFO
62: #include "xcoffout.h"
63: #endif
64:
65: #include "bytecode.h"
66: #include "bc-emit.h"
67:
68: #ifdef VMS
69: /* The extra parameters substantially improve the I/O performance. */
70: static FILE *
71: VMS_fopen (fname, type)
72: char * fname;
73: char * type;
74: {
75: if (strcmp (type, "w") == 0)
76: return fopen (fname, type, "mbc=16", "deq=64", "fop=tef", "shr=nil");
77: return fopen (fname, type, "mbc=16");
78: }
79: #define fopen VMS_fopen
80: #endif
81:
82: #ifndef DEFAULT_GDB_EXTENSIONS
83: #define DEFAULT_GDB_EXTENSIONS 1
84: #endif
85:
86: extern int rtx_equal_function_value_matters;
87:
88: #if ! (defined (VMS) || defined (OS2))
89: extern char **environ;
90: #endif
91: extern char *version_string, *language_string;
92:
93: /* Carry information from ASM_DECLARE_OBJECT_NAME
94: to ASM_FINISH_DECLARE_OBJECT. */
95:
96: extern int size_directive_output;
97: extern tree last_assemble_variable_decl;
98:
99: extern void init_lex ();
100: extern void init_decl_processing ();
101: extern void init_obstacks ();
102: extern void init_tree_codes ();
103: extern void init_rtl ();
104: extern void init_optabs ();
105: extern void init_stmt ();
106: extern void init_reg_sets ();
107: extern void dump_flow_info ();
108: extern void dump_sched_info ();
109: extern void dump_local_alloc ();
110:
111: void rest_of_decl_compilation ();
112: void error ();
113: void error_with_file_and_line ();
114: void fancy_abort ();
115: #ifndef abort
116: void abort ();
117: #endif
118: void set_target_switch ();
119: #ifdef NEXT_FAT_OUTPUT
120: void set_target_architecture ();
121: #endif
122: static void print_switch_values ();
123: static char *decl_name ();
124:
125: extern char *getenv ();
126:
127: /* Name of program invoked, sans directories. */
128:
129: char *progname;
130:
131: /* Copy of arguments to main. */
132: int save_argc;
133: char **save_argv;
134:
135: /* Name of current original source file (what was input to cpp).
136: This comes from each #-command in the actual input. */
137:
138: char *input_filename;
139:
140: /* Name of top-level original source file (what was input to cpp).
141: This comes from the #-command at the beginning of the actual input.
142: If there isn't any there, then this is the cc1 input file name. */
143:
144: char *main_input_filename;
145:
146: /* Stream for reading from the input file. */
147:
148: FILE *finput;
149:
150: /* Current line number in real source file. */
151:
152: int lineno;
153:
154: /* Stack of currently pending input files. */
155:
156: struct file_stack *input_file_stack;
157:
158: /* Incremented on each change to input_file_stack. */
159: int input_file_stack_tick;
160:
161: /* FUNCTION_DECL for function now being parsed or compiled. */
162:
163: extern tree current_function_decl;
164:
165: /* Name to use as base of names for dump output files. */
166:
167: char *dump_base_name;
168:
169: /* Bit flags that specify the machine subtype we are compiling for.
170: Bits are tested using macros TARGET_... defined in the tm.h file
171: and set by `-m...' switches. Must be defined in rtlanal.c. */
172:
173: extern int target_flags;
174:
175: /* Flags saying which kinds of debugging dump have been requested. */
176:
177: int rtl_dump = 0;
178: int rtl_dump_and_exit = 0;
179: int jump_opt_dump = 0;
180: int cse_dump = 0;
181: int loop_dump = 0;
182: int cse2_dump = 0;
183: int flow_dump = 0;
184: int combine_dump = 0;
185: int sched_dump = 0;
186: int fppc_dump = 0;
187: int local_reg_dump = 0;
188: int global_reg_dump = 0;
189: int sched2_dump = 0;
190: int jump2_opt_dump = 0;
191: int dbr_sched_dump = 0;
192: int flag_print_asm_name = 0;
193: int stack_reg_dump = 0;
194:
195: /* Name for output file of assembly code, specified with -o. */
196:
197: char *asm_file_name;
198:
199: /* Value of the -G xx switch, and whether it was passed or not. */
200: int g_switch_value;
201: int g_switch_set;
202:
203: /* Type(s) of debugging information we are producing (if any).
204: See flags.h for the definitions of the different possible
205: types of debugging information. */
206: enum debug_info_type write_symbols = NO_DEBUG;
207:
208: /* Level of debugging information we are producing. See flags.h
209: for the definitions of the different possible levels. */
210: enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
211:
212: /* Nonzero means use GNU-only extensions in the generated symbolic
213: debugging information. */
214: /* Currently, this only has an effect when write_symbols is set to
215: DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
216: int use_gnu_debug_info_extensions = 0;
217:
218: /* Nonzero means do optimizations. -O.
219: Particular numeric values stand for particular amounts of optimization;
220: thus, -O2 stores 2 here. However, the optimizations beyond the basic
221: ones are not controlled directly by this variable. Instead, they are
222: controlled by individual `flag_...' variables that are defaulted
223: based on this variable. */
224:
225: int optimize = 0;
226:
227: /* Number of error messages and warning messages so far. */
228:
229: int errorcount = 0;
230: int warningcount = 0;
231: int sorrycount = 0;
232:
233: /* Flag to output bytecode instead of native assembler */
234: int output_bytecode = 0;
235:
236: /* Pointer to function to compute the name to use to print a declaration. */
237:
238: char *(*decl_printable_name) ();
239:
240: /* Pointer to function to compute rtl for a language-specific tree code. */
241:
242: struct rtx_def *(*lang_expand_expr) ();
243:
244: /* Pointer to function to finish handling an incomplete decl at the
245: end of compilation. */
246:
247: void (*incomplete_decl_finalize_hook) () = 0;
248:
249: /* Nonzero if generating code to do profiling. */
250:
251: int profile_flag = 0;
252:
253: /* Nonzero if generating code to do profiling on a line-by-line basis. */
254:
255: int profile_block_flag;
256:
257: /* Nonzero for -pedantic switch: warn about anything
258: that standard spec forbids. */
259:
260: int pedantic = 0;
261:
262: /* Temporarily suppress certain warnings.
263: This is set while reading code from a system header file. */
264:
265: int in_system_header = 0;
266:
267: /* Nonzero means do stupid register allocation.
268: Currently, this is 1 if `optimize' is 0. */
269:
270: int obey_regdecls = 0;
271:
272: #ifdef NEXT_FAT_OUTPUT
273: /* The name of the architecture we are compiling. -arch */
274:
275: static char *architecture = 0;
276:
277: /* Print the name of this architecture before the first warning or
278: error message. -arch_multiple. */
279:
280: static int multi_arch_flag = 0;
281: #endif /* NEXT_FAT_OUTPUT */
282:
283: /* Don't print functions as they are compiled and don't print
284: times taken by the various passes. -quiet. */
285:
286: int quiet_flag = 0;
287:
288: /* -f flags. */
289:
290: /* Nonzero means `char' should be signed. */
291:
292: int flag_signed_char;
293:
294: /* Nonzero means give an enum type only as many bytes as it needs. */
295:
296: int flag_short_enums;
297:
298: /* Nonzero for -fcaller-saves: allocate values in regs that need to
299: be saved across function calls, if that produces overall better code.
300: Optional now, so people can test it. */
301:
302: #ifdef DEFAULT_CALLER_SAVES
303: int flag_caller_saves = 1;
304: #else
305: int flag_caller_saves = 0;
306: #endif
307:
308: /* Nonzero if the floating point precision controll pass should
309: be performed. */
310:
311: #if defined (DEFAULT_FPPC)
312: int flag_fppc = 1;
313: #else
314: int flag_fppc = 0;
315: #endif
316:
317: /* Nonzero if we should generate dave-style indirections. */
318: int flag_dave_indirect = 0;
319:
320: /* Nonzero if structures and unions should be returned in memory.
321:
322: This should only be defined if compatibility with another compiler or
323: with an ABI is needed, because it results in slower code. */
324:
325: #ifndef DEFAULT_PCC_STRUCT_RETURN
326: #define DEFAULT_PCC_STRUCT_RETURN 1
327: #endif
328:
329: /* Nonzero for -fpcc-struct-return: return values the same way PCC does. */
330:
331: int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
332:
333: /* Nonzero for -fforce-mem: load memory value into a register
334: before arithmetic on it. This makes better cse but slower compilation. */
335:
336: int flag_force_mem = 0;
337:
338: /* Nonzero for -fforce-addr: load memory address into a register before
339: reference to memory. This makes better cse but slower compilation. */
340:
341: int flag_force_addr = 0;
342:
343: /* Nonzero for -fdefer-pop: don't pop args after each function call;
344: instead save them up to pop many calls' args with one insns. */
345:
346: int flag_defer_pop = 0;
347:
348: /* Nonzero for -ffloat-store: don't allocate floats and doubles
349: in extended-precision registers. */
350:
351: int flag_float_store = 0;
352:
353: /* Nonzero for -fcse-follow-jumps:
354: have cse follow jumps to do a more extensive job. */
355:
356: int flag_cse_follow_jumps;
357:
358: /* Nonzero for -fcse-skip-blocks:
359: have cse follow a branch around a block. */
360: int flag_cse_skip_blocks;
361:
362: /* Nonzero for -fexpensive-optimizations:
363: perform miscellaneous relatively-expensive optimizations. */
364: int flag_expensive_optimizations;
365:
366: /* Nonzero for -fthread-jumps:
367: have jump optimize output of loop. */
368:
369: int flag_thread_jumps;
370:
371: /* Nonzero enables strength-reduction in loop.c. */
372:
373: int flag_strength_reduce = 0;
374:
375: /* Nonzero enables loop unrolling in unroll.c. Only loops for which the
376: number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
377: UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
378: unrolled. */
379:
380: int flag_unroll_loops;
381:
382: /* Nonzero enables loop unrolling in unroll.c. All loops are unrolled.
383: This is generally not a win. */
384:
385: int flag_unroll_all_loops;
386:
387: /* Nonzero for -fwritable-strings:
388: store string constants in data segment and don't uniquize them. */
389:
390: int flag_writable_strings = 0;
391:
392: /* Nonzero means don't put addresses of constant functions in registers.
393: Used for compiling the Unix kernel, where strange substitutions are
394: done on the assembly output. */
395:
396: int flag_no_function_cse = 0;
397:
398: /* Nonzero for -fomit-frame-pointer:
399: don't make a frame pointer in simple functions that don't require one. */
400:
401: int flag_omit_frame_pointer = 0;
402:
403: /* Nonzero to inhibit use of define_optimization peephole opts. */
404:
405: int flag_no_peephole = 0;
406:
407: /* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math
408: operations in the interest of optimization. For example it allows
409: GCC to assume arguments to sqrt are nonnegative numbers, allowing
410: faster code for sqrt to be generated. */
411:
412: int flag_fast_math = 0;
413:
414: /* Nonzero means all references through pointers are volatile. */
415:
416: int flag_volatile;
417:
418: /* Nonzero means treat all global and extern variables as global. */
419:
420: int flag_volatile_global;
421:
422: /* Nonzero means just do syntax checking; don't output anything. */
423:
424: int flag_syntax_only = 0;
425:
426: /* Nonzero means to rerun cse after loop optimization. This increases
427: compilation time about 20% and picks up a few more common expressions. */
428:
429: static int flag_rerun_cse_after_loop;
430:
431: /* Nonzero for -finline-functions: ok to inline functions that look like
432: good inline candidates. */
433:
434: int flag_inline_functions;
435:
436: /* Nonzero for -fkeep-inline-functions: even if we make a function
437: go inline everywhere, keep its definition around for debugging
438: purposes. */
439:
440: int flag_keep_inline_functions;
441:
442: /* Nonzero means that functions declared `inline' will be treated
443: as `static'. Prevents generation of zillions of copies of unused
444: static inline functions; instead, `inlines' are written out
445: only when actually used. Used in conjunction with -g. Also
446: does the right thing with #pragma interface. */
447:
448: int flag_no_inline;
449:
450: /* Nonzero means we should be saving declaration info into a .X file. */
451:
452: int flag_gen_aux_info = 0;
453:
454: /* Specified name of aux-info file. */
455:
456: static char *aux_info_file_name;
457:
458: /* Nonzero means make the text shared if supported. */
459:
460: int flag_shared_data;
461:
462: /* Nonzero means schedule into delayed branch slots if supported. */
463:
464: int flag_delayed_branch;
465:
466: /* Nonzero if we are compiling pure (sharable) code.
467: Value is 1 if we are doing reasonable (i.e. simple
468: offset into offset table) pic. Value is 2 if we can
469: only perform register offsets. */
470:
471: int flag_pic;
472:
473: /* Nonzero means place uninitialized global data in the bss section. */
474:
475: int flag_no_common;
476:
477: /* Nonzero means pretend it is OK to examine bits of target floats,
478: even if that isn't true. The resulting code will have incorrect constants,
479: but the same series of instructions that the native compiler would make. */
480:
481: int flag_pretend_float;
482:
483: /* Nonzero means change certain warnings into errors.
484: Usually these are warnings about failure to conform to some standard. */
485:
486: int flag_pedantic_errors = 0;
487:
488: /* flag_schedule_insns means schedule insns within basic blocks (before
489: local_alloc).
490: flag_schedule_insns_after_reload means schedule insns after
491: global_alloc. */
492:
493: int flag_schedule_insns = 0;
494: int flag_schedule_insns_after_reload = 0;
495:
496: /* -finhibit-size-directive inhibits output of .size for ELF.
497: This is used only for compiling crtstuff.c,
498: and it may be extended to other effects
499: needed for crtstuff.c on other systems. */
500: int flag_inhibit_size_directive = 0;
501:
502: /* -fverbose-asm causes extra commentary information to be produced in
503: the generated assembly code (to make it more readable). This option
504: is generally only of use to those who actually need to read the
505: generated assembly code (perhaps while debugging the compiler itself). */
506:
507: int flag_verbose_asm = 0;
508:
509: /* -fgnu-linker specifies use of the GNU linker for initializations.
510: (Or, more generally, a linker that handles initializations.)
511: -fno-gnu-linker says that collect2 will be used. */
512: #ifdef USE_COLLECT2
513: int flag_gnu_linker = 0;
514: #else
515: int flag_gnu_linker = 1;
516: #endif
517:
518: /* Table of language-independent -f options.
519: STRING is the option name. VARIABLE is the address of the variable.
520: ON_VALUE is the value to store in VARIABLE
521: if `-fSTRING' is seen as an option.
522: (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
523:
524: struct { char *string; int *variable; int on_value;} f_options[] =
525: {
526: {"float-store", &flag_float_store, 1},
527: {"volatile", &flag_volatile, 1},
528: {"volatile-global", &flag_volatile_global, 1},
529: {"defer-pop", &flag_defer_pop, 1},
530: {"omit-frame-pointer", &flag_omit_frame_pointer, 1},
531: {"cse-follow-jumps", &flag_cse_follow_jumps, 1},
532: {"cse-skip-blocks", &flag_cse_skip_blocks, 1},
533: {"expensive-optimizations", &flag_expensive_optimizations, 1},
534: {"thread-jumps", &flag_thread_jumps, 1},
535: {"strength-reduce", &flag_strength_reduce, 1},
536: {"unroll-loops", &flag_unroll_loops, 1},
537: {"unroll-all-loops", &flag_unroll_all_loops, 1},
538: {"writable-strings", &flag_writable_strings, 1},
539: {"peephole", &flag_no_peephole, 0},
540: {"force-mem", &flag_force_mem, 1},
541: {"force-addr", &flag_force_addr, 1},
542: {"function-cse", &flag_no_function_cse, 0},
543: {"inline-functions", &flag_inline_functions, 1},
544: {"keep-inline-functions", &flag_keep_inline_functions, 1},
545: {"inline", &flag_no_inline, 0},
546: {"syntax-only", &flag_syntax_only, 1},
547: {"shared-data", &flag_shared_data, 1},
548: {"caller-saves", &flag_caller_saves, 1},
549: {"pcc-struct-return", &flag_pcc_struct_return, 1},
550: {"reg-struct-return", &flag_pcc_struct_return, 0},
551: {"delayed-branch", &flag_delayed_branch, 1},
552: {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1},
553: {"pretend-float", &flag_pretend_float, 1},
554: {"schedule-insns", &flag_schedule_insns, 1},
555: {"schedule-insns2", &flag_schedule_insns_after_reload, 1},
556: {"pic", &flag_pic, 1},
557: {"PIC", &flag_pic, 2},
558: {"fast-math", &flag_fast_math, 1},
559: {"common", &flag_no_common, 0},
560: {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
561: {"verbose-asm", &flag_verbose_asm, 1},
562: {"gnu-linker", &flag_gnu_linker, 1},
563: {"bytecode", &output_bytecode, 1},
564: {"fppc", &flag_fppc, 1},
565: {"dave-indirect", &flag_dave_indirect, 1}
566: };
567:
568: /* Table of language-specific options. */
569:
570: char *lang_options[] =
571: {
572: "-ftraditional",
573: "-traditional",
574: "-fnotraditional",
575: "-fno-traditional",
576: "-fallow-single-precision",
577: "-fsigned-char",
578: "-funsigned-char",
579: "-fno-signed-char",
580: "-fno-unsigned-char",
581: "-fsigned-bitfields",
582: "-funsigned-bitfields",
583: "-fno-signed-bitfields",
584: "-fno-unsigned-bitfields",
585: "-fshort-enums",
586: "-fno-short-enums",
587: "-fcond-mismatch",
588: "-fno-cond-mismatch",
589: "-fshort-double",
590: "-fno-short-double",
591: "-fasm",
592: "-fno-asm",
593: "-fbuiltin",
594: "-fno-builtin",
595: "-fno-ident",
596: "-fident",
597: "-fdollars-in-identifiers",
598: "-fno-dollars-in-identifiers",
599: "-ansi",
600: "-Wimplicit",
601: "-Wno-implicit",
602: "-Wwrite-strings",
603: "-Wno-write-strings",
604: "-Wcast-qual",
605: "-Wno-cast-qual",
606: "-Wpointer-arith",
607: "-Wno-pointer-arith",
608: "-Wstrict-prototypes",
609: "-Wno-strict-prototypes",
610: "-Wmissing-prototypes",
611: "-Wno-missing-prototypes",
612: "-Wredundant-decls",
613: "-Wno-redundant-decls",
614: "-Wnested-externs",
615: "-Wno-nested-externs",
616: "-Wtraditional",
617: "-Wno-traditional",
618: "-Wformat",
619: "-Wno-format",
620: #ifdef NEXT_SEMANTICS
621: "-Wnoformat",
622: #endif
623: "-Wchar-subscripts",
624: "-Wno-char-subscripts",
625: "-Wconversion",
626: "-Wno-conversion",
627: "-Wparentheses",
628: "-Wno-parentheses",
629: "-Wcomment",
630: "-Wno-comment",
631: "-Wcomments",
632: "-Wno-comments",
633: "-Wtrigraphs",
634: "-Wno-trigraphs",
635: "-Wimport",
636: "-Wno-import",
637: "-Wmissing-braces",
638: "-Wno-missing-braces",
639: "-Wall",
640:
641: /* These are for C++. */
642: "-+e0", /* gcc.c tacks the `-' on the front. */
643: "-+e1",
644: "-+e2",
645: "-fsave-memoized",
646: "-fno-save-memoized",
647: "-fcadillac",
648: "-fno-cadillac",
649: "-fgc",
650: "-fno-gc",
651: "-flabels-ok",
652: "-fno-labels-ok",
653: "-fstats",
654: "-fno-stats",
655: "-fthis-is-variable",
656: "-fno-this-is-variable",
657: "-fstrict-prototype",
658: "-fno-strict-prototype",
659: "-fall-virtual",
660: "-fno-all-virtual",
661: "-fmemoize-lookups",
662: "-fno-memoize-lookups",
663: "-felide-constructors",
664: "-fno-elide-constructors",
665: "-fhandle-exceptions",
666: "-fno-handle-exceptions",
667: "-fansi-exceptions",
668: "-fno-ansi-exceptions",
669: "-fspring-exceptions",
670: "-fno-spring-exceptions",
671: "-fdefault-inline",
672: "-fno-default-inline",
673: "-fenum-int-equiv",
674: "-fno-enum-int-equiv",
675: "-fdossier",
676: "-fno-dossier",
677: "-fxref",
678: "-fno-xref",
679: "-fnonnull-objects",
680: "-fno-nonnull-objects",
681: "-fimplement-inlines",
682: "-fno-implement-inlines",
683: "-fexternal-templates",
684: "-fno-external-templates",
685: "-fansi-overloading",
686: "-fno-ansi-overloading",
687:
688: "-Wreturn-type",
689: "-Wno-return-type",
690: "-Woverloaded-virtual",
691: "-Wno-overloaded-virtual",
692: "-Wenum-clash",
693: "-Wno-enum-clash",
694: "-Wtemplate-debugging",
695: "-Wno-template-debugging",
696: "-Wctor-dtor-privacy",
697: "-Wno-ctor-dtor-privacy",
698:
699: /* these are for obj c */
700: "-fobjc",
701: "-fno-objc",
702: "-fgen-decls",
703: "-fgnu-runtime",
704: "-fno-gnu-runtime",
705: "-fnext-runtime",
706: "-fno-next-runtime",
707: "-Wselector",
708: "-Wno-selector",
709: "-Wprotocol",
710: "-Wno-protocol",
711:
712: #ifdef NEXT_SEMANTICS
713: /* These are for objective-c */
714: /* NeXT should change to use the -fobjc and -fobjc++ ones above */
715: "-ObjC++",
716: "-ObjC",
717: #endif
718:
719: /* This is for GNAT and is temporary. */
720: "-gnat",
721: 0
722: };
723:
724: /* Options controlling warnings */
725:
726: /* Don't print warning messages. -w. */
727:
728: int inhibit_warnings = 0;
729:
730: /* Print various extra warnings. -W. */
731:
732: int extra_warnings = 0;
733:
734: /* Treat warnings as errors. -Werror. */
735:
736: int warnings_are_errors = 0;
737:
738: /* Nonzero to warn about unused local variables. */
739:
740: int warn_unused;
741:
742: /* Nonzero to warn about variables used before they are initialized. */
743:
744: int warn_uninitialized;
745:
746: /* Nonzero means warn about all declarations which shadow others. */
747:
748: int warn_shadow;
749:
750: /* Warn if a switch on an enum fails to have a case for every enum value. */
751:
752: int warn_switch;
753:
754: /* Nonzero means warn about function definitions that default the return type
755: or that use a null return and have a return-type other than void. */
756:
757: int warn_return_type;
758:
759: /* Nonzero means warn about pointer casts that increase the required
760: alignment of the target type (and might therefore lead to a crash
761: due to a misaligned access). */
762:
763: int warn_cast_align;
764:
765: /* Nonzero means warn about any identifiers that match in the first N
766: characters. The value N is in `id_clash_len'. */
767:
768: int warn_id_clash;
769: int id_clash_len;
770:
771: /* Nonzero means warn if inline function is too large. */
772:
773: int warn_inline;
774:
775: /* Warn if a function returns an aggregate,
776: since there are often incompatible calling conventions for doing this. */
777:
778: int warn_aggregate_return;
779:
780: /* Likewise for -W. */
781:
782: struct { char *string; int *variable; int on_value;} W_options[] =
783: {
784: #ifdef NEXT_CPP_PRECOMP
785: {"precomp", NULL, 1},
786: #endif
787: {"unused", &warn_unused, 1},
788: {"error", &warnings_are_errors, 1},
789: {"shadow", &warn_shadow, 1},
790: {"switch", &warn_switch, 1},
791: {"aggregate-return", &warn_aggregate_return, 1},
792: {"cast-align", &warn_cast_align, 1},
793: {"uninitialized", &warn_uninitialized, 1},
794: {"inline", &warn_inline, 1}
795: };
796:
797: /* Output files for assembler code (real compiler output)
798: and debugging dumps. */
799:
800: FILE *asm_out_file;
801: FILE *aux_info_file;
802: FILE *rtl_dump_file;
803: FILE *jump_opt_dump_file;
804: FILE *cse_dump_file;
805: FILE *loop_dump_file;
806: FILE *cse2_dump_file;
807: FILE *flow_dump_file;
808: FILE *combine_dump_file;
809: FILE *sched_dump_file;
810: FILE *fppc_dump_file;
811: FILE *local_reg_dump_file;
812: FILE *global_reg_dump_file;
813: FILE *sched2_dump_file;
814: FILE *jump2_opt_dump_file;
815: FILE *dbr_sched_dump_file;
816: FILE *stack_reg_dump_file;
817:
818: /* Time accumulators, to count the total time spent in various passes. */
819:
820: int parse_time;
821: int varconst_time;
822: int integration_time;
823: int jump_time;
824: int cse_time;
825: int loop_time;
826: int cse2_time;
827: int flow_time;
828: int combine_time;
829: int sched_time;
830: int local_alloc_time;
831: int global_alloc_time;
832: int sched2_time;
833: int dbr_sched_time;
834: int shorten_branch_time;
835: int stack_reg_time;
836: int final_time;
837: int symout_time;
838: int dump_time;
839:
840: /* Return time used so far, in microseconds. */
841:
842: int
843: get_run_time ()
844: {
845: #ifdef USG
846: struct tms tms;
847: #else
848: #ifndef VMS
849: struct rusage rusage;
850: #else /* VMS */
851: struct
852: {
853: int proc_user_time;
854: int proc_system_time;
855: int child_user_time;
856: int child_system_time;
857: } vms_times;
858: #endif
859: #endif
860:
861: if (quiet_flag)
862: return 0;
863:
864: #ifdef USG
865: times (&tms);
866: return (tms.tms_utime + tms.tms_stime) * (1000000 / HZ);
867: #else
868: #ifndef VMS
869: getrusage (0, &rusage);
870: return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec
871: + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec);
872: #else /* VMS */
873: times (&vms_times);
874: return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000;
875: #endif
876: #endif
877: }
878:
879: #define TIMEVAR(VAR, BODY) \
880: do { int otime = get_run_time (); BODY; VAR += get_run_time () - otime; } while (0)
881:
882: void
883: print_time (str, total)
884: char *str;
885: int total;
886: {
887: fprintf (stderr,
888: "time in %s: %d.%06d\n",
889: str, total / 1000000, total % 1000000);
890: }
891:
892: #ifdef REPORT_EVENT
893: void
894: report_event (type, decl, file, line, msg, arg1, arg2, arg3)
895: int type;
896: tree decl;
897: char *file;
898: char *line;
899: char *msg;
900: int arg1;
901: int arg2;
902: int arg3;
903: {
904: char *name, *kind;
905: tree method_name = maybe_objc_method_name (decl);
906:
907: if (decl == NULL)
908: name = "top level";
909: else if (method_name)
910: name = IDENTIFIER_POINTER (method_name);
911: else
912: name = (*decl_printable_name) (decl, &kind);
913:
914: REPORT_EVENT (type, name, file, line, msg, arg1, arg2, arg3);
915: }
916: #endif /* REPORT_EVENT */
917:
918:
919: /* Count an error or warning. Return 1 if the message should be printed. */
920:
921: int
922: count_error (warningp)
923: int warningp;
924: {
925: if (warningp && inhibit_warnings)
926: return 0;
927:
928: #ifdef NEXT_CPP_PRECOMP
929: if (multi_arch_flag && architecture)
930: {
931: const char *a;
932:
933: if (! strcmp (architecture, "i386"))
934: a = "Intel";
935: else if (! strcmp (architecture, "hppa"))
936: a = "HPPA";
937: else if (! strcmp (architecture, "m68k"))
938: a = "NeXT";
939: else
940: a = architecture;
941:
942: #ifdef REPORT_EVENT
943: report_event (1, current_function_decl, input_filename, lineno,
944: "For architecture %s", a, 0, 0);
945: #endif
946: fprintf (stderr, "For architecture %s:\n", architecture);
947: multi_arch_flag = 0;
948: }
949: #endif /* NEXT_CPP_PRECOMP */
950:
951: if (warningp && !warnings_are_errors)
952: warningcount++;
953: else
954: {
955: static int warning_message = 0;
956:
957: if (warningp && !warning_message)
958: {
959: fprintf (stderr, "%s: warnings being treated as errors\n", progname);
960: warning_message = 1;
961: }
962: errorcount++;
963: }
964:
965: return 1;
966: }
967:
968: /* Print a fatal error message. NAME is the text.
969: Also include a system error message based on `errno'. */
970:
971: void
972: pfatal_with_name (name)
973: char *name;
974: {
975: #ifdef REPORT_EVENT
976: report_event (0, current_function_decl, input_filename, lineno,
977: "%s: ", name, strerror (errno), 0);
978: #endif
979: fprintf (stderr, "%s: ", progname);
980: perror (name);
981: exit (35);
982: }
983:
984: void
985: fatal_io_error (name)
986: char *name;
987: {
988: #ifdef REPORT_EVENT
989: report_event (0, current_function_decl, input_filename, lineno,
990: "%s: I/O error\n", name, 0, 0);
991: #endif
992: fprintf (stderr, "%s: %s: I/O error\n", progname, name);
993: exit (35);
994: }
995:
996: /* Called to give a better error message when we don't have an insn to match
997: what we are looking for or if the insn's constraints aren't satisfied,
998: rather than just calling abort(). */
999:
1000: void
1001: fatal_insn_not_found (insn)
1002: rtx insn;
1003: {
1004: if (!output_bytecode)
1005: {
1006: if (INSN_CODE (insn) < 0)
1007: error ("internal error--unrecognizable insn:", 0);
1008: else
1009: error ("internal error--insn does not satisfy its constraints:", 0);
1010: debug_rtx (insn);
1011: }
1012: if (asm_out_file)
1013: fflush (asm_out_file);
1014: if (aux_info_file)
1015: fflush (aux_info_file);
1016: if (rtl_dump_file)
1017: fflush (rtl_dump_file);
1018: if (jump_opt_dump_file)
1019: fflush (jump_opt_dump_file);
1020: if (cse_dump_file)
1021: fflush (cse_dump_file);
1022: if (loop_dump_file)
1023: fflush (loop_dump_file);
1024: if (cse2_dump_file)
1025: fflush (cse2_dump_file);
1026: if (flow_dump_file)
1027: fflush (flow_dump_file);
1028: if (combine_dump_file)
1029: fflush (combine_dump_file);
1030: if (sched_dump_file)
1031: fflush (sched_dump_file);
1032: if (fppc_dump_file)
1033: fflush (fppc_dump_file);
1034: if (local_reg_dump_file)
1035: fflush (local_reg_dump_file);
1036: if (global_reg_dump_file)
1037: fflush (global_reg_dump_file);
1038: if (sched2_dump_file)
1039: fflush (sched2_dump_file);
1040: if (jump2_opt_dump_file)
1041: fflush (jump2_opt_dump_file);
1042: if (dbr_sched_dump_file)
1043: fflush (dbr_sched_dump_file);
1044: if (stack_reg_dump_file)
1045: fflush (stack_reg_dump_file);
1046: abort ();
1047: }
1048:
1049: /* This is the default decl_printable_name function. */
1050:
1051: static char *
1052: decl_name (decl, kind)
1053: tree decl;
1054: char **kind;
1055: {
1056: return IDENTIFIER_POINTER (DECL_NAME (decl));
1057: }
1058:
1059: static int need_error_newline;
1060:
1061: /* Function of last error message;
1062: more generally, function such that if next error message is in it
1063: then we don't have to mention the function name. */
1064: static tree last_error_function = NULL;
1065:
1066: /* Used to detect when input_file_stack has changed since last described. */
1067: static int last_error_tick;
1068:
1069: /* Called when the start of a function definition is parsed,
1070: this function prints on stderr the name of the function. */
1071:
1072: void
1073: announce_function (decl)
1074: tree decl;
1075: {
1076: if (! quiet_flag)
1077: {
1078: char *junk;
1079: if (rtl_dump_and_exit)
1080: fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
1081: else
1082: fprintf (stderr, " %s", (*decl_printable_name) (decl, &junk));
1083: fflush (stderr);
1084: need_error_newline = 1;
1085: last_error_function = current_function_decl;
1086: }
1087: }
1088:
1089: /* Prints out, if necessary, the name of the current function
1090: which caused an error. Called from all error and warning functions. */
1091:
1092: void
1093: report_error_function (file)
1094: char *file;
1095: {
1096: struct file_stack *p;
1097:
1098: if (need_error_newline)
1099: {
1100: fprintf (stderr, "\n");
1101: need_error_newline = 0;
1102: }
1103:
1104: if (last_error_function != current_function_decl)
1105: {
1106: char *kind = "function";
1107: tree method_name = maybe_objc_method_name (current_function_decl);
1108:
1109: if (current_function_decl != 0
1110: && TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
1111: kind = "method";
1112:
1113: if (file)
1114: fprintf (stderr, "%s: ", file);
1115:
1116: if (current_function_decl == NULL)
1117: fprintf (stderr, "At top level:\n");
1118:
1119: else if (method_name)
1120: fprintf (stderr, "In method `%s'\n",
1121: IDENTIFIER_POINTER (method_name));
1122: else
1123: {
1124: char *name = (*decl_printable_name) (current_function_decl, &kind);
1125: fprintf (stderr, "In %s `%s':\n", kind, name);
1126: }
1127:
1128: last_error_function = current_function_decl;
1129: }
1130: if (input_file_stack && input_file_stack->next != 0
1131: && input_file_stack_tick != last_error_tick)
1132: {
1133: fprintf (stderr, "In file included");
1134: for (p = input_file_stack->next; p; p = p->next)
1135: {
1136: fprintf (stderr, " from %s:%d", p->name, p->line);
1137: if (p->next)
1138: fprintf (stderr, ",\n ");
1139: }
1140: fprintf (stderr, ":\n");
1141: last_error_tick = input_file_stack_tick;
1142: }
1143: }
1144:
1145: /* Report an error at the current line number.
1146: S is a string and ARGLIST are args for `printf'. We use HOST_WIDE_INT
1147: as the type for these args assuming it is wide enough to hold a
1148: pointer. This isn't terribly portable, but is the best we can do
1149: without vprintf universally available. */
1150:
1151: #define arglist a1, a2, a3
1152: #define arglist_dcl HOST_WIDE_INT a1, a2, a3;
1153:
1154: void
1155: error (s, arglist)
1156: char *s;
1157: arglist_dcl
1158: {
1159: error_with_file_and_line (input_filename, lineno, s, arglist);
1160: }
1161:
1162: /* Report an error at line LINE of file FILE.
1163: S and ARGLIST are a string and args for `printf'. */
1164:
1165: void
1166: error_with_file_and_line (file, line, s, arglist)
1167: char *file;
1168: int line;
1169: char *s;
1170: arglist_dcl
1171: {
1172: count_error (0);
1173:
1174: report_error_function (file);
1175:
1176: #ifdef REPORT_EVENT
1177: report_event (0, current_function_decl, file, line, s, arglist, 0, 0);
1178: #endif
1179:
1180: if (file)
1181: fprintf (stderr, "%s:%d: ", file, line);
1182: else
1183: fprintf (stderr, "%s: ", progname);
1184: fprintf (stderr, s, arglist);
1185:
1186: fprintf (stderr, "\n");
1187: }
1188:
1189: /* Report an error at the declaration DECL.
1190: S and V are a string and an arg which uses %s to substitute
1191: the declaration name. */
1192:
1193: void
1194: error_with_decl (decl, s, v)
1195: tree decl;
1196: char *s;
1197: HOST_WIDE_INT v;
1198: {
1199: char *junk;
1200: count_error (0);
1201:
1202: report_error_function (DECL_SOURCE_FILE (decl));
1203:
1204: #ifdef REPORT_EVENT
1205: if (DECL_NAME (decl))
1206: report_event (0, current_function_decl,
1207: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl),
1208: s, (*decl_printable_name) (decl, &junk), v, 0);
1209: else
1210: report_event (0, current_function_decl,
1211: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl),
1212: s, "((anonymous))", v, 0);
1213: #endif
1214:
1215: fprintf (stderr, "%s:%d: ",
1216: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
1217:
1218: if (DECL_NAME (decl))
1219: fprintf (stderr, s, (*decl_printable_name) (decl, &junk), v);
1220: else
1221: fprintf (stderr, s, "((anonymous))", v);
1222: fprintf (stderr, "\n");
1223: }
1224:
1225: /* Report an error at the line number of the insn INSN.
1226: S and ARGLIST are a string and args for `printf'.
1227: This is used only when INSN is an `asm' with operands,
1228: and each ASM_OPERANDS records its own source file and line. */
1229:
1230: void
1231: error_for_asm (insn, s, arglist)
1232: rtx insn;
1233: char *s;
1234: arglist_dcl
1235: {
1236: char *filename;
1237: int line;
1238: rtx body = PATTERN (insn);
1239: rtx asmop;
1240:
1241: /* Find the (or one of the) ASM_OPERANDS in the insn. */
1242: if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1243: asmop = SET_SRC (body);
1244: else if (GET_CODE (body) == ASM_OPERANDS)
1245: asmop = body;
1246: else if (GET_CODE (body) == PARALLEL
1247: && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1248: asmop = SET_SRC (XVECEXP (body, 0, 0));
1249: else if (GET_CODE (body) == PARALLEL
1250: && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1251: asmop = XVECEXP (body, 0, 0);
1252:
1253: filename = ASM_OPERANDS_SOURCE_FILE (asmop);
1254: line = ASM_OPERANDS_SOURCE_LINE (asmop);
1255:
1256: error_with_file_and_line (filename, line, s, arglist);
1257: }
1258:
1259: void
1260: fatal (s, arglist)
1261: char *s;
1262: arglist_dcl
1263: {
1264: error (s, arglist);
1265: exit (34);
1266: }
1267:
1268: /* Report a warning at line LINE.
1269: S and ARGLIST are a string and args for `printf'. */
1270:
1271: void
1272: warning_with_file_and_line (file, line, s, arglist)
1273: char *file;
1274: int line;
1275: char *s;
1276: arglist_dcl
1277: {
1278: if (count_error (1) == 0)
1279: return;
1280:
1281: report_error_function (file);
1282:
1283: #ifdef REPORT_EVENT
1284: report_event (1, current_function_decl, file, line, s, arglist, 0, 0);
1285: #endif
1286:
1287: if (file)
1288: fprintf (stderr, "%s:%d: ", file, line);
1289: else
1290: fprintf (stderr, "%s: ", progname);
1291:
1292: fprintf (stderr, "warning: ");
1293: fprintf (stderr, s, arglist);
1294: fprintf (stderr, "\n");
1295: }
1296:
1297: /* Report a warning at the current line number.
1298: S and ARGLIST are a string and args for `printf'. */
1299:
1300: void
1301: warning (s, arglist)
1302: char *s;
1303: arglist_dcl
1304: {
1305: warning_with_file_and_line (input_filename, lineno, s, arglist);
1306: }
1307:
1308: /* Report a warning at the declaration DECL.
1309: S is string which uses %s to substitute the declaration name.
1310: V is a second parameter that S can refer to. */
1311:
1312: void
1313: warning_with_decl (decl, s, v)
1314: tree decl;
1315: char *s;
1316: HOST_WIDE_INT v;
1317: {
1318: char *junk;
1319:
1320: if (count_error (1) == 0)
1321: return;
1322:
1323: report_error_function (DECL_SOURCE_FILE (decl));
1324:
1325: #ifdef REPORT_EVENT
1326: if (DECL_NAME (decl))
1327: report_event (1, current_function_decl,
1328: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl),
1329: s, (*decl_printable_name) (decl, &junk), v, 0);
1330: else
1331: report_event (1, current_function_decl,
1332: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl),
1333: s, "((anonymous))", v, 0);
1334: #endif
1335:
1336: fprintf (stderr, "%s:%d: ",
1337: DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
1338:
1339: fprintf (stderr, "warning: ");
1340: if (DECL_NAME (decl))
1341: fprintf (stderr, s, (*decl_printable_name) (decl, &junk), v);
1342: else
1343: fprintf (stderr, s, "((anonymous))", v);
1344: fprintf (stderr, "\n");
1345: }
1346:
1347: /* Report a warning at the line number of the insn INSN.
1348: S and ARGLIST are a string and args for `printf'.
1349: This is used only when INSN is an `asm' with operands,
1350: and each ASM_OPERANDS records its own source file and line. */
1351:
1352: void
1353: warning_for_asm (insn, s, arglist)
1354: rtx insn;
1355: char *s;
1356: arglist_dcl
1357: {
1358: char *filename;
1359: int line;
1360: rtx body = PATTERN (insn);
1361: rtx asmop;
1362:
1363: /* Find the (or one of the) ASM_OPERANDS in the insn. */
1364: if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1365: asmop = SET_SRC (body);
1366: else if (GET_CODE (body) == ASM_OPERANDS)
1367: asmop = body;
1368: else if (GET_CODE (body) == PARALLEL
1369: && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1370: asmop = SET_SRC (XVECEXP (body, 0, 0));
1371: else if (GET_CODE (body) == PARALLEL
1372: && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1373: asmop = XVECEXP (body, 0, 0);
1374:
1375: filename = ASM_OPERANDS_SOURCE_FILE (asmop);
1376: line = ASM_OPERANDS_SOURCE_LINE (asmop);
1377:
1378: warning_with_file_and_line (filename, line, s, arglist);
1379: }
1380:
1381: /* These functions issue either warnings or errors depending on
1382: -pedantic-errors. */
1383:
1384: void
1385: pedwarn (s, arglist)
1386: char *s;
1387: arglist_dcl
1388: {
1389: if (flag_pedantic_errors)
1390: error (s, arglist);
1391: else
1392: warning (s, arglist);
1393: }
1394:
1395: void
1396: pedwarn_with_decl (decl, s, v)
1397: tree decl;
1398: char *s;
1399: HOST_WIDE_INT v;
1400: {
1401: if (flag_pedantic_errors)
1402: error_with_decl (decl, s, v);
1403: else
1404: warning_with_decl (decl, s, v);
1405: }
1406:
1407: void
1408: pedwarn_with_file_and_line (file, line, s, arglist)
1409: char *file;
1410: int line;
1411: char *s;
1412: arglist_dcl
1413: {
1414: if (flag_pedantic_errors)
1415: error_with_file_and_line (file, line, s, arglist);
1416: else
1417: warning_with_file_and_line (file, line, s, arglist);
1418: }
1419:
1420: /* Apologize for not implementing some feature.
1421: S and ARGLIST are a string and args for `printf'. */
1422:
1423: void
1424: sorry (s, arglist)
1425: char *s;
1426: arglist_dcl
1427: {
1428: sorrycount++;
1429: #ifdef REPORT_EVENT
1430: report_event (0, current_function_decl, input_filename, lineno,
1431: s, arglist, 0, 0);
1432: #endif
1433: if (input_filename)
1434: fprintf (stderr, "%s:%d: ", input_filename, lineno);
1435: else
1436: fprintf (stderr, "%s: ", progname);
1437:
1438: fprintf (stderr, "sorry, not implemented: ");
1439: fprintf (stderr, s, arglist);
1440: fprintf (stderr, "\n");
1441: }
1442:
1443: /* Apologize for not implementing some feature, then quit.
1444: S and ARGLIST are a string and args for `printf'. */
1445:
1446: void
1447: really_sorry (s, arglist)
1448: char *s;
1449: arglist_dcl
1450: {
1451: #ifdef REPORT_EVENT
1452: report_event (0, current_function_decl, input_filename, lineno,
1453: s, arglist, 0, 0);
1454: #endif
1455: if (input_filename)
1456: fprintf (stderr, "%s:%d: ", input_filename, lineno);
1457: else
1458: fprintf (stderr, "%s: ", progname);
1459:
1460: fprintf (stderr, "sorry, not implemented: ");
1461: fprintf (stderr, s, arglist);
1462: fatal (" (fatal)\n");
1463: }
1464:
1465: /* More 'friendly' abort that prints the line and file.
1466: config.h can #define abort fancy_abort if you like that sort of thing.
1467:
1468: I don't think this is actually a good idea.
1469: Other sorts of crashes will look a certain way.
1470: It is a good thing if crashes from calling abort look the same way.
1471: -- RMS */
1472:
1473: void
1474: fancy_abort ()
1475: {
1476: fatal ("internal gcc abort");
1477: }
1478:
1479: /* This calls abort and is used to avoid problems when abort if a macro.
1480: It is used when we need to pass the address of abort. */
1481:
1482: void
1483: do_abort ()
1484: {
1485: abort ();
1486: }
1487:
1488: /* When `malloc.c' is compiled with `rcheck' defined,
1489: it calls this function to report clobberage. */
1490:
1491: void
1492: botch (s)
1493: {
1494: abort ();
1495: }
1496:
1497: /* Same as `malloc' but report error if no memory available. */
1498:
1499: char *
1500: xmalloc (size)
1501: unsigned size;
1502: {
1503: register char *value = (char *) malloc (size);
1504: if (value == 0)
1505: fatal ("virtual memory exhausted");
1506: return value;
1507: }
1508:
1509: /* Same as `realloc' but report error if no memory available. */
1510:
1511: char *
1512: xrealloc (ptr, size)
1513: char *ptr;
1514: int size;
1515: {
1516: char *result = (char *) realloc (ptr, size);
1517: if (!result)
1518: fatal ("virtual memory exhausted");
1519: return result;
1520: }
1521:
1522: /* Return the logarithm of X, base 2, considering X unsigned,
1523: if X is a power of 2. Otherwise, returns -1.
1524:
1525: This should be used via the `exact_log2' macro. */
1526:
1527: int
1528: exact_log2_wide (x)
1529: register unsigned HOST_WIDE_INT x;
1530: {
1531: register int log = 0;
1532: /* Test for 0 or a power of 2. */
1533: if (x == 0 || x != (x & -x))
1534: return -1;
1535: while ((x >>= 1) != 0)
1536: log++;
1537: return log;
1538: }
1539:
1540: /* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
1541: If X is 0, return -1.
1542:
1543: This should be used via the floor_log2 macro. */
1544:
1545: int
1546: floor_log2_wide (x)
1547: register unsigned HOST_WIDE_INT x;
1548: {
1549: register int log = -1;
1550: while (x != 0)
1551: log++,
1552: x >>= 1;
1553: return log;
1554: }
1555:
1556: int float_handled;
1557: jmp_buf float_handler;
1558:
1559: /* Specify where to longjmp to when a floating arithmetic error happens.
1560: If HANDLER is 0, it means don't handle the errors any more. */
1561:
1562: void
1563: set_float_handler (handler)
1564: jmp_buf handler;
1565: {
1566: float_handled = (handler != 0);
1567: if (handler)
1568: bcopy (handler, float_handler, sizeof (float_handler));
1569: }
1570:
1571: /* Specify, in HANDLER, where to longjmp to when a floating arithmetic
1572: error happens, pushing the previous specification into OLD_HANDLER.
1573: Return an indication of whether there was a previous handler in effect. */
1574:
1575: int
1576: push_float_handler (handler, old_handler)
1577: jmp_buf handler, old_handler;
1578: {
1579: int was_handled = float_handled;
1580:
1581: float_handled = 1;
1582: if (was_handled)
1583: bcopy (float_handler, old_handler, sizeof (float_handler));
1584: bcopy (handler, float_handler, sizeof (float_handler));
1585: return was_handled;
1586: }
1587:
1588: /* Restore the previous specification of whether and where to longjmp to
1589: when a floating arithmetic error happens. */
1590:
1591: void
1592: pop_float_handler (handled, handler)
1593: int handled;
1594: jmp_buf handler;
1595: {
1596: float_handled = handled;
1597: if (handled)
1598: bcopy (handler, float_handler, sizeof (float_handler));
1599: }
1600:
1601: /* Signals actually come here. */
1602:
1603: static void
1604: float_signal (signo)
1605: /* If this is missing, some compilers complain. */
1606: int signo;
1607: {
1608: if (float_handled == 0)
1609: abort ();
1610: #if defined (USG) || defined (hpux)
1611: signal (SIGFPE, float_signal); /* re-enable the signal catcher */
1612: #endif
1613: float_handled = 0;
1614: signal (SIGFPE, float_signal);
1615: longjmp (float_handler, 1);
1616: }
1617:
1618: /* Handler for SIGPIPE. */
1619:
1620: static void
1621: pipe_closed (signo)
1622: /* If this is missing, some compilers complain. */
1623: int signo;
1624: {
1625: fatal ("output pipe has been closed");
1626: }
1627:
1628: /* Strip off a legitimate source ending from the input string NAME of
1629: length LEN. */
1630:
1631: void
1632: strip_off_ending (name, len)
1633: char *name;
1634: int len;
1635: {
1636: if (len > 2 && ! strcmp (".c", name + len - 2))
1637: name[len - 2] = 0;
1638: else if (len > 2 && ! strcmp (".m", name + len - 2))
1639: name[len - 2] = 0;
1640: else if (len > 2 && ! strcmp (".i", name + len - 2))
1641: name[len - 2] = 0;
1642: else if (len > 3 && ! strcmp (".ii", name + len - 3))
1643: name[len - 3] = 0;
1644: else if (len > 3 && ! strcmp (".co", name + len - 3))
1645: name[len - 3] = 0;
1646: else if (len > 3 && ! strcmp (".cc", name + len - 3))
1647: name[len - 3] = 0;
1648: else if (len > 2 && ! strcmp (".C", name + len - 2))
1649: name[len - 2] = 0;
1650: else if (len > 4 && ! strcmp (".cxx", name + len - 4))
1651: name[len - 4] = 0;
1652: else if (len > 2 && ! strcmp (".f", name + len - 2))
1653: name[len - 2] = 0;
1654: /* Ada will use extensions like .ada, .adb, and .ads, so just test
1655: for "ad". */
1656: else if (len > 4 && ! strncmp (".ad", name + len - 4, 3))
1657: name[len - 4] = 0;
1658: else if (len > 4 && ! strcmp (".atr", name + len - 4))
1659: name[len - 4] = 0;
1660: }
1661:
1662: /* Output a quoted string. */
1663: void
1664: output_quoted_string (asm_file, string)
1665: FILE *asm_file;
1666: char *string;
1667: {
1668: char c;
1669:
1670: putc ('\"', asm_file);
1671: while ((c = *string++) != 0)
1672: {
1673: if (c == '\"' || c == '\\')
1674: putc ('\\', asm_file);
1675: putc (c, asm_file);
1676: }
1677: putc ('\"', asm_file);
1678: }
1679:
1680: /* Output a file name in the form wanted by System V. */
1681:
1682: void
1683: output_file_directive (asm_file, input_name)
1684: FILE *asm_file;
1685: char *input_name;
1686: {
1687: int len = strlen (input_name);
1688: char *na = input_name + len;
1689:
1690: /* NA gets INPUT_NAME sans directory names. */
1691: while (na > input_name)
1692: {
1693: if (na[-1] == '/')
1694: break;
1695: na--;
1696: }
1697:
1698: #ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
1699: ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
1700: #else
1701: #ifdef ASM_OUTPUT_SOURCE_FILENAME
1702: ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
1703: #else
1704: fprintf (asm_file, "\t.file\t");
1705: output_quoted_string (asm_file, na);
1706: fputc ('\n', asm_file);
1707: #endif
1708: #endif
1709: }
1710:
1711: /* Routine to build language identifier for object file. */
1712: static void
1713: output_lang_identify (asm_out_file)
1714: FILE *asm_out_file;
1715: {
1716: int len = strlen (lang_identify ()) + sizeof ("__gnu_compiled_") + 1;
1717: char *s = (char *) alloca (len);
1718: sprintf (s, "__gnu_compiled_%s", lang_identify ());
1719: ASM_OUTPUT_LABEL (asm_out_file, s);
1720: }
1721:
1722: /* Compile an entire file of output from cpp, named NAME.
1723: Write a file of assembly output and various debugging dumps. */
1724:
1725: static void
1726: compile_file (name)
1727: char *name;
1728: {
1729: tree globals;
1730: int start_time;
1731: int dump_base_name_length;
1732:
1733: int name_specified = name != 0;
1734:
1735: if (dump_base_name == 0)
1736: dump_base_name = name ? name : "gccdump";
1737: dump_base_name_length = strlen (dump_base_name);
1738:
1739: parse_time = 0;
1740: varconst_time = 0;
1741: integration_time = 0;
1742: jump_time = 0;
1743: cse_time = 0;
1744: loop_time = 0;
1745: cse2_time = 0;
1746: flow_time = 0;
1747: combine_time = 0;
1748: sched_time = 0;
1749: local_alloc_time = 0;
1750: global_alloc_time = 0;
1751: sched2_time = 0;
1752: dbr_sched_time = 0;
1753: shorten_branch_time = 0;
1754: stack_reg_time = 0;
1755: final_time = 0;
1756: symout_time = 0;
1757: dump_time = 0;
1758:
1759: /* Open input file. */
1760:
1761: if (name == 0 || !strcmp (name, "-"))
1762: {
1763: finput = stdin;
1764: name = "stdin";
1765: }
1766: else
1767: finput = fopen (name, "r");
1768: if (finput == 0)
1769: pfatal_with_name (name);
1770:
1771: #ifdef IO_BUFFER_SIZE
1772: setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
1773: #endif
1774:
1775: /* Initialize data in various passes. */
1776:
1777: init_obstacks ();
1778: init_tree_codes ();
1779: init_lex ();
1780: /* Some of these really don't need to be called when generating bytecode,
1781: but the options would have to be parsed first to know that. -bson */
1782: init_rtl ();
1783: init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
1784: || debug_info_level == DINFO_LEVEL_VERBOSE);
1785: init_decl_processing ();
1786: init_optabs ();
1787: init_stmt ();
1788: init_expmed ();
1789: init_expr_once ();
1790: init_loop ();
1791: init_reload ();
1792:
1793: if (flag_caller_saves)
1794: init_caller_save ();
1795:
1796: /* If auxiliary info generation is desired, open the output file.
1797: This goes in the same directory as the source file--unlike
1798: all the other output files. */
1799: if (flag_gen_aux_info)
1800: {
1801: aux_info_file = fopen (aux_info_file_name, "w");
1802: if (aux_info_file == 0)
1803: pfatal_with_name (aux_info_file_name);
1804: }
1805:
1806: /* If rtl dump desired, open the output file. */
1807: if (rtl_dump)
1808: {
1809: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1810: strcpy (dumpname, dump_base_name);
1811: strcat (dumpname, ".rtl");
1812: rtl_dump_file = fopen (dumpname, "w");
1813: if (rtl_dump_file == 0)
1814: pfatal_with_name (dumpname);
1815: }
1816:
1817: /* If jump_opt dump desired, open the output file. */
1818: if (jump_opt_dump)
1819: {
1820: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1821: strcpy (dumpname, dump_base_name);
1822: strcat (dumpname, ".jump");
1823: jump_opt_dump_file = fopen (dumpname, "w");
1824: if (jump_opt_dump_file == 0)
1825: pfatal_with_name (dumpname);
1826: }
1827:
1828: /* If cse dump desired, open the output file. */
1829: if (cse_dump)
1830: {
1831: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1832: strcpy (dumpname, dump_base_name);
1833: strcat (dumpname, ".cse");
1834: cse_dump_file = fopen (dumpname, "w");
1835: if (cse_dump_file == 0)
1836: pfatal_with_name (dumpname);
1837: }
1838:
1839: /* If loop dump desired, open the output file. */
1840: if (loop_dump)
1841: {
1842: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1843: strcpy (dumpname, dump_base_name);
1844: strcat (dumpname, ".loop");
1845: loop_dump_file = fopen (dumpname, "w");
1846: if (loop_dump_file == 0)
1847: pfatal_with_name (dumpname);
1848: }
1849:
1850: /* If cse2 dump desired, open the output file. */
1851: if (cse2_dump)
1852: {
1853: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1854: strcpy (dumpname, dump_base_name);
1855: strcat (dumpname, ".cse2");
1856: cse2_dump_file = fopen (dumpname, "w");
1857: if (cse2_dump_file == 0)
1858: pfatal_with_name (dumpname);
1859: }
1860:
1861: /* If flow dump desired, open the output file. */
1862: if (flow_dump)
1863: {
1864: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1865: strcpy (dumpname, dump_base_name);
1866: strcat (dumpname, ".flow");
1867: flow_dump_file = fopen (dumpname, "w");
1868: if (flow_dump_file == 0)
1869: pfatal_with_name (dumpname);
1870: }
1871:
1872: /* If combine dump desired, open the output file. */
1873: if (combine_dump)
1874: {
1875: register char *dumpname = (char *) xmalloc (dump_base_name_length + 10);
1876: strcpy (dumpname, dump_base_name);
1877: strcat (dumpname, ".combine");
1878: combine_dump_file = fopen (dumpname, "w");
1879: if (combine_dump_file == 0)
1880: pfatal_with_name (dumpname);
1881: }
1882:
1883: /* If scheduling dump desired, open the output file. */
1884: if (sched_dump)
1885: {
1886: register char *dumpname = (char *) xmalloc (dump_base_name_length + 7);
1887: strcpy (dumpname, dump_base_name);
1888: strcat (dumpname, ".sched");
1889: sched_dump_file = fopen (dumpname, "w");
1890: if (sched_dump_file == 0)
1891: pfatal_with_name (dumpname);
1892: }
1893:
1894: /* If local_reg dump desired, open the output file. */
1895: if (fppc_dump)
1896: {
1897: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1898: strcpy (dumpname, dump_base_name);
1899: strcat (dumpname, ".fppc");
1900: fppc_dump_file = fopen (dumpname, "w");
1901: if (fppc_dump_file == 0)
1902: pfatal_with_name (dumpname);
1903: }
1904:
1905: /* If local_reg dump desired, open the output file. */
1906: if (local_reg_dump)
1907: {
1908: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1909: strcpy (dumpname, dump_base_name);
1910: strcat (dumpname, ".lreg");
1911: local_reg_dump_file = fopen (dumpname, "w");
1912: if (local_reg_dump_file == 0)
1913: pfatal_with_name (dumpname);
1914: }
1915:
1916: /* If global_reg dump desired, open the output file. */
1917: if (global_reg_dump)
1918: {
1919: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1920: strcpy (dumpname, dump_base_name);
1921: strcat (dumpname, ".greg");
1922: global_reg_dump_file = fopen (dumpname, "w");
1923: if (global_reg_dump_file == 0)
1924: pfatal_with_name (dumpname);
1925: }
1926:
1927: /* If 2nd scheduling dump desired, open the output file. */
1928: if (sched2_dump)
1929: {
1930: register char *dumpname = (char *) xmalloc (dump_base_name_length + 8);
1931: strcpy (dumpname, dump_base_name);
1932: strcat (dumpname, ".sched2");
1933: sched2_dump_file = fopen (dumpname, "w");
1934: if (sched2_dump_file == 0)
1935: pfatal_with_name (dumpname);
1936: }
1937:
1938: /* If jump2_opt dump desired, open the output file. */
1939: if (jump2_opt_dump)
1940: {
1941: register char *dumpname = (char *) xmalloc (dump_base_name_length + 7);
1942: strcpy (dumpname, dump_base_name);
1943: strcat (dumpname, ".jump2");
1944: jump2_opt_dump_file = fopen (dumpname, "w");
1945: if (jump2_opt_dump_file == 0)
1946: pfatal_with_name (dumpname);
1947: }
1948:
1949: /* If dbr_sched dump desired, open the output file. */
1950: if (dbr_sched_dump)
1951: {
1952: register char *dumpname = (char *) xmalloc (dump_base_name_length + 7);
1953: strcpy (dumpname, dump_base_name);
1954: strcat (dumpname, ".dbr");
1955: dbr_sched_dump_file = fopen (dumpname, "w");
1956: if (dbr_sched_dump_file == 0)
1957: pfatal_with_name (dumpname);
1958: }
1959:
1960: #ifdef STACK_REGS
1961:
1962: /* If stack_reg dump desired, open the output file. */
1963: if (stack_reg_dump)
1964: {
1965: register char *dumpname = (char *) xmalloc (dump_base_name_length + 10);
1966: strcpy (dumpname, dump_base_name);
1967: strcat (dumpname, ".stack");
1968: stack_reg_dump_file = fopen (dumpname, "w");
1969: if (stack_reg_dump_file == 0)
1970: pfatal_with_name (dumpname);
1971: }
1972:
1973: #endif
1974:
1975: /* Open assembler code output file. */
1976:
1977: if (! name_specified && asm_file_name == 0)
1978: asm_out_file = stdout;
1979: else
1980: {
1981: register char *dumpname = (char *) xmalloc (dump_base_name_length + 6);
1982: int len = strlen (dump_base_name);
1983: strcpy (dumpname, dump_base_name);
1984: strip_off_ending (dumpname, len);
1985: strcat (dumpname, ".s");
1986: if (asm_file_name == 0)
1987: {
1988: asm_file_name = (char *) xmalloc (strlen (dumpname) + 1);
1989: strcpy (asm_file_name, dumpname);
1990: }
1991: if (!strcmp (asm_file_name, "-"))
1992: asm_out_file = stdout;
1993: else
1994: asm_out_file = fopen (asm_file_name, "w");
1995: if (asm_out_file == 0)
1996: pfatal_with_name (asm_file_name);
1997: }
1998:
1999: #ifdef IO_BUFFER_SIZE
2000: setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
2001: _IOFBF, IO_BUFFER_SIZE);
2002: #endif
2003:
2004: input_filename = name;
2005:
2006: /* Perform language-specific initialization.
2007: This may set main_input_filename. */
2008: lang_init ();
2009:
2010: /* If the input doesn't start with a #line, use the input name
2011: as the official input file name. */
2012: if (main_input_filename == 0)
2013: main_input_filename = name;
2014:
2015: /* Put an entry on the input file stack for the main input file. */
2016: input_file_stack
2017: = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2018: input_file_stack->next = 0;
2019: input_file_stack->name = input_filename;
2020:
2021: if (!output_bytecode)
2022: {
2023: ASM_FILE_START (asm_out_file);
2024: }
2025:
2026: /* Output something to inform GDB that this compilation was by GCC. Also
2027: serves to tell GDB file consists of bytecodes. */
2028: if (output_bytecode)
2029: fprintf (asm_out_file, "bc_gcc2_compiled.:\n");
2030: else
2031: {
2032: #ifndef ASM_IDENTIFY_GCC
2033: fprintf (asm_out_file, "gcc2_compiled.:\n");
2034: #else
2035: ASM_IDENTIFY_GCC (asm_out_file);
2036: #endif
2037: }
2038:
2039: /* Output something to identify which front-end produced this file. */
2040: #ifdef ASM_IDENTIFY_LANGUAGE
2041: ASM_IDENTIFY_LANGUAGE (asm_out_file);
2042: #endif
2043:
2044: if (output_bytecode)
2045: {
2046: if (profile_flag || profile_block_flag)
2047: error ("profiling not supported in bytecode compilation");
2048: }
2049: else
2050: {
2051: /* ??? Note: There used to be a conditional here
2052: to call assemble_zeros without fail if DBX_DEBUGGING_INFO is defined.
2053: This was to guarantee separation between gcc_compiled. and
2054: the first function, for the sake of dbx on Suns.
2055: However, having the extra zero here confused the Emacs
2056: code for unexec, and might confuse other programs too.
2057: Therefore, I took out that change.
2058: In future versions we should find another way to solve
2059: that dbx problem. -- rms, 23 May 93. */
2060:
2061: /* Don't let the first function fall at the same address
2062: as gcc_compiled., if profiling. */
2063: #ifndef DBX_DEBUGGING_INFO
2064: if (profile_flag || profile_block_flag)
2065: assemble_zeros (UNITS_PER_WORD);
2066: #endif
2067: }
2068:
2069: /* If dbx symbol table desired, initialize writing it
2070: and output the predefined types. */
2071: #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2072: if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2073: TIMEVAR (symout_time, dbxout_init (asm_out_file, main_input_filename,
2074: getdecls ()));
2075: #endif
2076: #ifdef SDB_DEBUGGING_INFO
2077: if (write_symbols == SDB_DEBUG)
2078: TIMEVAR (symout_time, sdbout_init (asm_out_file, main_input_filename,
2079: getdecls ()));
2080: #endif
2081: #ifdef DWARF_DEBUGGING_INFO
2082: if (write_symbols == DWARF_DEBUG)
2083: TIMEVAR (symout_time, dwarfout_init (asm_out_file, main_input_filename));
2084: #endif
2085:
2086: /* Initialize yet another pass. */
2087:
2088: if (!output_bytecode)
2089: init_final (main_input_filename);
2090:
2091: start_time = get_run_time ();
2092:
2093: /* Call the parser, which parses the entire file
2094: (calling rest_of_compilation for each function). */
2095:
2096: if (yyparse () != 0)
2097: if (errorcount == 0)
2098: fprintf (stderr, "Errors detected in input file (your bison.simple is out of date)");
2099:
2100: /* Compilation is now finished except for writing
2101: what's left of the symbol table output. */
2102:
2103: parse_time += get_run_time () - start_time;
2104:
2105: parse_time -= integration_time;
2106: parse_time -= varconst_time;
2107:
2108: globals = getdecls ();
2109:
2110: /* Really define vars that have had only a tentative definition.
2111: Really output inline functions that must actually be callable
2112: and have not been output so far. */
2113:
2114: {
2115: int len = list_length (globals);
2116: tree *vec = (tree *) alloca (sizeof (tree) * len);
2117: int i;
2118: tree decl;
2119:
2120: /* Process the decls in reverse order--earliest first.
2121: Put them into VEC from back to front, then take out from front. */
2122:
2123: for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
2124: vec[len - i - 1] = decl;
2125:
2126: for (i = 0; i < len; i++)
2127: {
2128: decl = vec[i];
2129: if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0
2130: && incomplete_decl_finalize_hook != 0)
2131: (*incomplete_decl_finalize_hook) (decl);
2132:
2133: if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2134: && ! TREE_ASM_WRITTEN (decl))
2135: {
2136: /* Don't write out static consts, unless we used them.
2137: (This used to write them out only if the address was
2138: taken, but that was wrong; if the variable was simply
2139: referred to, it still needs to exist or else it will
2140: be undefined in the linker.) */
2141: if (! TREE_READONLY (decl)
2142: || TREE_PUBLIC (decl)
2143: || TREE_USED (decl)
2144: || TREE_ADDRESSABLE (decl)
2145: || TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl)))
2146: rest_of_decl_compilation (decl, NULL_PTR, 1, 1);
2147: else
2148: /* Cancel the RTL for this decl so that, if debugging info
2149: output for global variables is still to come,
2150: this one will be omitted. */
2151: DECL_RTL (decl) = NULL;
2152: }
2153:
2154: if (TREE_CODE (decl) == FUNCTION_DECL
2155: && ! TREE_ASM_WRITTEN (decl)
2156: && DECL_INITIAL (decl) != 0
2157: && (TREE_ADDRESSABLE (decl)
2158: || TREE_ADDRESSABLE (DECL_ASSEMBLER_NAME (decl)))
2159: && ! DECL_EXTERNAL (decl))
2160: {
2161: temporary_allocation ();
2162: output_inline_function (decl);
2163: permanent_allocation ();
2164: }
2165:
2166: /* Warn about any function
2167: declared static but not defined.
2168: We don't warn about variables,
2169: because many programs have static variables
2170: that exist only to get some text into the object file. */
2171: if ((warn_unused
2172: || TREE_USED (decl)
2173: || (DECL_NAME (decl) && TREE_USED (DECL_NAME (decl))))
2174: && TREE_CODE (decl) == FUNCTION_DECL
2175: && DECL_INITIAL (decl) == 0
2176: && DECL_EXTERNAL (decl)
2177: && ! TREE_PUBLIC (decl))
2178: {
2179: /* This should be a pedwarn, except that there is
2180: no easy way to prevent it from happening when the
2181: name is used only inside a sizeof.
2182: This at least avoids being incorrect. */
2183: warning_with_decl (decl,
2184: "`%s' declared `static' but never defined");
2185: /* This symbol is effectively an "extern" declaration now. */
2186: TREE_PUBLIC (decl) = 1;
2187: assemble_external (decl);
2188:
2189: }
2190: /* Warn about static fns or vars defined but not used,
2191: but not about inline functions
2192: since unused inline statics is normal practice. */
2193: if (warn_unused
2194: && (TREE_CODE (decl) == FUNCTION_DECL
2195: || TREE_CODE (decl) == VAR_DECL)
2196: && ! DECL_IN_SYSTEM_HEADER (decl)
2197: && ! DECL_EXTERNAL (decl)
2198: && ! TREE_PUBLIC (decl)
2199: && ! TREE_USED (decl)
2200: && ! DECL_INLINE (decl)
2201: && ! DECL_REGISTER (decl)
2202: /* The TREE_USED bit for file-scope decls
2203: is kept in the identifier, to handle multiple
2204: external decls in different scopes. */
2205: && ! TREE_USED (DECL_NAME (decl)))
2206: warning_with_decl (decl, "`%s' defined but not used");
2207:
2208: #ifdef SDB_DEBUGGING_INFO
2209: /* The COFF linker can move initialized global vars to the end.
2210: And that can screw up the symbol ordering.
2211: By putting the symbols in that order to begin with,
2212: we avoid a problem. [email protected]. */
2213: if (write_symbols == SDB_DEBUG && TREE_CODE (decl) == VAR_DECL
2214: && TREE_PUBLIC (decl) && DECL_INITIAL (decl)
2215: && DECL_RTL (decl) != 0)
2216: TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2217:
2218: /* Output COFF information for non-global
2219: file-scope initialized variables. */
2220: if (write_symbols == SDB_DEBUG
2221: && TREE_CODE (decl) == VAR_DECL
2222: && DECL_INITIAL (decl)
2223: && DECL_RTL (decl) != 0
2224: && GET_CODE (DECL_RTL (decl)) == MEM)
2225: TIMEVAR (symout_time, sdbout_toplevel_data (decl));
2226: #endif /* SDB_DEBUGGING_INFO */
2227: #ifdef DWARF_DEBUGGING_INFO
2228: /* Output DWARF information for file-scope tentative data object
2229: declarations, file-scope (extern) function declarations (which
2230: had no corresponding body) and file-scope tagged type declarations
2231: and definitions which have not yet been forced out. */
2232:
2233: if (write_symbols == DWARF_DEBUG
2234: && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2235: TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 1));
2236: #endif
2237: }
2238: }
2239:
2240: /* Do dbx symbols */
2241: #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2242: if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2243: TIMEVAR (symout_time,
2244: {
2245: dbxout_finish (asm_out_file, main_input_filename);
2246: });
2247: #endif
2248:
2249: #ifdef DWARF_DEBUGGING_INFO
2250: if (write_symbols == DWARF_DEBUG)
2251: TIMEVAR (symout_time,
2252: {
2253: dwarfout_finish ();
2254: });
2255: #endif
2256:
2257: #ifdef MACHO_PIC
2258: TIMEVAR (symout_time,
2259: {
2260: machopic_finish (asm_out_file);
2261: });
2262: #endif
2263:
2264: /* Output some stuff at end of file if nec. */
2265:
2266: if (!output_bytecode)
2267: {
2268: end_final (main_input_filename);
2269:
2270: #ifdef ASM_FILE_END
2271: ASM_FILE_END (asm_out_file);
2272: #endif
2273: }
2274:
2275: after_finish_compilation:
2276:
2277: /* Language-specific end of compilation actions. */
2278:
2279: lang_finish ();
2280:
2281: /* Close the dump files. */
2282:
2283: if (flag_gen_aux_info)
2284: {
2285: fclose (aux_info_file);
2286: if (errorcount)
2287: unlink (aux_info_file_name);
2288: }
2289:
2290: if (rtl_dump)
2291: fclose (rtl_dump_file);
2292:
2293: if (jump_opt_dump)
2294: fclose (jump_opt_dump_file);
2295:
2296: if (cse_dump)
2297: fclose (cse_dump_file);
2298:
2299: if (loop_dump)
2300: fclose (loop_dump_file);
2301:
2302: if (cse2_dump)
2303: fclose (cse2_dump_file);
2304:
2305: if (flow_dump)
2306: fclose (flow_dump_file);
2307:
2308: if (combine_dump)
2309: {
2310: dump_combine_total_stats (combine_dump_file);
2311: fclose (combine_dump_file);
2312: }
2313:
2314: if (sched_dump)
2315: fclose (sched_dump_file);
2316:
2317: if (fppc_dump)
2318: fclose (fppc_dump_file);
2319:
2320: if (local_reg_dump)
2321: fclose (local_reg_dump_file);
2322:
2323: if (global_reg_dump)
2324: fclose (global_reg_dump_file);
2325:
2326: if (sched2_dump)
2327: fclose (sched2_dump_file);
2328:
2329: if (jump2_opt_dump)
2330: fclose (jump2_opt_dump_file);
2331:
2332: if (dbr_sched_dump)
2333: fclose (dbr_sched_dump_file);
2334:
2335: #ifdef STACK_REGS
2336: if (stack_reg_dump)
2337: fclose (stack_reg_dump_file);
2338: #endif
2339:
2340: /* Close non-debugging input and output files. Take special care to note
2341: whether fclose returns an error, since the pages might still be on the
2342: buffer chain while the file is open. */
2343:
2344: fclose (finput);
2345: if (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0)
2346: fatal_io_error (asm_file_name);
2347:
2348: /* Print the times. */
2349:
2350: if (! quiet_flag)
2351: {
2352: fprintf (stderr,"\n");
2353: print_time ("parse", parse_time);
2354:
2355: if (!output_bytecode)
2356: {
2357: print_time ("integration", integration_time);
2358: print_time ("jump", jump_time);
2359: print_time ("cse", cse_time);
2360: print_time ("loop", loop_time);
2361: print_time ("cse2", cse2_time);
2362: print_time ("flow", flow_time);
2363: print_time ("combine", combine_time);
2364: print_time ("sched", sched_time);
2365: print_time ("local-alloc", local_alloc_time);
2366: print_time ("global-alloc", global_alloc_time);
2367: print_time ("sched2", sched2_time);
2368: print_time ("dbranch", dbr_sched_time);
2369: print_time ("shorten-branch", shorten_branch_time);
2370: print_time ("stack-reg", stack_reg_time);
2371: print_time ("final", final_time);
2372: print_time ("varconst", varconst_time);
2373: print_time ("symout", symout_time);
2374: print_time ("dump", dump_time);
2375: }
2376: }
2377: }
2378:
2379: /* This is called from various places for FUNCTION_DECL, VAR_DECL,
2380: and TYPE_DECL nodes.
2381:
2382: This does nothing for local (non-static) variables.
2383: Otherwise, it sets up the RTL and outputs any assembler code
2384: (label definition, storage allocation and initialization).
2385:
2386: DECL is the declaration. If ASMSPEC is nonzero, it specifies
2387: the assembler symbol name to be used. TOP_LEVEL is nonzero
2388: if this declaration is not within a function. */
2389:
2390: void
2391: rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2392: tree decl;
2393: char *asmspec;
2394: int top_level;
2395: int at_end;
2396: {
2397: /* Declarations of variables, and of functions defined elsewhere. */
2398:
2399: /* The most obvious approach, to put an #ifndef around where
2400: this macro is used, doesn't work since it's inside a macro call. */
2401: #ifndef ASM_FINISH_DECLARE_OBJECT
2402: #define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
2403: #endif
2404:
2405: /* Forward declarations for nested functions are not "external",
2406: but we need to treat them as if they were. */
2407: if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
2408: || TREE_CODE (decl) == FUNCTION_DECL)
2409: TIMEVAR (varconst_time,
2410: {
2411: make_decl_rtl (decl, asmspec, top_level);
2412: /* Initialized extern variable exists to be replaced
2413: with its value, or represents something that will be
2414: output in another file. */
2415: if (! (TREE_CODE (decl) == VAR_DECL
2416: && DECL_EXTERNAL (decl) && TREE_READONLY (decl)
2417: && DECL_INITIAL (decl) != 0
2418: && DECL_INITIAL (decl) != error_mark_node))
2419: /* Don't output anything
2420: when a tentative file-scope definition is seen.
2421: But at end of compilation, do output code for them. */
2422: if (! (! at_end && top_level
2423: && (DECL_INITIAL (decl) == 0
2424: || DECL_INITIAL (decl) == error_mark_node)))
2425: assemble_variable (decl, top_level, at_end, 0);
2426: if (decl == last_assemble_variable_decl)
2427: {
2428: ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2429: top_level, at_end);
2430: }
2431: });
2432: else if (DECL_REGISTER (decl) && asmspec != 0)
2433: {
2434: if (decode_reg_name (asmspec) >= 0)
2435: {
2436: DECL_RTL (decl) = 0;
2437: make_decl_rtl (decl, asmspec, top_level);
2438: }
2439: else
2440: error ("invalid register name `%s' for register variable", asmspec);
2441: }
2442: #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2443: else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2444: && TREE_CODE (decl) == TYPE_DECL)
2445: TIMEVAR (symout_time, dbxout_symbol (decl, 0));
2446: #endif
2447: #ifdef SDB_DEBUGGING_INFO
2448: else if (write_symbols == SDB_DEBUG && top_level
2449: && TREE_CODE (decl) == TYPE_DECL)
2450: TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2451: #endif
2452: }
2453:
2454: /* Called after finishing a record, union or enumeral type. */
2455:
2456: void
2457: rest_of_type_compilation (type, toplev)
2458: tree type;
2459: int toplev;
2460: {
2461: #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2462: if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2463: TIMEVAR (symout_time, dbxout_symbol (TYPE_STUB_DECL (type), !toplev));
2464: #endif
2465: #ifdef SDB_DEBUGGING_INFO
2466: if (write_symbols == SDB_DEBUG)
2467: TIMEVAR (symout_time, sdbout_symbol (TYPE_STUB_DECL (type), !toplev));
2468: #endif
2469: }
2470:
2471: /* This is called from finish_function (within yyparse)
2472: after each top-level definition is parsed.
2473: It is supposed to compile that function or variable
2474: and output the assembler code for it.
2475: After we return, the tree storage is freed. */
2476:
2477: void
2478: rest_of_compilation (decl)
2479: tree decl;
2480: {
2481: register rtx insns;
2482: int start_time = get_run_time ();
2483: int tem;
2484: /* Nonzero if we have saved the original DECL_INITIAL of the function,
2485: to be restored after we finish compiling the function
2486: (for use when compiling inline calls to this function). */
2487: tree saved_block_tree = 0;
2488: /* Likewise, for DECL_ARGUMENTS. */
2489: tree saved_arguments = 0;
2490: int failure = 0;
2491:
2492: if (output_bytecode)
2493: return;
2494:
2495: /* If we are reconsidering an inline function
2496: at the end of compilation, skip the stuff for making it inline. */
2497:
2498: if (DECL_SAVED_INSNS (decl) == 0)
2499: {
2500: int specd = DECL_INLINE (decl);
2501: char *lose;
2502:
2503: /* If requested, consider whether to make this function inline. */
2504: if (specd || flag_inline_functions)
2505: TIMEVAR (integration_time,
2506: {
2507: lose = function_cannot_inline_p (decl);
2508: /* If not optimzing, then make sure the DECL_INLINE
2509: bit is off. */
2510:
2511: #ifdef NEXT_SEMANTICS
2512: if (lose || flag_keep_inline_functions)
2513: #else
2514: if (lose || ! optimize)
2515: #endif
2516: {
2517: if (warn_inline && specd)
2518: warning_with_decl (decl, lose);
2519: DECL_INLINE (decl) = 0;
2520: /* Don't really compile an extern inline function.
2521: If we can't make it inline, pretend
2522: it was only declared. */
2523: if (DECL_EXTERNAL (decl))
2524: {
2525: DECL_INITIAL (decl) = 0;
2526: goto exit_rest_of_compilation;
2527: }
2528: }
2529: else
2530: DECL_INLINE (decl) = 1;
2531: });
2532:
2533: insns = get_insns ();
2534:
2535: /* Dump the rtl code if we are dumping rtl. */
2536:
2537: if (rtl_dump)
2538: TIMEVAR (dump_time,
2539: {
2540: fprintf (rtl_dump_file, "\n;; Function %s\n\n",
2541: IDENTIFIER_POINTER (DECL_NAME (decl)));
2542: if (DECL_SAVED_INSNS (decl))
2543: fprintf (rtl_dump_file, ";; (integrable)\n\n");
2544: print_rtl (rtl_dump_file, insns);
2545: fflush (rtl_dump_file);
2546: });
2547:
2548: /* If function is inline, and we don't yet know whether to
2549: compile it by itself, defer decision till end of compilation.
2550: finish_compilation will call rest_of_compilation again
2551: for those functions that need to be output. */
2552:
2553: if (DECL_INLINE (decl)
2554: && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
2555: && ! flag_keep_inline_functions)
2556: || DECL_EXTERNAL (decl)))
2557: {
2558: #ifdef DWARF_DEBUGGING_INFO
2559: /* Generate the DWARF info for the "abstract" instance
2560: of a function which we may later generate inlined and/or
2561: out-of-line instances of. */
2562: if (write_symbols == DWARF_DEBUG)
2563: {
2564: set_decl_abstract_flags (decl, 1);
2565: TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2566: set_decl_abstract_flags (decl, 0);
2567: }
2568: #endif
2569: TIMEVAR (integration_time, save_for_inline_nocopy (decl));
2570: goto exit_rest_of_compilation;
2571: }
2572:
2573: /* If we have to compile the function now, save its rtl and subdecls
2574: so that its compilation will not affect what others get. */
2575: if (DECL_INLINE (decl))
2576: {
2577: #ifdef DWARF_DEBUGGING_INFO
2578: /* Generate the DWARF info for the "abstract" instance of
2579: a function which we will generate an out-of-line instance
2580: of almost immediately (and which we may also later generate
2581: various inlined instances of). */
2582: if (write_symbols == DWARF_DEBUG)
2583: {
2584: set_decl_abstract_flags (decl, 1);
2585: TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
2586: set_decl_abstract_flags (decl, 0);
2587: }
2588: #endif
2589: saved_block_tree = DECL_INITIAL (decl);
2590: saved_arguments = DECL_ARGUMENTS (decl);
2591: TIMEVAR (integration_time, save_for_inline_copying (decl));
2592: }
2593: }
2594:
2595: TREE_ASM_WRITTEN (decl) = 1;
2596:
2597: /* Now that integrate will no longer see our rtl, we need not distinguish
2598: between the return value of this function and the return value of called
2599: functions. */
2600: rtx_equal_function_value_matters = 0;
2601:
2602: /* Don't return yet if -Wreturn-type; we need to do jump_optimize. */
2603: if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
2604: {
2605: goto exit_rest_of_compilation;
2606: }
2607:
2608: /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
2609: Note that that may have been done above, in save_for_inline_copying.
2610: The call to resume_temporary_allocation near the end of this function
2611: goes back to the usual state of affairs. */
2612:
2613: rtl_in_current_obstack ();
2614:
2615: #ifdef FINALIZE_PIC
2616: /* If we are doing position-independent code generation, now
2617: is the time to output special prologues and epilogues.
2618: We do not want to do this earlier, because it just clutters
2619: up inline functions with meaningless insns. */
2620: if (flag_pic)
2621: FINALIZE_PIC;
2622: #endif
2623:
2624: insns = get_insns ();
2625:
2626: /* Copy any shared structure that should not be shared. */
2627:
2628: unshare_all_rtl (insns);
2629:
2630: /* Instantiate all virtual registers. */
2631:
2632: instantiate_virtual_regs (current_function_decl, get_insns ());
2633:
2634: /* See if we have allocated stack slots that are not directly addressable.
2635: If so, scan all the insns and create explicit address computation
2636: for all references to such slots. */
2637: /* fixup_stack_slots (); */
2638:
2639: /* Do jump optimization the first time, if -opt.
2640: Also do it if -W, but in that case it doesn't change the rtl code,
2641: it only computes whether control can drop off the end of the function. */
2642:
2643: if (optimize > 0 || extra_warnings || warn_return_type
2644: /* If function is `volatile', we should warn if it tries to return. */
2645: || TREE_THIS_VOLATILE (decl))
2646: {
2647: TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
2648: TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
2649: }
2650:
2651: /* Now is when we stop if -fsyntax-only and -Wreturn-type. */
2652: if (rtl_dump_and_exit || flag_syntax_only)
2653: goto exit_rest_of_compilation;
2654:
2655: /* Dump rtl code after jump, if we are doing that. */
2656:
2657: if (jump_opt_dump)
2658: TIMEVAR (dump_time,
2659: {
2660: fprintf (jump_opt_dump_file, "\n;; Function %s\n\n",
2661: IDENTIFIER_POINTER (DECL_NAME (decl)));
2662: print_rtl (jump_opt_dump_file, insns);
2663: fflush (jump_opt_dump_file);
2664: });
2665:
2666: /* Perform common subexpression elimination.
2667: Nonzero value from `cse_main' means that jumps were simplified
2668: and some code may now be unreachable, so do
2669: jump optimization again. */
2670:
2671: if (cse_dump)
2672: TIMEVAR (dump_time,
2673: {
2674: fprintf (cse_dump_file, "\n;; Function %s\n\n",
2675: IDENTIFIER_POINTER (DECL_NAME (decl)));
2676: });
2677:
2678: if (optimize > 0)
2679: {
2680: TIMEVAR (cse_time, reg_scan (insns, max_reg_num (), 1));
2681:
2682: if (flag_thread_jumps)
2683: /* Hacks by tiemann & kenner. */
2684: TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
2685:
2686: TIMEVAR (cse_time, tem = cse_main (insns, max_reg_num (),
2687: 0, cse_dump_file));
2688: TIMEVAR (cse_time, delete_dead_from_cse (insns, max_reg_num ()));
2689:
2690: if (tem)
2691: TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
2692: }
2693:
2694: /* Dump rtl code after cse, if we are doing that. */
2695:
2696: if (cse_dump)
2697: TIMEVAR (dump_time,
2698: {
2699: print_rtl (cse_dump_file, insns);
2700: fflush (cse_dump_file);
2701: });
2702:
2703: if (loop_dump)
2704: TIMEVAR (dump_time,
2705: {
2706: fprintf (loop_dump_file, "\n;; Function %s\n\n",
2707: IDENTIFIER_POINTER (DECL_NAME (decl)));
2708: });
2709:
2710: /* Move constant computations out of loops. */
2711:
2712: if (optimize > 0)
2713: {
2714: TIMEVAR (loop_time,
2715: {
2716: loop_optimize (insns, loop_dump_file);
2717: });
2718: }
2719:
2720: /* Dump rtl code after loop opt, if we are doing that. */
2721:
2722: if (loop_dump)
2723: TIMEVAR (dump_time,
2724: {
2725: print_rtl (loop_dump_file, insns);
2726: fflush (loop_dump_file);
2727: });
2728:
2729: if (cse2_dump)
2730: TIMEVAR (dump_time,
2731: {
2732: fprintf (cse2_dump_file, "\n;; Function %s\n\n",
2733: IDENTIFIER_POINTER (DECL_NAME (decl)));
2734: });
2735:
2736: if (optimize > 0 && flag_rerun_cse_after_loop)
2737: {
2738: TIMEVAR (cse2_time, reg_scan (insns, max_reg_num (), 0));
2739:
2740: TIMEVAR (cse2_time, tem = cse_main (insns, max_reg_num (),
2741: 1, cse2_dump_file));
2742: if (tem)
2743: TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
2744: }
2745:
2746: if (optimize > 0 && flag_thread_jumps)
2747: /* This pass of jump threading straightens out code
2748: that was kinked by loop optimization. */
2749: TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
2750:
2751: /* Dump rtl code after cse, if we are doing that. */
2752:
2753: if (cse2_dump)
2754: TIMEVAR (dump_time,
2755: {
2756: print_rtl (cse2_dump_file, insns);
2757: fflush (cse2_dump_file);
2758: });
2759:
2760: /* We are no longer anticipating cse in this function, at least. */
2761:
2762: cse_not_expected = 1;
2763:
2764: /* Now we choose between stupid (pcc-like) register allocation
2765: (if we got the -noreg switch and not -opt)
2766: and smart register allocation. */
2767:
2768: if (optimize > 0) /* Stupid allocation probably won't work */
2769: obey_regdecls = 0; /* if optimizations being done. */
2770:
2771: regclass_init ();
2772:
2773: /* Print function header into flow dump now
2774: because doing the flow analysis makes some of the dump. */
2775:
2776: if (flow_dump)
2777: TIMEVAR (dump_time,
2778: {
2779: fprintf (flow_dump_file, "\n;; Function %s\n\n",
2780: IDENTIFIER_POINTER (DECL_NAME (decl)));
2781: });
2782:
2783: if (obey_regdecls)
2784: {
2785: TIMEVAR (flow_time,
2786: {
2787: regclass (insns, max_reg_num ());
2788: stupid_life_analysis (insns, max_reg_num (),
2789: flow_dump_file);
2790: });
2791: }
2792: else
2793: {
2794: /* Do control and data flow analysis,
2795: and write some of the results to dump file. */
2796:
2797: TIMEVAR (flow_time, flow_analysis (insns, max_reg_num (),
2798: flow_dump_file));
2799: if (warn_uninitialized)
2800: {
2801: uninitialized_vars_warning (DECL_INITIAL (decl));
2802: setjmp_args_warning ();
2803: }
2804: }
2805:
2806: /* Dump rtl after flow analysis. */
2807:
2808: if (flow_dump)
2809: TIMEVAR (dump_time,
2810: {
2811: print_rtl (flow_dump_file, insns);
2812: fflush (flow_dump_file);
2813: });
2814:
2815: /* If -opt, try combining insns through substitution. */
2816:
2817: if (optimize > 0)
2818: TIMEVAR (combine_time, combine_instructions (insns, max_reg_num ()));
2819:
2820: /* Dump rtl code after insn combination. */
2821:
2822: if (combine_dump)
2823: TIMEVAR (dump_time,
2824: {
2825: fprintf (combine_dump_file, "\n;; Function %s\n\n",
2826: IDENTIFIER_POINTER (DECL_NAME (decl)));
2827: dump_combine_stats (combine_dump_file);
2828: print_rtl (combine_dump_file, insns);
2829: fflush (combine_dump_file);
2830: });
2831:
2832: /* Print function header into sched dump now
2833: because doing the sched analysis makes some of the dump. */
2834:
2835: if (sched_dump)
2836: TIMEVAR (dump_time,
2837: {
2838: fprintf (sched_dump_file, "\n;; Function %s\n\n",
2839: IDENTIFIER_POINTER (DECL_NAME (decl)));
2840: });
2841:
2842: if (optimize > 0 && flag_schedule_insns)
2843: {
2844: /* Do control and data sched analysis,
2845: and write some of the results to dump file. */
2846:
2847: TIMEVAR (sched_time, schedule_insns (sched_dump_file));
2848: }
2849:
2850: /* Dump rtl after instruction scheduling. */
2851:
2852: if (sched_dump)
2853: TIMEVAR (dump_time,
2854: {
2855: print_rtl (sched_dump_file, insns);
2856: fflush (sched_dump_file);
2857: });
2858:
2859: #if defined(HAVE_fppc_switch)
2860: /* Insert floating point precision control code. */
2861:
2862: if (flag_fppc && HAVE_fppc_switch)
2863: TIMEVAR (local_alloc_time,
2864: {
2865: fppc_insns (insns);
2866: });
2867:
2868: if (fppc_dump)
2869: TIMEVAR (dump_time,
2870: {
2871: fprintf (fppc_dump_file, "\n;; Function %s\n\n",
2872: IDENTIFIER_POINTER (DECL_NAME (decl)));
2873: print_rtl (fppc_dump_file, insns);
2874: fflush (fppc_dump_file);
2875: });
2876:
2877: #endif
2878:
2879: /* Unless we did stupid register allocation,
2880: allocate pseudo-regs that are used only within 1 basic block. */
2881:
2882: if (!obey_regdecls)
2883: TIMEVAR (local_alloc_time,
2884: {
2885: regclass (insns, max_reg_num ());
2886: local_alloc ();
2887: });
2888:
2889: /* Dump rtl code after allocating regs within basic blocks. */
2890:
2891: if (local_reg_dump)
2892: TIMEVAR (dump_time,
2893: {
2894: fprintf (local_reg_dump_file, "\n;; Function %s\n\n",
2895: IDENTIFIER_POINTER (DECL_NAME (decl)));
2896: dump_flow_info (local_reg_dump_file);
2897: dump_local_alloc (local_reg_dump_file);
2898: print_rtl (local_reg_dump_file, insns);
2899: fflush (local_reg_dump_file);
2900: });
2901:
2902: if (global_reg_dump)
2903: TIMEVAR (dump_time,
2904: fprintf (global_reg_dump_file, "\n;; Function %s\n\n",
2905: IDENTIFIER_POINTER (DECL_NAME (decl))));
2906:
2907: /* Unless we did stupid register allocation,
2908: allocate remaining pseudo-regs, then do the reload pass
2909: fixing up any insns that are invalid. */
2910:
2911: TIMEVAR (global_alloc_time,
2912: {
2913: if (!obey_regdecls)
2914: failure = global_alloc (global_reg_dump_file);
2915: else
2916: failure = reload (insns, 0, global_reg_dump_file);
2917: });
2918:
2919: if (global_reg_dump)
2920: TIMEVAR (dump_time,
2921: {
2922: dump_global_regs (global_reg_dump_file);
2923: print_rtl (global_reg_dump_file, insns);
2924: fflush (global_reg_dump_file);
2925: });
2926:
2927: if (failure)
2928: goto exit_rest_of_compilation;
2929:
2930: reload_completed = 1;
2931:
2932: /* On some machines, the prologue and epilogue code, or parts thereof,
2933: can be represented as RTL. Doing so lets us schedule insns between
2934: it and the rest of the code and also allows delayed branch
2935: scheduling to operate in the epilogue. */
2936:
2937: thread_prologue_and_epilogue_insns (insns);
2938:
2939: if (optimize > 0 && flag_schedule_insns_after_reload)
2940: {
2941: if (sched2_dump)
2942: TIMEVAR (dump_time,
2943: {
2944: fprintf (sched2_dump_file, "\n;; Function %s\n\n",
2945: IDENTIFIER_POINTER (DECL_NAME (decl)));
2946: });
2947:
2948: /* Do control and data sched analysis again,
2949: and write some more of the results to dump file. */
2950:
2951: TIMEVAR (sched2_time, schedule_insns (sched2_dump_file));
2952:
2953: /* Dump rtl after post-reorder instruction scheduling. */
2954:
2955: if (sched2_dump)
2956: TIMEVAR (dump_time,
2957: {
2958: print_rtl (sched2_dump_file, insns);
2959: fflush (sched2_dump_file);
2960: });
2961: }
2962:
2963: #ifdef LEAF_REGISTERS
2964: leaf_function = 0;
2965: if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
2966: leaf_function = 1;
2967: #endif
2968:
2969: /* One more attempt to remove jumps to .+1
2970: left by dead-store-elimination.
2971: Also do cross-jumping this time
2972: and delete no-op move insns. */
2973:
2974: if (optimize > 0)
2975: {
2976: TIMEVAR (jump_time, jump_optimize (insns, 1, 1, 0));
2977: }
2978:
2979: /* Dump rtl code after jump, if we are doing that. */
2980:
2981: if (jump2_opt_dump)
2982: TIMEVAR (dump_time,
2983: {
2984: fprintf (jump2_opt_dump_file, "\n;; Function %s\n\n",
2985: IDENTIFIER_POINTER (DECL_NAME (decl)));
2986: print_rtl (jump2_opt_dump_file, insns);
2987: fflush (jump2_opt_dump_file);
2988: });
2989:
2990: /* If a scheduling pass for delayed branches is to be done,
2991: call the scheduling code. */
2992:
2993: #ifdef DELAY_SLOTS
2994: if (optimize > 0 && flag_delayed_branch)
2995: {
2996: TIMEVAR (dbr_sched_time, dbr_schedule (insns, dbr_sched_dump_file));
2997: if (dbr_sched_dump)
2998: {
2999: TIMEVAR (dump_time,
3000: {
3001: fprintf (dbr_sched_dump_file, "\n;; Function %s\n\n",
3002: IDENTIFIER_POINTER (DECL_NAME (decl)));
3003: print_rtl (dbr_sched_dump_file, insns);
3004: fflush (dbr_sched_dump_file);
3005: });
3006: }
3007: }
3008: #endif
3009:
3010: if (optimize > 0)
3011: /* Shorten branches. */
3012: TIMEVAR (shorten_branch_time,
3013: {
3014: shorten_branches (get_insns ());
3015: });
3016:
3017: #ifdef STACK_REGS
3018: TIMEVAR (stack_reg_time, reg_to_stack (insns, stack_reg_dump_file));
3019: if (stack_reg_dump)
3020: {
3021: TIMEVAR (dump_time,
3022: {
3023: fprintf (stack_reg_dump_file, "\n;; Function %s\n\n",
3024: IDENTIFIER_POINTER (DECL_NAME (decl)));
3025: print_rtl (stack_reg_dump_file, insns);
3026: fflush (stack_reg_dump_file);
3027: });
3028: }
3029: #endif
3030:
3031: /* Now turn the rtl into assembler code. */
3032:
3033: TIMEVAR (final_time,
3034: {
3035: rtx x;
3036: char *fnname;
3037:
3038: /* Get the function's name, as described by its RTL.
3039: This may be different from the DECL_NAME name used
3040: in the source file. */
3041:
3042: x = DECL_RTL (decl);
3043: if (GET_CODE (x) != MEM)
3044: abort ();
3045: x = XEXP (x, 0);
3046: if (GET_CODE (x) != SYMBOL_REF)
3047: abort ();
3048: fnname = XSTR (x, 0);
3049:
3050: assemble_start_function (decl, fnname);
3051: final_start_function (insns, asm_out_file, optimize);
3052: final (insns, asm_out_file, optimize, 0);
3053: final_end_function (insns, asm_out_file, optimize);
3054: assemble_end_function (decl, fnname);
3055: fflush (asm_out_file);
3056: });
3057:
3058: /* Write DBX symbols if requested */
3059:
3060: /* Note that for those inline functions where we don't initially
3061: know for certain that we will be generating an out-of-line copy,
3062: the first invocation of this routine (rest_of_compilation) will
3063: skip over this code by doing a `goto exit_rest_of_compilation;'.
3064: Later on, finish_compilation will call rest_of_compilation again
3065: for those inline functions that need to have out-of-line copies
3066: generated. During that call, we *will* be routed past here. */
3067:
3068: #ifdef DBX_DEBUGGING_INFO
3069: if (write_symbols == DBX_DEBUG)
3070: TIMEVAR (symout_time, dbxout_function (decl));
3071: #endif
3072:
3073: #ifdef DWARF_DEBUGGING_INFO
3074: if (write_symbols == DWARF_DEBUG)
3075: TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3076: #endif
3077:
3078: exit_rest_of_compilation:
3079:
3080: /* In case the function was not output,
3081: don't leave any temporary anonymous types
3082: queued up for sdb output. */
3083: #ifdef SDB_DEBUGGING_INFO
3084: if (write_symbols == SDB_DEBUG)
3085: sdbout_types (NULL_TREE);
3086: #endif
3087:
3088: /* Put back the tree of subblocks and list of arguments
3089: from before we copied them.
3090: Code generation and the output of debugging info may have modified
3091: the copy, but the original is unchanged. */
3092:
3093: if (saved_block_tree != 0)
3094: DECL_INITIAL (decl) = saved_block_tree;
3095: if (saved_arguments != 0)
3096: DECL_ARGUMENTS (decl) = saved_arguments;
3097:
3098: reload_completed = 0;
3099:
3100: /* Clear out the real_constant_chain before some of the rtx's
3101: it runs through become garbage. */
3102:
3103: clear_const_double_mem ();
3104:
3105: /* Cancel the effect of rtl_in_current_obstack. */
3106:
3107: resume_temporary_allocation ();
3108:
3109: /* The parsing time is all the time spent in yyparse
3110: *except* what is spent in this function. */
3111:
3112: parse_time -= get_run_time () - start_time;
3113: }
3114:
3115: /* Entry point of cc1/c++. Decode command args, then call compile_file.
3116: Exit code is 35 if can't open files, 34 if fatal error,
3117: 33 if had nonfatal errors, else success. */
3118:
3119: int
3120: main (argc, argv, envp)
3121: int argc;
3122: char **argv;
3123: char **envp;
3124: {
3125: register int i;
3126: char *filename = 0;
3127: int flag_print_mem = 0;
3128: int version_flag = 0;
3129: char *p;
3130:
3131: /* save in case md file wants to emit args as a comment. */
3132: save_argc = argc;
3133: save_argv = argv;
3134:
3135: p = argv[0] + strlen (argv[0]);
3136: while (p != argv[0] && p[-1] != '/') --p;
3137: progname = p;
3138:
3139: #ifdef RLIMIT_STACK
3140: /* Get rid of any avoidable limit on stack size. */
3141: if (getenv ("DEBUGING_GCC") == 0)
3142: {
3143: struct rlimit rlim;
3144:
3145: /* Set the stack limit huge so that alloca does not fail. */
3146: getrlimit (RLIMIT_STACK, &rlim);
3147: rlim.rlim_cur = rlim.rlim_max;
3148: setrlimit (RLIMIT_STACK, &rlim);
3149: }
3150: #endif /* RLIMIT_STACK */
3151:
3152: signal (SIGFPE, float_signal);
3153:
3154: #ifdef SIGPIPE
3155: signal (SIGPIPE, pipe_closed);
3156: #endif
3157:
3158: decl_printable_name = decl_name;
3159: lang_expand_expr = (struct rtx_def *(*)()) do_abort;
3160:
3161: /* Initialize whether `char' is signed. */
3162: flag_signed_char = DEFAULT_SIGNED_CHAR;
3163: #ifdef DEFAULT_SHORT_ENUMS
3164: /* Initialize how much space enums occupy, by default. */
3165: flag_short_enums = DEFAULT_SHORT_ENUMS;
3166: #endif
3167:
3168: /* Scan to see what optimization level has been specified. That will
3169: determine the default value of many flags. */
3170: for (i = 1; i < argc; i++)
3171: {
3172: if (!strcmp (argv[i], "-O"))
3173: {
3174: optimize = 1;
3175: }
3176: else if (argv[i][0] == '-' && argv[i][1] == 'O')
3177: {
3178: /* Handle -O2, -O3, -O69, ... */
3179: char *p = &argv[i][2];
3180: int c;
3181:
3182: while (c = *p++)
3183: if (! (c >= '0' && c <= '9'))
3184: break;
3185: if (c == 0)
3186: optimize = atoi (&argv[i][2]);
3187: }
3188: }
3189:
3190: obey_regdecls = (optimize == 0);
3191: if (optimize == 0)
3192: {
3193: flag_no_inline = 1;
3194: warn_inline = 0;
3195: }
3196:
3197: if (optimize >= 1)
3198: {
3199: flag_defer_pop = 1;
3200: flag_thread_jumps = 1;
3201: #ifdef DELAY_SLOTS
3202: flag_delayed_branch = 1;
3203: #endif
3204: }
3205:
3206: if (optimize >= 2)
3207: {
3208: flag_cse_follow_jumps = 1;
3209: flag_cse_skip_blocks = 1;
3210: flag_expensive_optimizations = 1;
3211: flag_strength_reduce = 1;
3212: flag_rerun_cse_after_loop = 1;
3213: flag_caller_saves = 1;
3214: #ifdef INSN_SCHEDULING
3215: flag_schedule_insns = 1;
3216: flag_schedule_insns_after_reload = 1;
3217: #endif
3218: }
3219:
3220: #ifdef OPTIMIZATION_OPTIONS
3221: /* Allow default optimizations to be specified on a per-machine basis. */
3222: OPTIMIZATION_OPTIONS (optimize);
3223: #endif
3224:
3225: /* Initialize register usage now so switches may override. */
3226: init_reg_sets ();
3227:
3228: target_flags = 0;
3229: set_target_switch ("");
3230:
3231: for (i = 1; i < argc; i++)
3232: {
3233: int j;
3234: /* If this is a language-specific option,
3235: decode it in a language-specific way. */
3236: for (j = 0; lang_options[j] != 0; j++)
3237: if (!strncmp (argv[i], lang_options[j],
3238: strlen (lang_options[j])))
3239: break;
3240: if (lang_options[j] != 0)
3241: /* If the option is valid for *some* language,
3242: treat it as valid even if this language doesn't understand it. */
3243: lang_decode_option (argv[i]);
3244: else if (argv[i][0] == '-' && argv[i][1] != 0)
3245: {
3246: register char *str = argv[i] + 1;
3247: if (str[0] == 'Y')
3248: str++;
3249:
3250: if (str[0] == 'm')
3251: set_target_switch (&str[1]);
3252: else if (!strcmp (str, "dumpbase"))
3253: {
3254: dump_base_name = argv[++i];
3255: }
3256: else if (str[0] == 'd')
3257: {
3258: register char *p = &str[1];
3259: while (*p)
3260: switch (*p++)
3261: {
3262: case 'a':
3263: combine_dump = 1;
3264: dbr_sched_dump = 1;
3265: flow_dump = 1;
3266: global_reg_dump = 1;
3267: jump_opt_dump = 1;
3268: jump2_opt_dump = 1;
3269: fppc_dump = 1;
3270: local_reg_dump = 1;
3271: loop_dump = 1;
3272: rtl_dump = 1;
3273: cse_dump = 1, cse2_dump = 1;
3274: sched_dump = 1;
3275: sched2_dump = 1;
3276: stack_reg_dump = 1;
3277: break;
3278: case 'k':
3279: stack_reg_dump = 1;
3280: break;
3281: case 'c':
3282: combine_dump = 1;
3283: break;
3284: case 'd':
3285: dbr_sched_dump = 1;
3286: break;
3287: case 'f':
3288: flow_dump = 1;
3289: break;
3290: case 'g':
3291: global_reg_dump = 1;
3292: break;
3293: case 'j':
3294: jump_opt_dump = 1;
3295: break;
3296: case 'J':
3297: jump2_opt_dump = 1;
3298: break;
3299: case 'l':
3300: local_reg_dump = 1;
3301: break;
3302: case 'L':
3303: loop_dump = 1;
3304: break;
3305: case 'm':
3306: flag_print_mem = 1;
3307: break;
3308: case 'p':
3309: flag_print_asm_name = 1;
3310: break;
3311: case 'r':
3312: rtl_dump = 1;
3313: break;
3314: case 's':
3315: cse_dump = 1;
3316: break;
3317: case 't':
3318: cse2_dump = 1;
3319: break;
3320: case 'S':
3321: sched_dump = 1;
3322: break;
3323: case 'R':
3324: sched2_dump = 1;
3325: break;
3326: case 'y':
3327: set_yydebug (1);
3328: break;
3329: case 'F':
3330: fppc_dump = 1;
3331: break;
3332:
3333: case 'x':
3334: rtl_dump_and_exit = 1;
3335: break;
3336: }
3337: }
3338: else if (str[0] == 'f')
3339: {
3340: register char *p = &str[1];
3341: int found = 0;
3342:
3343: /* Some kind of -f option.
3344: P's value is the option sans `-f'.
3345: Search for it in the table of options. */
3346:
3347: for (j = 0;
3348: !found && j < sizeof (f_options) / sizeof (f_options[0]);
3349: j++)
3350: {
3351: if (!strcmp (p, f_options[j].string))
3352: {
3353: *f_options[j].variable = f_options[j].on_value;
3354: /* A goto here would be cleaner,
3355: but breaks the vax pcc. */
3356: found = 1;
3357: }
3358: if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
3359: && ! strcmp (p+3, f_options[j].string))
3360: {
3361: *f_options[j].variable = ! f_options[j].on_value;
3362: found = 1;
3363: }
3364: }
3365:
3366: if (found)
3367: ;
3368: else if (!strncmp (p, "fixed-", 6))
3369: fix_register (&p[6], 1, 1);
3370: else if (!strncmp (p, "call-used-", 10))
3371: fix_register (&p[10], 0, 1);
3372: else if (!strncmp (p, "call-saved-", 11))
3373: fix_register (&p[11], 0, 0);
3374: #ifdef NEXT_FAT_OUTPUT
3375: else if (!strncmp (p, "orce_cpusubtype_ALL", 19))
3376: ;
3377: #endif
3378: else
3379: error ("Invalid option `%s'", argv[i]);
3380: }
3381: else if (str[0] == 'O')
3382: {
3383: register char *p = str+1;
3384: while (*p && *p >= '0' && *p <= '9')
3385: p++;
3386: if (*p == '\0')
3387: ;
3388: else
3389: error ("Invalid option `%s'", argv[i]);
3390: }
3391: else if (!strcmp (str, "pedantic"))
3392: pedantic = 1;
3393: else if (!strcmp (str, "pedantic-errors"))
3394: flag_pedantic_errors = pedantic = 1;
3395: #ifdef NEXT_FAT_OUTPUT
3396: else if (!strcmp (str, "arch"))
3397: {
3398: if (i + 1 < argc)
3399: architecture = argv[++i];
3400: else
3401: error ("Missing argument to -arch");
3402: }
3403: else if (!strcmp (str, "arch_multiple"))
3404: multi_arch_flag = 1;
3405: #endif /* NEXT_FAT_OUTPUT */
3406: else if (!strcmp (str, "quiet"))
3407: quiet_flag = 1;
3408: else if (!strcmp (str, "version"))
3409: version_flag = 1;
3410: else if (!strcmp (str, "w"))
3411: inhibit_warnings = 1;
3412: else if (!strcmp (str, "W"))
3413: {
3414: extra_warnings = 1;
3415: /* We save the value of warn_uninitialized, since if they put
3416: -Wuninitialized on the command line, we need to generate a
3417: warning about not using it without also specifying -O. */
3418: if (warn_uninitialized != 1)
3419: warn_uninitialized = 2;
3420: }
3421: else if (str[0] == 'W')
3422: {
3423: register char *p = &str[1];
3424: int found = 0;
3425:
3426: /* Some kind of -W option.
3427: P's value is the option sans `-W'.
3428: Search for it in the table of options. */
3429:
3430: for (j = 0;
3431: !found && j < sizeof (W_options) / sizeof (W_options[0]);
3432: j++)
3433: {
3434: if (!strcmp (p, W_options[j].string))
3435: {
3436: if (W_options[j].variable)
3437: *W_options[j].variable = W_options[j].on_value;
3438: /* A goto here would be cleaner,
3439: but breaks the vax pcc. */
3440: found = 1;
3441: }
3442: if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
3443: && ! strcmp (p+3, W_options[j].string))
3444: {
3445: if (W_options[j].variable)
3446: *W_options[j].variable = ! W_options[j].on_value;
3447: found = 1;
3448: }
3449: }
3450:
3451: if (found)
3452: ;
3453: else if (!strncmp (p, "id-clash-", 9))
3454: {
3455: char *endp = p + 9;
3456:
3457: while (*endp)
3458: {
3459: if (*endp >= '0' && *endp <= '9')
3460: endp++;
3461: else
3462: {
3463: error ("Invalid option `%s'", argv[i]);
3464: goto id_clash_lose;
3465: }
3466: }
3467: warn_id_clash = 1;
3468: id_clash_len = atoi (str + 10);
3469: id_clash_lose: ;
3470: }
3471: else
3472: error ("Invalid option `%s'", argv[i]);
3473: }
3474: else if (!strcmp (str, "p"))
3475: {
3476: if (!output_bytecode)
3477: profile_flag = 1;
3478: else
3479: error ("profiling not supported in bytecode compilation");
3480: }
3481: else if (!strcmp (str, "a"))
3482: {
3483: #if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
3484: warning ("`-a' option (basic block profile) not supported");
3485: #else
3486: profile_block_flag = 1;
3487: #endif
3488: }
3489: else if (str[0] == 'g')
3490: {
3491: char *p = str + 1;
3492: char *q;
3493: unsigned len;
3494: unsigned level;
3495:
3496: while (*p && (*p < '0' || *p > '9'))
3497: p++;
3498: len = p - str;
3499: q = p;
3500: while (*q && (*q >= '0' && *q <= '9'))
3501: q++;
3502: if (*p)
3503: level = atoi (p);
3504: else
3505: level = 2; /* default debugging info level */
3506: if (*q || level > 3)
3507: {
3508: warning ("invalid debug level specification in option: `-%s'",
3509: str);
3510: warning ("no debugging information will be generated");
3511: level = 0;
3512: }
3513:
3514: /* If more than one debugging type is supported,
3515: you must define PREFERRED_DEBUGGING_TYPE
3516: to choose a format in a system-dependent way. */
3517: /* This is one long line cause VAXC can't handle a \-newline. */
3518: #if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) + defined (DWARF_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO))
3519: #ifdef PREFERRED_DEBUGGING_TYPE
3520: if (!strncmp (str, "ggdb", len))
3521: write_symbols = PREFERRED_DEBUGGING_TYPE;
3522: #else /* no PREFERRED_DEBUGGING_TYPE */
3523: You Lose! You must define PREFERRED_DEBUGGING_TYPE!
3524: #endif /* no PREFERRED_DEBUGGING_TYPE */
3525: #endif /* More than one debugger format enabled. */
3526: #ifdef DBX_DEBUGGING_INFO
3527: if (write_symbols != NO_DEBUG)
3528: ;
3529: else if (!strncmp (str, "ggdb", len))
3530: write_symbols = DBX_DEBUG;
3531: else if (!strncmp (str, "gstabs", len))
3532: write_symbols = DBX_DEBUG;
3533: else if (!strncmp (str, "gstabs+", len))
3534: write_symbols = DBX_DEBUG;
3535:
3536: /* Always enable extensions for -ggdb or -gstabs+,
3537: always disable for -gstabs.
3538: For plain -g, use system-specific default. */
3539: if (write_symbols == DBX_DEBUG && !strncmp (str, "ggdb", len)
3540: && len >= 2)
3541: use_gnu_debug_info_extensions = 1;
3542: else if (write_symbols == DBX_DEBUG && !strncmp (str, "gstabs+", len)
3543: && len >= 7)
3544: use_gnu_debug_info_extensions = 1;
3545: else if (write_symbols == DBX_DEBUG
3546: && !strncmp (str, "gstabs", len) && len >= 2)
3547: use_gnu_debug_info_extensions = 0;
3548: else
3549: use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3550: #endif /* DBX_DEBUGGING_INFO */
3551: #ifdef DWARF_DEBUGGING_INFO
3552: if (write_symbols != NO_DEBUG)
3553: ;
3554: else if (!strncmp (str, "g", len))
3555: write_symbols = DWARF_DEBUG;
3556: else if (!strncmp (str, "ggdb", len))
3557: write_symbols = DWARF_DEBUG;
3558: else if (!strncmp (str, "gdwarf", len))
3559: write_symbols = DWARF_DEBUG;
3560:
3561: /* Always enable extensions for -ggdb or -gdwarf+,
3562: always disable for -gdwarf.
3563: For plain -g, use system-specific default. */
3564: if (write_symbols == DWARF_DEBUG && !strncmp (str, "ggdb", len)
3565: && len >= 2)
3566: use_gnu_debug_info_extensions = 1;
3567: else if (write_symbols == DWARF_DEBUG && !strcmp (str, "gdwarf+"))
3568: use_gnu_debug_info_extensions = 1;
3569: else if (write_symbols == DWARF_DEBUG
3570: && !strncmp (str, "gdwarf", len) && len >= 2)
3571: use_gnu_debug_info_extensions = 0;
3572: else
3573: use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3574: #endif
3575: #ifdef SDB_DEBUGGING_INFO
3576: if (write_symbols != NO_DEBUG)
3577: ;
3578: else if (!strncmp (str, "g", len))
3579: write_symbols = SDB_DEBUG;
3580: else if (!strncmp (str, "gdb", len))
3581: write_symbols = SDB_DEBUG;
3582: else if (!strncmp (str, "gcoff", len))
3583: write_symbols = SDB_DEBUG;
3584: #endif /* SDB_DEBUGGING_INFO */
3585: #ifdef XCOFF_DEBUGGING_INFO
3586: if (write_symbols != NO_DEBUG)
3587: ;
3588: else if (!strncmp (str, "g", len))
3589: write_symbols = XCOFF_DEBUG;
3590: else if (!strncmp (str, "ggdb", len))
3591: write_symbols = XCOFF_DEBUG;
3592: else if (!strncmp (str, "gxcoff", len))
3593: write_symbols = XCOFF_DEBUG;
3594:
3595: /* Always enable extensions for -ggdb or -gxcoff+,
3596: always disable for -gxcoff.
3597: For plain -g, use system-specific default. */
3598: if (write_symbols == XCOFF_DEBUG && !strncmp (str, "ggdb", len)
3599: && len >= 2)
3600: use_gnu_debug_info_extensions = 1;
3601: else if (write_symbols == XCOFF_DEBUG && !strcmp (str, "gxcoff+"))
3602: use_gnu_debug_info_extensions = 1;
3603: else if (write_symbols == XCOFF_DEBUG
3604: && !strncmp (str, "gxcoff", len) && len >= 2)
3605: use_gnu_debug_info_extensions = 0;
3606: else
3607: use_gnu_debug_info_extensions = DEFAULT_GDB_EXTENSIONS;
3608: #endif
3609: if (write_symbols == NO_DEBUG)
3610: warning ("`-%s' option not supported on this version of GCC", str);
3611: else if (level == 0)
3612: write_symbols = NO_DEBUG;
3613: else
3614: debug_info_level = (enum debug_info_level) level;
3615: }
3616: else if (!strcmp (str, "o"))
3617: {
3618: asm_file_name = argv[++i];
3619: }
3620: else if (str[0] == 'G')
3621: {
3622: g_switch_set = TRUE;
3623: g_switch_value = atoi ((str[1] != '\0') ? str+1 : argv[++i]);
3624: }
3625: else if (!strncmp (str, "aux-info", 8))
3626: {
3627: flag_gen_aux_info = 1;
3628: aux_info_file_name = (str[8] != '\0' ? str+8 : argv[++i]);
3629: }
3630: else
3631: error ("Invalid option `%s'", argv[i]);
3632: }
3633: else if (argv[i][0] == '+')
3634: error ("Invalid option `%s'", argv[i]);
3635: else
3636: filename = argv[i];
3637: }
3638:
3639: /* Initialize for bytecode output. A good idea to do this as soon as
3640: possible after the "-f" options have been parsed. */
3641: if (output_bytecode)
3642: {
3643: #ifndef TARGET_SUPPORTS_BYTECODE
3644: /* Just die with a fatal error if not supported */
3645: fatal ("-fbytecode can not be used for this target");
3646: #else
3647: bc_initialize ();
3648: #endif
3649: }
3650:
3651: #ifdef NEXT_FAT_OUTPUT
3652: set_target_architecture (architecture);
3653: #endif
3654:
3655: if (optimize == 0)
3656: {
3657: /* Inlining does not work if not optimizing,
3658: so force it not to be done. */
3659: flag_no_inline = 1;
3660: warn_inline = 0;
3661:
3662: /* The c_decode_option and lang_decode_option functions set
3663: this to `2' if -Wall is used, so we can avoid giving out
3664: lots of errors for people who don't realize what -Wall does. */
3665: if (warn_uninitialized == 1)
3666: warning ("-Wuninitialized is not supported without -O");
3667: }
3668:
3669: #if defined(DWARF_DEBUGGING_INFO)
3670: if (write_symbols == DWARF_DEBUG
3671: && strcmp (language_string, "GNU C++") == 0)
3672: {
3673: warning ("-g option not supported for C++ on SVR4 systems");
3674: write_symbols = NO_DEBUG;
3675: }
3676: #endif /* defined(DWARF_DEBUGGING_INFO) */
3677:
3678: #ifdef OVERRIDE_OPTIONS
3679: /* Some machines may reject certain combinations of options. */
3680: OVERRIDE_OPTIONS;
3681: #endif
3682:
3683: /* Unrolling all loops implies that standard loop unrolling must also
3684: be done. */
3685: if (flag_unroll_all_loops)
3686: flag_unroll_loops = 1;
3687: /* Loop unrolling requires that strength_reduction be on also. Silently
3688: turn on strength reduction here if it isn't already on. Also, the loop
3689: unrolling code assumes that cse will be run after loop, so that must
3690: be turned on also. */
3691: if (flag_unroll_loops)
3692: {
3693: flag_strength_reduce = 1;
3694: flag_rerun_cse_after_loop = 1;
3695: }
3696:
3697: /* Warn about options that are not supported on this machine. */
3698: #ifndef INSN_SCHEDULING
3699: if (flag_schedule_insns || flag_schedule_insns_after_reload)
3700: warning ("instruction scheduling not supported on this target machine");
3701: #endif
3702: #ifndef DELAY_SLOTS
3703: if (flag_delayed_branch)
3704: warning ("this target machine does not have delayed branches");
3705: #endif
3706:
3707: /* If we are in verbose mode, write out the version and maybe all the
3708: option flags in use. */
3709: if (version_flag)
3710: {
3711: fprintf (stderr, "%s version %s", language_string, version_string);
3712: #ifdef TARGET_VERSION
3713: TARGET_VERSION;
3714: #endif
3715: #ifdef __GNUC__
3716: #ifndef __VERSION__
3717: #define __VERSION__ "[unknown]"
3718: #endif
3719: fprintf (stderr, " compiled by GNU C version %s.\n", __VERSION__);
3720: #else
3721: fprintf (stderr, " compiled by CC.\n");
3722: #endif
3723: if (! quiet_flag)
3724: print_switch_values ();
3725: }
3726:
3727: /* Now that register usage is specified, convert it to HARD_REG_SETs. */
3728: if (!output_bytecode)
3729: init_reg_sets_1 ();
3730:
3731: compile_file (filename);
3732:
3733: if (output_bytecode)
3734: bc_write_file (stdout);
3735:
3736: #ifndef OS2
3737: #ifndef VMS
3738: if (flag_print_mem)
3739: {
3740: char *lim = (char *) sbrk (0);
3741:
3742: fprintf (stderr, "Data size %d.\n",
3743: lim - (char *) &environ);
3744: fflush (stderr);
3745:
3746: #ifdef USG
3747: system ("ps -l 1>&2");
3748: #else /* not USG */
3749: system ("ps v");
3750: #endif /* not USG */
3751: }
3752: #endif /* not VMS */
3753: #endif /* not OS2 */
3754:
3755: if (errorcount)
3756: exit (FATAL_EXIT_CODE);
3757: if (sorrycount)
3758: exit (FATAL_EXIT_CODE);
3759: exit (SUCCESS_EXIT_CODE);
3760: return 34;
3761: }
3762:
3763: /* Decode -m switches. */
3764:
3765: /* Here is a table, controlled by the tm.h file, listing each -m switch
3766: and which bits in `target_switches' it should set or clear.
3767: If VALUE is positive, it is bits to set.
3768: If VALUE is negative, -VALUE is bits to clear.
3769: (The sign bit is not used so there is no confusion.) */
3770:
3771: struct {char *name; int value;} target_switches []
3772: = TARGET_SWITCHES;
3773:
3774: /* This table is similar, but allows the switch to have a value. */
3775:
3776: #ifdef TARGET_OPTIONS
3777: struct {char *prefix; char ** variable;} target_options []
3778: = TARGET_OPTIONS;
3779: #endif
3780:
3781: /* Decode the switch -mNAME. */
3782:
3783: void
3784: set_target_switch (name)
3785: char *name;
3786: {
3787: register int j;
3788: int valid = 0;
3789:
3790: for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
3791: if (!strcmp (target_switches[j].name, name))
3792: {
3793: if (target_switches[j].value < 0)
3794: target_flags &= ~-target_switches[j].value;
3795: else
3796: target_flags |= target_switches[j].value;
3797: valid = 1;
3798: }
3799:
3800: #ifdef TARGET_OPTIONS
3801: if (!valid)
3802: for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
3803: {
3804: int len = strlen (target_options[j].prefix);
3805: if (!strncmp (target_options[j].prefix, name, len))
3806: {
3807: *target_options[j].variable = name + len;
3808: valid = 1;
3809: }
3810: }
3811: #endif
3812:
3813: #ifdef NEXT_FAT_OUTPUT
3814: if (!valid && !multi_arch_flag)
3815: error ("Invalid option `%s'", name);
3816: #endif
3817: }
3818:
3819: #ifdef NEXT_FAT_OUTPUT
3820: /* Decode -arch options. */
3821:
3822: /* This table, filled in by the tm.h file, lists the known values of the
3823: -arch option and their effect on `target_flags'. */
3824:
3825: void
3826: set_target_architecture (name)
3827: char *name;
3828: {
3829: static struct {
3830: char *name;
3831: int value;
3832: } target_arch [] = TARGET_ARCHITECTURE;
3833: register int j;
3834: int found = 0;
3835:
3836: if (name == 0) return;
3837:
3838: for (j = 0; j < sizeof target_arch / sizeof target_arch[0]; j++)
3839: {
3840: if (!strcmp (target_arch[j].name, name))
3841: {
3842: if (target_arch[j].value < 0)
3843: target_flags &= ~-target_arch[j].value;
3844: else
3845: target_flags |= target_arch[j].value;
3846: found = 1;
3847: }
3848: }
3849:
3850: if (!found)
3851: warning ("-arch `%s' not understood", name);
3852: }
3853: #endif /* NEXT_FAT_OUTPUT */
3854:
3855: /* Variable used for communication between the following two routines. */
3856:
3857: static int line_position;
3858:
3859: /* Print an option value and adjust the position in the line. */
3860:
3861: static void
3862: print_single_switch (type, name)
3863: char *type, *name;
3864: {
3865: fprintf (stderr, " %s%s", type, name);
3866:
3867: line_position += strlen (type) + strlen (name) + 1;
3868:
3869: if (line_position > 65)
3870: {
3871: fprintf (stderr, "\n\t");
3872: line_position = 8;
3873: }
3874: }
3875:
3876: /* Print default target switches for -version. */
3877:
3878: static void
3879: print_switch_values ()
3880: {
3881: register int j;
3882:
3883: fprintf (stderr, "enabled:");
3884: line_position = 8;
3885:
3886: for (j = 0; j < sizeof f_options / sizeof f_options[0]; j++)
3887: if (*f_options[j].variable == f_options[j].on_value)
3888: print_single_switch ("-f", f_options[j].string);
3889:
3890: for (j = 0; j < sizeof W_options / sizeof W_options[0]; j++)
3891: if (W_options[j].variable
3892: && *W_options[j].variable == W_options[j].on_value)
3893: print_single_switch ("-W", W_options[j].string);
3894:
3895: for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
3896: if (target_switches[j].name[0] != '\0'
3897: && target_switches[j].value > 0
3898: && ((target_switches[j].value & target_flags)
3899: == target_switches[j].value))
3900: print_single_switch ("-m", target_switches[j].name);
3901:
3902: fprintf (stderr, "\n");
3903: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.