Annotation of gcc/toplev.c, revision 1.1.1.7

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

unix.superglobalmegacorp.com

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