]> gcc.gnu.org Git - gcc.git/blame - gcc/toplev.c
Bring in final gcc-2.8.0 changes.
[gcc.git] / gcc / toplev.c
CommitLineData
4291d9c8 1/* Top level of GNU C compiler
5ae3bec5 2 Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc.
4291d9c8
RS
3
4This file is part of GNU CC.
5
6GNU CC is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2, or (at your option)
9any later version.
10
11GNU CC is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GNU CC; see the file COPYING. If not, write to
e9fa0c7c
RK
18the Free Software Foundation, 59 Temple Place - Suite 330,
19Boston, MA 02111-1307, USA. */
4291d9c8 20
4291d9c8
RS
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"
e0e2a8da 27#ifdef __STDC__
04fe4385 28#include <stdarg.h>
e0e2a8da 29#else
04fe4385 30#include <varargs.h>
e0e2a8da 31#endif
4291d9c8
RS
32#include <stdio.h>
33#include <signal.h>
34#include <setjmp.h>
eb711c86 35#include <sys/types.h>
ea9182cd 36#include <ctype.h>
4291d9c8 37#include <sys/stat.h>
4291d9c8 38#undef FLOAT
956d6950 39#ifdef HAVE_SYS_PARAM_H
4291d9c8 40#include <sys/param.h>
956d6950
JL
41#endif
42
43#undef FLOAT /* This is for hpux. They should change hpux. */
4291d9c8 44#undef FFS /* Some systems define this in param.h. */
956d6950
JL
45
46#ifdef TIME_WITH_SYS_TIME
47# include <sys/time.h>
48# include <time.h>
4291d9c8 49#else
956d6950
JL
50# if HAVE_SYS_TIME_H
51# include <sys/time.h>
52# else
53# include <time.h>
4291d9c8
RS
54#endif
55#endif
956d6950
JL
56
57#ifdef HAVE_SYS_RESOURCE_H
58# include <sys/resource.h>
59#endif
60
61#ifdef HAVE_SYS_TIMES_H
62# include <sys/times.h>
eb910b5a 63#endif
4291d9c8
RS
64
65#include "input.h"
66#include "tree.h"
4291d9c8
RS
67#include "rtl.h"
68#include "flags.h"
69#include "insn-attr.h"
d0d4af87 70#include "defaults.h"
e14417fa
RK
71#include "output.h"
72#include "bytecode.h"
73#include "bc-emit.h"
3d195391 74#include "except.h"
f246a305
RS
75
76#ifdef XCOFF_DEBUGGING_INFO
77#include "xcoffout.h"
78#endif
4291d9c8
RS
79\f
80#ifdef VMS
81/* The extra parameters substantially improve the I/O performance. */
82static FILE *
37c9f674 83vms_fopen (fname, type)
4291d9c8
RS
84 char * fname;
85 char * type;
86{
37c9f674
RK
87 /* The <stdio.h> in the gcc-vms-1.42 distribution prototypes fopen with two
88 fixed arguments, which matches ANSI's specification but not VAXCRTL's
89 pre-ANSI implementation. This hack circumvents the mismatch problem. */
90 FILE *(*vmslib_fopen)() = (FILE *(*)()) fopen;
91
92 if (*type == 'w')
93 return (*vmslib_fopen) (fname, type, "mbc=32",
94 "deq=64", "fop=tef", "shr=nil");
95 else
96 return (*vmslib_fopen) (fname, type, "mbc=32");
4291d9c8 97}
37c9f674
RK
98#define fopen vms_fopen
99#endif /* VMS */
4291d9c8
RS
100
101#ifndef DEFAULT_GDB_EXTENSIONS
102#define DEFAULT_GDB_EXTENSIONS 1
103#endif
104
30657ee3
RK
105/* If more than one debugging type is supported, you must define
106 PREFERRED_DEBUGGING_TYPE to choose a format in a system-dependent way.
107
108 This is one long line cause VAXC can't handle a \-newline. */
9a666dda 109#if 1 < (defined (DBX_DEBUGGING_INFO) + defined (SDB_DEBUGGING_INFO) + defined (DWARF_DEBUGGING_INFO) + defined (DWARF2_DEBUGGING_INFO) + defined (XCOFF_DEBUGGING_INFO))
30657ee3
RK
110#ifndef PREFERRED_DEBUGGING_TYPE
111You Lose! You must define PREFERRED_DEBUGGING_TYPE!
112#endif /* no PREFERRED_DEBUGGING_TYPE */
113#else /* Only one debugging format supported. Define PREFERRED_DEBUGGING_TYPE
114 so the following code needn't care. */
115#ifdef DBX_DEBUGGING_INFO
116#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
117#endif
118#ifdef SDB_DEBUGGING_INFO
119#define PREFERRED_DEBUGGING_TYPE SDB_DEBUG
120#endif
121#ifdef DWARF_DEBUGGING_INFO
122#define PREFERRED_DEBUGGING_TYPE DWARF_DEBUG
123#endif
9a666dda
JM
124#ifdef DWARF2_DEBUGGING_INFO
125#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
126#endif
30657ee3
RK
127#ifdef XCOFF_DEBUGGING_INFO
128#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG
129#endif
130#endif /* More than one debugger format enabled. */
131
132/* If still not defined, must have been because no debugging formats
133 are supported. */
134#ifndef PREFERRED_DEBUGGING_TYPE
135#define PREFERRED_DEBUGGING_TYPE NO_DEBUG
136#endif
137
4291d9c8
RS
138extern int rtx_equal_function_value_matters;
139
72c8bb7f 140#if ! (defined (VMS) || defined (OS2))
4291d9c8 141extern char **environ;
4d7e336b 142#endif
4291d9c8
RS
143extern char *version_string, *language_string;
144
b0316e35
RS
145/* Carry information from ASM_DECLARE_OBJECT_NAME
146 to ASM_FINISH_DECLARE_OBJECT. */
147
148extern int size_directive_output;
5e10b3cc 149extern tree last_assemble_variable_decl;
b0316e35 150
4291d9c8
RS
151extern void init_lex ();
152extern void init_decl_processing ();
153extern void init_obstacks ();
154extern void init_tree_codes ();
155extern void init_rtl ();
34d0205f 156extern void init_regs ();
4291d9c8
RS
157extern void init_optabs ();
158extern void init_stmt ();
159extern void init_reg_sets ();
160extern void dump_flow_info ();
161extern void dump_sched_info ();
162extern void dump_local_alloc ();
9ddca353 163extern void regset_release_memory ();
4291d9c8
RS
164
165void rest_of_decl_compilation ();
d18225c4
RK
166void error_with_file_and_line PVPROTO((char *file, int line, char *s, ...));
167void error_with_decl PVPROTO((tree decl, char *s, ...));
168void error_for_asm PVPROTO((rtx insn, char *s, ...));
169void error PVPROTO((char *s, ...));
170void fatal PVPROTO((char *s, ...));
171void warning_with_file_and_line PVPROTO((char *file, int line, char *s, ...));
172void warning_with_decl PVPROTO((tree decl, char *s, ...));
173void warning_for_asm PVPROTO((rtx insn, char *s, ...));
174void warning PVPROTO((char *s, ...));
175void pedwarn PVPROTO((char *s, ...));
176void pedwarn_with_decl PVPROTO((tree decl, char *s, ...));
177void pedwarn_with_file_and_line PVPROTO((char *file, int line, char *s, ...));
178void sorry PVPROTO((char *s, ...));
179void really_sorry PVPROTO((char *s, ...));
4291d9c8
RS
180void fancy_abort ();
181#ifndef abort
182void abort ();
183#endif
184void set_target_switch ();
4291d9c8
RS
185static char *decl_name ();
186
3d5cdd42
DE
187void print_version ();
188int print_single_switch ();
189void print_switch_values ();
190/* Length of line when printing switch values. */
191#define MAX_LINE 75
192
efa00f4e
RK
193#ifdef __alpha
194extern char *sbrk ();
195#endif
196
4291d9c8
RS
197/* Name of program invoked, sans directories. */
198
199char *progname;
200
201/* Copy of arguments to main. */
202int save_argc;
203char **save_argv;
204\f
205/* Name of current original source file (what was input to cpp).
206 This comes from each #-command in the actual input. */
207
208char *input_filename;
209
210/* Name of top-level original source file (what was input to cpp).
211 This comes from the #-command at the beginning of the actual input.
212 If there isn't any there, then this is the cc1 input file name. */
213
214char *main_input_filename;
215
e3d1fd32 216#if !USE_CPPLIB
4291d9c8 217/* Stream for reading from the input file. */
4291d9c8 218FILE *finput;
e3d1fd32 219#endif
4291d9c8
RS
220
221/* Current line number in real source file. */
222
223int lineno;
224
225/* Stack of currently pending input files. */
226
227struct file_stack *input_file_stack;
228
229/* Incremented on each change to input_file_stack. */
230int input_file_stack_tick;
231
232/* FUNCTION_DECL for function now being parsed or compiled. */
233
234extern tree current_function_decl;
235
236/* Name to use as base of names for dump output files. */
237
238char *dump_base_name;
239
240/* Bit flags that specify the machine subtype we are compiling for.
241 Bits are tested using macros TARGET_... defined in the tm.h file
242 and set by `-m...' switches. Must be defined in rtlanal.c. */
243
244extern int target_flags;
245
246/* Flags saying which kinds of debugging dump have been requested. */
247
248int rtl_dump = 0;
249int rtl_dump_and_exit = 0;
250int jump_opt_dump = 0;
e9a25f70 251int addressof_dump = 0;
4291d9c8
RS
252int cse_dump = 0;
253int loop_dump = 0;
254int cse2_dump = 0;
0d332add 255int branch_prob_dump = 0;
4291d9c8
RS
256int flow_dump = 0;
257int combine_dump = 0;
8c660648 258int regmove_dump = 0;
4291d9c8
RS
259int sched_dump = 0;
260int local_reg_dump = 0;
261int global_reg_dump = 0;
262int sched2_dump = 0;
263int jump2_opt_dump = 0;
264int dbr_sched_dump = 0;
265int flag_print_asm_name = 0;
266int stack_reg_dump = 0;
267
268/* Name for output file of assembly code, specified with -o. */
269
270char *asm_file_name;
271
272/* Value of the -G xx switch, and whether it was passed or not. */
273int g_switch_value;
274int g_switch_set;
275
276/* Type(s) of debugging information we are producing (if any).
277 See flags.h for the definitions of the different possible
278 types of debugging information. */
279enum debug_info_type write_symbols = NO_DEBUG;
280
281/* Level of debugging information we are producing. See flags.h
282 for the definitions of the different possible levels. */
283enum debug_info_level debug_info_level = DINFO_LEVEL_NONE;
284
a53d0bcc
RS
285/* Nonzero means use GNU-only extensions in the generated symbolic
286 debugging information. */
287/* Currently, this only has an effect when write_symbols is set to
288 DBX_DEBUG, XCOFF_DEBUG, or DWARF_DEBUG. */
289int use_gnu_debug_info_extensions = 0;
4291d9c8
RS
290
291/* Nonzero means do optimizations. -O.
292 Particular numeric values stand for particular amounts of optimization;
293 thus, -O2 stores 2 here. However, the optimizations beyond the basic
294 ones are not controlled directly by this variable. Instead, they are
295 controlled by individual `flag_...' variables that are defaulted
296 based on this variable. */
297
298int optimize = 0;
299
300/* Number of error messages and warning messages so far. */
301
302int errorcount = 0;
303int warningcount = 0;
304int sorrycount = 0;
305
ca695ac9
JB
306/* Flag to output bytecode instead of native assembler */
307int output_bytecode = 0;
308
a1d7ffe3
JM
309/* Pointer to function to compute the name to use to print a declaration.
310 DECL is the declaration in question.
311 VERBOSITY determines what information will be printed:
312 0: DECL_NAME, demangled as necessary.
313 1: and scope information.
314 2: and any other information that might be interesting, such as function
315 parameter types in C++. */
4291d9c8 316
a1d7ffe3 317char *(*decl_printable_name) (/* tree decl, int verbosity */);
4291d9c8
RS
318
319/* Pointer to function to compute rtl for a language-specific tree code. */
320
321struct rtx_def *(*lang_expand_expr) ();
322
2b599527
RS
323/* Pointer to function to finish handling an incomplete decl at the
324 end of compilation. */
325
326void (*incomplete_decl_finalize_hook) () = 0;
327
bf8b4985
RK
328/* Highest label number used at the end of reload. */
329
330int max_label_num_after_reload;
331
4291d9c8
RS
332/* Nonzero if generating code to do profiling. */
333
334int profile_flag = 0;
335
336/* Nonzero if generating code to do profiling on a line-by-line basis. */
337
338int profile_block_flag;
339
0d332add
DE
340/* Nonzero if generating code to profile program flow graph arcs. */
341
342int profile_arc_flag = 0;
343
344/* Nonzero if generating info for gcov to calculate line test coverage. */
345
346int flag_test_coverage = 0;
347
348/* Nonzero indicates that branch taken probabilities should be calculated. */
349
350int flag_branch_probabilities = 0;
351
4291d9c8
RS
352/* Nonzero for -pedantic switch: warn about anything
353 that standard spec forbids. */
354
355int pedantic = 0;
356
357/* Temporarily suppress certain warnings.
358 This is set while reading code from a system header file. */
359
360int in_system_header = 0;
361
362/* Nonzero means do stupid register allocation.
363 Currently, this is 1 if `optimize' is 0. */
364
365int obey_regdecls = 0;
366
367/* Don't print functions as they are compiled and don't print
368 times taken by the various passes. -quiet. */
369
370int quiet_flag = 0;
371\f
372/* -f flags. */
373
374/* Nonzero means `char' should be signed. */
375
376int flag_signed_char;
377
378/* Nonzero means give an enum type only as many bytes as it needs. */
379
380int flag_short_enums;
381
382/* Nonzero for -fcaller-saves: allocate values in regs that need to
383 be saved across function calls, if that produces overall better code.
384 Optional now, so people can test it. */
385
386#ifdef DEFAULT_CALLER_SAVES
387int flag_caller_saves = 1;
388#else
389int flag_caller_saves = 0;
390#endif
391
958ec8ca
JW
392/* Nonzero if structures and unions should be returned in memory.
393
394 This should only be defined if compatibility with another compiler or
395 with an ABI is needed, because it results in slower code. */
396
397#ifndef DEFAULT_PCC_STRUCT_RETURN
398#define DEFAULT_PCC_STRUCT_RETURN 1
399#endif
400
4291d9c8
RS
401/* Nonzero for -fpcc-struct-return: return values the same way PCC does. */
402
958ec8ca 403int flag_pcc_struct_return = DEFAULT_PCC_STRUCT_RETURN;
4291d9c8
RS
404
405/* Nonzero for -fforce-mem: load memory value into a register
406 before arithmetic on it. This makes better cse but slower compilation. */
407
408int flag_force_mem = 0;
409
410/* Nonzero for -fforce-addr: load memory address into a register before
411 reference to memory. This makes better cse but slower compilation. */
412
413int flag_force_addr = 0;
414
415/* Nonzero for -fdefer-pop: don't pop args after each function call;
416 instead save them up to pop many calls' args with one insns. */
417
6731a3e3 418int flag_defer_pop = 0;
4291d9c8
RS
419
420/* Nonzero for -ffloat-store: don't allocate floats and doubles
421 in extended-precision registers. */
422
423int flag_float_store = 0;
424
425/* Nonzero for -fcse-follow-jumps:
426 have cse follow jumps to do a more extensive job. */
427
428int flag_cse_follow_jumps;
429
8b3686ed
RK
430/* Nonzero for -fcse-skip-blocks:
431 have cse follow a branch around a block. */
432int flag_cse_skip_blocks;
433
4291d9c8
RS
434/* Nonzero for -fexpensive-optimizations:
435 perform miscellaneous relatively-expensive optimizations. */
436int flag_expensive_optimizations;
437
438/* Nonzero for -fthread-jumps:
439 have jump optimize output of loop. */
440
441int flag_thread_jumps;
442
443/* Nonzero enables strength-reduction in loop.c. */
444
445int flag_strength_reduce = 0;
446
447/* Nonzero enables loop unrolling in unroll.c. Only loops for which the
448 number of iterations can be calculated at compile-time (UNROLL_COMPLETELY,
449 UNROLL_MODULO) or at run-time (preconditioned to be UNROLL_MODULO) are
450 unrolled. */
451
452int flag_unroll_loops;
453
454/* Nonzero enables loop unrolling in unroll.c. All loops are unrolled.
455 This is generally not a win. */
456
457int flag_unroll_all_loops;
458
e5eb27e5
JL
459/* Nonzero forces all invariant computations in loops to be moved
460 outside the loop. */
461
462int flag_move_all_movables = 0;
463
464/* Nonzero forces all general induction variables in loops to be
465 strength reduced. */
466
467int flag_reduce_all_givs = 0;
468
4291d9c8
RS
469/* Nonzero for -fwritable-strings:
470 store string constants in data segment and don't uniquize them. */
471
472int flag_writable_strings = 0;
473
474/* Nonzero means don't put addresses of constant functions in registers.
475 Used for compiling the Unix kernel, where strange substitutions are
476 done on the assembly output. */
477
478int flag_no_function_cse = 0;
479
480/* Nonzero for -fomit-frame-pointer:
481 don't make a frame pointer in simple functions that don't require one. */
482
483int flag_omit_frame_pointer = 0;
484
cf440348
JL
485/* Nonzero means place each function into its own section on those platforms
486 which support arbitrary section names and unlimited numbers of sections. */
487
488int flag_function_sections = 0;
489
4291d9c8
RS
490/* Nonzero to inhibit use of define_optimization peephole opts. */
491
492int flag_no_peephole = 0;
493
43855b28
JL
494/* Nonzero allows GCC to violate some IEEE or ANSI rules regarding math
495 operations in the interest of optimization. For example it allows
496 GCC to assume arguments to sqrt are nonnegative numbers, allowing
0f41302f 497 faster code for sqrt to be generated. */
43855b28
JL
498
499int flag_fast_math = 0;
500
4291d9c8
RS
501/* Nonzero means all references through pointers are volatile. */
502
503int flag_volatile;
c6e75897
RS
504
505/* Nonzero means treat all global and extern variables as global. */
506
38d4d0c2 507int flag_volatile_global;
4291d9c8
RS
508
509/* Nonzero means just do syntax checking; don't output anything. */
510
511int flag_syntax_only = 0;
512
513/* Nonzero means to rerun cse after loop optimization. This increases
514 compilation time about 20% and picks up a few more common expressions. */
515
516static int flag_rerun_cse_after_loop;
517
6d6d0fa0
JL
518/* Nonzero means to run loop optimizations twice. */
519
64fde701 520int flag_rerun_loop_opt;
6d6d0fa0 521
4291d9c8
RS
522/* Nonzero for -finline-functions: ok to inline functions that look like
523 good inline candidates. */
524
525int flag_inline_functions;
526
527/* Nonzero for -fkeep-inline-functions: even if we make a function
ac2a9454 528 go inline everywhere, keep its definition around for debugging
4291d9c8
RS
529 purposes. */
530
531int flag_keep_inline_functions;
532
fadb3bc9 533/* Nonzero means that functions will not be inlined. */
4291d9c8
RS
534
535int flag_no_inline;
536
fbe912dd
BK
537/* Nonzero means that we should emit static const variables
538 regardless of whether or not optimization is turned on. */
539
540int flag_keep_static_consts = 1;
541
4291d9c8
RS
542/* Nonzero means we should be saving declaration info into a .X file. */
543
544int flag_gen_aux_info = 0;
545
f246a305
RS
546/* Specified name of aux-info file. */
547
548static char *aux_info_file_name;
549
4291d9c8
RS
550/* Nonzero means make the text shared if supported. */
551
552int flag_shared_data;
553
554/* Nonzero means schedule into delayed branch slots if supported. */
555
556int flag_delayed_branch;
557
558/* Nonzero if we are compiling pure (sharable) code.
559 Value is 1 if we are doing reasonable (i.e. simple
560 offset into offset table) pic. Value is 2 if we can
561 only perform register offsets. */
562
563int flag_pic;
564
3d195391
MS
565/* Nonzero means generate extra code for exception handling and enable
566 exception handling. */
567
56bf1fd9 568int flag_exceptions = 2;
3d195391 569
2786cbad 570/* Nonzero means don't place uninitialized global data in common storage
3d195391 571 by default. */
4291d9c8
RS
572
573int flag_no_common;
574
575/* Nonzero means pretend it is OK to examine bits of target floats,
576 even if that isn't true. The resulting code will have incorrect constants,
577 but the same series of instructions that the native compiler would make. */
578
579int flag_pretend_float;
580
581/* Nonzero means change certain warnings into errors.
582 Usually these are warnings about failure to conform to some standard. */
583
584int flag_pedantic_errors = 0;
585
586/* flag_schedule_insns means schedule insns within basic blocks (before
587 local_alloc).
588 flag_schedule_insns_after_reload means schedule insns after
589 global_alloc. */
590
591int flag_schedule_insns = 0;
592int flag_schedule_insns_after_reload = 0;
593
8c660648
JL
594#ifdef HAIFA
595/* The following flags have effect only for scheduling before register
596 allocation:
597
598 flag_schedule_interblock means schedule insns accross basic blocks.
599 flag_schedule_speculative means allow speculative motion of non-load insns.
600 flag_schedule_speculative_load means allow speculative motion of some
601 load insns.
602 flag_schedule_speculative_load_dangerous allows speculative motion of more
603 load insns.
604 flag_schedule_reverse_before_reload means try to reverse original order
605 of insns (S).
606 flag_schedule_reverse_after_reload means try to reverse original order
607 of insns (R). */
608
609int flag_schedule_interblock = 1;
610int flag_schedule_speculative = 1;
611int flag_schedule_speculative_load = 0;
612int flag_schedule_speculative_load_dangerous = 0;
613int flag_schedule_reverse_before_reload = 0;
614int flag_schedule_reverse_after_reload = 0;
615
616
617/* flag_on_branch_count_reg means try to replace add-1,compare,branch tupple
618 by a cheaper branch, on a count register. */
619int flag_branch_on_count_reg;
620#endif /* HAIFA */
621
622
4291d9c8
RS
623/* -finhibit-size-directive inhibits output of .size for ELF.
624 This is used only for compiling crtstuff.c,
625 and it may be extended to other effects
626 needed for crtstuff.c on other systems. */
627int flag_inhibit_size_directive = 0;
628
9a631e8e
RS
629/* -fverbose-asm causes extra commentary information to be produced in
630 the generated assembly code (to make it more readable). This option
631 is generally only of use to those who actually need to read the
3d5cdd42 632 generated assembly code (perhaps while debugging the compiler itself).
c85f7c16 633 -fno-verbose-asm, the default, causes the extra information
3d5cdd42
DE
634 to be omitted and is useful when comparing two assembler files. */
635
c85f7c16 636int flag_verbose_asm = 0;
9a631e8e 637
3d5cdd42
DE
638/* -dA causes debug commentary information to be produced in
639 the generated assembly code (to make it more readable). This option
640 is generally only of use to those who actually need to read the
641 generated assembly code (perhaps while debugging the compiler itself).
642 Currently, this switch is only used by dwarfout.c; however, it is intended
643 to be a catchall for printing debug information in the assembler file. */
644
645int flag_debug_asm = 0;
9a631e8e 646
4291d9c8 647/* -fgnu-linker specifies use of the GNU linker for initializations.
d68c507d
RS
648 (Or, more generally, a linker that handles initializations.)
649 -fno-gnu-linker says that collect2 will be used. */
650#ifdef USE_COLLECT2
651int flag_gnu_linker = 0;
652#else
4291d9c8 653int flag_gnu_linker = 1;
d68c507d 654#endif
4291d9c8 655
566cdc73
MM
656/* Tag all structures with __attribute__(packed) */
657int flag_pack_struct = 0;
658
bd83d0ac
RK
659/* Emit code to check for stack overflow; also may cause large objects
660 to be allocated dynamically. */
661int flag_stack_check;
662
f602c208
RK
663/* -fcheck-memory-usage causes extra code to be generated in order to check
664 memory accesses. This is used by a detector of bad memory accesses such
665 as Checker. */
666int flag_check_memory_usage = 0;
667
668/* -fprefix-function-name causes function name to be prefixed. This
669 can be used with -fcheck-memory-usage to isolate code compiled with
670 -fcheck-memory-usage. */
671int flag_prefix_function_name = 0;
672
8c660648
JL
673int flag_regmove = 0;
674
9ae8ffe7
JL
675/* 0 if pointer arguments may alias each other. True in C.
676 1 if pointer arguments may not alias each other but may alias
677 global variables.
678 2 if pointer arguments may not alias each other and may not
679 alias global variables. True in Fortran.
680 This defaults to 0 for C. */
681int flag_argument_noalias = 0;
682
4291d9c8
RS
683/* Table of language-independent -f options.
684 STRING is the option name. VARIABLE is the address of the variable.
685 ON_VALUE is the value to store in VARIABLE
686 if `-fSTRING' is seen as an option.
687 (If `-fno-STRING' is seen as an option, the opposite value is stored.) */
688
689struct { char *string; int *variable; int on_value;} f_options[] =
690{
691 {"float-store", &flag_float_store, 1},
692 {"volatile", &flag_volatile, 1},
38d4d0c2 693 {"volatile-global", &flag_volatile_global, 1},
4291d9c8
RS
694 {"defer-pop", &flag_defer_pop, 1},
695 {"omit-frame-pointer", &flag_omit_frame_pointer, 1},
696 {"cse-follow-jumps", &flag_cse_follow_jumps, 1},
8b3686ed 697 {"cse-skip-blocks", &flag_cse_skip_blocks, 1},
4291d9c8
RS
698 {"expensive-optimizations", &flag_expensive_optimizations, 1},
699 {"thread-jumps", &flag_thread_jumps, 1},
700 {"strength-reduce", &flag_strength_reduce, 1},
701 {"unroll-loops", &flag_unroll_loops, 1},
702 {"unroll-all-loops", &flag_unroll_all_loops, 1},
e5eb27e5
JL
703 {"move-all-movables", &flag_move_all_movables, 1},
704 {"reduce-all-givs", &flag_reduce_all_givs, 1},
4291d9c8
RS
705 {"writable-strings", &flag_writable_strings, 1},
706 {"peephole", &flag_no_peephole, 0},
707 {"force-mem", &flag_force_mem, 1},
708 {"force-addr", &flag_force_addr, 1},
709 {"function-cse", &flag_no_function_cse, 0},
710 {"inline-functions", &flag_inline_functions, 1},
711 {"keep-inline-functions", &flag_keep_inline_functions, 1},
712 {"inline", &flag_no_inline, 0},
fbe912dd 713 {"keep-static-consts", &flag_keep_static_consts, 1},
4291d9c8 714 {"syntax-only", &flag_syntax_only, 1},
4291d9c8
RS
715 {"shared-data", &flag_shared_data, 1},
716 {"caller-saves", &flag_caller_saves, 1},
717 {"pcc-struct-return", &flag_pcc_struct_return, 1},
958ec8ca 718 {"reg-struct-return", &flag_pcc_struct_return, 0},
4291d9c8
RS
719 {"delayed-branch", &flag_delayed_branch, 1},
720 {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1},
6d6d0fa0 721 {"rerun-loop-opt", &flag_rerun_loop_opt, 1},
4291d9c8
RS
722 {"pretend-float", &flag_pretend_float, 1},
723 {"schedule-insns", &flag_schedule_insns, 1},
724 {"schedule-insns2", &flag_schedule_insns_after_reload, 1},
8c660648
JL
725#ifdef HAIFA
726 {"sched-interblock",&flag_schedule_interblock, 1},
727 {"sched-spec",&flag_schedule_speculative, 1},
728 {"sched-spec-load",&flag_schedule_speculative_load, 1},
729 {"sched-spec-load-dangerous",&flag_schedule_speculative_load_dangerous, 1},
730 {"sched-reverse-S",&flag_schedule_reverse_before_reload, 1},
731 {"sched-reverse-R",&flag_schedule_reverse_after_reload, 1},
732 {"branch-count-reg",&flag_branch_on_count_reg, 1},
733#endif /* HAIFA */
4291d9c8
RS
734 {"pic", &flag_pic, 1},
735 {"PIC", &flag_pic, 2},
3d195391 736 {"exceptions", &flag_exceptions, 1},
e976b8b2
MS
737 {"sjlj-exceptions", &exceptions_via_longjmp, 1},
738 {"asynchronous-exceptions", &asynchronous_exceptions, 1},
0d332add
DE
739 {"profile-arcs", &profile_arc_flag, 1},
740 {"test-coverage", &flag_test_coverage, 1},
741 {"branch-probabilities", &flag_branch_probabilities, 1},
43855b28 742 {"fast-math", &flag_fast_math, 1},
4291d9c8
RS
743 {"common", &flag_no_common, 0},
744 {"inhibit-size-directive", &flag_inhibit_size_directive, 1},
cf440348 745 {"function-sections", &flag_function_sections, 1},
9a631e8e 746 {"verbose-asm", &flag_verbose_asm, 1},
422e2ed3 747 {"gnu-linker", &flag_gnu_linker, 1},
8c660648 748 {"regmove", &flag_regmove, 1},
566cdc73 749 {"pack-struct", &flag_pack_struct, 1},
bd83d0ac 750 {"stack-check", &flag_stack_check, 1},
f602c208 751 {"bytecode", &output_bytecode, 1},
9ae8ffe7
JL
752 {"argument-alias", &flag_argument_noalias, 0},
753 {"argument-noalias", &flag_argument_noalias, 1},
754 {"argument-noalias-global", &flag_argument_noalias, 2},
f602c208
RK
755 {"check-memory-usage", &flag_check_memory_usage, 1},
756 {"prefix-function-name", &flag_prefix_function_name, 1}
4291d9c8 757};
b99933c7
RS
758
759/* Table of language-specific options. */
760
761char *lang_options[] =
762{
4200c8de 763 "-ansi",
8305445b 764 "-fallow-single-precision",
4200c8de 765
b99933c7
RS
766 "-fsigned-bitfields",
767 "-funsigned-bitfields",
768 "-fno-signed-bitfields",
769 "-fno-unsigned-bitfields",
4200c8de
RK
770 "-fsigned-char",
771 "-funsigned-char",
772 "-fno-signed-char",
773 "-fno-unsigned-char",
774
775 "-ftraditional",
776 "-traditional",
777 "-fnotraditional",
778 "-fno-traditional",
779
b99933c7
RS
780 "-fasm",
781 "-fno-asm",
782 "-fbuiltin",
783 "-fno-builtin",
5ae3bec5
RK
784 "-fhosted",
785 "-fno-hosted",
786 "-ffreestanding",
787 "-fno-freestanding",
4200c8de
RK
788 "-fcond-mismatch",
789 "-fno-cond-mismatch",
c7daad38 790 "-fdollars-in-identifiers",
57f0a224 791 "-fno-dollars-in-identifiers",
4200c8de
RK
792 "-fident",
793 "-fno-ident",
794 "-fshort-double",
795 "-fno-short-double",
796 "-fshort-enums",
797 "-fno-short-enums",
798
799 "-Wall",
289871f0
RK
800 "-Wbad-function-cast",
801 "-Wno-bad-function-cast",
b99933c7
RS
802 "-Wcast-qual",
803 "-Wno-cast-qual",
b99933c7
RS
804 "-Wchar-subscripts",
805 "-Wno-char-subscripts",
b99933c7
RS
806 "-Wcomment",
807 "-Wno-comment",
808 "-Wcomments",
809 "-Wno-comments",
4200c8de
RK
810 "-Wconversion",
811 "-Wno-conversion",
812 "-Wformat",
813 "-Wno-format",
b99933c7
RS
814 "-Wimport",
815 "-Wno-import",
e9a25f70
JL
816 "-Wimplicit-function-declaration",
817 "-Wno-implicit-function-declaration",
818 "-Werror-implicit-function-declaration",
819 "-Wimplicit-int",
820 "-Wno-implicit-int",
4200c8de
RK
821 "-Wimplicit",
822 "-Wno-implicit",
5ae3bec5
RK
823 "-Wmain",
824 "-Wno-main",
f41372d4
RS
825 "-Wmissing-braces",
826 "-Wno-missing-braces",
4200c8de
RK
827 "-Wmissing-declarations",
828 "-Wno-missing-declarations",
829 "-Wmissing-prototypes",
830 "-Wno-missing-prototypes",
831 "-Wnested-externs",
832 "-Wno-nested-externs",
833 "-Wparentheses",
834 "-Wno-parentheses",
835 "-Wpointer-arith",
836 "-Wno-pointer-arith",
837 "-Wredundant-decls",
838 "-Wno-redundant-decls",
d51f9363
JM
839 "-Wsign-compare",
840 "-Wno-sign-compare",
4200c8de
RK
841 "-Wstrict-prototypes",
842 "-Wno-strict-prototypes",
843 "-Wtraditional",
844 "-Wno-traditional",
845 "-Wtrigraphs",
846 "-Wno-trigraphs",
c7710c1f
RK
847 "-Wundef",
848 "-Wno-undef",
4200c8de
RK
849 "-Wwrite-strings",
850 "-Wno-write-strings",
b99933c7 851
65faa6a4
RS
852 /* these are for obj c */
853 "-lang-objc",
854 "-gen-decls",
f5309ddf
TW
855 "-fgnu-runtime",
856 "-fno-gnu-runtime",
857 "-fnext-runtime",
858 "-fno-next-runtime",
65faa6a4
RS
859 "-Wselector",
860 "-Wno-selector",
b800a01b
KKT
861 "-Wprotocol",
862 "-Wno-protocol",
956d6950 863 "-print-objc-runtime-info",
a457294f 864
2a95de17 865#include "options.h"
b99933c7
RS
866 0
867};
4291d9c8
RS
868\f
869/* Options controlling warnings */
870
871/* Don't print warning messages. -w. */
872
873int inhibit_warnings = 0;
874
875/* Print various extra warnings. -W. */
876
877int extra_warnings = 0;
878
879/* Treat warnings as errors. -Werror. */
880
881int warnings_are_errors = 0;
882
883/* Nonzero to warn about unused local variables. */
884
885int warn_unused;
886
887/* Nonzero to warn about variables used before they are initialized. */
888
889int warn_uninitialized;
890
891/* Nonzero means warn about all declarations which shadow others. */
892
893int warn_shadow;
894
895/* Warn if a switch on an enum fails to have a case for every enum value. */
896
897int warn_switch;
898
899/* Nonzero means warn about function definitions that default the return type
900 or that use a null return and have a return-type other than void. */
901
902int warn_return_type;
903
904/* Nonzero means warn about pointer casts that increase the required
905 alignment of the target type (and might therefore lead to a crash
906 due to a misaligned access). */
907
908int warn_cast_align;
909
910/* Nonzero means warn about any identifiers that match in the first N
911 characters. The value N is in `id_clash_len'. */
912
913int warn_id_clash;
b51e9c62
RK
914unsigned id_clash_len;
915
916/* Nonzero means warn about any objects definitions whose size is larger
917 than N bytes. Also want about function definitions whose returned
918 values are larger than N bytes. The value N is in `larger_than_size'. */
919
920int warn_larger_than;
921unsigned larger_than_size;
4291d9c8
RS
922
923/* Nonzero means warn if inline function is too large. */
924
925int warn_inline;
926
927/* Warn if a function returns an aggregate,
928 since there are often incompatible calling conventions for doing this. */
929
930int warn_aggregate_return;
931
932/* Likewise for -W. */
933
934struct { char *string; int *variable; int on_value;} W_options[] =
935{
936 {"unused", &warn_unused, 1},
937 {"error", &warnings_are_errors, 1},
938 {"shadow", &warn_shadow, 1},
939 {"switch", &warn_switch, 1},
4291d9c8
RS
940 {"aggregate-return", &warn_aggregate_return, 1},
941 {"cast-align", &warn_cast_align, 1},
f246a305
RS
942 {"uninitialized", &warn_uninitialized, 1},
943 {"inline", &warn_inline, 1}
4291d9c8
RS
944};
945\f
946/* Output files for assembler code (real compiler output)
947 and debugging dumps. */
948
949FILE *asm_out_file;
950FILE *aux_info_file;
951FILE *rtl_dump_file;
952FILE *jump_opt_dump_file;
e9a25f70 953FILE *addressof_dump_file;
4291d9c8
RS
954FILE *cse_dump_file;
955FILE *loop_dump_file;
956FILE *cse2_dump_file;
0d332add 957FILE *branch_prob_dump_file;
4291d9c8
RS
958FILE *flow_dump_file;
959FILE *combine_dump_file;
8c660648 960FILE *regmove_dump_file;
4291d9c8
RS
961FILE *sched_dump_file;
962FILE *local_reg_dump_file;
963FILE *global_reg_dump_file;
964FILE *sched2_dump_file;
965FILE *jump2_opt_dump_file;
966FILE *dbr_sched_dump_file;
967FILE *stack_reg_dump_file;
968
969/* Time accumulators, to count the total time spent in various passes. */
970
971int parse_time;
972int varconst_time;
973int integration_time;
974int jump_time;
975int cse_time;
976int loop_time;
977int cse2_time;
0d332add 978int branch_prob_time;
4291d9c8
RS
979int flow_time;
980int combine_time;
8c660648 981int regmove_time;
4291d9c8
RS
982int sched_time;
983int local_alloc_time;
984int global_alloc_time;
985int sched2_time;
986int dbr_sched_time;
987int shorten_branch_time;
988int stack_reg_time;
989int final_time;
990int symout_time;
991int dump_time;
992\f
993/* Return time used so far, in microseconds. */
994
995int
996get_run_time ()
997{
ea466196 998#if !defined (_WIN32) || defined (__CYGWIN32__)
4291d9c8
RS
999#ifdef USG
1000 struct tms tms;
1001#else
1002#ifndef VMS
1003 struct rusage rusage;
15f00097 1004#else
4291d9c8
RS
1005 struct
1006 {
1007 int proc_user_time;
1008 int proc_system_time;
1009 int child_user_time;
1010 int child_system_time;
1011 } vms_times;
1012#endif
15f00097 1013#endif
4291d9c8
RS
1014#endif
1015
1016 if (quiet_flag)
1017 return 0;
332c1bb4
JL
1018#ifdef __BEOS__
1019 return 0;
1020#else /* not BeOS */
ea466196 1021#if defined (_WIN32) && !defined (__CYGWIN32__)
15f00097
RK
1022 if (clock() < 0)
1023 return 0;
1024 else
1025 return (clock() * 1000);
9580b583 1026#else /* not _WIN32 */
4291d9c8
RS
1027#ifdef USG
1028 times (&tms);
1029 return (tms.tms_utime + tms.tms_stime) * (1000000 / HZ);
1030#else
1031#ifndef VMS
1032 getrusage (0, &rusage);
1033 return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec
1034 + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec);
1035#else /* VMS */
b472527b 1036 times ((void *) &vms_times);
4291d9c8 1037 return (vms_times.proc_user_time + vms_times.proc_system_time) * 10000;
c55dcc7d
FF
1038#endif /* VMS */
1039#endif /* USG */
1040#endif /* _WIN32 */
1041#endif /* __BEOS__ */
4291d9c8
RS
1042}
1043
1044#define TIMEVAR(VAR, BODY) \
1045do { int otime = get_run_time (); BODY; VAR += get_run_time () - otime; } while (0)
1046
1047void
1048print_time (str, total)
1049 char *str;
1050 int total;
1051{
1052 fprintf (stderr,
1053 "time in %s: %d.%06d\n",
1054 str, total / 1000000, total % 1000000);
1055}
1056
1057/* Count an error or warning. Return 1 if the message should be printed. */
1058
1059int
1060count_error (warningp)
1061 int warningp;
1062{
1063 if (warningp && inhibit_warnings)
1064 return 0;
1065
1066 if (warningp && !warnings_are_errors)
1067 warningcount++;
1068 else
1069 {
1070 static int warning_message = 0;
1071
1072 if (warningp && !warning_message)
1073 {
1074 fprintf (stderr, "%s: warnings being treated as errors\n", progname);
1075 warning_message = 1;
1076 }
1077 errorcount++;
1078 }
1079
1080 return 1;
1081}
1082
1083/* Print a fatal error message. NAME is the text.
1084 Also include a system error message based on `errno'. */
1085
1086void
1087pfatal_with_name (name)
1088 char *name;
1089{
1090 fprintf (stderr, "%s: ", progname);
1091 perror (name);
299846f2 1092 exit (FATAL_EXIT_CODE);
4291d9c8
RS
1093}
1094
1095void
1096fatal_io_error (name)
1097 char *name;
1098{
1099 fprintf (stderr, "%s: %s: I/O error\n", progname, name);
299846f2 1100 exit (FATAL_EXIT_CODE);
4291d9c8
RS
1101}
1102
a89b2cc4
MM
1103/* Called to give a better error message for a bad insn rather than
1104 just calling abort(). */
4291d9c8
RS
1105
1106void
a89b2cc4
MM
1107fatal_insn (message, insn)
1108 char *message;
4291d9c8
RS
1109 rtx insn;
1110{
ca695ac9
JB
1111 if (!output_bytecode)
1112 {
a89b2cc4 1113 error (message);
ca695ac9
JB
1114 debug_rtx (insn);
1115 }
4291d9c8
RS
1116 if (asm_out_file)
1117 fflush (asm_out_file);
1118 if (aux_info_file)
1119 fflush (aux_info_file);
1120 if (rtl_dump_file)
1121 fflush (rtl_dump_file);
1122 if (jump_opt_dump_file)
1123 fflush (jump_opt_dump_file);
e9a25f70
JL
1124 if (addressof_dump_file)
1125 fflush (addressof_dump_file);
4291d9c8
RS
1126 if (cse_dump_file)
1127 fflush (cse_dump_file);
1128 if (loop_dump_file)
1129 fflush (loop_dump_file);
1130 if (cse2_dump_file)
1131 fflush (cse2_dump_file);
1132 if (flow_dump_file)
1133 fflush (flow_dump_file);
1134 if (combine_dump_file)
1135 fflush (combine_dump_file);
8c660648
JL
1136 if (regmove_dump_file)
1137 fflush (regmove_dump_file);
4291d9c8
RS
1138 if (sched_dump_file)
1139 fflush (sched_dump_file);
1140 if (local_reg_dump_file)
1141 fflush (local_reg_dump_file);
1142 if (global_reg_dump_file)
1143 fflush (global_reg_dump_file);
1144 if (sched2_dump_file)
1145 fflush (sched2_dump_file);
1146 if (jump2_opt_dump_file)
1147 fflush (jump2_opt_dump_file);
1148 if (dbr_sched_dump_file)
1149 fflush (dbr_sched_dump_file);
1150 if (stack_reg_dump_file)
1151 fflush (stack_reg_dump_file);
1902f7fd
MM
1152 fflush (stdout);
1153 fflush (stderr);
4291d9c8
RS
1154 abort ();
1155}
1156
a89b2cc4
MM
1157/* Called to give a better error message when we don't have an insn to match
1158 what we are looking for or if the insn's constraints aren't satisfied,
1159 rather than just calling abort(). */
1160
1161void
1162fatal_insn_not_found (insn)
1163 rtx insn;
1164{
1165 if (INSN_CODE (insn) < 0)
1166 fatal_insn ("internal error--unrecognizable insn:", insn);
1167 else
1168 fatal_insn ("internal error--insn does not satisfy its constraints:", insn);
1169}
1170
4291d9c8
RS
1171/* This is the default decl_printable_name function. */
1172
1173static char *
a1d7ffe3 1174decl_name (decl, verbosity)
4291d9c8 1175 tree decl;
a1d7ffe3 1176 int verbosity;
4291d9c8
RS
1177{
1178 return IDENTIFIER_POINTER (DECL_NAME (decl));
1179}
1180\f
1181static int need_error_newline;
1182
1183/* Function of last error message;
1184 more generally, function such that if next error message is in it
1185 then we don't have to mention the function name. */
1186static tree last_error_function = NULL;
1187
1188/* Used to detect when input_file_stack has changed since last described. */
1189static int last_error_tick;
1190
1191/* Called when the start of a function definition is parsed,
1192 this function prints on stderr the name of the function. */
1193
1194void
1195announce_function (decl)
1196 tree decl;
1197{
1198 if (! quiet_flag)
1199 {
4291d9c8
RS
1200 if (rtl_dump_and_exit)
1201 fprintf (stderr, "%s ", IDENTIFIER_POINTER (DECL_NAME (decl)));
1202 else
a1d7ffe3 1203 fprintf (stderr, " %s", (*decl_printable_name) (decl, 2));
4291d9c8
RS
1204 fflush (stderr);
1205 need_error_newline = 1;
1206 last_error_function = current_function_decl;
1207 }
1208}
1209
b64e9948
PB
1210/* The default function to print out name of current function that caused
1211 an error. */
4291d9c8
RS
1212
1213void
b64e9948 1214default_print_error_function (file)
4291d9c8
RS
1215 char *file;
1216{
4291d9c8
RS
1217 if (last_error_function != current_function_decl)
1218 {
1219 char *kind = "function";
1220 if (current_function_decl != 0
1221 && TREE_CODE (TREE_TYPE (current_function_decl)) == METHOD_TYPE)
1222 kind = "method";
1223
1224 if (file)
1225 fprintf (stderr, "%s: ", file);
1226
1227 if (current_function_decl == NULL)
1228 fprintf (stderr, "At top level:\n");
1229 else
1230 {
a1d7ffe3 1231 char *name = (*decl_printable_name) (current_function_decl, 2);
4291d9c8
RS
1232 fprintf (stderr, "In %s `%s':\n", kind, name);
1233 }
1234
1235 last_error_function = current_function_decl;
1236 }
b64e9948
PB
1237}
1238
1239/* Called by report_error_function to print out function name.
0f41302f 1240 * Default may be overridden by language front-ends. */
b64e9948 1241
0f41302f 1242void (*print_error_function) PROTO((char *)) = default_print_error_function;
b64e9948
PB
1243
1244/* Prints out, if necessary, the name of the current function
1245 that caused an error. Called from all error and warning functions. */
1246
1247void
1248report_error_function (file)
1249 char *file;
1250{
1251 struct file_stack *p;
1252
1253 if (need_error_newline)
1254 {
1255 fprintf (stderr, "\n");
1256 need_error_newline = 0;
1257 }
1258
1259 (*print_error_function) (file);
1260
4291d9c8 1261 if (input_file_stack && input_file_stack->next != 0
2efc92ed
RK
1262 && input_file_stack_tick != last_error_tick
1263 && file == input_filename)
4291d9c8
RS
1264 {
1265 fprintf (stderr, "In file included");
1266 for (p = input_file_stack->next; p; p = p->next)
1267 {
1268 fprintf (stderr, " from %s:%d", p->name, p->line);
1269 if (p->next)
e5301904 1270 fprintf (stderr, ",\n ");
4291d9c8
RS
1271 }
1272 fprintf (stderr, ":\n");
1273 last_error_tick = input_file_stack_tick;
1274 }
1275}
eb711c86
RK
1276\f
1277/* Print a message. */
4291d9c8 1278
eb711c86
RK
1279static void
1280vmessage (prefix, s, ap)
1281 char *prefix;
4291d9c8 1282 char *s;
eb711c86 1283 va_list ap;
4291d9c8 1284{
eb711c86
RK
1285 if (prefix)
1286 fprintf (stderr, "%s: ", prefix);
1287
1288#ifdef HAVE_VPRINTF
1289 vfprintf (stderr, s, ap);
1290#else
1291 {
1292 HOST_WIDE_INT v1 = va_arg(ap, HOST_WIDE_INT);
1293 HOST_WIDE_INT v2 = va_arg(ap, HOST_WIDE_INT);
1294 HOST_WIDE_INT v3 = va_arg(ap, HOST_WIDE_INT);
a4326b4d
RK
1295 HOST_WIDE_INT v4 = va_arg(ap, HOST_WIDE_INT);
1296 fprintf (stderr, s, v1, v2, v3, v4);
eb711c86
RK
1297 }
1298#endif
4291d9c8
RS
1299}
1300
eb711c86 1301/* Print a message relevant to line LINE of file FILE. */
4291d9c8 1302
eb711c86
RK
1303static void
1304v_message_with_file_and_line (file, line, prefix, s, ap)
4291d9c8
RS
1305 char *file;
1306 int line;
eb711c86 1307 char *prefix;
4291d9c8 1308 char *s;
eb711c86 1309 va_list ap;
4291d9c8 1310{
4291d9c8
RS
1311 if (file)
1312 fprintf (stderr, "%s:%d: ", file, line);
1313 else
1314 fprintf (stderr, "%s: ", progname);
d78c6ad5 1315
eb711c86
RK
1316 vmessage (prefix, s, ap);
1317 fputc ('\n', stderr);
4291d9c8
RS
1318}
1319
eb711c86 1320/* Print a message relevant to the given DECL. */
4291d9c8 1321
eb711c86
RK
1322static void
1323v_message_with_decl (decl, prefix, s, ap)
4291d9c8 1324 tree decl;
eb711c86 1325 char *prefix;
4291d9c8 1326 char *s;
eb711c86 1327 va_list ap;
4291d9c8 1328{
a1d7ffe3 1329 char *n, *p;
4291d9c8
RS
1330
1331 fprintf (stderr, "%s:%d: ",
1332 DECL_SOURCE_FILE (decl), DECL_SOURCE_LINE (decl));
1333
eb711c86
RK
1334 if (prefix)
1335 fprintf (stderr, "%s: ", prefix);
1336
1337 /* Do magic to get around lack of varargs support for insertion
1338 of arguments into existing list. We know that the decl is first;
1339 we ass_u_me that it will be printed with "%s". */
1340
1341 for (p = s; *p; ++p)
1342 {
1343 if (*p == '%')
1344 {
1345 if (*(p + 1) == '%')
1346 ++p;
1347 else
1348 break;
1349 }
1350 }
1351
cb039f8a
RK
1352 if (p > s) /* Print the left-hand substring. */
1353 {
1354 char fmt[sizeof "%.255s"];
1355 long width = p - s;
1356
1357 if (width > 255L) width = 255L; /* arbitrary */
1358 sprintf (fmt, "%%.%lds", width);
1359 fprintf (stderr, fmt, s);
1360 }
eb711c86 1361
cb039f8a 1362 if (*p == '%') /* Print the name. */
eb711c86
RK
1363 {
1364 char *n = (DECL_NAME (decl)
a1d7ffe3 1365 ? (*decl_printable_name) (decl, 2)
eb711c86
RK
1366 : "((anonymous))");
1367 fputs (n, stderr);
1368 while (*p)
1369 {
1370 ++p;
1371 if (isalpha (*(p - 1) & 0xFF))
1372 break;
1373 }
1374 }
1375
cb039f8a 1376 if (*p) /* Print the rest of the message. */
eb711c86
RK
1377 vmessage ((char *)NULL, p, ap);
1378
1379 fputc ('\n', stderr);
4291d9c8
RS
1380}
1381
eb711c86 1382/* Figure file and line of the given INSN. */
4291d9c8 1383
eb711c86
RK
1384static void
1385file_and_line_for_asm (insn, pfile, pline)
4291d9c8 1386 rtx insn;
eb711c86
RK
1387 char **pfile;
1388 int *pline;
4291d9c8 1389{
4291d9c8
RS
1390 rtx body = PATTERN (insn);
1391 rtx asmop;
1392
1393 /* Find the (or one of the) ASM_OPERANDS in the insn. */
1394 if (GET_CODE (body) == SET && GET_CODE (SET_SRC (body)) == ASM_OPERANDS)
1395 asmop = SET_SRC (body);
1396 else if (GET_CODE (body) == ASM_OPERANDS)
1397 asmop = body;
1398 else if (GET_CODE (body) == PARALLEL
1399 && GET_CODE (XVECEXP (body, 0, 0)) == SET)
1400 asmop = SET_SRC (XVECEXP (body, 0, 0));
1401 else if (GET_CODE (body) == PARALLEL
1402 && GET_CODE (XVECEXP (body, 0, 0)) == ASM_OPERANDS)
1403 asmop = XVECEXP (body, 0, 0);
eb711c86
RK
1404 else
1405 asmop = NULL;
1406
1407 if (asmop)
1408 {
1409 *pfile = ASM_OPERANDS_SOURCE_FILE (asmop);
1410 *pline = ASM_OPERANDS_SOURCE_LINE (asmop);
1411 }
1412 else
1413 {
1414 *pfile = input_filename;
1415 *pline = lineno;
1416 }
1417}
4291d9c8 1418
eb711c86 1419/* Report an error at line LINE of file FILE. */
4291d9c8 1420
eb711c86
RK
1421static void
1422v_error_with_file_and_line (file, line, s, ap)
1423 char *file;
1424 int line;
1425 char *s;
1426 va_list ap;
1427{
1428 count_error (0);
1429 report_error_function (file);
1430 v_message_with_file_and_line (file, line, (char *)NULL, s, ap);
d78c6ad5
RK
1431}
1432
1433void
e0e2a8da 1434error_with_file_and_line VPROTO((char *file, int line, char *s, ...))
d78c6ad5 1435{
e0e2a8da 1436#ifndef __STDC__
eb711c86
RK
1437 char *file;
1438 int line;
1439 char *s;
e0e2a8da
RK
1440#endif
1441 va_list ap;
1442
1443 VA_START (ap, s);
eb711c86 1444
e0e2a8da 1445#ifndef __STDC__
eb711c86
RK
1446 file = va_arg (ap, char *);
1447 line = va_arg (ap, int);
1448 s = va_arg (ap, char *);
e0e2a8da
RK
1449#endif
1450
eb711c86
RK
1451 v_error_with_file_and_line (file, line, s, ap);
1452 va_end (ap);
4291d9c8
RS
1453}
1454
eb711c86
RK
1455/* Report an error at the declaration DECL.
1456 S is a format string which uses %s to substitute the declaration
1457 name; subsequent substitutions are a la printf. */
1458
1459static void
1460v_error_with_decl (decl, s, ap)
1461 tree decl;
1462 char *s;
1463 va_list ap;
1464{
1465 count_error (0);
1466 report_error_function (DECL_SOURCE_FILE (decl));
1467 v_message_with_decl (decl, (char *)NULL, s, ap);
1468}
4291d9c8
RS
1469
1470void
e0e2a8da 1471error_with_decl VPROTO((tree decl, char *s, ...))
eb711c86 1472{
e0e2a8da 1473#ifndef __STDC__
eb711c86
RK
1474 tree decl;
1475 char *s;
e0e2a8da
RK
1476#endif
1477 va_list ap;
eb711c86 1478
e0e2a8da
RK
1479 VA_START (ap, s);
1480
1481#ifndef __STDC__
eb711c86
RK
1482 decl = va_arg (ap, tree);
1483 s = va_arg (ap, char *);
e0e2a8da
RK
1484#endif
1485
eb711c86
RK
1486 v_error_with_decl (decl, s, ap);
1487 va_end (ap);
1488}
1489
1490/* Report an error at the line number of the insn INSN.
1491 This is used only when INSN is an `asm' with operands,
1492 and each ASM_OPERANDS records its own source file and line. */
1493
1494static void
1495v_error_for_asm (insn, s, ap)
1496 rtx insn;
4291d9c8 1497 char *s;
eb711c86 1498 va_list ap;
4291d9c8 1499{
eb711c86
RK
1500 char *file;
1501 int line;
4291d9c8 1502
eb711c86
RK
1503 count_error (0);
1504 file_and_line_for_asm (insn, &file, &line);
4291d9c8 1505 report_error_function (file);
eb711c86
RK
1506 v_message_with_file_and_line (file, line, (char *)NULL, s, ap);
1507}
4291d9c8 1508
eb711c86 1509void
e0e2a8da 1510error_for_asm VPROTO((rtx insn, char *s, ...))
eb711c86 1511{
e0e2a8da 1512#ifndef __STDC__
eb711c86
RK
1513 rtx insn;
1514 char *s;
e0e2a8da
RK
1515#endif
1516 va_list ap;
eb711c86 1517
e0e2a8da
RK
1518 VA_START (ap, s);
1519
1520#ifndef __STDC__
eb711c86
RK
1521 insn = va_arg (ap, rtx);
1522 s = va_arg (ap, char *);
e0e2a8da
RK
1523#endif
1524
eb711c86
RK
1525 v_error_for_asm (insn, s, ap);
1526 va_end (ap);
4291d9c8
RS
1527}
1528
eb711c86 1529/* Report an error at the current line number. */
4291d9c8 1530
eb711c86
RK
1531static void
1532verror (s, ap)
4291d9c8 1533 char *s;
eb711c86 1534 va_list ap;
4291d9c8 1535{
eb711c86 1536 v_error_with_file_and_line (input_filename, lineno, s, ap);
4291d9c8
RS
1537}
1538
eb711c86 1539void
e0e2a8da 1540error VPROTO((char *s, ...))
eb711c86 1541{
e0e2a8da 1542#ifndef __STDC__
eb711c86 1543 char *s;
e0e2a8da
RK
1544#endif
1545 va_list ap;
1546
1547 VA_START (ap, s);
eb711c86 1548
e0e2a8da 1549#ifndef __STDC__
eb711c86 1550 s = va_arg (ap, char *);
e0e2a8da
RK
1551#endif
1552
eb711c86
RK
1553 verror (s, ap);
1554 va_end (ap);
1555}
1556
1557/* Report a fatal error at the current line number. */
1558
1559static void
1560vfatal (s, ap)
1561 char *s;
1562 va_list ap;
1563{
1564 verror (s, ap);
299846f2 1565 exit (FATAL_EXIT_CODE);
eb711c86 1566}
4291d9c8
RS
1567
1568void
e0e2a8da 1569fatal VPROTO((char *s, ...))
eb711c86 1570{
e0e2a8da 1571#ifndef __STDC__
eb711c86 1572 char *s;
e0e2a8da
RK
1573#endif
1574 va_list ap;
1575
1576 VA_START (ap, s);
eb711c86 1577
e0e2a8da 1578#ifndef __STDC__
eb711c86 1579 s = va_arg (ap, char *);
e0e2a8da
RK
1580#endif
1581
eb711c86
RK
1582 vfatal (s, ap);
1583 va_end (ap);
1584}
1585
1586/* Report a warning at line LINE of file FILE. */
1587
1588static void
1589v_warning_with_file_and_line (file, line, s, ap)
1590 char *file;
1591 int line;
4291d9c8 1592 char *s;
eb711c86 1593 va_list ap;
4291d9c8 1594{
eb711c86
RK
1595 if (count_error (1))
1596 {
1597 report_error_function (file);
1598 v_message_with_file_and_line (file, line, "warning", s, ap);
1599 }
1600}
4291d9c8 1601
eb711c86 1602void
e0e2a8da 1603warning_with_file_and_line VPROTO((char *file, int line, char *s, ...))
eb711c86 1604{
e0e2a8da 1605#ifndef __STDC__
eb711c86
RK
1606 char *file;
1607 int line;
1608 char *s;
e0e2a8da
RK
1609#endif
1610 va_list ap;
1611
1612 VA_START (ap, s);
eb711c86 1613
e0e2a8da 1614#ifndef __STDC__
eb711c86
RK
1615 file = va_arg (ap, char *);
1616 line = va_arg (ap, int);
1617 s = va_arg (ap, char *);
e0e2a8da
RK
1618#endif
1619
eb711c86
RK
1620 v_warning_with_file_and_line (file, line, s, ap);
1621 va_end (ap);
1622}
4291d9c8 1623
eb711c86
RK
1624/* Report a warning at the declaration DECL.
1625 S is a format string which uses %s to substitute the declaration
1626 name; subsequent substitutions are a la printf. */
4291d9c8 1627
eb711c86
RK
1628static void
1629v_warning_with_decl (decl, s, ap)
1630 tree decl;
1631 char *s;
1632 va_list ap;
1633{
1634 if (count_error (1))
1635 {
1636 report_error_function (DECL_SOURCE_FILE (decl));
1637 v_message_with_decl (decl, "warning", s, ap);
1638 }
1639}
4291d9c8 1640
eb711c86 1641void
e0e2a8da 1642warning_with_decl VPROTO((tree decl, char *s, ...))
eb711c86 1643{
e0e2a8da 1644#ifndef __STDC__
eb711c86
RK
1645 tree decl;
1646 char *s;
e0e2a8da
RK
1647#endif
1648 va_list ap;
eb711c86 1649
e0e2a8da
RK
1650 VA_START (ap, s);
1651
1652#ifndef __STDC__
eb711c86
RK
1653 decl = va_arg (ap, tree);
1654 s = va_arg (ap, char *);
e0e2a8da
RK
1655#endif
1656
eb711c86
RK
1657 v_warning_with_decl (decl, s, ap);
1658 va_end (ap);
4291d9c8
RS
1659}
1660
1661/* Report a warning at the line number of the insn INSN.
4291d9c8
RS
1662 This is used only when INSN is an `asm' with operands,
1663 and each ASM_OPERANDS records its own source file and line. */
1664
eb711c86
RK
1665static void
1666v_warning_for_asm (insn, s, ap)
4291d9c8
RS
1667 rtx insn;
1668 char *s;
eb711c86 1669 va_list ap;
4291d9c8 1670{
eb711c86
RK
1671 if (count_error (1))
1672 {
1673 char *file;
1674 int line;
4291d9c8 1675
eb711c86
RK
1676 file_and_line_for_asm (insn, &file, &line);
1677 report_error_function (file);
1678 v_message_with_file_and_line (file, line, "warning", s, ap);
1679 }
1680}
4291d9c8 1681
eb711c86 1682void
e0e2a8da 1683warning_for_asm VPROTO((rtx insn, char *s, ...))
eb711c86 1684{
e0e2a8da 1685#ifndef __STDC__
eb711c86
RK
1686 rtx insn;
1687 char *s;
e0e2a8da
RK
1688#endif
1689 va_list ap;
1690
1691 VA_START (ap, s);
eb711c86 1692
e0e2a8da 1693#ifndef __STDC__
eb711c86
RK
1694 insn = va_arg (ap, rtx);
1695 s = va_arg (ap, char *);
e0e2a8da
RK
1696#endif
1697
eb711c86
RK
1698 v_warning_for_asm (insn, s, ap);
1699 va_end (ap);
1700}
4291d9c8 1701
eb711c86
RK
1702/* Report a warning at the current line number. */
1703
1704static void
1705vwarning (s, ap)
1706 char *s;
1707 va_list ap;
1708{
1709 v_warning_with_file_and_line (input_filename, lineno, s, ap);
4291d9c8 1710}
eb711c86
RK
1711
1712void
e0e2a8da 1713warning VPROTO((char *s, ...))
eb711c86 1714{
e0e2a8da 1715#ifndef __STDC__
eb711c86 1716 char *s;
e0e2a8da
RK
1717#endif
1718 va_list ap;
1719
1720 VA_START (ap, s);
eb711c86 1721
e0e2a8da 1722#ifndef __STDC__
eb711c86 1723 s = va_arg (ap, char *);
e0e2a8da
RK
1724#endif
1725
eb711c86
RK
1726 vwarning (s, ap);
1727 va_end (ap);
1728}
1729
4291d9c8
RS
1730/* These functions issue either warnings or errors depending on
1731 -pedantic-errors. */
1732
eb711c86
RK
1733static void
1734vpedwarn (s, ap)
4291d9c8 1735 char *s;
eb711c86 1736 va_list ap;
4291d9c8
RS
1737{
1738 if (flag_pedantic_errors)
eb711c86 1739 verror (s, ap);
4291d9c8 1740 else
eb711c86 1741 vwarning (s, ap);
4291d9c8
RS
1742}
1743
1744void
e0e2a8da 1745pedwarn VPROTO((char *s, ...))
eb711c86 1746{
e0e2a8da 1747#ifndef __STDC__
eb711c86 1748 char *s;
e0e2a8da
RK
1749#endif
1750 va_list ap;
1751
1752 VA_START (ap, s);
eb711c86 1753
e0e2a8da 1754#ifndef __STDC__
eb711c86 1755 s = va_arg (ap, char *);
e0e2a8da
RK
1756#endif
1757
eb711c86
RK
1758 vpedwarn (s, ap);
1759 va_end (ap);
1760}
1761
1762static void
1763v_pedwarn_with_decl (decl, s, ap)
4291d9c8
RS
1764 tree decl;
1765 char *s;
eb711c86 1766 va_list ap;
4291d9c8 1767{
1554cdf5
DE
1768 /* We don't want -pedantic-errors to cause the compilation to fail from
1769 "errors" in system header files. Sometimes fixincludes can't fix what's
1770 broken (eg: unsigned char bitfields - fixing it may change the alignment
1771 which will cause programs to mysteriously fail because the C library
22d74562
DE
1772 or kernel uses the original layout). There's no point in issuing a
1773 warning either, it's just unnecessary noise. */
1554cdf5 1774
22d74562
DE
1775 if (! DECL_IN_SYSTEM_HEADER (decl))
1776 {
1777 if (flag_pedantic_errors)
1778 v_error_with_decl (decl, s, ap);
1779 else
1780 v_warning_with_decl (decl, s, ap);
1781 }
4291d9c8
RS
1782}
1783
1784void
e0e2a8da 1785pedwarn_with_decl VPROTO((tree decl, char *s, ...))
eb711c86 1786{
e0e2a8da 1787#ifndef __STDC__
eb711c86
RK
1788 tree decl;
1789 char *s;
e0e2a8da
RK
1790#endif
1791 va_list ap;
eb711c86 1792
e0e2a8da
RK
1793 VA_START (ap, s);
1794
1795#ifndef __STDC__
eb711c86
RK
1796 decl = va_arg (ap, tree);
1797 s = va_arg (ap, char *);
e0e2a8da
RK
1798#endif
1799
eb711c86
RK
1800 v_pedwarn_with_decl (decl, s, ap);
1801 va_end (ap);
1802}
1803
1804static void
1805v_pedwarn_with_file_and_line (file, line, s, ap)
4291d9c8
RS
1806 char *file;
1807 int line;
1808 char *s;
eb711c86 1809 va_list ap;
4291d9c8
RS
1810{
1811 if (flag_pedantic_errors)
eb711c86 1812 v_error_with_file_and_line (file, line, s, ap);
4291d9c8 1813 else
eb711c86 1814 v_warning_with_file_and_line (file, line, s, ap);
4291d9c8
RS
1815}
1816
4291d9c8 1817void
e0e2a8da 1818pedwarn_with_file_and_line VPROTO((char *file, int line, char *s, ...))
eb711c86 1819{
e0e2a8da 1820#ifndef __STDC__
eb711c86
RK
1821 char *file;
1822 int line;
1823 char *s;
e0e2a8da
RK
1824#endif
1825 va_list ap;
eb711c86 1826
e0e2a8da
RK
1827 VA_START (ap, s);
1828
1829#ifndef __STDC__
eb711c86
RK
1830 file = va_arg (ap, char *);
1831 line = va_arg (ap, int);
1832 s = va_arg (ap, char *);
e0e2a8da
RK
1833#endif
1834
eb711c86
RK
1835 v_pedwarn_with_file_and_line (file, line, s, ap);
1836 va_end (ap);
1837}
1838
1839/* Apologize for not implementing some feature. */
1840
1841static void
1842vsorry (s, ap)
4291d9c8 1843 char *s;
eb711c86 1844 va_list ap;
4291d9c8
RS
1845{
1846 sorrycount++;
1847 if (input_filename)
1848 fprintf (stderr, "%s:%d: ", input_filename, lineno);
1849 else
1850 fprintf (stderr, "%s: ", progname);
eb711c86
RK
1851 vmessage ("sorry, not implemented", s, ap);
1852 fputc ('\n', stderr);
1853}
4291d9c8 1854
eb711c86 1855void
e0e2a8da 1856sorry VPROTO((char *s, ...))
eb711c86 1857{
e0e2a8da 1858#ifndef __STDC__
eb711c86 1859 char *s;
e0e2a8da
RK
1860#endif
1861 va_list ap;
1862
1863 VA_START (ap, s);
eb711c86 1864
e0e2a8da 1865#ifndef __STDC__
eb711c86 1866 s = va_arg (ap, char *);
e0e2a8da
RK
1867#endif
1868
eb711c86
RK
1869 vsorry (s, ap);
1870 va_end (ap);
4291d9c8
RS
1871}
1872
eb711c86 1873/* Apologize for not implementing some feature, then quit. */
4291d9c8 1874
eb711c86
RK
1875static void
1876v_really_sorry (s, ap)
4291d9c8 1877 char *s;
eb711c86 1878 va_list ap;
4291d9c8 1879{
eb711c86 1880 sorrycount++;
4291d9c8
RS
1881 if (input_filename)
1882 fprintf (stderr, "%s:%d: ", input_filename, lineno);
1883 else
c10afc44 1884 fprintf (stderr, "%s: ", progname);
eb711c86 1885 vmessage ("sorry, not implemented", s, ap);
4291d9c8
RS
1886 fatal (" (fatal)\n");
1887}
eb711c86
RK
1888
1889void
e0e2a8da 1890really_sorry VPROTO((char *s, ...))
eb711c86 1891{
e0e2a8da 1892#ifndef __STDC__
eb711c86 1893 char *s;
e0e2a8da
RK
1894#endif
1895 va_list ap;
1896
1897 VA_START (ap, s);
eb711c86 1898
e0e2a8da 1899#ifndef __STDC__
eb711c86 1900 s = va_arg (ap, char *);
e0e2a8da
RK
1901#endif
1902
eb711c86
RK
1903 v_really_sorry (s, ap);
1904 va_end (ap);
1905}
4291d9c8
RS
1906\f
1907/* More 'friendly' abort that prints the line and file.
1908 config.h can #define abort fancy_abort if you like that sort of thing.
1909
1910 I don't think this is actually a good idea.
1911 Other sorts of crashes will look a certain way.
1912 It is a good thing if crashes from calling abort look the same way.
1913 -- RMS */
1914
1915void
1916fancy_abort ()
1917{
1918 fatal ("internal gcc abort");
1919}
1920
1921/* This calls abort and is used to avoid problems when abort if a macro.
1922 It is used when we need to pass the address of abort. */
1923
1924void
1925do_abort ()
1926{
1927 abort ();
1928}
1929
1930/* When `malloc.c' is compiled with `rcheck' defined,
1931 it calls this function to report clobberage. */
1932
1933void
1934botch (s)
1935{
1936 abort ();
1937}
1938
1939/* Same as `malloc' but report error if no memory available. */
1940
4b980e20 1941char *
4291d9c8
RS
1942xmalloc (size)
1943 unsigned size;
1944{
4b980e20 1945 register char *value = (char *) malloc (size);
809d135d 1946 if (value == 0 && size != 0)
4291d9c8
RS
1947 fatal ("virtual memory exhausted");
1948 return value;
1949}
1950
e9a25f70
JL
1951/* Same as `realloc' but report error if no memory available.
1952 Also handle null PTR even if the vendor realloc gets it wrong. */
4291d9c8 1953
4b980e20 1954char *
4291d9c8
RS
1955xrealloc (ptr, size)
1956 char *ptr;
1957 int size;
1958{
e9a25f70
JL
1959 char *result = (ptr
1960 ? (char *) realloc (ptr, size)
1961 : (char *) malloc (size));
4291d9c8
RS
1962 if (!result)
1963 fatal ("virtual memory exhausted");
1964 return result;
1965}
3e386b9e
RK
1966
1967/* Same as `strdup' but report error if no memory available. */
1968
1969char *
1970xstrdup (s)
1971 register char *s;
1972{
1973 register char *result = (char *) malloc (strlen (s) + 1);
1974
1975 if (! result)
1976 fatal ("virtual memory exhausted");
1977 strcpy (result, s);
1978 return result;
1979}
4291d9c8
RS
1980\f
1981/* Return the logarithm of X, base 2, considering X unsigned,
37366632
RK
1982 if X is a power of 2. Otherwise, returns -1.
1983
1984 This should be used via the `exact_log2' macro. */
4291d9c8
RS
1985
1986int
37366632
RK
1987exact_log2_wide (x)
1988 register unsigned HOST_WIDE_INT x;
4291d9c8
RS
1989{
1990 register int log = 0;
1991 /* Test for 0 or a power of 2. */
1992 if (x == 0 || x != (x & -x))
1993 return -1;
1994 while ((x >>= 1) != 0)
1995 log++;
1996 return log;
1997}
1998
1999/* Given X, an unsigned number, return the largest int Y such that 2**Y <= X.
37366632
RK
2000 If X is 0, return -1.
2001
2002 This should be used via the floor_log2 macro. */
4291d9c8
RS
2003
2004int
37366632
RK
2005floor_log2_wide (x)
2006 register unsigned HOST_WIDE_INT x;
4291d9c8
RS
2007{
2008 register int log = -1;
2009 while (x != 0)
2010 log++,
2011 x >>= 1;
2012 return log;
2013}
2014
3bbfa296 2015static int float_handler_set;
4291d9c8
RS
2016int float_handled;
2017jmp_buf float_handler;
2018
3bbfa296
RK
2019/* Signals actually come here. */
2020
2021static void
2022float_signal (signo)
2023 /* If this is missing, some compilers complain. */
2024 int signo;
2025{
2026 if (float_handled == 0)
2027 abort ();
2028#if defined (USG) || defined (hpux)
2029 signal (SIGFPE, float_signal); /* re-enable the signal catcher */
2030#endif
2031 float_handled = 0;
2032 signal (SIGFPE, float_signal);
2033 longjmp (float_handler, 1);
2034}
2035
4291d9c8
RS
2036/* Specify where to longjmp to when a floating arithmetic error happens.
2037 If HANDLER is 0, it means don't handle the errors any more. */
2038
2039void
2040set_float_handler (handler)
2041 jmp_buf handler;
2042{
2043 float_handled = (handler != 0);
2044 if (handler)
4c9a05bc 2045 bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
3bbfa296
RK
2046
2047 if (float_handled && ! float_handler_set)
2048 {
2049 signal (SIGFPE, float_signal);
2050 float_handler_set = 1;
2051 }
4291d9c8
RS
2052}
2053
bff4b641
RS
2054/* Specify, in HANDLER, where to longjmp to when a floating arithmetic
2055 error happens, pushing the previous specification into OLD_HANDLER.
2056 Return an indication of whether there was a previous handler in effect. */
2057
2058int
2059push_float_handler (handler, old_handler)
dc2b15dc 2060 jmp_buf handler, old_handler;
bff4b641
RS
2061{
2062 int was_handled = float_handled;
2063
2064 float_handled = 1;
2065 if (was_handled)
4c9a05bc
RK
2066 bcopy ((char *) float_handler, (char *) old_handler,
2067 sizeof (float_handler));
2068
2069 bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
bff4b641
RS
2070 return was_handled;
2071}
2072
2073/* Restore the previous specification of whether and where to longjmp to
2074 when a floating arithmetic error happens. */
2075
2076void
2077pop_float_handler (handled, handler)
2078 int handled;
2079 jmp_buf handler;
2080{
2081 float_handled = handled;
2082 if (handled)
4c9a05bc 2083 bcopy ((char *) handler, (char *) float_handler, sizeof (float_handler));
bff4b641
RS
2084}
2085
4291d9c8
RS
2086/* Handler for SIGPIPE. */
2087
2088static void
2089pipe_closed (signo)
2090 /* If this is missing, some compilers complain. */
2091 int signo;
2092{
2093 fatal ("output pipe has been closed");
2094}
2095
2096/* Strip off a legitimate source ending from the input string NAME of
c62bdc79
RK
2097 length LEN. Rather than having to know the names used by all of
2098 our front ends, we strip off an ending of a period followed by one,
2099 two, or three characters. */
4291d9c8
RS
2100
2101void
2102strip_off_ending (name, len)
2103 char *name;
2104 int len;
2105{
c62bdc79
RK
2106 if (len > 2 && name[len - 2] == '.')
2107 name[len - 2] = '\0';
2108 else if (len > 3 && name[len - 3] == '.')
2109 name[len - 3] = '\0';
2110 else if (len > 4 && name[len - 4] == '.')
2111 name[len - 4] = '\0';
4291d9c8
RS
2112}
2113
7dce5088 2114/* Output a quoted string. */
0f41302f 2115
7dce5088
PE
2116void
2117output_quoted_string (asm_file, string)
2118 FILE *asm_file;
2119 char *string;
2120{
e9a25f70
JL
2121#ifdef OUTPUT_QUOTED_STRING
2122 OUTPUT_QUOTED_STRING (asm_file, string);
2123#else
7dce5088
PE
2124 char c;
2125
2126 putc ('\"', asm_file);
2127 while ((c = *string++) != 0)
2128 {
2129 if (c == '\"' || c == '\\')
2130 putc ('\\', asm_file);
2131 putc (c, asm_file);
2132 }
2133 putc ('\"', asm_file);
e9a25f70 2134#endif
7dce5088
PE
2135}
2136
4291d9c8
RS
2137/* Output a file name in the form wanted by System V. */
2138
2139void
2140output_file_directive (asm_file, input_name)
2141 FILE *asm_file;
2142 char *input_name;
2143{
2144 int len = strlen (input_name);
2145 char *na = input_name + len;
2146
2147 /* NA gets INPUT_NAME sans directory names. */
2148 while (na > input_name)
2149 {
2150 if (na[-1] == '/')
2151 break;
2152 na--;
2153 }
2154
2155#ifdef ASM_OUTPUT_MAIN_SOURCE_FILENAME
2156 ASM_OUTPUT_MAIN_SOURCE_FILENAME (asm_file, na);
2157#else
2158#ifdef ASM_OUTPUT_SOURCE_FILENAME
2159 ASM_OUTPUT_SOURCE_FILENAME (asm_file, na);
2160#else
7dce5088
PE
2161 fprintf (asm_file, "\t.file\t");
2162 output_quoted_string (asm_file, na);
2163 fputc ('\n', asm_file);
4291d9c8
RS
2164#endif
2165#endif
2166}
2167\f
0f41302f
MS
2168/* Routine to build language identifier for object file. */
2169
d0d4af87
MS
2170static void
2171output_lang_identify (asm_out_file)
2172 FILE *asm_out_file;
2173{
2174 int len = strlen (lang_identify ()) + sizeof ("__gnu_compiled_") + 1;
2175 char *s = (char *) alloca (len);
2176 sprintf (s, "__gnu_compiled_%s", lang_identify ());
2177 ASM_OUTPUT_LABEL (asm_out_file, s);
2178}
2179
dfe1a916 2180/* Routine to open a dump file. */
0f41302f 2181
dfe1a916
DE
2182static FILE *
2183open_dump_file (base_name, suffix)
2184 char *base_name;
2185 char *suffix;
2186{
2187 FILE *f;
2188 char *dumpname = (char *) alloca (strlen (base_name) + strlen (suffix) + 1);
2189
2190 strcpy (dumpname, base_name);
2191 strcat (dumpname, suffix);
2192 f = fopen (dumpname, "w");
2193 if (f == 0)
2194 pfatal_with_name (dumpname);
2195 return f;
2196}
2197
4291d9c8
RS
2198/* Compile an entire file of output from cpp, named NAME.
2199 Write a file of assembly output and various debugging dumps. */
2200
2201static void
2202compile_file (name)
2203 char *name;
2204{
2205 tree globals;
2206 int start_time;
4291d9c8
RS
2207
2208 int name_specified = name != 0;
2209
2210 if (dump_base_name == 0)
2211 dump_base_name = name ? name : "gccdump";
4291d9c8
RS
2212
2213 parse_time = 0;
2214 varconst_time = 0;
2215 integration_time = 0;
2216 jump_time = 0;
2217 cse_time = 0;
2218 loop_time = 0;
2219 cse2_time = 0;
0d332add 2220 branch_prob_time = 0;
4291d9c8
RS
2221 flow_time = 0;
2222 combine_time = 0;
8c660648 2223 regmove_time = 0;
4291d9c8
RS
2224 sched_time = 0;
2225 local_alloc_time = 0;
2226 global_alloc_time = 0;
2227 sched2_time = 0;
2228 dbr_sched_time = 0;
2229 shorten_branch_time = 0;
2230 stack_reg_time = 0;
2231 final_time = 0;
2232 symout_time = 0;
2233 dump_time = 0;
2234
e3d1fd32 2235#if !USE_CPPLIB
4291d9c8
RS
2236 /* Open input file. */
2237
2238 if (name == 0 || !strcmp (name, "-"))
2239 {
2240 finput = stdin;
2241 name = "stdin";
2242 }
2243 else
2244 finput = fopen (name, "r");
2245 if (finput == 0)
2246 pfatal_with_name (name);
2247
282ea52a 2248#ifdef IO_BUFFER_SIZE
d7cedf4b 2249 setvbuf (finput, (char *) xmalloc (IO_BUFFER_SIZE), _IOFBF, IO_BUFFER_SIZE);
282ea52a 2250#endif
e3d1fd32 2251#endif /* !USE_CPPLIB */
282ea52a 2252
4291d9c8
RS
2253 /* Initialize data in various passes. */
2254
2255 init_obstacks ();
2256 init_tree_codes ();
e3d1fd32
PB
2257#if USE_CPPLIB
2258 init_parse (name);
2259#else
4291d9c8 2260 init_lex ();
e3d1fd32 2261#endif
ca695ac9
JB
2262 /* Some of these really don't need to be called when generating bytecode,
2263 but the options would have to be parsed first to know that. -bson */
4291d9c8
RS
2264 init_rtl ();
2265 init_emit_once (debug_info_level == DINFO_LEVEL_NORMAL
0d332add
DE
2266 || debug_info_level == DINFO_LEVEL_VERBOSE
2267 || flag_test_coverage);
7f21d440 2268 init_regs ();
4291d9c8
RS
2269 init_decl_processing ();
2270 init_optabs ();
2271 init_stmt ();
2272 init_expmed ();
4fa52007 2273 init_expr_once ();
4291d9c8
RS
2274 init_loop ();
2275 init_reload ();
6e73e666 2276 init_alias_once ();
4291d9c8
RS
2277
2278 if (flag_caller_saves)
2279 init_caller_save ();
2280
f246a305
RS
2281 /* If auxiliary info generation is desired, open the output file.
2282 This goes in the same directory as the source file--unlike
2283 all the other output files. */
4291d9c8
RS
2284 if (flag_gen_aux_info)
2285 {
4291d9c8
RS
2286 aux_info_file = fopen (aux_info_file_name, "w");
2287 if (aux_info_file == 0)
2288 pfatal_with_name (aux_info_file_name);
2289 }
2290
2291 /* If rtl dump desired, open the output file. */
2292 if (rtl_dump)
dfe1a916 2293 rtl_dump_file = open_dump_file (dump_base_name, ".rtl");
4291d9c8
RS
2294
2295 /* If jump_opt dump desired, open the output file. */
2296 if (jump_opt_dump)
dfe1a916 2297 jump_opt_dump_file = open_dump_file (dump_base_name, ".jump");
4291d9c8 2298
e9a25f70
JL
2299 /* If addressof dump desired, open the output file. */
2300 if (addressof_dump)
2301 addressof_dump_file = open_dump_file (dump_base_name, ".addressof");
2302
4291d9c8
RS
2303 /* If cse dump desired, open the output file. */
2304 if (cse_dump)
dfe1a916 2305 cse_dump_file = open_dump_file (dump_base_name, ".cse");
4291d9c8
RS
2306
2307 /* If loop dump desired, open the output file. */
2308 if (loop_dump)
dfe1a916 2309 loop_dump_file = open_dump_file (dump_base_name, ".loop");
4291d9c8
RS
2310
2311 /* If cse2 dump desired, open the output file. */
2312 if (cse2_dump)
dfe1a916 2313 cse2_dump_file = open_dump_file (dump_base_name, ".cse2");
4291d9c8 2314
0d332add
DE
2315 /* If branch_prob dump desired, open the output file. */
2316 if (branch_prob_dump)
2317 branch_prob_dump_file = open_dump_file (dump_base_name, ".bp");
2318
4291d9c8
RS
2319 /* If flow dump desired, open the output file. */
2320 if (flow_dump)
dfe1a916 2321 flow_dump_file = open_dump_file (dump_base_name, ".flow");
4291d9c8
RS
2322
2323 /* If combine dump desired, open the output file. */
2324 if (combine_dump)
dfe1a916 2325 combine_dump_file = open_dump_file (dump_base_name, ".combine");
4291d9c8 2326
8c660648
JL
2327 /* If regmove dump desired, open the output file. */
2328 if (regmove_dump)
2329 regmove_dump_file = open_dump_file (dump_base_name, ".regmove");
2330
4291d9c8
RS
2331 /* If scheduling dump desired, open the output file. */
2332 if (sched_dump)
dfe1a916 2333 sched_dump_file = open_dump_file (dump_base_name, ".sched");
4291d9c8
RS
2334
2335 /* If local_reg dump desired, open the output file. */
2336 if (local_reg_dump)
dfe1a916 2337 local_reg_dump_file = open_dump_file (dump_base_name, ".lreg");
4291d9c8
RS
2338
2339 /* If global_reg dump desired, open the output file. */
2340 if (global_reg_dump)
dfe1a916 2341 global_reg_dump_file = open_dump_file (dump_base_name, ".greg");
4291d9c8
RS
2342
2343 /* If 2nd scheduling dump desired, open the output file. */
2344 if (sched2_dump)
dfe1a916 2345 sched2_dump_file = open_dump_file (dump_base_name, ".sched2");
4291d9c8
RS
2346
2347 /* If jump2_opt dump desired, open the output file. */
2348 if (jump2_opt_dump)
dfe1a916 2349 jump2_opt_dump_file = open_dump_file (dump_base_name, ".jump2");
4291d9c8
RS
2350
2351 /* If dbr_sched dump desired, open the output file. */
2352 if (dbr_sched_dump)
dfe1a916 2353 dbr_sched_dump_file = open_dump_file (dump_base_name, ".dbr");
4291d9c8
RS
2354
2355#ifdef STACK_REGS
2356
2357 /* If stack_reg dump desired, open the output file. */
2358 if (stack_reg_dump)
dfe1a916 2359 stack_reg_dump_file = open_dump_file (dump_base_name, ".stack");
4291d9c8
RS
2360
2361#endif
2362
2363 /* Open assembler code output file. */
2364
2365 if (! name_specified && asm_file_name == 0)
2366 asm_out_file = stdout;
2367 else
2368 {
4291d9c8 2369 int len = strlen (dump_base_name);
dfe1a916 2370 register char *dumpname = (char *) xmalloc (len + 6);
4291d9c8
RS
2371 strcpy (dumpname, dump_base_name);
2372 strip_off_ending (dumpname, len);
2373 strcat (dumpname, ".s");
2374 if (asm_file_name == 0)
2375 {
2376 asm_file_name = (char *) xmalloc (strlen (dumpname) + 1);
2377 strcpy (asm_file_name, dumpname);
2378 }
2379 if (!strcmp (asm_file_name, "-"))
2380 asm_out_file = stdout;
2381 else
2382 asm_out_file = fopen (asm_file_name, "w");
2383 if (asm_out_file == 0)
2384 pfatal_with_name (asm_file_name);
2385 }
2386
f246a305 2387#ifdef IO_BUFFER_SIZE
d7cedf4b
RS
2388 setvbuf (asm_out_file, (char *) xmalloc (IO_BUFFER_SIZE),
2389 _IOFBF, IO_BUFFER_SIZE);
f246a305
RS
2390#endif
2391
4291d9c8
RS
2392 input_filename = name;
2393
18736654
RK
2394 /* Put an entry on the input file stack for the main input file. */
2395 input_file_stack
2396 = (struct file_stack *) xmalloc (sizeof (struct file_stack));
2397 input_file_stack->next = 0;
2398 input_file_stack->name = input_filename;
2399
56bf1fd9
JL
2400 /* Gross. Gross. lang_init is (I think) the first callback into
2401 the language front end, and is thus the first opportunity to
2402 have the selected language override the default value for any
2403 -f option.
2404
2405 So the default value for flag_exceptions is 2 (uninitialized).
2406 If we encounter -fno-exceptions or -fexceptions, then flag_exceptions
2407 will be set to zero or one respectively.
2408
2409 flag_exceptions can also be set by lang_init to something other
2410 than the default "uninitialized" value of 2.
2411
2412 After lang_init, if the value is still 2, then we default to
2413 -fno-exceptions (value will be reset to zero).
2414
2415 When our EH mechanism is low enough overhead that we can enable
2416 it by default for languages other than C++, then all this braindamage
2417 will go away. */
2418
4291d9c8
RS
2419 /* Perform language-specific initialization.
2420 This may set main_input_filename. */
2421 lang_init ();
2422
56bf1fd9
JL
2423 if (flag_exceptions == 2)
2424 flag_exceptions = 0;
2425
4291d9c8
RS
2426 /* If the input doesn't start with a #line, use the input name
2427 as the official input file name. */
2428 if (main_input_filename == 0)
2429 main_input_filename = name;
2430
ca695ac9
JB
2431 if (!output_bytecode)
2432 {
2433 ASM_FILE_START (asm_out_file);
3d5cdd42
DE
2434
2435#ifdef ASM_COMMENT_START
2436 if (flag_verbose_asm)
2437 {
2438 /* Print the list of options in effect. */
3d5cdd42
DE
2439 print_version (asm_out_file, ASM_COMMENT_START);
2440 print_switch_values (asm_out_file, 0, MAX_LINE,
2441 ASM_COMMENT_START, " ", "\n");
2442 /* Add a blank line here so it appears in assembler output but not
2443 screen output. */
2444 fprintf (asm_out_file, "\n");
2445 }
2446#endif
ca695ac9 2447 }
4291d9c8 2448
ca695ac9 2449 /* Output something to inform GDB that this compilation was by GCC. Also
0f41302f 2450 serves to tell GDB file consists of bytecodes. */
ca695ac9
JB
2451 if (output_bytecode)
2452 fprintf (asm_out_file, "bc_gcc2_compiled.:\n");
2453 else
2454 {
4291d9c8 2455#ifndef ASM_IDENTIFY_GCC
ca695ac9 2456 fprintf (asm_out_file, "gcc2_compiled.:\n");
4291d9c8 2457#else
ca695ac9 2458 ASM_IDENTIFY_GCC (asm_out_file);
4291d9c8 2459#endif
ca695ac9 2460 }
d0d4af87 2461
0f41302f 2462 /* Output something to identify which front-end produced this file. */
d0d4af87
MS
2463#ifdef ASM_IDENTIFY_LANGUAGE
2464 ASM_IDENTIFY_LANGUAGE (asm_out_file);
2465#endif
2466
cf440348
JL
2467#ifndef ASM_OUTPUT_SECTION_NAME
2468 if (flag_function_sections)
2469 {
2470 warning ("-ffunction-sections not supported for this target.");
2471 flag_function_sections = 0;
2472 }
2473#endif
2474
2475 if (flag_function_sections
2476 && (profile_flag || profile_block_flag))
2477 {
2478 warning ("-ffunction-sections disabled; it makes profiling impossible.");
2479 flag_function_sections = 0;
2480 }
2481
2482 if (flag_function_sections && write_symbols != NO_DEBUG)
2483 warning ("-ffunction-sections may affect debugging on some targets.");
2484
ca695ac9
JB
2485 if (output_bytecode)
2486 {
2487 if (profile_flag || profile_block_flag)
2488 error ("profiling not supported in bytecode compilation");
2489 }
2490 else
2491 {
2492 /* ??? Note: There used to be a conditional here
2493 to call assemble_zeros without fail if DBX_DEBUGGING_INFO is defined.
2494 This was to guarantee separation between gcc_compiled. and
2495 the first function, for the sake of dbx on Suns.
2496 However, having the extra zero here confused the Emacs
2497 code for unexec, and might confuse other programs too.
2498 Therefore, I took out that change.
2499 In future versions we should find another way to solve
2500 that dbx problem. -- rms, 23 May 93. */
2501
2502 /* Don't let the first function fall at the same address
2503 as gcc_compiled., if profiling. */
2504 if (profile_flag || profile_block_flag)
2505 assemble_zeros (UNITS_PER_WORD);
2506 }
4291d9c8
RS
2507
2508 /* If dbx symbol table desired, initialize writing it
2509 and output the predefined types. */
f246a305
RS
2510#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2511 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
4291d9c8
RS
2512 TIMEVAR (symout_time, dbxout_init (asm_out_file, main_input_filename,
2513 getdecls ()));
2514#endif
2515#ifdef SDB_DEBUGGING_INFO
2516 if (write_symbols == SDB_DEBUG)
2517 TIMEVAR (symout_time, sdbout_init (asm_out_file, main_input_filename,
2518 getdecls ()));
2519#endif
2520#ifdef DWARF_DEBUGGING_INFO
2521 if (write_symbols == DWARF_DEBUG)
2522 TIMEVAR (symout_time, dwarfout_init (asm_out_file, main_input_filename));
2523#endif
0021b564
JM
2524#ifdef DWARF2_UNWIND_INFO
2525 if (dwarf2out_do_frame ())
2526 dwarf2out_frame_init ();
2527#endif
9a666dda
JM
2528#ifdef DWARF2_DEBUGGING_INFO
2529 if (write_symbols == DWARF2_DEBUG)
2530 TIMEVAR (symout_time, dwarf2out_init (asm_out_file, main_input_filename));
2531#endif
4291d9c8
RS
2532
2533 /* Initialize yet another pass. */
2534
ca695ac9
JB
2535 if (!output_bytecode)
2536 init_final (main_input_filename);
0d332add 2537 init_branch_prob (dump_base_name);
4291d9c8
RS
2538
2539 start_time = get_run_time ();
2540
2541 /* Call the parser, which parses the entire file
2542 (calling rest_of_compilation for each function). */
2543
2544 if (yyparse () != 0)
453dfc78
JW
2545 {
2546 if (errorcount == 0)
2547 fprintf (stderr, "Errors detected in input file (your bison.simple is out of date)");
2548
2549 /* In case there were missing closebraces,
2550 get us back to the global binding level. */
2551 while (! global_bindings_p ())
2552 poplevel (0, 0, 0);
2553 }
4291d9c8 2554
0d332add
DE
2555 output_func_start_profiler ();
2556
4291d9c8
RS
2557 /* Compilation is now finished except for writing
2558 what's left of the symbol table output. */
2559
2560 parse_time += get_run_time () - start_time;
2561
2562 parse_time -= integration_time;
2563 parse_time -= varconst_time;
2564
2565 globals = getdecls ();
2566
2567 /* Really define vars that have had only a tentative definition.
2568 Really output inline functions that must actually be callable
2569 and have not been output so far. */
2570
2571 {
2572 int len = list_length (globals);
2573 tree *vec = (tree *) alloca (sizeof (tree) * len);
2574 int i;
2575 tree decl;
2b6c54d6 2576 int reconsider = 1;
4291d9c8
RS
2577
2578 /* Process the decls in reverse order--earliest first.
2579 Put them into VEC from back to front, then take out from front. */
2580
2581 for (i = 0, decl = globals; i < len; i++, decl = TREE_CHAIN (decl))
2582 vec[len - i - 1] = decl;
2583
2584 for (i = 0; i < len; i++)
2585 {
2586 decl = vec[i];
07af9d16
JM
2587
2588 /* We're not deferring this any longer. */
2589 DECL_DEFER_OUTPUT (decl) = 0;
2590
488b1f4f
RS
2591 if (TREE_CODE (decl) == VAR_DECL && DECL_SIZE (decl) == 0
2592 && incomplete_decl_finalize_hook != 0)
2b599527 2593 (*incomplete_decl_finalize_hook) (decl);
2b6c54d6 2594 }
2b599527 2595
2b6c54d6
JM
2596 /* Now emit any global variables or functions that we have been putting
2597 off. We need to loop in case one of the things emitted here
2598 references another one which comes earlier in the list. */
2599 while (reconsider)
2600 {
2601 reconsider = 0;
2602 for (i = 0; i < len; i++)
4291d9c8 2603 {
2b6c54d6
JM
2604 decl = vec[i];
2605
2606 if (TREE_ASM_WRITTEN (decl) || DECL_EXTERNAL (decl))
2607 continue;
2608
6b2bd61e
PB
2609 /* Don't write out static consts, unless we still need them.
2610
fbe912dd
BK
2611 We also keep static consts if not optimizing (for debugging),
2612 unless the user specified -fno-keep-static-consts.
6b2bd61e
PB
2613 ??? They might be better written into the debug information.
2614 This is possible when using DWARF.
2615
2616 A language processor that wants static constants to be always
2617 written out (even if it is not used) is responsible for
2618 calling rest_of_decl_compilation itself. E.g. the C front-end
2619 calls rest_of_decl_compilation from finish_decl.
2620 One motivation for this is that is conventional in some
2621 environments to write things like:
2622 static const char rcsid[] = "... version string ...";
2623 intending to force the string to be in the executable.
2624
2625 A language processor that would prefer to have unneeded
2626 static constants "optimized away" would just defer writing
2627 them out until here. E.g. C++ does this, because static
2628 constants are often defined in header files.
2629
2630 ??? A tempting alternative (for both C and C++) would be
2631 to force a constant to be written if and only if it is
0f41302f 2632 defined in a main file, as opposed to an include file. */
6b2bd61e 2633
2b6c54d6
JM
2634 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2635 && (! TREE_READONLY (decl)
2636 || TREE_PUBLIC (decl)
fbe912dd 2637 || (!optimize && flag_keep_static_consts)
2b6c54d6
JM
2638 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2639 {
2640 reconsider = 1;
2641 rest_of_decl_compilation (decl, NULL_PTR, 1, 1);
2642 }
2643
2644 if (TREE_CODE (decl) == FUNCTION_DECL
2645 && DECL_INITIAL (decl) != 0
2646 && DECL_SAVED_INSNS (decl) != 0
2647 && (flag_keep_inline_functions
2f8844a8 2648 || TREE_PUBLIC (decl)
2b6c54d6
JM
2649 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))))
2650 {
2651 reconsider = 1;
2652 temporary_allocation ();
2653 output_inline_function (decl);
2654 permanent_allocation (1);
2655 }
4291d9c8 2656 }
2b6c54d6 2657 }
4291d9c8 2658
3d195391
MS
2659 /* Now that all possible functions have been output, we can dump
2660 the exception table. */
2661
0021b564 2662 output_exception_table ();
3d195391 2663
2b6c54d6
JM
2664 for (i = 0; i < len; i++)
2665 {
2666 decl = vec[i];
2667
2668 if (TREE_CODE (decl) == VAR_DECL && TREE_STATIC (decl)
2669 && ! TREE_ASM_WRITTEN (decl))
2670 /* Cancel the RTL for this decl so that, if debugging info
2671 output for global variables is still to come,
2672 this one will be omitted. */
2673 DECL_RTL (decl) = NULL;
4291d9c8 2674
ac266247
RS
2675 /* Warn about any function
2676 declared static but not defined.
2677 We don't warn about variables,
2678 because many programs have static variables
2679 that exist only to get some text into the object file. */
8c461ea1
JM
2680 if (TREE_CODE (decl) == FUNCTION_DECL
2681 && (warn_unused
2682 || TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
4291d9c8 2683 && DECL_INITIAL (decl) == 0
216d5cdd 2684 && DECL_EXTERNAL (decl)
d1b01681 2685 && ! DECL_ARTIFICIAL (decl)
4291d9c8 2686 && ! TREE_PUBLIC (decl))
7d429c41 2687 {
8c461ea1 2688 pedwarn_with_decl (decl,
7d429c41
RS
2689 "`%s' declared `static' but never defined");
2690 /* This symbol is effectively an "extern" declaration now. */
2691 TREE_PUBLIC (decl) = 1;
2692 assemble_external (decl);
7d429c41 2693 }
8c461ea1 2694
4291d9c8 2695 /* Warn about static fns or vars defined but not used,
7062b881
PB
2696 but not about inline functions or static consts
2697 since defining those in header files is normal practice. */
4291d9c8 2698 if (warn_unused
7062b881
PB
2699 && ((TREE_CODE (decl) == FUNCTION_DECL && ! DECL_INLINE (decl))
2700 || (TREE_CODE (decl) == VAR_DECL && ! TREE_READONLY (decl)))
0c20aabf 2701 && ! DECL_IN_SYSTEM_HEADER (decl)
216d5cdd 2702 && ! DECL_EXTERNAL (decl)
4291d9c8
RS
2703 && ! TREE_PUBLIC (decl)
2704 && ! TREE_USED (decl)
f843649d 2705 && (TREE_CODE (decl) == FUNCTION_DECL || ! DECL_REGISTER (decl))
4291d9c8
RS
2706 /* The TREE_USED bit for file-scope decls
2707 is kept in the identifier, to handle multiple
2708 external decls in different scopes. */
2709 && ! TREE_USED (DECL_NAME (decl)))
2710 warning_with_decl (decl, "`%s' defined but not used");
2711
2712#ifdef SDB_DEBUGGING_INFO
2713 /* The COFF linker can move initialized global vars to the end.
2714 And that can screw up the symbol ordering.
2715 By putting the symbols in that order to begin with,
2716 we avoid a problem. mcsun!unido!fauern!tumuc!pes@uunet.uu.net. */
2717 if (write_symbols == SDB_DEBUG && TREE_CODE (decl) == VAR_DECL
2718 && TREE_PUBLIC (decl) && DECL_INITIAL (decl)
7efad3f7 2719 && ! DECL_EXTERNAL (decl)
4291d9c8
RS
2720 && DECL_RTL (decl) != 0)
2721 TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2722
2723 /* Output COFF information for non-global
0f41302f 2724 file-scope initialized variables. */
4291d9c8
RS
2725 if (write_symbols == SDB_DEBUG
2726 && TREE_CODE (decl) == VAR_DECL
2727 && DECL_INITIAL (decl)
7efad3f7 2728 && ! DECL_EXTERNAL (decl)
4291d9c8
RS
2729 && DECL_RTL (decl) != 0
2730 && GET_CODE (DECL_RTL (decl)) == MEM)
2731 TIMEVAR (symout_time, sdbout_toplevel_data (decl));
2732#endif /* SDB_DEBUGGING_INFO */
2733#ifdef DWARF_DEBUGGING_INFO
6dc42e49 2734 /* Output DWARF information for file-scope tentative data object
4291d9c8
RS
2735 declarations, file-scope (extern) function declarations (which
2736 had no corresponding body) and file-scope tagged type declarations
2737 and definitions which have not yet been forced out. */
2738
2739 if (write_symbols == DWARF_DEBUG
2740 && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
2741 TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 1));
9a666dda
JM
2742#endif
2743#ifdef DWARF2_DEBUGGING_INFO
2744 /* Output DWARF2 information for file-scope tentative data object
2745 declarations, file-scope (extern) function declarations (which
2746 had no corresponding body) and file-scope tagged type declarations
2747 and definitions which have not yet been forced out. */
2748
2749 if (write_symbols == DWARF2_DEBUG
2750 && (TREE_CODE (decl) != FUNCTION_DECL || !DECL_INITIAL (decl)))
88dad228 2751 TIMEVAR (symout_time, dwarf2out_decl (decl));
4291d9c8
RS
2752#endif
2753 }
2754 }
2755
4b8af8d9
JM
2756 /* Write out any pending weak symbol declarations. */
2757
2758 weak_finish ();
2759
4291d9c8 2760 /* Do dbx symbols */
f246a305
RS
2761#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2762 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
4291d9c8
RS
2763 TIMEVAR (symout_time,
2764 {
2765 dbxout_finish (asm_out_file, main_input_filename);
2766 });
2767#endif
2768
2769#ifdef DWARF_DEBUGGING_INFO
2770 if (write_symbols == DWARF_DEBUG)
2771 TIMEVAR (symout_time,
2772 {
2773 dwarfout_finish ();
2774 });
2775#endif
2776
0021b564
JM
2777#ifdef DWARF2_UNWIND_INFO
2778 if (dwarf2out_do_frame ())
2779 dwarf2out_frame_finish ();
2780#endif
2781
9a666dda
JM
2782#ifdef DWARF2_DEBUGGING_INFO
2783 if (write_symbols == DWARF2_DEBUG)
2784 TIMEVAR (symout_time,
2785 {
2786 dwarf2out_finish ();
2787 });
2788#endif
2789
4291d9c8
RS
2790 /* Output some stuff at end of file if nec. */
2791
ca695ac9
JB
2792 if (!output_bytecode)
2793 {
0d332add
DE
2794 end_final (dump_base_name);
2795 end_branch_prob (branch_prob_dump_file);
4291d9c8
RS
2796
2797#ifdef ASM_FILE_END
ca695ac9 2798 ASM_FILE_END (asm_out_file);
4291d9c8 2799#endif
ca695ac9 2800 }
4291d9c8 2801
4291d9c8
RS
2802 /* Language-specific end of compilation actions. */
2803
2804 lang_finish ();
2805
0207ea82
RK
2806 if (output_bytecode)
2807 bc_write_file (asm_out_file);
2808
4291d9c8
RS
2809 /* Close the dump files. */
2810
2811 if (flag_gen_aux_info)
2812 {
2813 fclose (aux_info_file);
2814 if (errorcount)
2815 unlink (aux_info_file_name);
2816 }
2817
2818 if (rtl_dump)
2819 fclose (rtl_dump_file);
2820
2821 if (jump_opt_dump)
2822 fclose (jump_opt_dump_file);
2823
e9a25f70
JL
2824 if (addressof_dump)
2825 fclose (addressof_dump_file);
2826
4291d9c8
RS
2827 if (cse_dump)
2828 fclose (cse_dump_file);
2829
2830 if (loop_dump)
2831 fclose (loop_dump_file);
2832
2833 if (cse2_dump)
2834 fclose (cse2_dump_file);
2835
0d332add
DE
2836 if (branch_prob_dump)
2837 fclose (branch_prob_dump_file);
2838
4291d9c8
RS
2839 if (flow_dump)
2840 fclose (flow_dump_file);
2841
2842 if (combine_dump)
2843 {
2844 dump_combine_total_stats (combine_dump_file);
2845 fclose (combine_dump_file);
2846 }
2847
8c660648
JL
2848 if (regmove_dump)
2849 fclose (regmove_dump_file);
2850
4291d9c8
RS
2851 if (sched_dump)
2852 fclose (sched_dump_file);
2853
2854 if (local_reg_dump)
2855 fclose (local_reg_dump_file);
2856
2857 if (global_reg_dump)
2858 fclose (global_reg_dump_file);
2859
2860 if (sched2_dump)
2861 fclose (sched2_dump_file);
2862
2863 if (jump2_opt_dump)
2864 fclose (jump2_opt_dump_file);
2865
2866 if (dbr_sched_dump)
2867 fclose (dbr_sched_dump_file);
2868
2869#ifdef STACK_REGS
2870 if (stack_reg_dump)
2871 fclose (stack_reg_dump_file);
2872#endif
2873
2874 /* Close non-debugging input and output files. Take special care to note
2875 whether fclose returns an error, since the pages might still be on the
2876 buffer chain while the file is open. */
2877
e3d1fd32
PB
2878#if USE_CPPLIB
2879 finish_parse ();
2880#else
4291d9c8 2881 fclose (finput);
e3d1fd32 2882#endif
4291d9c8
RS
2883 if (ferror (asm_out_file) != 0 || fclose (asm_out_file) != 0)
2884 fatal_io_error (asm_file_name);
2885
2886 /* Print the times. */
2887
2888 if (! quiet_flag)
2889 {
2890 fprintf (stderr,"\n");
2891 print_time ("parse", parse_time);
ca695ac9
JB
2892
2893 if (!output_bytecode)
2894 {
2895 print_time ("integration", integration_time);
2896 print_time ("jump", jump_time);
2897 print_time ("cse", cse_time);
2898 print_time ("loop", loop_time);
2899 print_time ("cse2", cse2_time);
116758a7 2900 print_time ("branch-prob", branch_prob_time);
ca695ac9
JB
2901 print_time ("flow", flow_time);
2902 print_time ("combine", combine_time);
8c660648 2903 print_time ("regmove", regmove_time);
ca695ac9
JB
2904 print_time ("sched", sched_time);
2905 print_time ("local-alloc", local_alloc_time);
2906 print_time ("global-alloc", global_alloc_time);
2907 print_time ("sched2", sched2_time);
2908 print_time ("dbranch", dbr_sched_time);
2909 print_time ("shorten-branch", shorten_branch_time);
2910 print_time ("stack-reg", stack_reg_time);
2911 print_time ("final", final_time);
2912 print_time ("varconst", varconst_time);
2913 print_time ("symout", symout_time);
2914 print_time ("dump", dump_time);
2915 }
4291d9c8
RS
2916 }
2917}
2918\f
2919/* This is called from various places for FUNCTION_DECL, VAR_DECL,
2920 and TYPE_DECL nodes.
2921
2922 This does nothing for local (non-static) variables.
2923 Otherwise, it sets up the RTL and outputs any assembler code
2924 (label definition, storage allocation and initialization).
2925
2926 DECL is the declaration. If ASMSPEC is nonzero, it specifies
2927 the assembler symbol name to be used. TOP_LEVEL is nonzero
2928 if this declaration is not within a function. */
2929
2930void
2931rest_of_decl_compilation (decl, asmspec, top_level, at_end)
2932 tree decl;
2933 char *asmspec;
2934 int top_level;
2935 int at_end;
2936{
2937 /* Declarations of variables, and of functions defined elsewhere. */
2938
928eb380
RS
2939/* The most obvious approach, to put an #ifndef around where
2940 this macro is used, doesn't work since it's inside a macro call. */
2941#ifndef ASM_FINISH_DECLARE_OBJECT
2942#define ASM_FINISH_DECLARE_OBJECT(FILE, DECL, TOP, END)
2943#endif
2944
4291d9c8
RS
2945 /* Forward declarations for nested functions are not "external",
2946 but we need to treat them as if they were. */
216d5cdd 2947 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
4291d9c8
RS
2948 || TREE_CODE (decl) == FUNCTION_DECL)
2949 TIMEVAR (varconst_time,
2950 {
2951 make_decl_rtl (decl, asmspec, top_level);
9a9a9643
RS
2952 /* Initialized extern variable exists to be replaced
2953 with its value, or represents something that will be
2954 output in another file. */
6dbf678a 2955 if (! (TREE_CODE (decl) == VAR_DECL
9a9a9643
RS
2956 && DECL_EXTERNAL (decl) && TREE_READONLY (decl)
2957 && DECL_INITIAL (decl) != 0
5b272d50 2958 && DECL_INITIAL (decl) != error_mark_node))
6dbf678a
RS
2959 /* Don't output anything
2960 when a tentative file-scope definition is seen.
2961 But at end of compilation, do output code for them. */
2962 if (! (! at_end && top_level
2963 && (DECL_INITIAL (decl) == 0
9a9a9643 2964 || DECL_INITIAL (decl) == error_mark_node)))
8380e2f2 2965 assemble_variable (decl, top_level, at_end, 0);
5b7540b6
DE
2966 if (!output_bytecode
2967 && decl == last_assemble_variable_decl)
5e10b3cc
RS
2968 {
2969 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
2970 top_level, at_end);
2971 }
4291d9c8 2972 });
216d5cdd 2973 else if (DECL_REGISTER (decl) && asmspec != 0)
4291d9c8
RS
2974 {
2975 if (decode_reg_name (asmspec) >= 0)
2976 {
2977 DECL_RTL (decl) = 0;
2978 make_decl_rtl (decl, asmspec, top_level);
2979 }
2980 else
2981 error ("invalid register name `%s' for register variable", asmspec);
2982 }
f246a305
RS
2983#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
2984 else if ((write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
2985 && TREE_CODE (decl) == TYPE_DECL)
4291d9c8
RS
2986 TIMEVAR (symout_time, dbxout_symbol (decl, 0));
2987#endif
2988#ifdef SDB_DEBUGGING_INFO
2989 else if (write_symbols == SDB_DEBUG && top_level
2990 && TREE_CODE (decl) == TYPE_DECL)
2991 TIMEVAR (symout_time, sdbout_symbol (decl, 0));
2992#endif
2993}
2994
2995/* Called after finishing a record, union or enumeral type. */
2996
2997void
2998rest_of_type_compilation (type, toplev)
2999 tree type;
3000 int toplev;
3001{
f246a305
RS
3002#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
3003 if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
4291d9c8
RS
3004 TIMEVAR (symout_time, dbxout_symbol (TYPE_STUB_DECL (type), !toplev));
3005#endif
3006#ifdef SDB_DEBUGGING_INFO
3007 if (write_symbols == SDB_DEBUG)
3008 TIMEVAR (symout_time, sdbout_symbol (TYPE_STUB_DECL (type), !toplev));
3009#endif
3010}
3011
3012/* This is called from finish_function (within yyparse)
3013 after each top-level definition is parsed.
3014 It is supposed to compile that function or variable
3015 and output the assembler code for it.
3016 After we return, the tree storage is freed. */
3017
3018void
3019rest_of_compilation (decl)
3020 tree decl;
3021{
3022 register rtx insns;
3023 int start_time = get_run_time ();
3024 int tem;
3025 /* Nonzero if we have saved the original DECL_INITIAL of the function,
3026 to be restored after we finish compiling the function
3027 (for use when compiling inline calls to this function). */
3028 tree saved_block_tree = 0;
8a958768
RS
3029 /* Likewise, for DECL_ARGUMENTS. */
3030 tree saved_arguments = 0;
ab40ad2b 3031 int failure = 0;
4291d9c8 3032
ca695ac9
JB
3033 if (output_bytecode)
3034 return;
3035
4291d9c8
RS
3036 /* If we are reconsidering an inline function
3037 at the end of compilation, skip the stuff for making it inline. */
3038
3039 if (DECL_SAVED_INSNS (decl) == 0)
3040 {
956d6950 3041 int inlinable = 0;
4291d9c8
RS
3042 char *lose;
3043
3044 /* If requested, consider whether to make this function inline. */
9deaf1b1 3045 if (DECL_INLINE (decl) || flag_inline_functions)
4291d9c8
RS
3046 TIMEVAR (integration_time,
3047 {
3048 lose = function_cannot_inline_p (decl);
caa0eccd 3049 if (lose || ! optimize)
4291d9c8 3050 {
9deaf1b1 3051 if (warn_inline && DECL_INLINE (decl))
4291d9c8 3052 warning_with_decl (decl, lose);
9548c538 3053 DECL_ABSTRACT_ORIGIN (decl) = 0;
46dbb914
RS
3054 /* Don't really compile an extern inline function.
3055 If we can't make it inline, pretend
3056 it was only declared. */
3057 if (DECL_EXTERNAL (decl))
27937f46
RS
3058 {
3059 DECL_INITIAL (decl) = 0;
3060 goto exit_rest_of_compilation;
3061 }
4291d9c8
RS
3062 }
3063 else
9deaf1b1
RK
3064 /* ??? Note that this has the effect of making it look
3065 like "inline" was specified for a function if we choose
3066 to inline it. This isn't quite right, but it's
3067 probably not worth the trouble to fix. */
956d6950 3068 inlinable = DECL_INLINE (decl) = 1;
4291d9c8
RS
3069 });
3070
3071 insns = get_insns ();
3072
3073 /* Dump the rtl code if we are dumping rtl. */
3074
3075 if (rtl_dump)
3076 TIMEVAR (dump_time,
3077 {
3078 fprintf (rtl_dump_file, "\n;; Function %s\n\n",
2f8844a8 3079 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3080 if (DECL_SAVED_INSNS (decl))
3081 fprintf (rtl_dump_file, ";; (integrable)\n\n");
3082 print_rtl (rtl_dump_file, insns);
3083 fflush (rtl_dump_file);
3084 });
3085
c0da11c4
JM
3086 /* If we can, defer compiling inlines until EOF.
3087 save_for_inline_copying can be extremely expensive. */
956d6950 3088 if (inlinable && ! decl_function_context (decl))
c0da11c4
JM
3089 DECL_DEFER_OUTPUT (decl) = 1;
3090
4291d9c8
RS
3091 /* If function is inline, and we don't yet know whether to
3092 compile it by itself, defer decision till end of compilation.
3093 finish_compilation will call rest_of_compilation again
16411ea6 3094 for those functions that need to be output. Also defer those
ec6c615d
RK
3095 functions that we are supposed to defer. We cannot defer
3096 functions containing nested functions since the nested function
3097 data is in our non-saved obstack. */
3098
e9a25f70
JL
3099 /* If this is a nested inline, remove ADDRESSOF now so we can
3100 finish compiling ourselves. Otherwise, wait until EOF.
3101 We have to do this because the purge_addressof transformation
3102 changes the DECL_RTL for many variables, which confuses integrate. */
956d6950 3103 if (inlinable)
e9a25f70
JL
3104 {
3105 if (decl_function_context (decl))
3106 purge_addressof (insns);
3107 else
3108 DECL_DEFER_OUTPUT (decl) = 1;
3109 }
3110
ec6c615d
RK
3111 if (! current_function_contains_functions
3112 && (DECL_DEFER_OUTPUT (decl)
9deaf1b1 3113 || (DECL_INLINE (decl)
ec6c615d
RK
3114 && ((! TREE_PUBLIC (decl) && ! TREE_ADDRESSABLE (decl)
3115 && ! flag_keep_inline_functions)
3116 || DECL_EXTERNAL (decl)))))
4291d9c8 3117 {
951af26e
JM
3118 DECL_DEFER_OUTPUT (decl) = 1;
3119
a701efba
MM
3120 /* If -Wreturn-type, we have to do a bit of compilation.
3121 However, if we just fall through we will call
3122 save_for_inline_copying() which results in excessive
3123 memory use. Instead, we just want to call
3124 jump_optimize() to figure out whether or not we can fall
3125 off the end of the function; we do the minimum amount of
3126 work necessary to make that safe. And, we set optimize
3127 to zero to keep jump_optimize from working too hard. */
3128 if (warn_return_type)
937522b5 3129 {
a701efba
MM
3130 int saved_optimize = optimize;
3131 optimize = 0;
3132 find_exception_handler_labels ();
3133 jump_optimize (get_insns(), 0, 0, 0);
3134 optimize = saved_optimize;
3135 }
3136
951af26e 3137#ifdef DWARF_DEBUGGING_INFO
a701efba
MM
3138 /* Generate the DWARF info for the "abstract" instance
3139 of a function which we may later generate inlined and/or
3140 out-of-line instances of. */
3141 if (write_symbols == DWARF_DEBUG)
3142 {
3143 set_decl_abstract_flags (decl, 1);
3144 TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3145 set_decl_abstract_flags (decl, 0);
3146 }
9a666dda
JM
3147#endif
3148#ifdef DWARF2_DEBUGGING_INFO
a701efba
MM
3149 /* Generate the DWARF2 info for the "abstract" instance
3150 of a function which we may later generate inlined and/or
3151 out-of-line instances of. */
3152 if (write_symbols == DWARF2_DEBUG)
3153 {
3154 set_decl_abstract_flags (decl, 1);
3155 TIMEVAR (symout_time, dwarf2out_decl (decl));
3156 set_decl_abstract_flags (decl, 0);
937522b5 3157 }
a701efba
MM
3158#endif
3159 TIMEVAR (integration_time, save_for_inline_nocopy (decl));
3160 RTX_INTEGRATED_P (DECL_SAVED_INSNS (decl)) = inlinable;
3161 goto exit_rest_of_compilation;
4291d9c8
RS
3162 }
3163
8a958768 3164 /* If we have to compile the function now, save its rtl and subdecls
4291d9c8 3165 so that its compilation will not affect what others get. */
956d6950 3166 if (inlinable || DECL_DEFER_OUTPUT (decl))
4291d9c8 3167 {
937522b5
RS
3168#ifdef DWARF_DEBUGGING_INFO
3169 /* Generate the DWARF info for the "abstract" instance of
3170 a function which we will generate an out-of-line instance
3171 of almost immediately (and which we may also later generate
3172 various inlined instances of). */
3173 if (write_symbols == DWARF_DEBUG)
3174 {
3175 set_decl_abstract_flags (decl, 1);
3176 TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3177 set_decl_abstract_flags (decl, 0);
3178 }
9a666dda
JM
3179#endif
3180#ifdef DWARF2_DEBUGGING_INFO
3181 /* Generate the DWARF2 info for the "abstract" instance of
3182 a function which we will generate an out-of-line instance
3183 of almost immediately (and which we may also later generate
3184 various inlined instances of). */
3185 if (write_symbols == DWARF2_DEBUG)
3186 {
3187 set_decl_abstract_flags (decl, 1);
88dad228 3188 TIMEVAR (symout_time, dwarf2out_decl (decl));
9a666dda
JM
3189 set_decl_abstract_flags (decl, 0);
3190 }
937522b5 3191#endif
4291d9c8 3192 saved_block_tree = DECL_INITIAL (decl);
8a958768 3193 saved_arguments = DECL_ARGUMENTS (decl);
4291d9c8 3194 TIMEVAR (integration_time, save_for_inline_copying (decl));
956d6950 3195 RTX_INTEGRATED_P (DECL_SAVED_INSNS (decl)) = inlinable;
4291d9c8 3196 }
4291d9c8 3197
b8471b65
RK
3198 /* If specified extern inline but we aren't inlining it, we are
3199 done. */
9deaf1b1 3200 if (DECL_INLINE (decl) && DECL_EXTERNAL (decl))
b8471b65
RK
3201 goto exit_rest_of_compilation;
3202 }
07af9d16 3203
951af26e
JM
3204 if (! DECL_DEFER_OUTPUT (decl))
3205 TREE_ASM_WRITTEN (decl) = 1;
4291d9c8
RS
3206
3207 /* Now that integrate will no longer see our rtl, we need not distinguish
3208 between the return value of this function and the return value of called
3209 functions. */
3210 rtx_equal_function_value_matters = 0;
3211
32235b30
RS
3212 /* Don't return yet if -Wreturn-type; we need to do jump_optimize. */
3213 if ((rtl_dump_and_exit || flag_syntax_only) && !warn_return_type)
4291d9c8
RS
3214 {
3215 goto exit_rest_of_compilation;
3216 }
3217
154bba13
TT
3218 /* Emit code to get eh context, if needed. */
3219 emit_eh_context ();
3220
4291d9c8
RS
3221#ifdef FINALIZE_PIC
3222 /* If we are doing position-independent code generation, now
3223 is the time to output special prologues and epilogues.
3224 We do not want to do this earlier, because it just clutters
3225 up inline functions with meaningless insns. */
3226 if (flag_pic)
3227 FINALIZE_PIC;
3228#endif
3229
89418a92
BK
3230 /* From now on, allocate rtl in current_obstack, not in saveable_obstack.
3231 Note that that may have been done above, in save_for_inline_copying.
3232 The call to resume_temporary_allocation near the end of this function
3233 goes back to the usual state of affairs. This must be done after
3234 we've built up any unwinders for exception handling, and done
3235 the FINALIZE_PIC work, if necessary. */
3236
3237 rtl_in_current_obstack ();
3d195391 3238
4291d9c8
RS
3239 insns = get_insns ();
3240
3241 /* Copy any shared structure that should not be shared. */
3242
3243 unshare_all_rtl (insns);
3244
3245 /* Instantiate all virtual registers. */
3246
3247 instantiate_virtual_regs (current_function_decl, get_insns ());
3248
3249 /* See if we have allocated stack slots that are not directly addressable.
3250 If so, scan all the insns and create explicit address computation
3251 for all references to such slots. */
3252/* fixup_stack_slots (); */
3253
3d195391
MS
3254 /* Find all the EH handlers. */
3255 find_exception_handler_labels ();
3256
cc4e79d8
JL
3257 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
3258 are initialized and to compute whether control can drop off the end
3259 of the function. */
3260 TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3261 TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
4291d9c8 3262
32235b30 3263 /* Now is when we stop if -fsyntax-only and -Wreturn-type. */
951af26e 3264 if (rtl_dump_and_exit || flag_syntax_only || DECL_DEFER_OUTPUT (decl))
32235b30
RS
3265 goto exit_rest_of_compilation;
3266
4291d9c8
RS
3267 /* Dump rtl code after jump, if we are doing that. */
3268
3269 if (jump_opt_dump)
3270 TIMEVAR (dump_time,
3271 {
3272 fprintf (jump_opt_dump_file, "\n;; Function %s\n\n",
2f8844a8 3273 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3274 print_rtl (jump_opt_dump_file, insns);
3275 fflush (jump_opt_dump_file);
3276 });
3277
3278 /* Perform common subexpression elimination.
3279 Nonzero value from `cse_main' means that jumps were simplified
3280 and some code may now be unreachable, so do
3281 jump optimization again. */
3282
3283 if (cse_dump)
3284 TIMEVAR (dump_time,
3285 {
3286 fprintf (cse_dump_file, "\n;; Function %s\n\n",
2f8844a8 3287 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3288 });
3289
3290 if (optimize > 0)
3291 {
3292 TIMEVAR (cse_time, reg_scan (insns, max_reg_num (), 1));
3293
3294 if (flag_thread_jumps)
3295 /* Hacks by tiemann & kenner. */
6f606d63 3296 TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 1));
4291d9c8
RS
3297
3298 TIMEVAR (cse_time, tem = cse_main (insns, max_reg_num (),
3299 0, cse_dump_file));
3300 TIMEVAR (cse_time, delete_dead_from_cse (insns, max_reg_num ()));
3301
534bfae4 3302 if (tem || optimize > 1)
4291d9c8
RS
3303 TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
3304 }
3305
3306 /* Dump rtl code after cse, if we are doing that. */
3307
3308 if (cse_dump)
3309 TIMEVAR (dump_time,
3310 {
3311 print_rtl (cse_dump_file, insns);
3312 fflush (cse_dump_file);
3313 });
3314
e9a25f70
JL
3315 purge_addressof (insns);
3316 reg_scan (insns, max_reg_num (), 1);
3317
3318 if (addressof_dump)
3319 TIMEVAR (dump_time,
3320 {
3321 fprintf (addressof_dump_file, "\n;; Function %s\n\n",
3322 (*decl_printable_name) (decl, 2));
3323 print_rtl (addressof_dump_file, insns);
3324 fflush (addressof_dump_file);
3325 });
3326
4291d9c8
RS
3327 if (loop_dump)
3328 TIMEVAR (dump_time,
3329 {
3330 fprintf (loop_dump_file, "\n;; Function %s\n\n",
2f8844a8 3331 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3332 });
3333
3334 /* Move constant computations out of loops. */
3335
3336 if (optimize > 0)
3337 {
3338 TIMEVAR (loop_time,
3339 {
6d6d0fa0
JL
3340 if (flag_rerun_loop_opt)
3341 {
3342 /* We only want to perform unrolling once. */
6d6d0fa0 3343
81797aba 3344 loop_optimize (insns, loop_dump_file, 0);
6d6d0fa0
JL
3345
3346 /* The regscan pass may not be necessary, but let's
3347 be safe until we can prove otherwise. */
3348 reg_scan (insns, max_reg_num (), 1);
6d6d0fa0 3349 }
81797aba 3350 loop_optimize (insns, loop_dump_file, flag_unroll_loops);
4291d9c8
RS
3351 });
3352 }
3353
3354 /* Dump rtl code after loop opt, if we are doing that. */
3355
3356 if (loop_dump)
3357 TIMEVAR (dump_time,
3358 {
3359 print_rtl (loop_dump_file, insns);
3360 fflush (loop_dump_file);
3361 });
3362
3363 if (cse2_dump)
3364 TIMEVAR (dump_time,
3365 {
3366 fprintf (cse2_dump_file, "\n;; Function %s\n\n",
2f8844a8 3367 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3368 });
3369
3370 if (optimize > 0 && flag_rerun_cse_after_loop)
3371 {
44333223
JL
3372 /* Running another jump optimization pass before the second
3373 cse pass sometimes simplifies the RTL enough to allow
9e9b48a4
DE
3374 the second CSE pass to do a better job. Jump_optimize can change
3375 max_reg_num so we must rerun reg_scan afterwards.
3376 ??? Rework to not call reg_scan so often. */
3377 TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
44333223 3378 TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 1));
4291d9c8 3379
9e9b48a4 3380 TIMEVAR (cse2_time, reg_scan (insns, max_reg_num (), 0));
4291d9c8
RS
3381 TIMEVAR (cse2_time, tem = cse_main (insns, max_reg_num (),
3382 1, cse2_dump_file));
3383 if (tem)
3384 TIMEVAR (jump_time, jump_optimize (insns, 0, 0, 0));
3385 }
3386
3387 if (optimize > 0 && flag_thread_jumps)
c2f006ec
RK
3388 {
3389 /* This pass of jump threading straightens out code
3390 that was kinked by loop optimization. */
3391 TIMEVAR (jump_time, reg_scan (insns, max_reg_num (), 0));
3392 TIMEVAR (jump_time, thread_jumps (insns, max_reg_num (), 0));
3393 }
4291d9c8
RS
3394 /* Dump rtl code after cse, if we are doing that. */
3395
3396 if (cse2_dump)
3397 TIMEVAR (dump_time,
3398 {
3399 print_rtl (cse2_dump_file, insns);
3400 fflush (cse2_dump_file);
3401 });
3402
0d332add
DE
3403 if (branch_prob_dump)
3404 TIMEVAR (dump_time,
3405 {
3406 fprintf (branch_prob_dump_file, "\n;; Function %s\n\n",
2f8844a8 3407 (*decl_printable_name) (decl, 2));
0d332add
DE
3408 });
3409
3410 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
3411 TIMEVAR (branch_prob_time,
3412 {
3413 branch_prob (insns, branch_prob_dump_file);
3414 });
3415
3416 if (branch_prob_dump)
3417 TIMEVAR (dump_time,
3418 {
3419 print_rtl (branch_prob_dump_file, insns);
3420 fflush (branch_prob_dump_file);
3421 });
4291d9c8
RS
3422 /* We are no longer anticipating cse in this function, at least. */
3423
3424 cse_not_expected = 1;
3425
3426 /* Now we choose between stupid (pcc-like) register allocation
3427 (if we got the -noreg switch and not -opt)
3428 and smart register allocation. */
3429
3430 if (optimize > 0) /* Stupid allocation probably won't work */
3431 obey_regdecls = 0; /* if optimizations being done. */
3432
3433 regclass_init ();
3434
3435 /* Print function header into flow dump now
3436 because doing the flow analysis makes some of the dump. */
3437
3438 if (flow_dump)
3439 TIMEVAR (dump_time,
3440 {
3441 fprintf (flow_dump_file, "\n;; Function %s\n\n",
2f8844a8 3442 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3443 });
3444
3445 if (obey_regdecls)
3446 {
3447 TIMEVAR (flow_time,
3448 {
3449 regclass (insns, max_reg_num ());
3450 stupid_life_analysis (insns, max_reg_num (),
3451 flow_dump_file);
3452 });
3453 }
3454 else
3455 {
3456 /* Do control and data flow analysis,
3457 and write some of the results to dump file. */
3458
3459 TIMEVAR (flow_time, flow_analysis (insns, max_reg_num (),
3460 flow_dump_file));
3461 if (warn_uninitialized)
3462 {
3463 uninitialized_vars_warning (DECL_INITIAL (decl));
3464 setjmp_args_warning ();
3465 }
3466 }
3467
3468 /* Dump rtl after flow analysis. */
3469
3470 if (flow_dump)
3471 TIMEVAR (dump_time,
3472 {
3e28fe44 3473 print_rtl_with_bb (flow_dump_file, insns);
4291d9c8
RS
3474 fflush (flow_dump_file);
3475 });
3476
3477 /* If -opt, try combining insns through substitution. */
3478
3479 if (optimize > 0)
3480 TIMEVAR (combine_time, combine_instructions (insns, max_reg_num ()));
3481
3482 /* Dump rtl code after insn combination. */
3483
3484 if (combine_dump)
3485 TIMEVAR (dump_time,
3486 {
3487 fprintf (combine_dump_file, "\n;; Function %s\n\n",
2f8844a8 3488 (*decl_printable_name) (decl, 2));
4291d9c8 3489 dump_combine_stats (combine_dump_file);
3e28fe44 3490 print_rtl_with_bb (combine_dump_file, insns);
4291d9c8
RS
3491 fflush (combine_dump_file);
3492 });
3493
8c660648
JL
3494 if (regmove_dump)
3495 TIMEVAR (dump_time,
3496 {
3497 fprintf (regmove_dump_file, "\n;; Function %s\n\n",
3498 (*decl_printable_name) (decl, 2));
3499 });
3500
3501 /* Register allocation pre-pass, to reduce number of moves
3502 necessary for two-address machines. */
3503 if (optimize > 0 && flag_regmove)
3504 TIMEVAR (regmove_time, regmove_optimize (insns, max_reg_num (),
3505 regmove_dump_file));
3506
3507 if (regmove_dump)
3508 TIMEVAR (dump_time,
3509 {
3e28fe44 3510 print_rtl_with_bb (regmove_dump_file, insns);
8c660648
JL
3511 fflush (regmove_dump_file);
3512 });
3513
4291d9c8
RS
3514 /* Print function header into sched dump now
3515 because doing the sched analysis makes some of the dump. */
3516
3517 if (sched_dump)
3518 TIMEVAR (dump_time,
3519 {
3520 fprintf (sched_dump_file, "\n;; Function %s\n\n",
2f8844a8 3521 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3522 });
3523
3524 if (optimize > 0 && flag_schedule_insns)
3525 {
3526 /* Do control and data sched analysis,
3527 and write some of the results to dump file. */
3528
3529 TIMEVAR (sched_time, schedule_insns (sched_dump_file));
3530 }
3531
3532 /* Dump rtl after instruction scheduling. */
3533
3534 if (sched_dump)
3535 TIMEVAR (dump_time,
3536 {
3e28fe44 3537 print_rtl_with_bb (sched_dump_file, insns);
4291d9c8
RS
3538 fflush (sched_dump_file);
3539 });
3540
3541 /* Unless we did stupid register allocation,
3542 allocate pseudo-regs that are used only within 1 basic block. */
3543
3544 if (!obey_regdecls)
3545 TIMEVAR (local_alloc_time,
3546 {
3547 regclass (insns, max_reg_num ());
3548 local_alloc ();
3549 });
3550
3551 /* Dump rtl code after allocating regs within basic blocks. */
3552
3553 if (local_reg_dump)
3554 TIMEVAR (dump_time,
3555 {
3556 fprintf (local_reg_dump_file, "\n;; Function %s\n\n",
2f8844a8 3557 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3558 dump_flow_info (local_reg_dump_file);
3559 dump_local_alloc (local_reg_dump_file);
3e28fe44 3560 print_rtl_with_bb (local_reg_dump_file, insns);
4291d9c8
RS
3561 fflush (local_reg_dump_file);
3562 });
3563
3564 if (global_reg_dump)
3565 TIMEVAR (dump_time,
3566 fprintf (global_reg_dump_file, "\n;; Function %s\n\n",
2f8844a8 3567 (*decl_printable_name) (decl, 2)));
4291d9c8 3568
bf8b4985
RK
3569 /* Save the last label number used so far, so reorg can tell
3570 when it's safe to kill spill regs. */
3571 max_label_num_after_reload = max_label_num ();
3572
4291d9c8
RS
3573 /* Unless we did stupid register allocation,
3574 allocate remaining pseudo-regs, then do the reload pass
3575 fixing up any insns that are invalid. */
3576
3577 TIMEVAR (global_alloc_time,
3578 {
3579 if (!obey_regdecls)
37366632 3580 failure = global_alloc (global_reg_dump_file);
4291d9c8 3581 else
37366632 3582 failure = reload (insns, 0, global_reg_dump_file);
4291d9c8
RS
3583 });
3584
3585 if (global_reg_dump)
3586 TIMEVAR (dump_time,
3587 {
3588 dump_global_regs (global_reg_dump_file);
3e28fe44 3589 print_rtl_with_bb (global_reg_dump_file, insns);
4291d9c8
RS
3590 fflush (global_reg_dump_file);
3591 });
3592
ab40ad2b
RS
3593 if (failure)
3594 goto exit_rest_of_compilation;
3595
4291d9c8
RS
3596 reload_completed = 1;
3597
c8ed219d
RK
3598 /* Do a very simple CSE pass over just the hard registers. */
3599 if (optimize > 0)
3600 reload_cse_regs (insns);
3601
bdac5f58
TW
3602 /* On some machines, the prologue and epilogue code, or parts thereof,
3603 can be represented as RTL. Doing so lets us schedule insns between
3604 it and the rest of the code and also allows delayed branch
3605 scheduling to operate in the epilogue. */
3606
3607 thread_prologue_and_epilogue_insns (insns);
3608
4291d9c8
RS
3609 if (optimize > 0 && flag_schedule_insns_after_reload)
3610 {
3611 if (sched2_dump)
3612 TIMEVAR (dump_time,
3613 {
3614 fprintf (sched2_dump_file, "\n;; Function %s\n\n",
2f8844a8 3615 (*decl_printable_name) (decl, 2));
4291d9c8
RS
3616 });
3617
3618 /* Do control and data sched analysis again,
3619 and write some more of the results to dump file. */
3620
3621 TIMEVAR (sched2_time, schedule_insns (sched2_dump_file));
3622
3623 /* Dump rtl after post-reorder instruction scheduling. */
3624
3625 if (sched2_dump)
3626 TIMEVAR (dump_time,
3627 {
3e28fe44 3628 print_rtl_with_bb (sched2_dump_file, insns);
4291d9c8
RS
3629 fflush (sched2_dump_file);
3630 });
3631 }
3632
3633#ifdef LEAF_REGISTERS
3634 leaf_function = 0;
3635 if (optimize > 0 && only_leaf_regs_used () && leaf_function_p ())
ab40ad2b 3636 leaf_function = 1;
4291d9c8
RS
3637#endif
3638
3639 /* One more attempt to remove jumps to .+1
3640 left by dead-store-elimination.
3641 Also do cross-jumping this time
3642 and delete no-op move insns. */
3643
3644 if (optimize > 0)
3645 {
3646 TIMEVAR (jump_time, jump_optimize (insns, 1, 1, 0));
3647 }
3648
3649 /* Dump rtl code after jump, if we are doing that. */
3650
3651 if (jump2_opt_dump)
3652 TIMEVAR (dump_time,
3653 {
3654 fprintf (jump2_opt_dump_file, "\n;; Function %s\n\n",
2f8844a8 3655 (*decl_printable_name) (decl, 2));
3e28fe44 3656 print_rtl_with_bb (jump2_opt_dump_file, insns);
4291d9c8
RS
3657 fflush (jump2_opt_dump_file);
3658 });
3659
2c65021a
RK
3660 /* If a machine dependent reorganization is needed, call it. */
3661#ifdef MACHINE_DEPENDENT_REORG
3662 MACHINE_DEPENDENT_REORG (insns);
3663#endif
3664
4291d9c8 3665 /* If a scheduling pass for delayed branches is to be done,
0f41302f 3666 call the scheduling code. */
4291d9c8
RS
3667
3668#ifdef DELAY_SLOTS
3669 if (optimize > 0 && flag_delayed_branch)
3670 {
3671 TIMEVAR (dbr_sched_time, dbr_schedule (insns, dbr_sched_dump_file));
3672 if (dbr_sched_dump)
3673 {
3674 TIMEVAR (dump_time,
3675 {
3676 fprintf (dbr_sched_dump_file, "\n;; Function %s\n\n",
2f8844a8 3677 (*decl_printable_name) (decl, 2));
3e28fe44 3678 print_rtl_with_bb (dbr_sched_dump_file, insns);
4291d9c8
RS
3679 fflush (dbr_sched_dump_file);
3680 });
3681 }
3682 }
3683#endif
3684
d0c874f6
TG
3685 /* Shorten branches. */
3686 TIMEVAR (shorten_branch_time,
3687 {
3688 shorten_branches (get_insns ());
3689 });
4291d9c8
RS
3690
3691#ifdef STACK_REGS
3692 TIMEVAR (stack_reg_time, reg_to_stack (insns, stack_reg_dump_file));
3693 if (stack_reg_dump)
3694 {
3695 TIMEVAR (dump_time,
3696 {
3697 fprintf (stack_reg_dump_file, "\n;; Function %s\n\n",
2f8844a8 3698 (*decl_printable_name) (decl, 2));
3e28fe44 3699 print_rtl_with_bb (stack_reg_dump_file, insns);
4291d9c8
RS
3700 fflush (stack_reg_dump_file);
3701 });
3702 }
3703#endif
3704
3705 /* Now turn the rtl into assembler code. */
3706
3707 TIMEVAR (final_time,
3708 {
3709 rtx x;
3710 char *fnname;
3711
3712 /* Get the function's name, as described by its RTL.
3713 This may be different from the DECL_NAME name used
3714 in the source file. */
3715
3716 x = DECL_RTL (decl);
3717 if (GET_CODE (x) != MEM)
3718 abort ();
3719 x = XEXP (x, 0);
3720 if (GET_CODE (x) != SYMBOL_REF)
3721 abort ();
3722 fnname = XSTR (x, 0);
3723
3724 assemble_start_function (decl, fnname);
3725 final_start_function (insns, asm_out_file, optimize);
3726 final (insns, asm_out_file, optimize, 0);
3727 final_end_function (insns, asm_out_file, optimize);
3728 assemble_end_function (decl, fnname);
3729 fflush (asm_out_file);
9ddca353
RK
3730
3731 /* Release all memory held by regsets now */
3732 regset_release_memory ();
4291d9c8
RS
3733 });
3734
3735 /* Write DBX symbols if requested */
3736
3737 /* Note that for those inline functions where we don't initially
3738 know for certain that we will be generating an out-of-line copy,
3739 the first invocation of this routine (rest_of_compilation) will
3740 skip over this code by doing a `goto exit_rest_of_compilation;'.
3741 Later on, finish_compilation will call rest_of_compilation again
3742 for those inline functions that need to have out-of-line copies
3743 generated. During that call, we *will* be routed past here. */
3744
3745#ifdef DBX_DEBUGGING_INFO
3746 if (write_symbols == DBX_DEBUG)
3747 TIMEVAR (symout_time, dbxout_function (decl));
3748#endif
3749
3750#ifdef DWARF_DEBUGGING_INFO
3751 if (write_symbols == DWARF_DEBUG)
3752 TIMEVAR (symout_time, dwarfout_file_scope_decl (decl, 0));
3753#endif
3754
9a666dda
JM
3755#ifdef DWARF2_DEBUGGING_INFO
3756 if (write_symbols == DWARF2_DEBUG)
88dad228 3757 TIMEVAR (symout_time, dwarf2out_decl (decl));
9a666dda
JM
3758#endif
3759
4291d9c8
RS
3760 exit_rest_of_compilation:
3761
f246a305
RS
3762 /* In case the function was not output,
3763 don't leave any temporary anonymous types
3764 queued up for sdb output. */
3765#ifdef SDB_DEBUGGING_INFO
3766 if (write_symbols == SDB_DEBUG)
37366632 3767 sdbout_types (NULL_TREE);
f246a305
RS
3768#endif
3769
8a958768
RS
3770 /* Put back the tree of subblocks and list of arguments
3771 from before we copied them.
4291d9c8
RS
3772 Code generation and the output of debugging info may have modified
3773 the copy, but the original is unchanged. */
3774
3775 if (saved_block_tree != 0)
fb19c456
JM
3776 {
3777 DECL_INITIAL (decl) = saved_block_tree;
3778 DECL_ARGUMENTS (decl) = saved_arguments;
3779 DECL_ABSTRACT_ORIGIN (decl) = NULL_TREE;
3780 }
4291d9c8
RS
3781
3782 reload_completed = 0;
3783
9fe320d7
RK
3784 /* Clear out the insn_length contents now that they are no longer valid. */
3785 init_insn_lengths ();
3786
4291d9c8
RS
3787 /* Clear out the real_constant_chain before some of the rtx's
3788 it runs through become garbage. */
3789
3790 clear_const_double_mem ();
3791
3792 /* Cancel the effect of rtl_in_current_obstack. */
3793
3794 resume_temporary_allocation ();
3795
adcd38c9
RK
3796 /* Show no temporary slots allocated. */
3797
3798 init_temp_slots ();
3799
4291d9c8
RS
3800 /* The parsing time is all the time spent in yyparse
3801 *except* what is spent in this function. */
3802
3803 parse_time -= get_run_time () - start_time;
3804}
3805\f
3806/* Entry point of cc1/c++. Decode command args, then call compile_file.
3807 Exit code is 35 if can't open files, 34 if fatal error,
3808 33 if had nonfatal errors, else success. */
3809
3810int
3811main (argc, argv, envp)
3812 int argc;
3813 char **argv;
3814 char **envp;
3815{
3816 register int i;
3817 char *filename = 0;
3818 int flag_print_mem = 0;
3819 int version_flag = 0;
3820 char *p;
3821
3822 /* save in case md file wants to emit args as a comment. */
3823 save_argc = argc;
3824 save_argv = argv;
3825
3826 p = argv[0] + strlen (argv[0]);
128373ac
RK
3827 while (p != argv[0] && p[-1] != '/'
3828#ifdef DIR_SEPARATOR
3829 && p[-1] != DIR_SEPARATOR
3830#endif
3831 )
3832 --p;
4291d9c8
RS
3833 progname = p;
3834
08ce3276 3835#if defined (RLIMIT_STACK) && defined (HAVE_GETRLIMIT) && defined (HAVE_SETRLIMIT)
4291d9c8
RS
3836 /* Get rid of any avoidable limit on stack size. */
3837 {
3838 struct rlimit rlim;
3839
0f41302f 3840 /* Set the stack limit huge so that alloca does not fail. */
4291d9c8
RS
3841 getrlimit (RLIMIT_STACK, &rlim);
3842 rlim.rlim_cur = rlim.rlim_max;
3843 setrlimit (RLIMIT_STACK, &rlim);
3844 }
c85f7c16 3845#endif
4291d9c8
RS
3846
3847 signal (SIGFPE, float_signal);
3848
935d4b07 3849#ifdef SIGPIPE
4291d9c8 3850 signal (SIGPIPE, pipe_closed);
935d4b07 3851#endif
4291d9c8
RS
3852
3853 decl_printable_name = decl_name;
3854 lang_expand_expr = (struct rtx_def *(*)()) do_abort;
3855
3856 /* Initialize whether `char' is signed. */
3857 flag_signed_char = DEFAULT_SIGNED_CHAR;
3858#ifdef DEFAULT_SHORT_ENUMS
3859 /* Initialize how much space enums occupy, by default. */
3860 flag_short_enums = DEFAULT_SHORT_ENUMS;
3861#endif
3862
3863 /* Scan to see what optimization level has been specified. That will
3864 determine the default value of many flags. */
3865 for (i = 1; i < argc; i++)
3866 {
3867 if (!strcmp (argv[i], "-O"))
3868 {
3869 optimize = 1;
3870 }
3871 else if (argv[i][0] == '-' && argv[i][1] == 'O')
3872 {
3873 /* Handle -O2, -O3, -O69, ... */
3874 char *p = &argv[i][2];
3875 int c;
3876
3877 while (c = *p++)
3878 if (! (c >= '0' && c <= '9'))
3879 break;
3880 if (c == 0)
3881 optimize = atoi (&argv[i][2]);
3882 }
3883 }
3884
3885 obey_regdecls = (optimize == 0);
4291d9c8
RS
3886
3887 if (optimize >= 1)
3888 {
6731a3e3 3889 flag_defer_pop = 1;
4291d9c8
RS
3890 flag_thread_jumps = 1;
3891#ifdef DELAY_SLOTS
3892 flag_delayed_branch = 1;
7e89c3a3
RK
3893#endif
3894#ifdef CAN_DEBUG_WITHOUT_FP
3895 flag_omit_frame_pointer = 1;
4291d9c8
RS
3896#endif
3897 }
3898
3899 if (optimize >= 2)
3900 {
3901 flag_cse_follow_jumps = 1;
8b3686ed 3902 flag_cse_skip_blocks = 1;
4291d9c8
RS
3903 flag_expensive_optimizations = 1;
3904 flag_strength_reduce = 1;
3905 flag_rerun_cse_after_loop = 1;
6d6d0fa0 3906 flag_rerun_loop_opt = 1;
ac266247 3907 flag_caller_saves = 1;
4ac8e06e 3908 flag_force_mem = 1;
4291d9c8
RS
3909#ifdef INSN_SCHEDULING
3910 flag_schedule_insns = 1;
3911 flag_schedule_insns_after_reload = 1;
3912#endif
8c660648 3913 flag_regmove = 1;
4291d9c8
RS
3914 }
3915
7e89c3a3
RK
3916 if (optimize >= 3)
3917 {
3918 flag_inline_functions = 1;
3919 }
3920
c1da383f
DE
3921 /* Initialize target_flags before OPTIMIZATION_OPTIONS so the latter can
3922 modify it. */
3923 target_flags = 0;
3924 set_target_switch ("");
3925
4291d9c8
RS
3926#ifdef OPTIMIZATION_OPTIONS
3927 /* Allow default optimizations to be specified on a per-machine basis. */
3928 OPTIMIZATION_OPTIONS (optimize);
3929#endif
3930
3931 /* Initialize register usage now so switches may override. */
3932 init_reg_sets ();
3933
4291d9c8
RS
3934 for (i = 1; i < argc; i++)
3935 {
b99933c7
RS
3936 int j;
3937 /* If this is a language-specific option,
3938 decode it in a language-specific way. */
3939 for (j = 0; lang_options[j] != 0; j++)
7e6c0864
RK
3940 if (!strncmp (argv[i], lang_options[j],
3941 strlen (lang_options[j])))
b99933c7
RS
3942 break;
3943 if (lang_options[j] != 0)
3944 /* If the option is valid for *some* language,
3945 treat it as valid even if this language doesn't understand it. */
3946 lang_decode_option (argv[i]);
3947 else if (argv[i][0] == '-' && argv[i][1] != 0)
4291d9c8
RS
3948 {
3949 register char *str = argv[i] + 1;
3950 if (str[0] == 'Y')
3951 str++;
3952
3953 if (str[0] == 'm')
3954 set_target_switch (&str[1]);
3955 else if (!strcmp (str, "dumpbase"))
3956 {
3957 dump_base_name = argv[++i];
3958 }
3959 else if (str[0] == 'd')
3960 {
3961 register char *p = &str[1];
3962 while (*p)
3963 switch (*p++)
3964 {
3965 case 'a':
0d332add 3966 branch_prob_dump = 1;
4291d9c8
RS
3967 combine_dump = 1;
3968 dbr_sched_dump = 1;
3969 flow_dump = 1;
3970 global_reg_dump = 1;
3971 jump_opt_dump = 1;
e9a25f70 3972 addressof_dump = 1;
4291d9c8
RS
3973 jump2_opt_dump = 1;
3974 local_reg_dump = 1;
3975 loop_dump = 1;
8c660648 3976 regmove_dump = 1;
4291d9c8
RS
3977 rtl_dump = 1;
3978 cse_dump = 1, cse2_dump = 1;
3979 sched_dump = 1;
3980 sched2_dump = 1;
3981 stack_reg_dump = 1;
3982 break;
0d332add
DE
3983 case 'b':
3984 branch_prob_dump = 1;
3985 break;
4291d9c8
RS
3986 case 'k':
3987 stack_reg_dump = 1;
3988 break;
3989 case 'c':
3990 combine_dump = 1;
3991 break;
3992 case 'd':
3993 dbr_sched_dump = 1;
3994 break;
3995 case 'f':
3996 flow_dump = 1;
3997 break;
3998 case 'g':
3999 global_reg_dump = 1;
4000 break;
4001 case 'j':
4002 jump_opt_dump = 1;
4003 break;
e9a25f70
JL
4004 case 'D':
4005 addressof_dump = 1;
4006 break;
4291d9c8
RS
4007 case 'J':
4008 jump2_opt_dump = 1;
4009 break;
4010 case 'l':
4011 local_reg_dump = 1;
4012 break;
4013 case 'L':
4014 loop_dump = 1;
4015 break;
4016 case 'm':
4017 flag_print_mem = 1;
4018 break;
4019 case 'p':
4020 flag_print_asm_name = 1;
4021 break;
4022 case 'r':
4023 rtl_dump = 1;
4024 break;
4025 case 's':
4026 cse_dump = 1;
4027 break;
4028 case 't':
4029 cse2_dump = 1;
4030 break;
8c660648
JL
4031 case 'N':
4032 regmove_dump = 1;
4033 break;
4291d9c8
RS
4034 case 'S':
4035 sched_dump = 1;
4036 break;
4037 case 'R':
4038 sched2_dump = 1;
4039 break;
4040 case 'y':
4041 set_yydebug (1);
4042 break;
4291d9c8
RS
4043 case 'x':
4044 rtl_dump_and_exit = 1;
4045 break;
3d5cdd42
DE
4046 case 'A':
4047 flag_debug_asm = 1;
4048 break;
4291d9c8
RS
4049 }
4050 }
4051 else if (str[0] == 'f')
4052 {
4291d9c8
RS
4053 register char *p = &str[1];
4054 int found = 0;
4055
4056 /* Some kind of -f option.
4057 P's value is the option sans `-f'.
4058 Search for it in the table of options. */
4059
4060 for (j = 0;
4061 !found && j < sizeof (f_options) / sizeof (f_options[0]);
4062 j++)
4063 {
4064 if (!strcmp (p, f_options[j].string))
4065 {
4066 *f_options[j].variable = f_options[j].on_value;
4067 /* A goto here would be cleaner,
4068 but breaks the vax pcc. */
4069 found = 1;
4070 }
4071 if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
4072 && ! strcmp (p+3, f_options[j].string))
4073 {
4074 *f_options[j].variable = ! f_options[j].on_value;
4075 found = 1;
4076 }
4077 }
4078
4079 if (found)
4080 ;
8c660648
JL
4081#ifdef HAIFA
4082#ifdef INSN_SCHEDULING
4083 else if (!strncmp (p, "sched-verbose-",14))
4084 fix_sched_param("verbose",&p[14]);
4085 else if (!strncmp (p, "sched-max-",10))
4086 fix_sched_param("max",&p[10]);
4087 else if (!strncmp (p, "sched-inter-max-b-",18))
4088 fix_sched_param("interblock-max-blocks",&p[18]);
4089 else if (!strncmp (p, "sched-inter-max-i-",18))
4090 fix_sched_param("interblock-max-insns",&p[18]);
4091#endif
4092#endif /* HAIFA */
4291d9c8
RS
4093 else if (!strncmp (p, "fixed-", 6))
4094 fix_register (&p[6], 1, 1);
4095 else if (!strncmp (p, "call-used-", 10))
4096 fix_register (&p[10], 0, 1);
4097 else if (!strncmp (p, "call-saved-", 11))
4098 fix_register (&p[11], 0, 0);
b99933c7 4099 else
4291d9c8
RS
4100 error ("Invalid option `%s'", argv[i]);
4101 }
4102 else if (str[0] == 'O')
4103 {
4104 register char *p = str+1;
4105 while (*p && *p >= '0' && *p <= '9')
4106 p++;
4107 if (*p == '\0')
4108 ;
4109 else
4110 error ("Invalid option `%s'", argv[i]);
4111 }
4112 else if (!strcmp (str, "pedantic"))
4113 pedantic = 1;
4114 else if (!strcmp (str, "pedantic-errors"))
4115 flag_pedantic_errors = pedantic = 1;
4291d9c8
RS
4116 else if (!strcmp (str, "quiet"))
4117 quiet_flag = 1;
4118 else if (!strcmp (str, "version"))
4119 version_flag = 1;
4120 else if (!strcmp (str, "w"))
4121 inhibit_warnings = 1;
4122 else if (!strcmp (str, "W"))
4123 {
4124 extra_warnings = 1;
fa1a4543
RS
4125 /* We save the value of warn_uninitialized, since if they put
4126 -Wuninitialized on the command line, we need to generate a
4127 warning about not using it without also specifying -O. */
4128 if (warn_uninitialized != 1)
4129 warn_uninitialized = 2;
4291d9c8
RS
4130 }
4131 else if (str[0] == 'W')
4132 {
4291d9c8
RS
4133 register char *p = &str[1];
4134 int found = 0;
4135
4136 /* Some kind of -W option.
4137 P's value is the option sans `-W'.
4138 Search for it in the table of options. */
4139
4140 for (j = 0;
4141 !found && j < sizeof (W_options) / sizeof (W_options[0]);
4142 j++)
4143 {
4144 if (!strcmp (p, W_options[j].string))
4145 {
4146 *W_options[j].variable = W_options[j].on_value;
4147 /* A goto here would be cleaner,
4148 but breaks the vax pcc. */
4149 found = 1;
4150 }
4151 if (p[0] == 'n' && p[1] == 'o' && p[2] == '-'
4152 && ! strcmp (p+3, W_options[j].string))
4153 {
4154 *W_options[j].variable = ! W_options[j].on_value;
4155 found = 1;
4156 }
4157 }
4158
4159 if (found)
4160 ;
4161 else if (!strncmp (p, "id-clash-", 9))
4162 {
4163 char *endp = p + 9;
4164
4165 while (*endp)
4166 {
4167 if (*endp >= '0' && *endp <= '9')
4168 endp++;
4169 else
7085b873
RS
4170 {
4171 error ("Invalid option `%s'", argv[i]);
4172 goto id_clash_lose;
4173 }
4291d9c8
RS
4174 }
4175 warn_id_clash = 1;
4176 id_clash_len = atoi (str + 10);
7085b873 4177 id_clash_lose: ;
4291d9c8 4178 }
b51e9c62
RK
4179 else if (!strncmp (p, "larger-than-", 12))
4180 {
4181 char *endp = p + 12;
4182
4183 while (*endp)
4184 {
4185 if (*endp >= '0' && *endp <= '9')
4186 endp++;
4187 else
4188 {
4189 error ("Invalid option `%s'", argv[i]);
4190 goto larger_than_lose;
4191 }
4192 }
4193 warn_larger_than = 1;
4194 larger_than_size = atoi (str + 13);
4195 larger_than_lose: ;
4196 }
4291d9c8
RS
4197 else
4198 error ("Invalid option `%s'", argv[i]);
4199 }
4200 else if (!strcmp (str, "p"))
ca695ac9 4201 {
c2d12c8b 4202 profile_flag = 1;
ca695ac9 4203 }
4291d9c8
RS
4204 else if (!strcmp (str, "a"))
4205 {
4206#if !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
4207 warning ("`-a' option (basic block profile) not supported");
4208#else
ec6c615d
RK
4209 profile_block_flag = (profile_block_flag < 2) ? 1 : 3;
4210#endif
4211 }
4212 else if (!strcmp (str, "ax"))
4213 {
4214#if !defined (FUNCTION_BLOCK_PROFILER_EXIT) || !defined (BLOCK_PROFILER) || !defined (FUNCTION_BLOCK_PROFILER)
4215 warning ("`-ax' option (jump profiling) not supported");
4216#else
4217 profile_block_flag = (!profile_block_flag
4218 || profile_block_flag == 2) ? 2 : 3;
4291d9c8
RS
4219#endif
4220 }
4221 else if (str[0] == 'g')
4222 {
4291d9c8
RS
4223 unsigned len;
4224 unsigned level;
ff482cef
DE
4225 /* A lot of code assumes write_symbols == NO_DEBUG if the
4226 debugging level is 0 (thus -gstabs1 -gstabs0 would lose track
4227 of what debugging type has been selected). This records the
4228 selected type. It is an error to specify more than one
4229 debugging type. */
4230 static enum debug_info_type selected_debug_type = NO_DEBUG;
4231 /* Non-zero if debugging format has been explicitly set.
4232 -g and -ggdb don't explicitly set the debugging format so
4233 -gdwarf -g3 is equivalent to -gdwarf3. */
4234 static int type_explicitly_set_p = 0;
4235 /* Table of supported debugging formats. */
4236 static struct {
4237 char *arg;
4238 /* Since PREFERRED_DEBUGGING_TYPE isn't necessarily a
4239 constant expression, we use NO_DEBUG in its place. */
4240 enum debug_info_type debug_type;
4241 int use_extensions_p;
4242 } *da, debug_args[] = {
4243 { "g", NO_DEBUG, DEFAULT_GDB_EXTENSIONS },
4244 { "ggdb", NO_DEBUG, 1 },
4245#ifdef DBX_DEBUGGING_INFO
4246 { "gstabs", DBX_DEBUG, 0 },
4247 { "gstabs+", DBX_DEBUG, 1 },
4248#endif
4249#ifdef DWARF_DEBUGGING_INFO
4250 { "gdwarf", DWARF_DEBUG, 0 },
4251 { "gdwarf+", DWARF_DEBUG, 1 },
9a666dda 4252#endif
a94dbf2c
JM
4253#ifdef DWARF2_DEBUGGING_INFO
4254 { "gdwarf-2", DWARF2_DEBUG, 0 },
ff482cef
DE
4255#endif
4256#ifdef XCOFF_DEBUGGING_INFO
4257 { "gxcoff", XCOFF_DEBUG, 0 },
4258 { "gxcoff+", XCOFF_DEBUG, 1 },
4259#endif
4260#ifdef SDB_DEBUGGING_INFO
4261 { "gcoff", SDB_DEBUG, 0 },
4262#endif
4263 { 0, 0, 0 }
4264 };
4265 /* Indexed by enum debug_info_type. */
4266 static char *debug_type_names[] = {
9a666dda 4267 "none", "stabs", "coff", "dwarf-1", "dwarf-2", "xcoff"
ff482cef 4268 };
4291d9c8 4269
ff482cef
DE
4270 /* Look up STR in the table. */
4271 for (da = debug_args; da->arg; da++)
4272 {
9a666dda 4273 if (! strncmp (str, da->arg, strlen (da->arg)))
ff482cef
DE
4274 {
4275 enum debug_info_type type = da->debug_type;
9a666dda
JM
4276 char *p, *q;
4277
4278 p = str + strlen (da->arg);
4279 if (*p && (*p < '0' || *p > '9'))
4280 continue;
5d38efae 4281 len = p - str;
e9a25f70 4282 q = p;
9a666dda
JM
4283 while (*q && (*q >= '0' && *q <= '9'))
4284 q++;
4285 if (*p)
33e5c8c3
JM
4286 {
4287 level = atoi (p);
4288 if (len > 1 && !strncmp (str, "gdwarf", len))
4289 {
4290 error ("use -gdwarf -g%d for DWARF v1, level %d",
4291 level, level);
4292 if (level == 2)
4293 error ("use -gdwarf-2 for DWARF v2");
4294 }
4295 }
9a666dda
JM
4296 else
4297 level = 2; /* default debugging info level */
4298 if (*q || level > 3)
4299 {
4300 warning ("invalid debug level specification in option: `-%s'",
4301 str);
4302 /* ??? This error message is incorrect in the case of
4303 -g4 -g. */
4304 warning ("no debugging information will be generated");
4305 level = 0;
4306 }
4307
ff482cef 4308 if (type == NO_DEBUG)
fe0986b4
JM
4309 {
4310 type = PREFERRED_DEBUGGING_TYPE;
4311 if (len > 1 && strncmp (str, "ggdb", len) == 0)
4312 {
4313#ifdef DWARF2_DEBUGGING_INFO
4314 type = DWARF2_DEBUG;
417b0fa2
JW
4315#else
4316#ifdef DBX_DEBUGGING_INFO
fe0986b4 4317 type = DBX_DEBUG;
417b0fa2 4318#endif
fe0986b4
JM
4319#endif
4320 }
4321 }
ff482cef 4322
e38eaffd
RK
4323 if (type == NO_DEBUG)
4324 warning ("`-%s' not supported by this configuration of GCC",
4325 str);
4326
ff482cef
DE
4327 /* Does it conflict with an already selected type? */
4328 if (type_explicitly_set_p
4329 /* -g/-ggdb don't conflict with anything */
4330 && da->debug_type != NO_DEBUG
4331 && type != selected_debug_type)
4332 warning ("`-%s' ignored, conflicts with `-g%s'",
4333 str, debug_type_names[(int) selected_debug_type]);
4334 else
4335 {
4336 /* If the format has already been set, -g/-ggdb
4337 only change the debug level. */
4338 if (type_explicitly_set_p
4339 && da->debug_type == NO_DEBUG)
4340 ; /* don't change debugging type */
4341 else
4342 {
4343 selected_debug_type = type;
4344 type_explicitly_set_p = da->debug_type != NO_DEBUG;
4345 }
4346 write_symbols = (level == 0
4347 ? NO_DEBUG
4348 : selected_debug_type);
4349 use_gnu_debug_info_extensions = da->use_extensions_p;
4350 debug_info_level = (enum debug_info_level) level;
4351 }
4352 break;
4353 }
4354 }
4355 if (! da->arg)
7276e85d
RK
4356 warning ("`-%s' not supported by this configuration of GCC",
4357 str);
4291d9c8
RS
4358 }
4359 else if (!strcmp (str, "o"))
4360 {
4361 asm_file_name = argv[++i];
4362 }
4363 else if (str[0] == 'G')
4364 {
4365 g_switch_set = TRUE;
4366 g_switch_value = atoi ((str[1] != '\0') ? str+1 : argv[++i]);
4367 }
f246a305
RS
4368 else if (!strncmp (str, "aux-info", 8))
4369 {
4370 flag_gen_aux_info = 1;
4371 aux_info_file_name = (str[8] != '\0' ? str+8 : argv[++i]);
4372 }
4291d9c8
RS
4373 else
4374 error ("Invalid option `%s'", argv[i]);
4375 }
4376 else if (argv[i][0] == '+')
b99933c7 4377 error ("Invalid option `%s'", argv[i]);
4291d9c8
RS
4378 else
4379 filename = argv[i];
4380 }
4381
f602c208
RK
4382 /* Checker uses the frame pointer. */
4383 if (flag_check_memory_usage)
4384 flag_omit_frame_pointer = 0;
4385
ca695ac9 4386 /* Initialize for bytecode output. A good idea to do this as soon as
0f41302f 4387 possible after the "-f" options have been parsed. */
ca695ac9
JB
4388 if (output_bytecode)
4389 {
4390#ifndef TARGET_SUPPORTS_BYTECODE
4391 /* Just die with a fatal error if not supported */
40e6003c 4392 fatal ("-fbytecode not supported for this target");
ca695ac9
JB
4393#else
4394 bc_initialize ();
4395#endif
4396 }
4397
f246a305
RS
4398 if (optimize == 0)
4399 {
a2468e45
BK
4400 /* Inlining does not work if not optimizing,
4401 so force it not to be done. */
f246a305
RS
4402 flag_no_inline = 1;
4403 warn_inline = 0;
a2468e45
BK
4404
4405 /* The c_decode_option and lang_decode_option functions set
4406 this to `2' if -Wall is used, so we can avoid giving out
4407 lots of errors for people who don't realize what -Wall does. */
4408 if (warn_uninitialized == 1)
4409 warning ("-Wuninitialized is not supported without -O");
f246a305
RS
4410 }
4411
4291d9c8
RS
4412#ifdef OVERRIDE_OPTIONS
4413 /* Some machines may reject certain combinations of options. */
4414 OVERRIDE_OPTIONS;
4415#endif
4416
d1485032
JM
4417 if (exceptions_via_longjmp == 2)
4418 {
4419#ifdef DWARF2_UNWIND_INFO
4420 exceptions_via_longjmp = ! DWARF2_UNWIND_INFO;
4421#else
4422 exceptions_via_longjmp = 1;
4423#endif
4424 }
4425
ec6c615d
RK
4426 if (profile_block_flag == 3)
4427 {
4428 warning ("`-ax' and `-a' are conflicting options. `-a' ignored.");
4429 profile_block_flag = 2;
4430 }
4431
4291d9c8
RS
4432 /* Unrolling all loops implies that standard loop unrolling must also
4433 be done. */
4434 if (flag_unroll_all_loops)
4435 flag_unroll_loops = 1;
4436 /* Loop unrolling requires that strength_reduction be on also. Silently
4437 turn on strength reduction here if it isn't already on. Also, the loop
4438 unrolling code assumes that cse will be run after loop, so that must
4439 be turned on also. */
4440 if (flag_unroll_loops)
4441 {
4442 flag_strength_reduce = 1;
4443 flag_rerun_cse_after_loop = 1;
4444 }
4445
4446 /* Warn about options that are not supported on this machine. */
4447#ifndef INSN_SCHEDULING
4448 if (flag_schedule_insns || flag_schedule_insns_after_reload)
4449 warning ("instruction scheduling not supported on this target machine");
4450#endif
4451#ifndef DELAY_SLOTS
4452 if (flag_delayed_branch)
4453 warning ("this target machine does not have delayed branches");
4454#endif
4455
4456 /* If we are in verbose mode, write out the version and maybe all the
4457 option flags in use. */
4458 if (version_flag)
4459 {
3d5cdd42 4460 print_version (stderr, "");
4291d9c8 4461 if (! quiet_flag)
3d5cdd42 4462 print_switch_values (stderr, 0, MAX_LINE, "", " ", "\n");
4291d9c8
RS
4463 }
4464
4291d9c8
RS
4465 compile_file (filename);
4466
876ac40d 4467#if !defined(OS2) && !defined(VMS) && (!defined(_WIN32) || defined (__CYGWIN32__))
4291d9c8
RS
4468 if (flag_print_mem)
4469 {
4470 char *lim = (char *) sbrk (0);
4471
4472 fprintf (stderr, "Data size %d.\n",
b61b1c91 4473 lim - (char *) &environ);
4291d9c8
RS
4474 fflush (stderr);
4475
e9a25f70 4476#ifndef __MSDOS__
4291d9c8
RS
4477#ifdef USG
4478 system ("ps -l 1>&2");
4479#else /* not USG */
4480 system ("ps v");
4481#endif /* not USG */
e9a25f70 4482#endif
4291d9c8 4483 }
876ac40d 4484#endif /* ! OS2 && ! VMS && (! _WIN32 || CYGWIN32) */
4291d9c8
RS
4485
4486 if (errorcount)
4487 exit (FATAL_EXIT_CODE);
4488 if (sorrycount)
4489 exit (FATAL_EXIT_CODE);
4490 exit (SUCCESS_EXIT_CODE);
299846f2 4491 return 0;
4291d9c8
RS
4492}
4493\f
4494/* Decode -m switches. */
4495
4496/* Here is a table, controlled by the tm.h file, listing each -m switch
4497 and which bits in `target_switches' it should set or clear.
4498 If VALUE is positive, it is bits to set.
4499 If VALUE is negative, -VALUE is bits to clear.
4500 (The sign bit is not used so there is no confusion.) */
4501
4502struct {char *name; int value;} target_switches []
4503 = TARGET_SWITCHES;
4504
4505/* This table is similar, but allows the switch to have a value. */
4506
4507#ifdef TARGET_OPTIONS
4508struct {char *prefix; char ** variable;} target_options []
4509 = TARGET_OPTIONS;
4510#endif
4511
4512/* Decode the switch -mNAME. */
4513
4514void
4515set_target_switch (name)
4516 char *name;
4517{
4518 register int j;
4519 int valid = 0;
4520
4521 for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
4522 if (!strcmp (target_switches[j].name, name))
4523 {
4524 if (target_switches[j].value < 0)
4525 target_flags &= ~-target_switches[j].value;
4526 else
4527 target_flags |= target_switches[j].value;
4528 valid = 1;
4529 }
4530
4531#ifdef TARGET_OPTIONS
4532 if (!valid)
4533 for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
4534 {
4535 int len = strlen (target_options[j].prefix);
4536 if (!strncmp (target_options[j].prefix, name, len))
4537 {
4538 *target_options[j].variable = name + len;
4539 valid = 1;
4540 }
4541 }
4542#endif
4543
4544 if (!valid)
4545 error ("Invalid option `%s'", name);
4546}
4547\f
3d5cdd42
DE
4548/* Print version information to FILE.
4549 Each line begins with INDENT (for the case where FILE is the
4550 assembler output file). */
4291d9c8 4551
3d5cdd42
DE
4552void
4553print_version (file, indent)
4554 FILE *file;
4555 char *indent;
4291d9c8 4556{
3d5cdd42
DE
4557 fprintf (file, "%s%s%s version %s", indent, *indent != 0 ? " " : "",
4558 language_string, version_string);
4559 fprintf (file, " (%s)", TARGET_NAME);
4560#ifdef __GNUC__
4561#ifndef __VERSION__
4562#define __VERSION__ "[unknown]"
4563#endif
4564 fprintf (file, " compiled by GNU C version %s.\n", __VERSION__);
4565#else
4566 fprintf (file, " compiled by CC.\n");
4567#endif
4568}
4291d9c8 4569
3d5cdd42 4570/* Print an option value and return the adjusted position in the line.
309a8875
DE
4571 ??? We don't handle error returns from fprintf (disk full); presumably
4572 other code will catch a disk full though. */
4291d9c8 4573
3d5cdd42
DE
4574int
4575print_single_switch (file, pos, max, indent, sep, term, type, name)
4576 FILE *file;
4577 int pos, max;
4578 char *indent, *sep, *term, *type, *name;
4579{
309a8875
DE
4580 /* The ultrix fprintf returns 0 on success, so compute the result we want
4581 here since we need it for the following test. */
4582 int len = strlen (sep) + strlen (type) + strlen (name);
4583
3d5cdd42 4584 if (pos != 0
309a8875 4585 && pos + len > max)
4291d9c8 4586 {
3d5cdd42
DE
4587 fprintf (file, "%s", term);
4588 pos = 0;
4291d9c8 4589 }
3d5cdd42
DE
4590 if (pos == 0)
4591 {
309a8875
DE
4592 fprintf (file, "%s", indent);
4593 pos = strlen (indent);
3d5cdd42 4594 }
309a8875
DE
4595 fprintf (file, "%s%s%s", sep, type, name);
4596 pos += len;
3d5cdd42 4597 return pos;
4291d9c8
RS
4598}
4599
3d5cdd42
DE
4600/* Print active target switches to FILE.
4601 POS is the current cursor position and MAX is the size of a "line".
4602 Each line begins with INDENT and ends with TERM.
4603 Each switch is separated from the next by SEP. */
4291d9c8 4604
3d5cdd42
DE
4605void
4606print_switch_values (file, pos, max, indent, sep, term)
4607 FILE *file;
4608 int pos, max;
4609 char *indent, *sep, *term;
4291d9c8 4610{
3d5cdd42
DE
4611 int j, flags;
4612 char **p;
4613
4614 /* Print the options as passed. */
4291d9c8 4615
3d5cdd42
DE
4616 pos = print_single_switch (file, pos, max, indent, *indent ? " " : "", term,
4617 "options passed: ", "");
4618
520e7ff5 4619 for (p = &save_argv[1]; *p != NULL; p++)
3d5cdd42
DE
4620 if (**p == '-')
4621 {
4622 /* Ignore these. */
520e7ff5
DE
4623 if (strcmp (*p, "-o") == 0)
4624 {
4625 if (p[1] != NULL)
4626 p++;
4627 continue;
4628 }
3d5cdd42
DE
4629 if (strcmp (*p, "-quiet") == 0)
4630 continue;
4631 if (strcmp (*p, "-version") == 0)
4632 continue;
4633 if ((*p)[1] == 'd')
4634 continue;
4635
4636 pos = print_single_switch (file, pos, max, indent, sep, term, *p, "");
4637 }
4638 if (pos > 0)
4639 fprintf (file, "%s", term);
4640
4641 /* Print the -f and -m options that have been enabled.
4642 We don't handle language specific options but printing argv
4643 should suffice. */
4644
4645 pos = print_single_switch (file, 0, max, indent, *indent ? " " : "", term,
4646 "options enabled: ", "");
4291d9c8
RS
4647
4648 for (j = 0; j < sizeof f_options / sizeof f_options[0]; j++)
4649 if (*f_options[j].variable == f_options[j].on_value)
3d5cdd42
DE
4650 pos = print_single_switch (file, pos, max, indent, sep, term,
4651 "-f", f_options[j].string);
4291d9c8 4652
3d5cdd42 4653 /* Print target specific options. */
4291d9c8 4654
3d5cdd42 4655 flags = target_flags;
4291d9c8
RS
4656 for (j = 0; j < sizeof target_switches / sizeof target_switches[0]; j++)
4657 if (target_switches[j].name[0] != '\0'
4658 && target_switches[j].value > 0
4659 && ((target_switches[j].value & target_flags)
4660 == target_switches[j].value))
3d5cdd42
DE
4661 {
4662 pos = print_single_switch (file, pos, max, indent, sep, term,
4663 "-m", target_switches[j].name);
4664 flags &= ~ target_switches[j].value;
4665 }
4666
4667#ifdef TARGET_OPTIONS
4668 for (j = 0; j < sizeof target_options / sizeof target_options[0]; j++)
4669 if (*target_options[j].variable != NULL)
4670 {
4671 char prefix[256];
4672 sprintf (prefix, "-m%s", target_options[j].prefix);
4673 pos = print_single_switch (file, pos, max, indent, sep, term,
4674 prefix, *target_options[j].variable);
4675 }
4676#endif
4291d9c8 4677
3d5cdd42 4678 fprintf (file, "%s", term);
4291d9c8 4679}
9a666dda
JM
4680
4681/* Record the beginning of a new source file, named FILENAME. */
4682
4683void
4684debug_start_source_file (filename)
4685 register char *filename;
4686{
4687#ifdef DBX_DEBUGGING_INFO
4688 if (write_symbols == DBX_DEBUG)
4689 dbxout_start_new_source_file (filename);
4690#endif
4691#ifdef DWARF_DEBUGGING_INFO
4692 if (debug_info_level == DINFO_LEVEL_VERBOSE
4693 && write_symbols == DWARF_DEBUG)
4694 dwarfout_start_new_source_file (filename);
4695#endif /* DWARF_DEBUGGING_INFO */
4696#ifdef DWARF2_DEBUGGING_INFO
4697 if (debug_info_level == DINFO_LEVEL_VERBOSE
4698 && write_symbols == DWARF2_DEBUG)
4699 dwarf2out_start_source_file (filename);
4700#endif /* DWARF2_DEBUGGING_INFO */
cc694a81
DE
4701#ifdef SDB_DEBUGGING_INFO
4702 if (write_symbols == SDB_DEBUG)
4703 sdbout_start_new_source_file (filename);
4704#endif
9a666dda
JM
4705}
4706
4707/* Record the resumption of a source file. LINENO is the line number in
4708 the source file we are returning to. */
4709
4710void
4711debug_end_source_file (lineno)
4712 register unsigned lineno;
4713{
4714#ifdef DBX_DEBUGGING_INFO
4715 if (write_symbols == DBX_DEBUG)
4716 dbxout_resume_previous_source_file ();
4717#endif
4718#ifdef DWARF_DEBUGGING_INFO
4719 if (debug_info_level == DINFO_LEVEL_VERBOSE
4720 && write_symbols == DWARF_DEBUG)
4721 dwarfout_resume_previous_source_file (lineno);
4722#endif /* DWARF_DEBUGGING_INFO */
4723#ifdef DWARF2_DEBUGGING_INFO
4724 if (debug_info_level == DINFO_LEVEL_VERBOSE
4725 && write_symbols == DWARF2_DEBUG)
4726 dwarf2out_end_source_file ();
4727#endif /* DWARF2_DEBUGGING_INFO */
cc694a81
DE
4728#ifdef SDB_DEBUGGING_INFO
4729 if (write_symbols == SDB_DEBUG)
4730 sdbout_resume_previous_source_file ();
4731#endif
9a666dda
JM
4732}
4733
4734/* Called from check_newline in c-parse.y. The `buffer' parameter contains
4735 the tail part of the directive line, i.e. the part which is past the
4736 initial whitespace, #, whitespace, directive-name, whitespace part. */
4737
4738void
4739debug_define (lineno, buffer)
4740 register unsigned lineno;
4741 register char *buffer;
4742{
4743#ifdef DWARF_DEBUGGING_INFO
4744 if (debug_info_level == DINFO_LEVEL_VERBOSE
4745 && write_symbols == DWARF_DEBUG)
4746 dwarfout_define (lineno, buffer);
4747#endif /* DWARF_DEBUGGING_INFO */
4748#ifdef DWARF2_DEBUGGING_INFO
4749 if (debug_info_level == DINFO_LEVEL_VERBOSE
4750 && write_symbols == DWARF2_DEBUG)
4751 dwarf2out_define (lineno, buffer);
4752#endif /* DWARF2_DEBUGGING_INFO */
4753}
4754
4755/* Called from check_newline in c-parse.y. The `buffer' parameter contains
4756 the tail part of the directive line, i.e. the part which is past the
4757 initial whitespace, #, whitespace, directive-name, whitespace part. */
4758
4759void
4760debug_undef (lineno, buffer)
4761 register unsigned lineno;
4762 register char *buffer;
4763{
4764#ifdef DWARF_DEBUGGING_INFO
4765 if (debug_info_level == DINFO_LEVEL_VERBOSE
4766 && write_symbols == DWARF_DEBUG)
4767 dwarfout_undef (lineno, buffer);
4768#endif /* DWARF_DEBUGGING_INFO */
4769#ifdef DWARF2_DEBUGGING_INFO
4770 if (debug_info_level == DINFO_LEVEL_VERBOSE
4771 && write_symbols == DWARF2_DEBUG)
4772 dwarf2out_undef (lineno, buffer);
4773#endif /* DWARF2_DEBUGGING_INFO */
4774}
This page took 1.164172 seconds and 5 git commands to generate.