Annotation of GNUtools/cc/toplev.c, revision 1.1

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

unix.superglobalmegacorp.com

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