Annotation of gcc/toplev.c, revision 1.1.1.8

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.