* Check in merge from gcc2. See ChangeLog.11 and ChangeLog.12

for details.

        * haifa-sched.c: Mirror recent changes from gcc2.

From-SVN: r18984
This commit is contained in:
Jeff Law 1998-04-04 06:32:39 -07:00
parent 31031eddac
commit e5e809f419
133 changed files with 3622 additions and 2106 deletions

View File

@ -1,3 +1,10 @@
Sat Apr 4 10:23:41 1998 Jeffrey A Law (law@cygnus.com)
* Check in merge from gcc2. See ChangeLog.11 and ChangeLog.12
for details.
* haifa-sched.c: Mirror recent changes from gcc2.
Fri Apr 3 00:17:01 1998 Jeffrey A Law (law@cygnus.com)
* Makefile.in (insn*.o): Depend on system.h.

View File

@ -1,42 +1,3 @@
Wed Jan 7 18:02:42 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Version 2.8.0 released.
Wed Jan 7 17:54:41 1998 J. Kean Johnston <jkj@sco.com>
* i386/sco5.h ({END,START}FILE_SPEC): Link with correct crtbegin.o
and crtend.o when using -static.
Wed Jan 7 17:49:14 1998 Jan Christiaan van Winkel <Jan.Christiaan.van.Winkel@ATComputing.nl>
* cppexp.c (gansidecl.h): Include.
Wed Jan 7 17:45:07 1998 Tristan Gingold <gingold@puccini.enst.fr>
* expr.c (get_push_address): Use copy_to_reg instead of force_operand.
(emit_push_insn): Avoid null pointer deference if aggregate has no
types.
(expand_expr): Avoid finite but useless recursion.
(expand_builtin): Fix typo in calling function.
* function.c (assign_parms): Avoid useless call to chkr_set_right.
Wed Jan 7 17:31:13 1998 Christian Iseli <Christian.Iseli@lslsun.epfl.ch>
* combine.c (force_to_mode): Return if operand is a CLOBBER.
Wed Jan 7 17:23:24 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* x-rs6000 (INSTALL): Remove.
* jump.c (jump_optimize): Don't use a hard reg as an operand
of a conditional move if small register classes.
Wed Jan 7 17:09:28 1998 Jim Wilson <wilson@cygnus.com>
* cse.c (max_insn_uid): New variable.
(cse_around_loop): Use it.
(cse_main): Set it.
Wed Dec 31 18:40:26 1997 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* stmt.c (expand_asm_operands): Treat ASM with no outputs as volatile.

999
gcc/ChangeLog.12 Normal file
View File

@ -0,0 +1,999 @@
Mon Mar 30 13:56:30 1998 Jim Wilson <wilson@cygnus.com>
* mips/ultrix.h (SUBTARGET_CPP_SPEC): Define.
Wed Mar 25 16:09:01 1998 Michael Meissner <meissner@cygnus.com>
* rs6000.h (FUNCTION_ARG_PADDING): Cast result to be enum
direction.
(function_arg_padding): Declare.
* rs6000.c: Include stdlib.h if we have it.
(function_arg_padding): Change return type to int, cast enum's to
int.
(From Kaveh R. Ghazi <ghazi@caip.rutgers.edu>)
* rs6000.c (rs6000_override_options): Change type of `i', `j' and
`ptt_size' from int to size_t.
(rs6000_file_start): Likewise for `i'.
(rs6000_replace_regno): Add default case in enumeration switch.
(output_epilog): Remove unused variable `i'.
(rs6000_longcall_ref): Remove unused variables `len', `p', `reg1'
and `reg2'.
* rs6000.h (ADDITIONAL_REGISTER_NAMES): Add missing braces around
initializer.
(get_issue_rate, non_logical_cint_operand): Add prototype.
(rs6000_output_load_toc_table): Ditto.
* rs6000.md (udivmodsi4): Add explicit braces to avoid ambiguous
`else'.
Wed Mar 25 02:39:01 1998 Paul Eggert <eggert@twinsun.com>
* configure.in (i[[34567]]86-*-solaris2*, powerpcle-*-solaris2*,
sparc-*-solaris2*): Use fixinc.svr4 if Solaris 2.0 through 2.4.
Mon Mar 23 07:27:19 1998 Philippe De Muyter <phdm@macqel.be>
* m68k.md (ashldi_const): Allow shift count in range ]32,63].
(ashldi3): Allow constant shift count in range ]32,63].
(ashrdi_const, ashrid3, lshrdi_const, lshrdi3): Likewise.
* m68k.md (zero_extend[qh]idi2, iordi_zext): New patterns.
(zero_extendsidi2): Avoid useless copy.
(iorsi_zexthi_ashl16): Avoid "0" constraint for operand 2.
(iorsi_zext): New name for old unnamed pattern; indentation fixes.
Mon Mar 23 07:12:05 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* final.c (only_leaf_regs_used): If pic_offset_table_rtx used,
make sure it is a permitted register.
Sun Mar 22 06:57:04 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* expmed.c (extract_bit_field): Don't confuse SUBREG_WORD with
endian adjustment in SUBREG case.
Don't abort if can't make SUBREG needed for extv/extzv.
Sat Mar 21 08:02:17 1998 Richard Gorton <gorton@amt.tay1.dec.com>
* alpha.md (zero_extendqi[hsd]i2): Use "and", not "zapnot".
Sat Mar 21 07:47:04 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* unroll.c (verify_addresses): Use validate_replace_rtx.
(find_splittable_givs): If invalid address, show nothing same_insn.
Fri Mar 20 10:24:12 1998 Philippe De Muyter <phdm@macqel.be>
* fold-const.c (fold, case CONVERT_EXPR): Replace sign-extension of
a zero-extended value by a single zero-extension.
Thu Mar 19 14:59:32 1998 Andrew Pochinsky <avp@ctp.mit.edu>
* sparc.h (ASM_OUTPUT_LOOP_ALIGN): Fix error in last change.
Thu Mar 19 14:48:35 1998 Michael Meissner <meissner@cygnus.com>
* gcc.c (default_arg): Don't wander off the end of allocated memory.
* rs6000/sysv4.h (RELATIVE_PREFIX_NOT_LINKDIR): Undef for System V
and EABI.
Thu Mar 19 06:17:59 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Makefile.in (toplev.o): Depend on Makefile.
Wed Mar 18 17:40:09 1998 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
* expr.c (convert_move): Add [QH]Imode/P[QH]Imode conversions.
* machmode.def (PQImode, PHImode): New modes.
Wed Mar 18 17:11:18 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* m68k.md (movsf+1): Optimize moving a CONST_DOUBLE zero.
Wed Mar 18 17:07:54 1998 Ken Raeburn <raeburn@cygnus.com>
* regclass.c (init_reg_sets): Delete init of reg-move cost tables.
(init_reg_sets_1): Put it here.
Wed Mar 18 16:43:11 1998 Jim Wilson <wilson@cygnus.com>
* i960.md (tablejump): Handle flag_pic.
* profile.c (branch_prob): If see computed goto, call fatal.
* calls.c (expand_call): Fix typos in n_named_args computation.
Wed Mar 18 05:54:25 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* fold-const.c (operand_equal_for_comparison_p): See if equal
when nop conversions are removed.
* expr.c (expand_expr, case COND_EXPR): If have conditional move,
don't use ORIGINAL_TARGET unless REG.
* function.c (fixup_var_refs_insns): Also delete insn storing pseudo
back into arg list.
* combine.c (gen_binary): Don't make AND that does nothing.
(simplify_comparison, case AND): Commute AND and SUBREG.
* i386.h (CONST_CONSTS, case CONST_INT): One-byte integers are cost 0.
Mon Mar 16 15:57:17 1998 Geoffrey Keating <geoffk@ozemail.com.au>
* rs6000.c (small_data_operand): Ensure any address referenced
relative to small data area is inside SDA.
Sun Mar 15 16:01:19 1998 Andrew Pochinsky <avp@ctp.mit.edu>
* sparc.h (ASM_OUTPUT_LOOP_ALIGN): Write nop's.
Sun Mar 15 15:53:39 1998 Philippe De Muyter <phdm@macqel.be>
* libgcc2.c (exit): Don't call __bb_exit_func if HAVE_ATEXIT.
Sun Mar 15 15:44:41 1998 Paul Eggert <eggert@twinsun.com>
* cccp.c: Fix bugs relating to NUL in input file name,
e.g. with `#line 2 "x\0y"'.
(PRINTF_PROTO_4): New macro.
(struct {file_buf,definition,if_stack}): New member nominal_fname_len.
(main, expand_to_temp_buffer): Store length of input file names.
(finclude, create_definition, do_line, conditional_skip): Likewise.
(skip_if_group, macroexpand): Likewise.
(make_{definition,undef,assertion}): Likewise.
(special_symbol, do_include): Use stored length of input file names.
(do_define, do_elif, do_else, output_line_directive, verror): Likewise.
(error_from_errno, vwarning, verror_with_line): Likewise.
(vwarning_with_line, pedwarn_with_file_and_line): Likewise.
(print_containing_files): Likewise.
(do_line): Fix off-by-1 problem: 1 too many bytes were being allocated.
(quote_string, pedwarn_with_file_and_line): New arg specifies length.
All callers changed.
Sun Mar 15 15:38:16 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* c-typeck.c: Collect pending initializers in AVL tree instead of list.
(add_pending_init, pending_init_member): New functions.
(output_init_element): Use them.
(output_pending_init_elements): Rewritten to exploit AVL order.
Sun Mar 15 05:10:49 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* gnu.h (GNU_CPP_PREDEFINES): Deleted; not valid in traditional C.
* {i386,mips}/gnu.h (CPP_PREDEFINES): Don't call GNU_CPP_PREDEFINES.
* flow.c (insn_dead_p): A CLOBBER of a dead pseudo is dead.
* alpha.h (REG_ALLOC_ORDER): Put $f1 after other nonsaved.
* sparc.c (sparc_type_code): Fix error in previous change.
Sat Mar 14 05:45:21 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* i386/xm-aix.h, i386/xm-osf.h (i386/xm-i386.h): Don't include.
(USG): Don't define.
* i386/xm-isc.h (i386/xm-sysv3.h): Don't include.
* i386/xm-sco.h (i386/xm-sysv3.h): Likewise.
(BROKEN_LDEXP, SMALL_ARG_MAX, NO_SYS_SIGLIST): Don't define.
* m68k/xm-3b1.h (m68k/xm-m68k.h): Don't include.
(USG): Don't define.
* m68k/xm-atari.h (m68k/xm-m68kv.h): Don't include.
(HAVE_VPRINTF, FULL_PROTOTYPES): Don't define.
* m68k/xm-crds.h (m68k/xm-m68k.h): Don't include.
(USE_C_ALLOCA, unos, USG): Don't define.
* m68k/xm-mot3300.h (m68k/xm-m68k.h): Don't include.
(USE_C_ALLOCA, NO_SYS_SIGLIST): Don't define.
* m68k/xm-plexus.h (m68k/xm-m68k.h): Don't include.
(USE_C_ALLOCA, USG): Don't define.
* m88k/xm-sysv3.h (m88k/xm-m88k.h): Don't include.
* m68k/xm-next.h (m68k/xm-m68k.h): Don't include.
* ns32k/xm-pc532-min.h (ns32k/xm-ns32k.h): Don't include.
(USG): Don't define.
* rs6000/xm-mach.h: Don't include xm-rs6000.h.
* rs6000/xm-cygwin32.h (rs6000/xm-rs6000.h): Don't include.
(NO_STAB_H): Don't define.
* sparc/xm-linux.h (xm-linux.h): Don't include.
* sparc/xm-sol2.h (sparc/xm-sysv4.h): Don't include.
* a29k/xm-unix.h, alpha/xm-linux.h, arm/xm-linux.h: Deleted.
* arm/xm-netbsd.h, i386/xm-bsd386.h, i386/xm-gnu.h: Deleted.
* i386/xm-linux.h, i386/xm-sun.h, i386/xm-sysv3.h: Deleted.
* i386/xm-winnt.h, m68k/xm-altos3068.h, m68k/xm-amix.h: Deleted.
* m68k/xm-amix.h, m68k/xm-hp320.h, m68k/xm-linux.h: Deleted.
* m68k/xm-m68kv.h, mips/xm-iris5.h, ns32k/xm-genix.h: Deleted.
* sparc/xm-pbd.h, vax/xm-vaxv.h, xm-svr3.h, xm-linux.h: Deleted.
* configure.in: Reflect above changes.
* xm-siglist.h, xm-alloca.h: New files.
* i386/xm-sysv4.h (i386/xm-i386.h, xm-svr4.h): Don't include.
(USE_C_ALLOCA, SMALL_ARG_MAX): Don't define.
* i386/xm-sco5.h (i386/xm-sysv3.h): Don't include.
(SYS_SIGLIST_DECLARED, USE_C_ALLOCA): Don't define.
* rs6000/xm-sysv4.h, sparc/xm-sysv4.h: Don't include xm-svr4.h.
* xm-svr4.h, i386/xm-dgux.h, mips/xm-news.h, mips/xm-sysv4.h: Deleted.
* configure.in: Reflect above changes.
* configure.in ({,host_,build_}xm_defines): New variables.
Set to USG instead of including xm-usg.h.
Write #define lines in config.h files from xm_defines vars.
* xm-usg.h: Deleted.
Fri Mar 13 07:10:59 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* calls.c (expand_call): Fix typo in previous change.
* sparc.c (sparc_type_code): Avoid infinite loop when have
pointer to array of same pointer.
(sparc_type_code, case REAL_TYPE): Process subtypes here too.
* mips/bsd-4.h, mips/iris3.h, mips/news{4,5}.h: Don't include mips.h.
* mips/news5.h, mips/osfrose.h, mips/svr{3,4}-4.h: Likewise.
* mips/ultrix.h: Likewise.
* mips/cross64.h: Don't include iris6.h.
* mips/ecoff.h: Don't include mips.h or gofast.h.
* mips/elforion.h: Don't include elf64.h.
* mips/iris4.h: Don't include iris3.h.
* mips/iris4loser.h: Don't include iris4.h.
* mips/iris5gas.h: Don't include iris5.h.
* mips/elflorion.h, mips/nws3250v4.h, mips/xm-iris{3,4}.h: Deleted.
* mips/xm-nws3250v4.h, mips/xm-sysv.h: Deleted.
* mips/rtems64.h: Don't include elflorion.h.
* mips/sni-gas.h: Don't include sni-svr4.h.
* mips/svr4-t.h: Don't include svr4-5.h.
* mips/dec-osf1.h: Also include mips.h.
* mips/ecoffl.h, mips/elf.h: Also include mips.h and gofast.h.
* mips/iris5.h: Also include iris3.h and mips.h.
* xm-usg.h: New file.
* mips/xm-iris5.h: Don't include xm-mips.h; don't define USG.
* mips/xm-news.h, mips/xm-sysv4.h: Don't include xm-sysv.h.
* configure.in: Reflect above changes.
Thu Mar 12 07:18:48 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* expr.h (STRICT_ARGUMENT_NAMING): Provide default value of 0.
* calls.c (expand_call): Use value of STRICT_ARGUMENT_NAMING.
* function.c (assign_parm): Likewise.
* mips/abi64.h (STRICT_ARGUMENT_NAMING): Return 0 for ABI_32.
* sparc.h (STRICT_ARGUMENT_NAMING): Only nonzero for V9.
* calls.c (expand_call, expand_library_call{,_value}, store_one_arg):
Rework handling of REG_PARM_STACK_SPACE to treat return value of
zero as if macro not defined; add new arg to emit_push_insn.
* expr.c (emit_push_insn): New arg, REG_PARM_STACK_SPACE.
* expr.h (emit_push_insn): Likewise.
* mips/abi64.h (REG_PARM_STACK_SPACE): Define.
Wed Mar 11 06:58:13 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* m68k.h (CONST_OK_FOR_LETTER_P, case 'M'): Correct range check.
Wed Mar 11 06:15:52 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* expr.c (emit_push_insn): Use loop to find movstr patterns
instead of explicit tests.
* Makefile.in (extraclean): Don't delete install1.texi.
Tue Mar 10 14:27:51 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* combine.c (make_field_assignment): Don't get confused if OTHER
has VOIDmode and don't do anything if DEST is wider than a host word.
* vax.c (check_float_value): Cast bcopy args to char *.
Tue Mar 10 13:56:12 1998 Jim Wilson <wilson@cygnus.com>
* mips/abi64.h (LONG_MAX_SPEC): Check MIPS_ABI_DEFAULT and
TARGET_DEFAULT and define __LONG_MAX__ appropriately.
Add support for -mabi=X, -mlong64, and -mgp{32,64} options.
* mips.c (mips_abi): Change type to int.
* mips.h (enum mips_abi_type): Delete.
(ABI_32, ABI_N32, ABI_64, ABI_EABI): Define as constants.
(mips_abi): Change type to int.
Mon Mar 2 08:06:58 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Version 2.8.1 released.
* Makefile.in (mostlyclean): Remove duplicate deletion of temp
files. Delete more stamp files and [df]p-bit.c
(clean): Don't delete stamp files here.
(VERSION_DEP): New variable.
(distdir-finish): Pass a value of null for it.
(version.c): Use it.
Avoid broken pipe with cvs log.
* objc/Make-lang.in (objc/runtime-info.h): Rename emptyfile to
tmp-runtime and delete at end.
Sun Mar 1 05:50:25 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree.c (build_reference_type): Handle obstacks like
build_pointer_type.
* Makefile.in (tmp-gcc.xtar): Renamed from gcc.xtar.
(gcc.xtar.gz): Deleted; merged with `dist'.
(diff): Create gcc-$(oldversion)-$(version).diff.
(distdir): Depend on distdir-cvs.
(distdir-cvs): New rule.
(distdir-start): Depend on version.c and TAGS.
(TAGS): Use tmp-tags instead of temp.
(dist): Create gcc-$(version).tar.gz.
* varasm.c (compare_constant_1): Fix typo in previous change.
* objc/Make-lang.in (objc-distdir): Properly rebuild objc-parse.c.
Sat Feb 28 16:58:08 1998 Tristan Gingold <gingold@rossini.enst.fr>
* stmt.c (expand_decl): If -fcheck-memory-usage, put vars in memory.
* expr.c (get_memory_usage_from_modifier): Convert
EXPAND_{CONST_ADDRESS, INITIALIZER} to MEMORY_USE_DONT.
Sat Feb 28 08:13:43 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* i860/fx2800.h (DATA_ALIGNMENT): Use POINTER_TYPE_P.
* m68k/a-ux.h (FUNCTION_VALUE): Likewise.
* expr.c (get_pointer_alignment, compare, do_store_flag): Likewise.
(expand_builtin): Likewise.
* fold-const.c (force_fit_type, fold_convert, fold): Likewise.
* function.c (assign_parms): Likewise.
* integrate.c (expand_inline_function): Likewise.
* sdbout.c (sdbout_field_types): Likewise.
* tree.c (integer_pow2p, tree_log2, valid_machine_attribute): Likewise.
* stmt.c (expand_decl): Likewise.
({,bc_}expand_decl_init): Also test for REFERENCE_TYPE.
* configure.in (version_dep): New variable; if srcdir is CVS working
directory, set to ChangeLog.
(version): Supply default if no version.c.
* Makefile.in (version.c): New rule.
* gcc.c (snapshot_warning): New function.
(main): Call it for snapshots.
* dwarf2out.c (expand_builtin_dwarf_reg_size): If reg_raw_mode
not valid for reg, use last size. Also refine range assertion.
Sat Feb 28 05:04:47 1998 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
* enquire.c (cprop): Don't perform exhaustive search for char_min
and char_max when bits_per_byte > 16.
Thu Feb 26 15:12:03 1998 Christopher Taylor <cit@ckshq.com>
* fixincludes: Avoid using '0-~' in egrep.
Thu Feb 26 08:04:05 1998 Tristan Gingold <gingold@messiaen.enst.fr>
* function.c (assign_parms): Call 'chkr_set_right' when DECL_RTL
is stack_parm.
* expr.c (get_memory_usage_from_modifier): Convert
EXPAND_{SUM, CONST_ADDRESS, INITIALIZER} to MEMORY_USE_RO.
Thu Feb 26 07:33:53 1998 Paul Eggert <eggert@twinsun.com>
* c-lex.c (yylex): Don't munge errno before using it.
* cccp.c (error_from_errno, perror_with_name): Likewise.
* cpplib.c (cpp_error_from_errno): Likewise.
* gcc.c (pfatal_pexecute): Likewise.
* protoize.c (safe_write, find_file, process_aux_info_file): Likewise.
(rename_c_file, edit_file): Likewise.
* c-lex.c (yylex): Remove unused variable exceeds_double.
Thu Feb 26 07:05:14 1998 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
* reorg.c (fill_slots_from_thread): Don't steal delay list from target
if condition code of jump conflicts with opposite_needed.
Thu Feb 26 06:45:23 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Makefile.in (distdir-start): Don't copy CVS subdirectory of config.
* varasm.c ({compare,record}_constant_1, case CONSTRUCTOR):
Handle the case when we have TREE_PURPOSE values.
Thu Feb 26 05:59:01 1998 Philippe De Muyter <phdm@macqel.be>
* fixincludes (sys/limits.h): Fix a nested comment problem with
HUGE_VAL definition on sysV68 R3V7.1.
Wed Feb 25 21:09:38 1998 Philippe De Muyter <phdm@macqel.be>
* toplev.c (TICKS_PER_SECOND): Renamed from CLOCKS_PER_SECOND.
Wed Feb 25 20:50:08 1998 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
* reorg.c (fill_slots_from_thread): Mark resources referenced in
opposite_needed thread. Return delay_list even when cannot get
any more delay insns from end of subroutine.
Wed Feb 25 19:50:01 1998 Mikael Pettersson <Mikael.Pettersson@sophia.inria.fr>
* gcc.c (lookup_compiler): Remove redundant test.
Wed Feb 25 07:24:22 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* vax.md (call insns): Second operand to CALL rtl is SImode.
* configure.in (i[34567]86-*-mingw32): Support msv and crt suffix.
* i386/crtdll.h: New file.
* sparc.c (pic_setup_code): If -O0, write USE of pic_offset_table_rtx.
* expr.c (safe_from_p): Add new arg, TOP_P; all callers changed.
Sat Feb 21 07:02:39 1998 Jim Wilson <wilson@cygnus.com>
* mips/iris5.h (DWARF2_UNWIND_INFO): Define to 0.
* mips/iris5gas.h (DWARF2_UNWIND_INFO): Define to 1.
Fri Feb 20 08:27:46 1998 Paul Eggert <eggert@twinsun.com>
* sparc/sol2-sld.h: New file.
* configure.in (sparc-*-solaris2*): Use it when using system linker.
* toplev.c (main): Don't default to DWARF2_DEBUG with -ggdb
if LINKER_DOES_NOT_WORK_WITH_DWARF2 is defined.
Fri Feb 20 08:21:49 1998 H.J. Lu (hjl@gnu.org)
* alpha/elf.h (STARTFILE_SPEC, ENDFILE_SPEC): Support shared library.
(LIB_SPEC, DEFAULT_VTABLE_THUNKS): Defined #ifndef USE_GNULIBC_1.
* sparc/linux.h (DEFAULT_VTABLE_THUNKS): Likewise.
(LIB_SPEC): Add -lc for -shared #ifndef USE_GNULIBC_1.
* linux.h (LIB_SPEC): Likewise.
* sparc/linux64.h (LIB_SPEC): Likewise; also updated for glibc 2.
(LIBGCC_SPEC): Removed.
(CPP_SUBTARGET_SPEC): Add %{pthread:-D_REENTRANT}.
Fri Feb 20 05:22:12 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Makefile.in (distdir-start): Add dependence on bi-parser.[ch].
Thu Feb 19 18:07:11 1998 Jim Wilson <wilson@cygnus.com>
* m68k.h (TARGET_SWITCHES): For 68000, 68302, subtract MASK_68881.
For 68303, 68332, cpu32, subtract MASK_68040_ONLY.
Wed Feb 18 09:37:29 1998 Paul Eggert <eggert@twinsun.com>
* fixincludes (stdlib.h): Do not double-wrap the size_t typedef.
Wed Feb 18 07:32:11 1998 Jim Wilson <wilson@cygnus.com>
* i960.c (emit_move_sequence): Handle unaligned stores to pseudos.
* i960.md (store_unaligned_[dt]i_reg): Handle register dest.
(store_unaligned_ti_reg): Likewise.
* m68k.h (MACHINE_STATE_{SAVE,RESTORE} [MOTOROLA]): Add %# and %/;
add : to make them into extended asms.
Wed Feb 18 07:08:05 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* reg-stack.c (compare_for_stack_reg): Only handle FP conditional
move as next insn specially.
* reload.c (find_reloads): Always convert address reload for
non-reloaded operand to RELOAD_FOR_OPERAND_ADDRESS.
* emit-rtl.c (hard-reg-set.h): Include.
(get_lowpart_common): Don't make new REG for hard reg in a
class that cannot change size.
* Makefile.in (emit-rtl.o): Depend on hard-reg-set.h.
Sat Feb 14 09:59:00 1998 Richard Earnshaw (rearnsha@arm.com)
* arm.md (movsfcc): Also validate operands[3] for hard float.
(movdfcc): Only accept fpu_add_operand for operands[3].8
Sat Feb 14 09:32:34 1998 Jim Wilson <wilson@cygnus.com>
* dwarf2out.c (expand_builtin_dwarf_reg_size): New variable mode.
Convert CCmode to word_mode before calling GET_MODE_SIZE.
Sat Feb 14 09:27:42 1998 David Edelsohn <edelsohn@mhpcc.edu>
* rs6000.h (MY_ISCOFF): Check for U803XTOCMAGIC.
Sat Feb 14 08:29:43 1998 Arvind Sankar <arvind@cse.iitb.ernet.in>
* t-svr4 (TARGET_LIBGCC_CFLAGS): New definition.
Sat Feb 14 07:45:16 1998 Ken Rose (rose@acm.org)
* reorg.c (fill_slots_from_thread): New parameter, delay_list.
All callers changed.
Sat Feb 14 07:14:02 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* reload.c (debug_reload): Properly output insn codes.
* pa.c (emit_move_sequence): If in reload, call find_replacement.
* gansidecl.h (bcopy, bzero, {,r}index): Don't define if IN_LIBGCC2.
* combine.c (distribute_notes, case REG_DEAD): When seeing if place
to put new note sets register, use reg_bitfield_target_p, as in
original code.
* gcc.c (process_command): If file is for linker, set lang to "*".
(lookup_compiler): Return 0 for language of "*".
* sched.c (attach_deaths, case SUBREG): Fix error in last change.
* i386.md (mov[sdx]fcc): Disable for now.
(mov[sd]fcc_1): Add earlyclobber for output on last alternative.
Sat Feb 14 06:42:50 1998 Jason Merrill <jason@yorick.cygnus.com>
* except.c (get_dynamic_handler_chain): Only make call once per func.
(expand_fixup_region_{start,end}): New functions.
(expand_eh_region_start_tree): Store cleanup into finalization here.
* stmt.c (expand_cleanups): Use new functions to protect fixups.
* except.c (get_dynamic_handler_chain): Build up a FUNCTION_DECL.
* optabs.c (init_optabs): Don't init get_dynamic_handler_chain_libfunc.
* expr.h (get_dynamic_handler_chain_libfunc): Deleted.
Sat Feb 14 06:34:41 1998 Peter Lawrence <Peter.Lawrence@Eng.Sun.COM>
* optabs.c (emit_conditional_move): Don't reverse condition for FP.
Fri Feb 13 07:22:04 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Makefile.in (mostlyclean): Only use s-* convention for stamp
files in main dir.
* configure.in: Add support for i786 (Pentium II); same as i686.
Thu Feb 12 20:16:35 1998 Michael Meissner <meissner@cygnus.com>
* rs6000.md: Replace gen_rtx (CONST_INT,...) with GEN_INT.
Thu Feb 12 10:08:14 1998 John Hassey <hassey@dg-rtp.dg.com>
* configure.in (i[3456]86-dg-dgux*): Don't need fixincludes.
Thu Feb 12 07:27:39 1998 Mumit Khan <khan@xraylith.wisc.edu>
* i386/cygwin32.h (NO_IMPLICIT_EXTERN_C): Define.
about system headers.
(LIB_SPEC): Add -ladvapi32 -lshell32.
Thu Feb 12 07:19:31 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* expr.c (expand_assignment): Fix typo in checking OFFSET.
* gbl-ctors.h (atexit): Don't define unless needed.
* combine.c (distribute_notes): Completely check for note operand being
only partially set on potential note target; adjust what notes
we make in that case.
* i386/xm-go32.h (HAVE_{BCOPY,BZERO,INDEX,RINDEX}): Deleted.
Wed Feb 11 08:53:27 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* calls.c (emit_call_1): Size args now HOST_WIDE_INT.
(expand_call): struct_value_size now HOST_WIDE_INT.
Tue Feb 10 09:04:39 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* integrate.c (initialize_for_inline): Ensure DECL_INCOMING_RTL
is always copied.
Tue Feb 10 06:10:49 1998 Paul Eggert <eggert@twinsun.com>
* cccp.c (rescan): Fix bug with macro name appearing
immediately after L'x'.
Mon Feb 9 20:45:32 1998 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* c-common.c (format_char_info): Add new field zlen.
(print_char_table): Remove entry for 'Z' as a format character.
Initialize zlen field as appropriate.
(scan_char_table): Set zlen field to NULL in each entry.
(check_format_info): Recognize 'Z' as a length modifier, with a
warning in pedantic mode.
Avoid infinite loop when a repeated flag character is detected.
Mon Feb 9 09:24:04 1998 Paul Eggert <eggert@twinsun.com>
* c-parse.in (primary): Minor wording fix in diagnostic.
Mon Feb 9 07:50:19 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* c-decl.c (grokdeclarator): Remove warning on inline of varargs.
* reload.c (find_reloads): Check for const_to_mem case before
checking for invalid reload; use force_const_mem if no_input_reloads.
* function.c (push_function_context_to): Call init_emit last.
* protoize.c (my_link): Define as -1 in mingw32.
(link): Remove declaration.
* rs6000.c (setup_incoming_varargs): Always set rs6000_sysv_varargs_p.
* integrate.c (expand_inline_function): Clear label_map with bzero.
* unroll.c (copy_loop_body, case JUMP_INSN): Correct error in last
change: call single_set on COPY, not INSN.
Sun Feb 8 08:07:37 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* msdos/top.sed, winnt/config-nt.sed: Change version number to 2.8.1.
* configure.in (i[3456]86-*-sco3.2v5*): Use cpio for headers.
Sat Feb 7 07:32:46 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* i386/mingw32.h (LIBGCC_SPEC, STARTFILE_SPEC, MATH_LIBRARY):
Use msvcrt, not crtdll.
Fri Feb 6 20:32:06 1998 Geert Bosch <bosch@gnat.com>
* i386/xm-os2.h (EMX, USG, BSTRING, HAVE_{PUTENV,VPRINTF,STRERROR}):
Define ifdef __EMX__.
(strcasecmp): Define to be stricmp if __EMX__.
(spawnv{,p}): Don't define if EMX.
(OBJECT_SUFFIX): Don't define if EMX.
(MKTEMP_EACH_FILE): Define.
Fri Feb 6 16:37:29 1998 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* objc/Make-lang.in (objc.stage1): Depend on stage1-start.
(objc.stage2, objc.stage3, objc.stage4): Likewise for the
respective stageN-start targets.
(objc/sendmsg.o): Depend on objc/runtime-info.h.
Fri Feb 6 16:27:09 1998 Bernd Schmidt <crux@Pool.Informatik.RWTH-Aachen.DE>
* stmt.c (expand_asm_operands): Properly treat asm statement
statements with no operands as volatile.
Fri Feb 6 16:03:25 1998 Greg McGary <gkm@gnu.org>
* c-decl.c (pushdecl): Set DECL_ORIGINAL_TYPE once only.
Fri Feb 6 15:57:36 1998 Mumit Khan <khan@xraylith.wisc.edu>
* i386/cygwin32.h (STRIP_NAME_ENCODING): New macro.
Fri Feb 6 15:50:42 1998 Paul Eggert <eggert@twinsun.com>
* libgcc2.c (__floatdi[xtds]f): Round properly even when rounding
large negative integer to plus or minus infinity.
Fri Feb 6 15:45:16 1998 Philippe De Muyter <phdm@macqel.be>
* sdbout.c (plain_type_1): Return T_DOUBLE, not T_VOID, for
long double #ifndef EXTENDED_SDB_BASIC_TYPES.
Fri Feb 6 15:23:49 1998 John David Anglin <dave@hiauly1.hia.nrc.ca>
* vax/ultrix.h (HAVE_ATEXIT): Define.
* x-vax: File deleted.
Fri Feb 6 14:34:19 1998 Douglas Rupp <rupp@gnat.com>
* gcc.c (process_command, case "-dumpversion"): Print spec_version.
Fri Feb 6 11:01:13 1998 Josh Littlefield <josh@american.com>
* i386/gmon-sol2.c (internal_mcount): Do set-up when program starts
and install hook to do clean-up when it exits.
* i386/sol2-c1.asm (_mcount): Make a weak instead of global symbol.
* i386/sol2dbg.h (ASM_SPEC): Support Solaris bundled assembler's -V
argument; pass -s argument to assembler.
Fri Feb 6 09:13:21 1998 Jim Wilson (wilson@cygnus.com)
* function.c (assign_parms): New variable named_arg, with value
depending on STRICT_ARGUMENT_NAMING. Use instead of ! last_named.
* crtstuff.c (__frame_dummy): New function for irix6.
(__do_global_ctors): Call __frame_dummy for irix6.
* mips/iris6.h (LINK_SPEC): Hide __frame_dummy too.
Fri Feb 6 09:08:21 1998 Mike Stump <mrs@wrs.com>
* rtlanal.c (dead_or_set_regno_p): Ignore REG_DEAD notes after reload.
* genattrtab.c (reload_completed): Define.
* configure.in (i960-wrs-vxworks): Same as i960-wrs-vxworks5*.
Fri Feb 6 08:47:38 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Makefile.in (diff): Add INSTALL, configure, and config.in;
remove objc-*.
* objc/config-lang.in (diff_excludes): Add objc-parse.[cy].
* i386/xm-mingw32.h (link): Delete macro.
* alpha.c (output_prolog): Write out frame sizes as longs and
print too large sizes as zero.
* function.c (combine_temp_slots): No need to allocate and free rtx.
Don't do anything if too many slots in the list.
(put_var_into_stack): Don't use ADDRESSOF if not optimizing.
* function.c (purge_addressof_1): Force into mem if VOLATILE reference.
* calls.c (expand_call): Show VAR_DECL made for structure return
address is used; remove bogus set of MEM_IN_STRUCT_P.
* expr.c (expand_expr, case SAVE_EXPR, case TARGET_EXPR): Show used.
(expand_builtin, case BUILT_IN_LONGJMP): Show __dummy used.
* function.c (put_reg_into_stack): New arg USED_P; all callers changed.
* expr.c (expand_expr, case SAVE_EXPR): assign_temp with KEEP of 3.
* function.c (var_temp_slot_level): New variable.
(push_function_context_to, pop_function_context_from): Save/restore
it and target_temp_slot_level.
(assign_stack_temp): Implement KEEP of 3.
(push_temp_slots_for_block): New function.
(init_temp_slots): Initialize var_temp_slot_level.
* function.h (struct function, fields {var,target}_temp_slot_level):
New fields.
* stmt.c (expand_start_bindings): Call push_temp_slots_for_block.
* function.c (struct temp_slot): SIZE, BASE_OFF_SET, and FULL_SIZE
now HOST_WIDE_INT.
(assign_{,outer_}stack_local, assign_{,stack_}temp): Size arg is
now HOST_WIDE_INT.
(assign_stack_temp): Do size computations in HOST_WIDE_INT.
(fixup_var_refs_1, optimize_bit_field, instantiate_decls): Likewise.
(instantiate_virtual_regs_1, fix_lexical_address): Likewise.
* rtl.h (assign_stack_{local,temp}): Size arg is HOST_WIDE_INT.
(assign_temp): Likewise.
* expr.h (struct args_size): Field CONSTANT is now HOST_WIDE_INT.
* sched.c (attach_deaths, case REG): Don't check for REG_UNUSED.
(attach_deaths, case SUBREG, STRICT_LOW_PART, {ZERO,SIGN}_EXTRACT):
Don't pass set_p of 1 if partial assignment.
* tree.h (size_in_bytes): Returns HOST_WIDE_INT.
* tree.c (size_in_bytes): Likewise.
Tighen up logic some to avoid returning a bogus value instead of -1.
* expr.c (get_inner_reference, case ARRAY_EXPR): Make WITH_RECORD_EXPR
just for index.
(expand_expr, case PLACEHOLDER_EXPR): Refine search again; look
at each expression and look for pointer to type.
* expr.c (safe_from_p, case ADDR_EXPR): If TREE_STATIC, no trampoline.
(expand_expr, case ADDR_EXPR): Likewise.
* expr.c (emit_block_move): Use conservative range for movstr mode.
* configure.in: See if "cp -p" works if "ln -s" doesn't; else "cp".
* combine.c (try_combine.c): Pass elim_i2 and elim_i1 to
distribute_notes for i3dest_killed REG_DEAD note.
* configure.in (mips-dec-netbsd*): Remove bogus setting of prefix.
* c-decl.c (duplicate_decls): Set DECL_IGNORED_P in newdecl if
different bindings levels.
* configure.in: Test ln -s by symlinking gcc.c.
* configure.in (i[3456]86-dg-dgux): Add wildcard for version.
* crtstuff.c (__do_global_ctors_aux): Switch back to text section
in proper place.
* rtlanal.c (rtx_varies_p, case REG): pic_offset_table_rtx is fixed.
* genattrtab.c (pic_offset_table_rtx): Define (dummy).
* cse.c (set_nonvarying_address_components): Understand PIC refs.
* loop.c (strength_reduce): When placing increment for auto-inc
case, do comparison in loop order.
* i860.c (output_delayed_branch): Add missing arg to recog.
(output_delay_insn): Add missing arg to constrain_operands.
* configure.in: Truncate target after finished comparing it with host.
* i386.h (MAX_FIXED_MODE_SIZE): Delete.
* c-parse.in (expr_no_comma): Clarify undefined error.
* prefix.c (get_key_value): Don't default to PREFIX here.
(translate_name): Remove bogus addition of "$" if getenv fails;
clean up application of default value of PREFIX.
* fold-const.c (fold_convert): Call force_fit_type even if input
already overflows.
Fri Feb 6 07:45:01 1998 Robert Hoehne <robert.hoehne@gmx.net>
* i386/xm-go32.h (HAVE_{BCOPY,BZERO,BCMP,RINDEX,INDEX}): Define.
* gcc.c (main): Treat paths starting with '$' or DOS drives
as absolute in standard_startfile_prefix.
Thu Feb 5 21:07:12 1998 John David Anglin <dave@hiauly1.hia.nrc.ca>
* cpplib.c (IS_INCLUDE_DIRECTIVE_TYPE): Add casts from enum to int.
* cccp.c (IS_INCLUDE_DIRECTIVE_TYPE, handle_directive): Likewise.
Thu Feb 5 19:00:44 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* expr.c (expand_expr, case CONSTRUCTOR): Correct shift count
when making signed bit field; use EXPAND_NORMAL, not 0.
Thu Feb 5 17:42:43 1998 Manfred Hollstein <manfred@s-direktnet.de>
* libgcc2.c (__clear_insn_cache): On sysV68 enable the memctl
stuff only if MCT_TEXT is #define'd.
Thu Feb 5 17:32:01 1998 Robert Hoehne <robert.hoehne@gmx.net>
* Makefile.in: Changed most stamp-* to s-*.
Tue Feb 3 19:45:50 1998 James Hawtin <oolon@ankh.org>
* i386/sol2.h (STARTFILE_SPEC, LIB_SPEC): Update -pg files.
* configure.in (i[3456]86-*-solaris2*): Add gcrt1.o and gmon.o
to extra_parts.
Tue Feb 3 17:28:48 1998 Christopher C Chimelis <chris@classnet.med.miami.edu>
* configure.in (alpha*-*-linux-gnu*): Add extra_parts for crtstuff.
Tue Feb 3 17:18:19 1998 Richard Earnshaw <rearnsha@arm.com>
* arm.c (find_barrier): Fix one-too-many bug if fail to find barrier.
* arm.c (arm_reload_in_hi): Handle cases where the MEM is too
complex for a simple offset.
Tue Feb 3 16:14:21 1998 Robert Hoehne <robert.hoehne@gmx.net>
* i386/xm-go32.h (EXECUTABLE_SUFFIX): Define.
* configure.in (i[3456]86-pc-msdosdjgpp*): New entry.
Tue Feb 3 07:33:58 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* explow.c (probe_stack_range): Properly check for small
number of probes.
* gcc.c (process_command, case 'V'): Validate arg.
* configure.in (sbrk): Add check for needed declaration.
* acconfig.h (NEED_DECLARATION_SBRK): New entry.
* toplev.c (sbrk): Update declaration conditional.
* mips-tfile.c (sbrk, free): Likewise.
* sparc/sysv4.h (DBX_REGISTER_NUMBER): Remove abort.
* mips.c (mips_expand_prologue): Pass reg 25 to gen_loadgp.
* mips.md (loadgp): Add second operand for register number to add.
(builtin_setjmp_receiver): Pass new label and reg 31 to loadgp.
* toplev.c: Include insn-codes.h, insn-config.h, and recog.h.
(compile_file): Try to emit nop to separate gcc_compiled symbol.
* Makefile.in (toplev.o): Depends on insn-{codes,config}.h, recog.h.
Tue Feb 3 06:58:46 1998 Mark Mitchell <mmitchell@usa.net>
* integrate.c (get_label_from_map): New function.
(expand_inline_function): Use it.
Initialize label_map to NULL_RTX instead of gen_label_rtx.
(copy_rtx_and_substitute): Use get_label_from_map.
* integrate.h (get_label_from_map): New function.
(set_label_from_map): New macro.
* unroll.c (unroll_loop, copy_loop_body): Use them.
Mon Feb 2 16:33:01 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* i386.md (mov{si,hi,sf,df,xf}cc{,_1}): Remove cases with branches.
* rs6000/x-aix31 (INSTALL): Deleted.
* mips/x-dec-osf1, mips/x-osfrose, i386/x-osfrose: Likewise.
* arm/x-riscix: Likewise.
* c-typeck.c (signed_or_unsigned_type): Properly handle pointer types.
Mon Feb 2 15:33:58 1998 Michael P. Hayes <michaelh@ongaonga.chch.cri.nz>
* unroll.c (copy_loop_body): Use single_set instead of
PATTERN to detect increment of an iv inside a PARALLEL.
Fri Jan 16 20:29:50 1998 Paul Eggert <eggert@twinsun.com>
* toplev.c (<unistd.h>): New include.
(get_run_time): Prefer CLK_TCK (if available) to HZ, and
prefer sysconf (_SC_CLK_TCK) (if available) to CLK_TCK.
* configure.in (sysconf): Call AC_CHECK_FUNCS.
Wed Jan 14 20:10:51 1998 Paul Eggert <eggert@twinsun.com>
* cccp.c: (rescan): Don't report line 0 as the possible real start
of an unterminated string constant.
Don't mishandle backslash-newlines that in are the output of
a macro expansion. Properly skip // style comments between a function
macro name and '(', as well as backslash-newlines in comments there.
(handle_directive): Handle / \ newline * between # and directive name.
In #include directives, \ does not escape ".
(do_include): For `#include "file', do not bother expanding into temp
buffer. When error encountered when expanding, do not try result.
(skip_if_group): When skipping an include directive, use include
tokenization, not normal tokenization. Backslash-newline is still
special when skipping. Handle * \ newline / correctly in comments
when skipping.
(skip_quoted_string): After \ newline, set *backslash_newlines_p
even if count_newlines is 0.
(macroexpand): Newline space is not a special marker inside a string.
(macroexpand, macarg): Do not generate \ddd for control characters
when stringifying; the C Standard does not allow this.
(macarg1): New arg MACRO. All callers changed.
Do not treat /*, //, or backslash-newline specially when processing
the output of a macro.
(discard_comments): Don't go past limit if looking for end of comment.
Discard backslash-newline properly when discarding comments.
(change_newlines): \" does not end a string.
(make_definition): Do not treat backslash-newline specially, as it
has already been removed before we get here.
* profile.c (output_func_start_profiler): Don't fflush output
if -quiet.
* toplev.c (rest_of_compilation): Likewise.
* i386/x-sco5 (CC): Remove trailing white space.
* x-convex (CCLIBFLAGS): Likewise.
* arm/t-semi (LIBGCC2_CFLAGS): Likewise.
Wed Jan 7 18:02:42 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* Version 2.8.0 released.
Wed Jan 7 17:54:41 1998 J. Kean Johnston <jkj@sco.com>
* i386/sco5.h ({END,START}FILE_SPEC): Link with correct crtbegin.o
and crtend.o when using -static.
Wed Jan 7 17:49:14 1998 Jan Christiaan van Winkel <Jan.Christiaan.van.Winkel@ATComputing.nl>
* cppexp.c (gansidecl.h): Include.
Wed Jan 7 17:45:07 1998 Tristan Gingold <gingold@puccini.enst.fr>
* expr.c (get_push_address): Use copy_to_reg instead of force_operand.
(emit_push_insn): Avoid null pointer deference if aggregate has no
types.
(expand_expr): Avoid finite but useless recursion.
(expand_builtin): Fix typo in calling function.
* function.c (assign_parms): Avoid useless call to chkr_set_right.
Wed Jan 7 17:31:13 1998 Christian Iseli <Christian.Iseli@lslsun.epfl.ch>
* combine.c (force_to_mode): Return if operand is a CLOBBER.
Wed Jan 7 17:23:24 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* x-rs6000 (INSTALL): Remove.
* jump.c (jump_optimize): Don't use a hard reg as an operand
of a conditional move if small register classes.
Wed Jan 7 17:09:28 1998 Jim Wilson <wilson@cygnus.com>
* cse.c (max_insn_uid): New variable.
(cse_around_loop): Use it.
(cse_main): Set it.
See ChangeLog.11 for earlier changes.
Use a consistent time stamp format in ChangeLog entries.
Not everyone has Emacs 20 yet, so stick with Emacs 19 format for now.
Local Variables:
add-log-time-format: current-time-string
End:

View File

@ -1,5 +1,5 @@
# Makefile for GNU C compiler.
# Copyright (C) 1987, 88, 90-96, 1997 Free Software Foundation, Inc.
# Copyright (C) 1987, 88, 90-97, 1998 Free Software Foundation, Inc.
#This file is part of GNU CC.
@ -234,6 +234,8 @@ libsubdir = $(libdir)/gcc-lib/$(target_alias)/$(version)
# Directory in which the compiler finds g++ includes.
gxx_include_dir= @gxx_include_dir@
# Directory in which the old g++ header files may be found.
# The reason we use $(libdir)/g++-include rather than using libsubdir
# is for compatibility with older versions of libg++.
old_gxx_include_dir= $(libdir)/g++-include
# Directory to search for site-specific includes.
includedir = $(local_prefix)/include
@ -612,9 +614,9 @@ CCCP=cccp
STAGESTUFF = *$(objext) insn-flags.h insn-config.h insn-codes.h \
insn-output.c insn-recog.c insn-emit.c insn-extract.c insn-peep.c \
insn-attr.h insn-attrtab.c insn-opinit.c genrtl.c genrtl.h \
stamp-flags stamp-config stamp-codes stamp-mlib \
stamp-output stamp-recog stamp-emit stamp-extract stamp-peep \
stamp-attr stamp-attrtab stamp-opinit stamp-crt stamp-crtS stamp-crt0 \
s-flags s-config s-codes s-mlib \
s-output s-recog s-emit s-extract s-peep \
s-attr s-attrtab s-opinit s-crt s-crtS s-crt0 \
genemit$(build_exeext) genoutput$(build_exeext) genrecog$(build_exeext) \
genextract$(build_exeext) genflags$(build_exeext) gencodes$(build_exeext) \
genconfig$(build_exeext) genpeep$(build_exeext) genattrtab$(build_exeext) \
@ -1093,8 +1095,8 @@ libgcc.a: $(LIBGCC1) $(LIBGCC2)
# Use the genmultilib shell script to generate the information the gcc
# driver program needs to select the library directory based on the
# switches.
multilib.h: stamp-mlib; @true
stamp-mlib: $(srcdir)/genmultilib Makefile
multilib.h: s-mlib; @true
s-mlib: $(srcdir)/genmultilib Makefile
$(SHELL) $(srcdir)/genmultilib \
"$(MULTILIB_OPTIONS)" \
"$(MULTILIB_DIRNAMES)" \
@ -1102,7 +1104,7 @@ stamp-mlib: $(srcdir)/genmultilib Makefile
"$(MULTILIB_EXCEPTIONS)" \
"$(MULTILIB_EXTRA_OPTS)" > tmp-mlib.h
$(srcdir)/move-if-change tmp-mlib.h multilib.h
touch stamp-mlib
touch s-mlib
# Build multiple copies of libgcc.a, one for each target switch.
stmp-multilib: $(LIBGCC1) libgcc2.c libgcc2.ready $(CONFIG_H) \
@ -1189,9 +1191,9 @@ $(T)crtend.o: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \
# On some systems we also want to install versions of these files
# compiled using PIC for use in shared libraries.
crtbeginS.o crtendS.o: stamp-crtS ; @true
crtbeginS.o crtendS.o: s-crtS ; @true
stamp-crtS: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \
s-crtS: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \
defaults.h frame.h gbl-ctors.h
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS_S) \
-DCRT_BEGIN -finhibit-size-directive -fno-inline-functions \
@ -1200,18 +1202,18 @@ stamp-crtS: crtstuff.c $(GCC_PASSES) $(CONFIG_H) \
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(INCLUDES) $(CRTSTUFF_T_CFLAGS_S) \
-DCRT_END -finhibit-size-directive -fno-inline-functions \
-g0 -c $(srcdir)/crtstuff.c -o crtendS$(objext)
touch stamp-crtS
touch s-crtS
# Compile the start modules crt0.o and mcrt0.o that are linked with every program
crt0.o: stamp-crt0 ; @true
mcrt0.o: stamp-crt0; @true
crt0.o: s-crt0 ; @true
mcrt0.o: s-crt0; @true
stamp-crt0: $(CRT0_S) $(MCRT0_S) $(GCC_PASSES) $(CONFIG_H)
s-crt0: $(CRT0_S) $(MCRT0_S) $(GCC_PASSES) $(CONFIG_H)
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(CRT0STUFF_T_CFLAGS) \
-o crt0.o -c $(CRT0_S)
$(GCC_FOR_TARGET) $(GCC_CFLAGS) $(CRT0STUFF_T_CFLAGS) \
-o mcrt0.o -c $(MCRT0_S)
touch stamp-crt0
touch s-crt0
#
# Compiling object files from source files.
@ -1274,9 +1276,9 @@ tlink.o: tlink.c $(DEMANGLE_H) hash.h $(CONFIG_H) system.h
hash.o: hash.c hash.h system.h
cplus-dem.o: cplus-dem.c $(DEMANGLE_H)
underscore.c: stamp-under ; @true
underscore.c: s-under ; @true
stamp-under: $(GCC_PASSES)
s-under: $(GCC_PASSES)
echo "int xxy_us_dummy;" >tmp-dum.c
$(GCC_FOR_TARGET) -S tmp-dum.c
echo '/*WARNING: This file is automatically generated!*/' >tmp-under.c
@ -1287,7 +1289,7 @@ stamp-under: $(GCC_PASSES)
fi
$(srcdir)/move-if-change tmp-under.c underscore.c
-rm -f tmp-dum.c tmp-dum.s
touch stamp-under
touch s-under
# A file used by all variants of C.
@ -1327,6 +1329,7 @@ stor-layout.o : stor-layout.c $(CONFIG_H) system.h $(TREE_H) flags.h \
fold-const.o : fold-const.c $(CONFIG_H) system.h $(TREE_H) flags.h
toplev.o : toplev.c $(CONFIG_H) system.h $(TREE_H) $(RTL_H) \
flags.h input.h insn-attr.h xcoffout.h defaults.h output.h \
insn-codes.h insn-config.h recog.h Makefile \
$(lang_options_files)
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(MAYBE_USE_COLLECT2) \
-DTARGET_NAME=\"$(target_alias)\" \
@ -1476,7 +1479,7 @@ alloca.o: alloca.c
# Each of the other insn-* files is handled by a similar pair of rules.
# This causes an anomaly in the results of make -n
# because insn-* is older than stamp-*
# because insn-* is older than s-*
# and thus make -n thinks that insn-* will be updated
# and force recompilation of things that depend on it.
# We use move-if-change precisely to avoid such recompilation.
@ -1488,84 +1491,84 @@ alloca.o: alloca.c
# versions of make which don't like empty commands (nothing after the
# trailing `;'), we call true for each.
insn-config.h: stamp-config ; @true
stamp-config : $(md_file) genconfig $(srcdir)/move-if-change
insn-config.h: s-config ; @true
s-config : $(md_file) genconfig $(srcdir)/move-if-change
./genconfig $(md_file) > tmp-config.h
$(srcdir)/move-if-change tmp-config.h insn-config.h
touch stamp-config
touch s-config
insn-flags.h: stamp-flags ; @true
stamp-flags : $(md_file) genflags $(srcdir)/move-if-change
insn-flags.h: s-flags ; @true
s-flags : $(md_file) genflags $(srcdir)/move-if-change
./genflags $(md_file) > tmp-flags.h
$(srcdir)/move-if-change tmp-flags.h insn-flags.h
touch stamp-flags
touch s-flags
insn-codes.h: stamp-codes ; @true
stamp-codes : $(md_file) gencodes $(srcdir)/move-if-change
insn-codes.h: s-codes ; @true
s-codes : $(md_file) gencodes $(srcdir)/move-if-change
./gencodes $(md_file) > tmp-codes.h
$(srcdir)/move-if-change tmp-codes.h insn-codes.h
touch stamp-codes
touch s-codes
insn-emit.o : insn-emit.c $(CONFIG_H) $(RTL_H) expr.h real.h output.h \
insn-config.h insn-flags.h insn-codes.h system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-emit.c
insn-emit.c: stamp-emit ; @true
stamp-emit : $(md_file) genemit $(srcdir)/move-if-change
insn-emit.c: s-emit ; @true
s-emit : $(md_file) genemit $(srcdir)/move-if-change
./genemit $(md_file) > tmp-emit.c
$(srcdir)/move-if-change tmp-emit.c insn-emit.c
touch stamp-emit
touch s-emit
insn-recog.o : insn-recog.c $(CONFIG_H) $(RTL_H) insn-config.h $(RECOG_H) \
real.h output.h flags.h system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-recog.c
insn-recog.c: stamp-recog ; @true
stamp-recog : $(md_file) genrecog $(srcdir)/move-if-change
insn-recog.c: s-recog ; @true
s-recog : $(md_file) genrecog $(srcdir)/move-if-change
./genrecog $(md_file) > tmp-recog.c
$(srcdir)/move-if-change tmp-recog.c insn-recog.c
touch stamp-recog
touch s-recog
insn-opinit.o : insn-opinit.c $(CONFIG_H) $(RTL_H) insn-codes.h insn-flags.h \
insn-config.h flags.h $(RECOG_H) expr.h reload.h system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-opinit.c
insn-opinit.c: stamp-opinit ; @true
stamp-opinit : $(md_file) genopinit $(srcdir)/move-if-change
insn-opinit.c: s-opinit ; @true
s-opinit : $(md_file) genopinit $(srcdir)/move-if-change
./genopinit $(md_file) > tmp-opinit.c
$(srcdir)/move-if-change tmp-opinit.c insn-opinit.c
touch stamp-opinit
touch s-opinit
insn-extract.o : insn-extract.c $(CONFIG_H) $(RTL_H) system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-extract.c
insn-extract.c: stamp-extract ; @true
stamp-extract : $(md_file) genextract $(srcdir)/move-if-change
insn-extract.c: s-extract ; @true
s-extract : $(md_file) genextract $(srcdir)/move-if-change
./genextract $(md_file) > tmp-extract.c
$(srcdir)/move-if-change tmp-extract.c insn-extract.c
touch stamp-extract
touch s-extract
insn-peep.o : insn-peep.c $(CONFIG_H) $(RTL_H) regs.h output.h real.h system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-peep.c
insn-peep.c: stamp-peep ; @true
stamp-peep : $(md_file) genpeep $(srcdir)/move-if-change
insn-peep.c: s-peep ; @true
s-peep : $(md_file) genpeep $(srcdir)/move-if-change
./genpeep $(md_file) > tmp-peep.c
$(srcdir)/move-if-change tmp-peep.c insn-peep.c
touch stamp-peep
touch s-peep
insn-attrtab.o : insn-attrtab.c $(CONFIG_H) $(RTL_H) regs.h real.h output.h \
insn-attr.h insn-config.h system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-attrtab.c
insn-attr.h: stamp-attr ; @true
stamp-attr : $(md_file) genattr $(srcdir)/move-if-change
insn-attr.h: s-attr ; @true
s-attr : $(md_file) genattr $(srcdir)/move-if-change
./genattr $(md_file) > tmp-attr.h
$(srcdir)/move-if-change tmp-attr.h insn-attr.h
touch stamp-attr
touch s-attr
insn-attrtab.c: stamp-attrtab ; @true
stamp-attrtab : $(md_file) genattrtab $(srcdir)/move-if-change
insn-attrtab.c: s-attrtab ; @true
s-attrtab : $(md_file) genattrtab $(srcdir)/move-if-change
if cmp -s $(PREMADE_ATTRTAB_MD) $(md_file); \
then \
echo Using $(PREMADE_ATTRTAB); \
@ -1574,28 +1577,28 @@ stamp-attrtab : $(md_file) genattrtab $(srcdir)/move-if-change
./genattrtab $(md_file) > tmp-attrtab.c; \
fi
$(srcdir)/move-if-change tmp-attrtab.c insn-attrtab.c
touch stamp-attrtab
touch s-attrtab
insn-output.o : insn-output.c $(CONFIG_H) $(RTL_H) regs.h real.h conditions.h \
hard-reg-set.h insn-config.h insn-flags.h insn-attr.h output.h $(RECOG_H) \
insn-codes.h system.h
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -c insn-output.c
insn-output.c: stamp-output ; @true
stamp-output : $(md_file) genoutput $(srcdir)/move-if-change
insn-output.c: s-output ; @true
s-output : $(md_file) genoutput $(srcdir)/move-if-change
./genoutput $(md_file) > tmp-output.c
$(srcdir)/move-if-change tmp-output.c insn-output.c
touch stamp-output
touch s-output
genrtl.o : genrtl.c $(CONFIG_H) $(RTL_H)
genrtl.c genrtl.h : stamp-genrtl
genrtl.c genrtl.h : s-genrtl
@true # force gnu make to recheck modification times.
stamp-genrtl: gengenrtl $(srcdir)/move-if-change $(RTL_BASE_H)
s-genrtl: gengenrtl $(srcdir)/move-if-change $(RTL_BASE_H)
./gengenrtl tmp-genrtl.h tmp-genrtl.c
$(srcdir)/move-if-change tmp-genrtl.h genrtl.h
$(srcdir)/move-if-change tmp-genrtl.c genrtl.c
touch stamp-genrtl
touch s-genrtl
#
# Compile the programs that generate insn-* from the machine description.
@ -1754,8 +1757,6 @@ $(srcdir)/cexp.c: $(srcdir)/cexp.y
cd $(srcdir); $(BISON) -o cexp.c cexp.y
cccp.o: cccp.c $(CONFIG_H) pcp.h version.c config.status
# The reason we use $(libdir)/g++-include rather than using libsubdir
# is for compatibility with the current version of libg++.
$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \
-DGCC_INCLUDE_DIR=\"$(libsubdir)/include\" \
-DGPLUSPLUS_INCLUDE_DIR=\"$(gxx_include_dir)\" \
@ -1875,7 +1876,7 @@ gcov$(exeext): gcov.o $(LIBDEPS)
$(CC) $(ALL_CFLAGS) $(LDFLAGS) gcov.o $(LIBS) -o $@
#
# Build the include directory. The stamp files are stmp-* rather than
# stamp-* so that mostlyclean does not force the include directory to
# s-* so that mostlyclean does not force the include directory to
# be rebuilt.
# Build the include directory except for float.h (which depends upon
@ -2061,14 +2062,10 @@ mostlyclean: lang.mostlyclean
# Delete the temp files made in the course of building libgcc.a.
-rm -f tmplibgcc* tmpcopy xlimits.h libgcc1-test
for name in $(LIB1FUNCS); do rm -f $${name}.c; done
# Delete other temporary files.
-rm -f tmp-float.h tmp-gcc.xtar.gz
-rm -f tmp-foo1 tmp-foo2 tmp-proto.* tmp-unproto.1 tmp-SYSCALLS.s
-rm -f tmp-c-parse.y tmp-gperf.h
-rm -f tmp-specs t-float.h-cross tmp-xlimits.h
-rm -f tmp-fixtmp.c xsys-protos.hT
# Delete the stamp files.
-rm -f stamp-* tmp-*
# Delete other built files.
-rm -f t-float.h-cross xsys-protos.hT fp-bit.c dp-bit.c
# Delete the stamp and temporary files.
-rm -f s-* tmp-* stamp-* stmp-*
-rm -f */stamp-* */tmp-*
# Delete debugging dump files.
-rm -f *.greg *.lreg *.combine *.flow *.cse *.jump *.rtl *.tree *.loop
@ -2106,8 +2103,7 @@ clean: mostlyclean lang.clean
rm -f md ; \
fi
# Delete the include directory.
-rm -rf stmp-* include
-rm -f */stmp-*
-rm -rf include
# Delete files used by the "multilib" facility (including libgcc subdirs).
-rm -f multilib.h tmpmultilib*
-if [ "x$(MULTILIB_DIRNAMES)" != x ] ; then \
@ -2142,7 +2138,7 @@ extraclean: distclean lang.extraclean
-rm -f *.dvi *.ps *.oaux *.d *.[zZ] *.gz
-rm -f *.tar *.xtar *diff *.diff.* *.tar.* *.xtar.* *diffs
-rm -f *lose config/*lose config/*/*lose
-rm -f *.s *.s[0-9] *.i install1.texi config/ChangeLog
-rm -f *.s *.s[0-9] *.i config/ChangeLog
-rm -f */=* */"#"* */*~*
-rm -f */patch* */*.orig */*.rej
-rm -f */*.dvi */*.oaux */*.d */*.[zZ] */*.gz
@ -2516,32 +2512,29 @@ check-g77: testsuite/site.exp
# Update the tags table.
TAGS: force
cd $(srcdir); \
mkdir temp; \
mv -f c-parse.[ch] cexp.c =*.[chy] temp; \
mkdir tmp-tags; \
mv -f c-parse.[ch] cexp.c =*.[chy] tmp-tags; \
etags *.y *.h *.c; \
mv temp/* .; \
rmdir temp
mv tmp-tags/* .; \
rmdir tmp-tags
# Create the distribution tar file.
#dist: gcc-$(version).tar.gz
dist: gcc.xtar.gz
# Create the distribution tar.gz file.
dist: tmp-gcc.xtar
gzip --best < tmp-gcc.xtar > tmp-gcc.xtar.gz
mv tmp-gcc.xtar.gz gcc-$(version).tar.gz
gcc.xtar.gz: gcc.xtar
gzip --best < gcc.xtar > tmp-gcc.xtar.gz
mv tmp-gcc.xtar.gz gcc.xtar.gz
#gcc-$(version).tar.gz: gcc-$(version).tar
# gzip < gcc-$(version).tar > gcc-$(version).tar.gz
#gcc-$(version).tar:
gcc.xtar: distdir
tmp-gcc.xtar: distdir
# Make the distribution.
tar -chf gcc.xtar gcc-$(version)
tar -chf tmp-gcc.xtar gcc-$(version)
distdir-cvs: force
if [ -d $(srcdir)/CVS ]; then cvs -r update; fi
# This target exists to do the initial work before the language specific
# stuff gets done.
distdir-start: doc $(srcdir)/INSTALL $(srcdir)/c-parse.y $(srcdir)/c-gperf.h \
$(srcdir)/c-parse.c $(srcdir)/cexp.c $(srcdir)/config.in
$(srcdir)/c-parse.c $(srcdir)/cexp.c $(srcdir)/config.in \
$(srcdir)/bi-parser.h $(srcdir)/bi-parser.c $(srcdir)/version.c TAGS
@if grep -s "for version ${mainversion}" gcc.texi > /dev/null; \
then true; \
else echo "You must update the version number in \`gcc.texi'"; sleep 10;\
@ -2563,7 +2556,7 @@ distdir-start: doc $(srcdir)/INSTALL $(srcdir)/c-parse.y $(srcdir)/c-gperf.h \
done
cd config; \
for file in *[0-9a-zA-Z+]; do \
if test -d $$file && test "$$file" != RCS; then \
if test -d $$file && test "$$file" != RCS && test "$$file" != CVS; then \
mkdir ../tmp/config/$$file; \
cd $$file; \
for subfile in *[0-9a-zA-Z+]; do \
@ -2590,21 +2583,21 @@ distdir-finish:
# Get rid of everything we don't want in the distribution. We'd want
# this to use Makefile.in, but it doesn't have the `lang.foo' targets
# expanded.
cd gcc-$(version); make extraclean
cd gcc-$(version); make extraclean VERSION_DEP=
distdir: distdir-start lang.distdir distdir-finish
distdir: distdir-cvs distdir-start lang.distdir distdir-finish
# make diff oldversion=M.N
# creates a diff file between an older distribution and this one.
# The -P option assumes this is GNU diff.
diff:
diff -rc2P -x c-parse.y -x c-parse.c -x c-parse.h -x c-gperf.h \
-x cexp.c -x objc-parse.y -x objc-parse.c \
-x TAGS \
-x cexp.c -x bi-parser.c -x bi-parser.h -x TAGS -x INSTALL \
-x configure -x config.in \
-x "gcc.??" -x "gcc.??s" -x gcc.aux -x "gcc.info*" \
-x "cpp.??" -x "cpp.??s" -x cpp.aux -x "cpp.info*" \
$(LANG_DIFF_EXCLUDES) \
gcc-$(oldversion) gcc-$(version) > diffs
gcc-$(oldversion) gcc-$(version) > gcc-$(oldversion)-$(version).diff
bootstrap bootstrap-lean: force
# Only build the C compiler for stage1, because that is the only one that

View File

@ -1,5 +1,14 @@
Noteworthy changes in GCC for EGCS.
Noteworthy changes in GCC version 2.8.1
---------------------------------------
Numerous bugs have been fixed and some minor performance
improvements (compilation speed) have been made.
Noteworthy changes in GCC version 2.8.0
---------------------------------------
A major change in this release is the addition of a framework for
exception handling, currently used by C++. Many internal changes and
optimization improvements have been made. These increase the

View File

@ -120,4 +120,3 @@ an assembler modified after October 16th, 1995 in order to build the GNU C
compiler. This is because the GNU C compiler wants to build a variant of its
library, libgcc.a with the -mcpu=common switch to support building programs
that can run on either the Power or PowerPC machines.

View File

@ -40,7 +40,7 @@
/* Whether atol must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_ATOL
/* Whether sbrk must be declared even if <unistd.h> is included. */
/* Whether sbrk must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_SBRK
/* Whether abort must be declared even if <stdlib.h> is included. */

View File

@ -1,5 +1,5 @@
/* Subroutines shared by all languages that are variants of C.
Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -975,37 +975,39 @@ typedef struct {
/* Type of argument if length modifier `L' is used.
If NULL, then this modifier is not allowed. */
tree *bigllen;
/* Type of argument if length modifier `Z' is used.
If NULL, then this modifier is not allowed. */
tree *zlen;
/* List of other modifier characters allowed with these options. */
char *flag_chars;
} format_char_info;
static format_char_info print_char_table[] = {
{ "di", 0, T_I, T_I, T_L, T_LL, T_LL, "-wp0 +" },
{ "oxX", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, "-wp0#" },
{ "u", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, "-wp0" },
/* Two GNU extensions. */
{ "Z", 0, T_ST, NULL, NULL, NULL, NULL, "-wp0" },
{ "m", 0, T_V, NULL, NULL, NULL, NULL, "-wp" },
{ "feEgGaA", 0, T_D, NULL, NULL, NULL, T_LD, "-wp0 +#" },
{ "c", 0, T_I, NULL, T_W, NULL, NULL, "-w" },
{ "C", 0, T_W, NULL, NULL, NULL, NULL, "-w" },
{ "s", 1, T_C, NULL, T_W, NULL, NULL, "-wp" },
{ "S", 1, T_W, NULL, NULL, NULL, NULL, "-wp" },
{ "p", 1, T_V, NULL, NULL, NULL, NULL, "-w" },
{ "n", 1, T_I, T_S, T_L, T_LL, NULL, "" },
{ "di", 0, T_I, T_I, T_L, T_LL, T_LL, T_ST, "-wp0 +" },
{ "oxX", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0#" },
{ "u", 0, T_UI, T_UI, T_UL, T_ULL, T_ULL, T_ST, "-wp0" },
/* A GNU extension. */
{ "m", 0, T_V, NULL, NULL, NULL, NULL, NULL, "-wp" },
{ "feEgGaA", 0, T_D, NULL, NULL, NULL, T_LD, NULL, "-wp0 +#" },
{ "c", 0, T_I, NULL, T_W, NULL, NULL, NULL, "-w" },
{ "C", 0, T_W, NULL, NULL, NULL, NULL, NULL, "-w" },
{ "s", 1, T_C, NULL, T_W, NULL, NULL, NULL, "-wp" },
{ "S", 1, T_W, NULL, NULL, NULL, NULL, NULL, "-wp" },
{ "p", 1, T_V, NULL, NULL, NULL, NULL, NULL, "-w" },
{ "n", 1, T_I, T_S, T_L, T_LL, NULL, NULL, "" },
{ NULL }
};
static format_char_info scan_char_table[] = {
{ "di", 1, T_I, T_S, T_L, T_LL, T_LL, "*" },
{ "ouxX", 1, T_UI, T_US, T_UL, T_ULL, T_ULL, "*" },
{ "efgEGaA", 1, T_F, NULL, T_D, NULL, T_LD, "*" },
{ "sc", 1, T_C, NULL, T_W, NULL, NULL, "*a" },
{ "[", 1, T_C, NULL, NULL, NULL, NULL, "*a" },
{ "C", 1, T_W, NULL, NULL, NULL, NULL, "*" },
{ "S", 1, T_W, NULL, NULL, NULL, NULL, "*" },
{ "p", 2, T_V, NULL, NULL, NULL, NULL, "*" },
{ "n", 1, T_I, T_S, T_L, T_LL, NULL, "" },
{ "di", 1, T_I, T_S, T_L, T_LL, T_LL, NULL, "*" },
{ "ouxX", 1, T_UI, T_US, T_UL, T_ULL, T_ULL, NULL, "*" },
{ "efgEGaA", 1, T_F, NULL, T_D, NULL, T_LD, NULL, "*" },
{ "sc", 1, T_C, NULL, T_W, NULL, NULL, NULL, "*a" },
{ "[", 1, T_C, NULL, NULL, NULL, NULL, NULL, "*a" },
{ "C", 1, T_W, NULL, NULL, NULL, NULL, NULL, "*" },
{ "S", 1, T_W, NULL, NULL, NULL, NULL, NULL, "*" },
{ "p", 2, T_V, NULL, NULL, NULL, NULL, NULL, "*" },
{ "n", 1, T_I, T_S, T_L, T_LL, NULL, NULL, "" },
{ NULL }
};
@ -1345,7 +1347,7 @@ check_format_info (info, params)
if (index (flag_chars, *format_chars) != 0)
{
sprintf (message, "repeated `%c' flag in format",
*format_chars);
*format_chars++);
warning (message);
}
else
@ -1453,6 +1455,12 @@ check_format_info (info, params)
pedwarn ("ANSI C does not support the `%c' length modifier",
length_char);
}
else if (*format_chars == 'Z')
{
length_char = *format_chars++;
if (pedantic)
pedwarn ("ANSI C does not support the `Z' length modifier");
}
else
length_char = 0;
if (length_char == 'l' && *format_chars == 'l')
@ -1575,6 +1583,7 @@ check_format_info (info, params)
case 'l': wanted_type = fci->llen ? *(fci->llen) : 0; break;
case 'q': wanted_type = fci->qlen ? *(fci->qlen) : 0; break;
case 'L': wanted_type = fci->bigllen ? *(fci->bigllen) : 0; break;
case 'Z': wanted_type = fci->zlen ? *fci->zlen : 0; break;
}
if (wanted_type == 0
|| (pedantic && length_char == 'L' && integral_format))

View File

@ -1981,13 +1981,14 @@ duplicate_decls (newdecl, olddecl, different_binding_level)
}
if (different_binding_level)
{
/* Don't output a duplicate symbol for this declaration. */
TREE_ASM_WRITTEN (newdecl) = 1;
/* Don't output a duplicate symbol or debugging information for this
declaration. */
TREE_ASM_WRITTEN (newdecl) = DECL_IGNORED_P (newdecl) = 1;
return 0;
}
/* Copy most of the decl-specific fields of NEWDECL into OLDDECL.
But preserve OLDdECL's DECL_UID. */
But preserve OLDDECL's DECL_UID. */
{
register unsigned olddecl_uid = DECL_UID (olddecl);
@ -5163,9 +5164,6 @@ grokdeclarator (declarator, declspecs, decl_context, initialized)
if (! strcmp (IDENTIFIER_POINTER (declarator), "main"))
warning ("cannot inline function `main'");
else if (last && (TYPE_MAIN_VARIANT (TREE_VALUE (last))
!= void_type_node))
warning ("inline declaration ignored for function with `...'");
else
/* Assume that otherwise the function can be inlined. */
DECL_INLINE (decl) = 1;

View File

@ -1,5 +1,5 @@
/* C code produced by gperf version 2.5 (GNU C++ version) */
/* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ ./c-parse.gperf */
/* Command-line: gperf -p -j1 -i 1 -g -o -t -G -N is_reserved_word -k1,3,$ /puke/law/tmp/merge/egcs/gcc/c-parse.gperf */
/* Command-line: gperf -p -j1 -i 1 -g -o -t -N is_reserved_word -k1,3,$ c-parse.gperf */
struct resword { char *name; short token; enum rid rid; };

View File

@ -1,5 +1,5 @@
/* Lexical analyzer for C and Objective C.
Copyright (C) 1987, 88, 89, 92, 94-96, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 89, 92, 94-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -1513,8 +1513,8 @@ yylex ()
if (floatflag != NOT_FLOAT)
{
tree type = double_type_node;
int exceeds_double = 0;
int imag = 0;
int conversion_errno = 0;
REAL_VALUE_TYPE value;
jmp_buf handler;
@ -1543,7 +1543,6 @@ yylex ()
}
*p = 0;
errno = 0;
/* Convert string to a double, checking for overflow. */
if (setjmp (handler))
@ -1613,7 +1612,9 @@ yylex ()
error ("both `f' and `l' in floating constant");
type = float_type_node;
errno = 0;
value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
conversion_errno = errno;
/* A diagnostic is required here by some ANSI C testsuites.
This is not pedwarn, become some people don't want
an error for this. */
@ -1623,13 +1624,17 @@ yylex ()
else if (lflag)
{
type = long_double_type_node;
errno = 0;
value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
conversion_errno = errno;
if (REAL_VALUE_ISINF (value) && pedantic)
warning ("floating point number exceeds range of `long double'");
}
else
{
errno = 0;
value = REAL_VALUE_ATOF (copy, TYPE_MODE (type));
conversion_errno = errno;
if (REAL_VALUE_ISINF (value) && pedantic)
warning ("floating point number exceeds range of `double'");
}
@ -1637,17 +1642,12 @@ yylex ()
set_float_handler (NULL_PTR);
}
#ifdef ERANGE
if (errno == ERANGE && !flag_traditional && pedantic)
{
/* ERANGE is also reported for underflow,
so test the value to distinguish overflow from that. */
if (REAL_VALUES_LESS (dconst1, value)
|| REAL_VALUES_LESS (value, dconstm1))
{
warning ("floating point number exceeds range of `double'");
exceeds_double = 1;
}
}
/* ERANGE is also reported for underflow,
so test the value to distinguish overflow from that. */
if (conversion_errno == ERANGE && !flag_traditional && pedantic
&& (REAL_VALUES_LESS (dconst1, value)
|| REAL_VALUES_LESS (value, dconstm1)))
warning ("floating point number exceeds range of `double'");
#endif
/* If the result is not a number, assume it must have been

View File

@ -1,5 +1,5 @@
/* YACC parser for C syntax and for Objective C. -*-c-*-
Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 89, 92-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.

View File

@ -1,6 +1,6 @@
/*WARNING: This file is automatically generated!*/
/* YACC parser for C syntax and for Objective C. -*-c-*-
Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 89, 92-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
/* Build expressions with type checking for C compiler.
Copyright (C) 1987, 88, 91-7, 1998 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 91-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -70,6 +70,8 @@ static tree digest_init PROTO((tree, tree, int, int));
static void check_init_type_bitfields PROTO((tree));
static void output_init_element PROTO((tree, tree, tree, int));
static void output_pending_init_elements PROTO((int));
static void add_pending_init PROTO((tree, tree));
static int pending_init_member PROTO((tree));
/* Do `exp = require_complete_type (exp);' to make sure exp
does not have an incomplete type. (That includes void types.) */
@ -785,7 +787,7 @@ signed_or_unsigned_type (unsignedp, type)
int unsignedp;
tree type;
{
if (! INTEGRAL_TYPE_P (type)
if ((! INTEGRAL_TYPE_P (type) && ! POINTER_TYPE_P (type))
|| TREE_UNSIGNED (type) == unsignedp)
return type;
if (TYPE_PRECISION (type) == TYPE_PRECISION (signed_char_type_node))
@ -5080,11 +5082,23 @@ static int constructor_erroneous;
/* 1 if have called defer_addressed_constants. */
static int constructor_subconstants_deferred;
/* List of pending elements at this constructor level.
/* Structure for managing pending initializer elements, organized as an
AVL tree. */
struct init_node
{
struct init_node *left, *right;
struct init_node *parent;
int balance;
tree purpose;
tree value;
};
/* Tree of pending elements at this constructor level.
These are elements encountered out of order
which belong at places we haven't reached yet in actually
writing the output. */
static tree constructor_pending_elts;
static struct init_node *constructor_pending_elts;
/* The SPELLING_DEPTH of this constructor. */
static int constructor_depth;
@ -5128,7 +5142,7 @@ struct constructor_stack
tree bit_index;
tree elements;
int offset;
tree pending_elts;
struct init_node *pending_elts;
int depth;
/* If nonzero, this value should replace the entire
constructor at this level. */
@ -5871,6 +5885,251 @@ set_init_label (fieldname)
}
}
/* Add a new initializer to the tree of pending initializers. PURPOSE
indentifies the initializer, either array index or field in a structure.
VALUE is the value of that index or field. */
static void
add_pending_init (purpose, value)
tree purpose, value;
{
struct init_node *p, **q, *r;
q = &constructor_pending_elts;
p = 0;
if (TREE_CODE (constructor_type) == ARRAY_TYPE)
{
while (*q != 0)
{
p = *q;
if (tree_int_cst_lt (purpose, p->purpose))
q = &p->left;
else if (tree_int_cst_lt (p->purpose, purpose))
q = &p->right;
else
abort ();
}
}
else
{
while (*q != NULL)
{
p = *q;
if (tree_int_cst_lt (DECL_FIELD_BITPOS (purpose),
DECL_FIELD_BITPOS (p->purpose)))
q = &p->left;
else if (tree_int_cst_lt (DECL_FIELD_BITPOS (p->purpose),
DECL_FIELD_BITPOS (purpose)))
q = &p->right;
else
abort ();
}
}
r = (struct init_node *) oballoc (sizeof (struct init_node));
r->purpose = purpose;
r->value = value;
*q = r;
r->parent = p;
r->left = 0;
r->right = 0;
r->balance = 0;
while (p)
{
struct init_node *s;
if (r == p->left)
{
if (p->balance == 0)
p->balance = -1;
else if (p->balance < 0)
{
if (r->balance < 0)
{
/* L rotation. */
p->left = r->right;
if (p->left)
p->left->parent = p;
r->right = p;
p->balance = 0;
r->balance = 0;
s = p->parent;
p->parent = r;
r->parent = s;
if (s)
{
if (s->left == p)
s->left = r;
else
s->right = r;
}
else
constructor_pending_elts = r;
}
else
{
/* LR rotation. */
struct init_node *t = r->right;
r->right = t->left;
if (r->right)
r->right->parent = r;
t->left = r;
p->left = t->right;
if (p->left)
p->left->parent = p;
t->right = p;
p->balance = t->balance < 0;
r->balance = -(t->balance > 0);
t->balance = 0;
s = p->parent;
p->parent = t;
r->parent = t;
t->parent = s;
if (s)
{
if (s->left == p)
s->left = t;
else
s->right = t;
}
else
constructor_pending_elts = t;
}
break;
}
else
{
/* p->balance == +1; growth of left side balances the node. */
p->balance = 0;
break;
}
}
else /* r == p->right */
{
if (p->balance == 0)
/* Growth propagation from right side. */
p->balance++;
else if (p->balance > 0)
{
if (r->balance > 0)
{
/* R rotation. */
p->right = r->left;
if (p->right)
p->right->parent = p;
r->left = p;
p->balance = 0;
r->balance = 0;
s = p->parent;
p->parent = r;
r->parent = s;
if (s)
{
if (s->left == p)
s->left = r;
else
s->right = r;
}
else
constructor_pending_elts = r;
}
else /* r->balance == -1 */
{
/* RL rotation */
struct init_node *t = r->left;
r->left = t->right;
if (r->left)
r->left->parent = r;
t->right = r;
p->right = t->left;
if (p->right)
p->right->parent = p;
t->left = p;
r->balance = (t->balance < 0);
p->balance = -(t->balance > 0);
t->balance = 0;
s = p->parent;
p->parent = t;
r->parent = t;
t->parent = s;
if (s)
{
if (s->left == p)
s->left = t;
else
s->right = t;
}
else
constructor_pending_elts = t;
}
break;
}
else
{
/* p->balance == -1; growth of right side balances the node. */
p->balance = 0;
break;
}
}
r = p;
p = p->parent;
}
}
/* Return nonzero if FIELD is equal to the index of a pending initializer. */
static int
pending_init_member (field)
tree field;
{
struct init_node *p;
p = constructor_pending_elts;
if (TREE_CODE (constructor_type) == ARRAY_TYPE)
{
while (p)
{
if (tree_int_cst_equal (field, p->purpose))
return 1;
else if (tree_int_cst_lt (field, p->purpose))
p = p->left;
else
p = p->right;
}
}
else
{
while (p)
{
if (field == p->purpose)
return 1;
else if (tree_int_cst_lt (DECL_FIELD_BITPOS (field),
DECL_FIELD_BITPOS (p->purpose)))
p = p->left;
else
p = p->right;
}
}
return 0;
}
/* "Output" the next constructor element.
At top level, really output it to assembler code now.
Otherwise, collect it in a list from which we will make a CONSTRUCTOR.
@ -5929,25 +6188,10 @@ output_init_element (value, type, field, pending)
if (pending)
{
if (TREE_CODE (constructor_type) == RECORD_TYPE
|| TREE_CODE (constructor_type) == UNION_TYPE)
|| TREE_CODE (constructor_type) == UNION_TYPE
|| TREE_CODE (constructor_type) == ARRAY_TYPE)
{
if (purpose_member (field, constructor_pending_elts))
{
error_init ("duplicate initializer%s", " for `%s'", NULL);
duplicate = 1;
}
}
if (TREE_CODE (constructor_type) == ARRAY_TYPE)
{
tree tail;
for (tail = constructor_pending_elts; tail;
tail = TREE_CHAIN (tail))
if (TREE_PURPOSE (tail) != 0
&& TREE_CODE (TREE_PURPOSE (tail)) == INTEGER_CST
&& tree_int_cst_equal (TREE_PURPOSE (tail), constructor_index))
break;
if (tail != 0)
if (pending_init_member (field))
{
error_init ("duplicate initializer%s", " for `%s'", NULL);
duplicate = 1;
@ -5963,11 +6207,9 @@ output_init_element (value, type, field, pending)
if (! duplicate)
/* The copy_node is needed in case field is actually
constructor_index, which is modified in place. */
constructor_pending_elts
= tree_cons (copy_node (field),
digest_init (type, value, require_constant_value,
require_constant_elements),
constructor_pending_elts);
add_pending_init (copy_node (field),
digest_init (type, value, require_constant_value,
require_constant_elements));
}
else if (TREE_CODE (constructor_type) == RECORD_TYPE
&& field != constructor_unfilled_fields)
@ -5976,11 +6218,9 @@ output_init_element (value, type, field, pending)
no matter which field is specified, it can be initialized
right away since it starts at the beginning of the union. */
if (!duplicate)
constructor_pending_elts
= tree_cons (field,
digest_init (type, value, require_constant_value,
require_constant_elements),
constructor_pending_elts);
add_pending_init (field,
digest_init (type, value, require_constant_value,
require_constant_elements));
}
else
{
@ -6080,56 +6320,109 @@ static void
output_pending_init_elements (all)
int all;
{
tree tail;
struct init_node *elt = constructor_pending_elts;
tree next;
retry:
/* Look thru the whole pending list.
/* Look thru the whole pending tree.
If we find an element that should be output now,
output it. Otherwise, set NEXT to the element
that comes first among those still pending. */
next = 0;
for (tail = constructor_pending_elts; tail;
tail = TREE_CHAIN (tail))
while (elt)
{
if (TREE_CODE (constructor_type) == ARRAY_TYPE)
{
if (tree_int_cst_equal (TREE_PURPOSE (tail),
if (tree_int_cst_equal (elt->purpose,
constructor_unfilled_index))
output_init_element (elt->value,
TREE_TYPE (constructor_type),
constructor_unfilled_index, 0);
else if (tree_int_cst_lt (constructor_unfilled_index,
elt->purpose))
{
output_init_element (TREE_VALUE (tail),
TREE_TYPE (constructor_type),
constructor_unfilled_index, 0);
goto retry;
/* Advance to the next smaller node. */
if (elt->left)
elt = elt->left;
else
{
/* We have reached the smallest node bigger than the
current unfilled index. Fill the space first. */
next = elt->purpose;
break;
}
}
else
{
/* Advance to the next bigger node. */
if (elt->right)
elt = elt->right;
else
{
/* We have reached the biggest node in a subtree. Find
the parent of it, which is the next bigger node. */
while (elt->parent && elt->parent->right == elt)
elt = elt->parent;
elt = elt->parent;
if (elt && tree_int_cst_lt (constructor_unfilled_index,
elt->purpose))
{
next = elt->purpose;
break;
}
}
}
else if (tree_int_cst_lt (TREE_PURPOSE (tail),
constructor_unfilled_index))
;
else if (next == 0
|| tree_int_cst_lt (TREE_PURPOSE (tail), next))
next = TREE_PURPOSE (tail);
}
else if (TREE_CODE (constructor_type) == RECORD_TYPE
|| TREE_CODE (constructor_type) == UNION_TYPE)
{
if (TREE_PURPOSE (tail) == constructor_unfilled_fields)
/* If the current record is complete we are done. */
if (constructor_unfilled_fields == 0)
break;
if (elt->purpose == constructor_unfilled_fields)
{
output_init_element (TREE_VALUE (tail),
output_init_element (elt->value,
TREE_TYPE (constructor_unfilled_fields),
constructor_unfilled_fields,
0);
goto retry;
}
else if (constructor_unfilled_fields == 0
|| tree_int_cst_lt (DECL_FIELD_BITPOS (TREE_PURPOSE (tail)),
DECL_FIELD_BITPOS (constructor_unfilled_fields)))
;
else if (next == 0
|| tree_int_cst_lt (DECL_FIELD_BITPOS (TREE_PURPOSE (tail)),
DECL_FIELD_BITPOS (next)))
next = TREE_PURPOSE (tail);
else if (tree_int_cst_lt (DECL_FIELD_BITPOS (constructor_unfilled_fields),
DECL_FIELD_BITPOS (elt->purpose)))
{
/* Advance to the next smaller node. */
if (elt->left)
elt = elt->left;
else
{
/* We have reached the smallest node bigger than the
current unfilled field. Fill the space first. */
next = elt->purpose;
break;
}
}
else
{
/* Advance to the next bigger node. */
if (elt->right)
elt = elt->right;
else
{
/* We have reached the biggest node in a subtree. Find
the parent of it, which is the next bigger node. */
while (elt->parent && elt->parent->right == elt)
elt = elt->parent;
elt = elt->parent;
if (elt
&& tree_int_cst_lt (DECL_FIELD_BITPOS (constructor_unfilled_fields),
DECL_FIELD_BITPOS (elt->purpose)))
{
next = elt->purpose;
break;
}
}
}
}
}
@ -6147,6 +6440,7 @@ output_pending_init_elements (all)
if (TREE_CODE (constructor_type) == RECORD_TYPE
|| TREE_CODE (constructor_type) == UNION_TYPE)
{
tree tail;
/* Find the last field written out, if any. */
for (tail = TYPE_FIELDS (constructor_type); tail;
tail = TREE_CHAIN (tail))
@ -6212,6 +6506,8 @@ output_pending_init_elements (all)
}
}
/* ELT now points to the node in the pending tree with the next
initializer to output. */
goto retry;
}

View File

@ -125,7 +125,8 @@ int stack_arg_under_construction;
static int calls_function PROTO((tree, int));
static int calls_function_1 PROTO((tree, int));
static void emit_call_1 PROTO((rtx, tree, tree, int, int, rtx, rtx,
static void emit_call_1 PROTO((rtx, tree, tree, HOST_WIDE_INT,
HOST_WIDE_INT, rtx, rtx,
int, rtx, int));
static void store_one_arg PROTO ((struct arg_data *, rtx, int, int,
tree, int));
@ -347,8 +348,8 @@ emit_call_1 (funexp, fndecl, funtype, stack_size, struct_value_size,
rtx funexp;
tree fndecl;
tree funtype;
int stack_size;
int struct_value_size;
HOST_WIDE_INT stack_size;
HOST_WIDE_INT struct_value_size;
rtx next_arg_reg;
rtx valreg;
int old_inhibit_defer_pop;
@ -509,7 +510,7 @@ expand_call (exp, target, ignore)
/* Size of aggregate value wanted, or zero if none wanted
or if we are using the non-reentrant PCC calling convention
or expecting the value in registers. */
int struct_value_size = 0;
HOST_WIDE_INT struct_value_size = 0;
/* Nonzero if called function returns an aggregate in memory PCC style,
by returning the address of where to find it. */
int pcc_struct_value = 0;
@ -543,14 +544,10 @@ expand_call (exp, target, ignore)
So the entire argument block must then be preallocated (i.e., we
ignore PUSH_ROUNDING in that case). */
#if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
int must_preallocate = 1;
#else
#ifdef PUSH_ROUNDING
int must_preallocate = 0;
#else
int must_preallocate = 1;
#endif
#endif
/* Size of the stack reserved for parameter registers. */
@ -662,6 +659,11 @@ expand_call (exp, target, ignore)
#endif
#endif
#if defined(PUSH_ROUNDING) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
if (reg_parm_stack_space > 0)
must_preallocate = 1;
#endif
/* Warn if this value is an aggregate type,
regardless of which calling convention we are using for it. */
if (warn_aggregate_return && AGGREGATE_TYPE_P (TREE_TYPE (exp)))
@ -712,8 +714,7 @@ expand_call (exp, target, ignore)
DECL_RTL (d) = assign_temp (TREE_TYPE (exp), 1, 0, 1);
mark_addressable (d);
structure_value_addr = XEXP (DECL_RTL (d), 0);
MEM_IN_STRUCT_P (structure_value_addr)
= AGGREGATE_TYPE_P (TREE_TYPE (exp));
TREE_USED (d) = 1;
target = 0;
}
}
@ -771,18 +772,18 @@ expand_call (exp, target, ignore)
outgoing argument list in addition to the requested
space, but there is no way to ask for stack space such
that an argument list of a certain length can be
safely constructed. */
safely constructed.
int adjust = OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl));
#ifdef REG_PARM_STACK_SPACE
/* Add the stack space reserved for register arguments
in the inline function. What is really needed is the
Add the stack space reserved for register arguments, if
any, in the inline function. What is really needed is the
largest value of reg_parm_stack_space in the inline
function, but that is not available. Using the current
value of reg_parm_stack_space is wrong, but gives
correct results on all supported machines. */
adjust += reg_parm_stack_space;
#endif
int adjust = (OUTGOING_ARGS_SIZE (DECL_SAVED_INSNS (fndecl))
+ reg_parm_stack_space);
start_sequence ();
emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
allocate_dynamic_stack_space (GEN_INT (adjust),
@ -965,11 +966,11 @@ expand_call (exp, target, ignore)
/* Compute number of named args.
Normally, don't include the last named arg if anonymous args follow.
We do include the last named arg if STRICT_ARGUMENT_NAMING is defined.
We do include the last named arg if STRICT_ARGUMENT_NAMING is nonzero.
(If no anonymous args follow, the result of list_length is actually
one too large. This is harmless.)
If SETUP_INCOMING_VARARGS is defined and STRICT_ARGUMENT_NAMING is not,
If SETUP_INCOMING_VARARGS is defined and STRICT_ARGUMENT_NAMING is zero,
this machine will be able to place unnamed args that were passed in
registers into the stack. So treat all args as named. This allows the
insns emitting for a specific argument list to be independent of the
@ -978,18 +979,20 @@ expand_call (exp, target, ignore)
If SETUP_INCOMING_VARARGS is not defined, we do not have any reliable
way to pass unnamed args in registers, so we must force them into
memory. */
#if !defined(SETUP_INCOMING_VARARGS) || defined(STRICT_ARGUMENT_NAMING)
if (TYPE_ARG_TYPES (funtype) != 0)
if ((STRICT_ARGUMENT_NAMING
#ifndef SETUP_INCOMING_VARARGS
|| 1
#endif
)
&& TYPE_ARG_TYPES (funtype) != 0)
n_named_args
= (list_length (TYPE_ARG_TYPES (funtype))
#ifndef STRICT_ARGUMENT_NAMING
/* Don't include the last named arg. */
- 1
#endif
- (STRICT_ARGUMENT_NAMING ? 0 : -1)
/* Count the struct value address, if it is passed as a parm. */
+ structure_value_addr_parm);
else
#endif
/* If we know nothing, treat all args as named. */
n_named_args = num_actuals;
@ -1164,9 +1167,7 @@ expand_call (exp, target, ignore)
/* Compute the stack-size of this argument. */
if (args[i].reg == 0 || args[i].partial != 0
#ifdef REG_PARM_STACK_SPACE
|| reg_parm_stack_space > 0
#endif
|| args[i].pass_on_stack)
locate_and_pad_parm (mode, type,
#ifdef STACK_PARMS_IN_REG_PARM_AREA
@ -1181,14 +1182,12 @@ expand_call (exp, target, ignore)
args[i].slot_offset = args_size;
#endif
#ifndef REG_PARM_STACK_SPACE
/* If a part of the arg was put into registers,
don't include that part in the amount pushed. */
if (! args[i].pass_on_stack)
if (reg_parm_stack_space == 0 && ! args[i].pass_on_stack)
args[i].size.constant -= ((args[i].partial * UNITS_PER_WORD)
/ (PARM_BOUNDARY / BITS_PER_UNIT)
* (PARM_BOUNDARY / BITS_PER_UNIT));
#endif
/* Update ARGS_SIZE, the total stack space for args so far. */
@ -1245,12 +1244,11 @@ expand_call (exp, target, ignore)
args_size.var = round_up (args_size.var, STACK_BYTES);
#endif
#ifdef REG_PARM_STACK_SPACE
if (reg_parm_stack_space > 0)
{
args_size.var
= size_binop (MAX_EXPR, args_size.var,
size_int (REG_PARM_STACK_SPACE (fndecl)));
size_int (reg_parm_stack_space));
#ifndef OUTGOING_REG_PARM_STACK_SPACE
/* The area corresponding to register parameters is not to count in
@ -1260,7 +1258,6 @@ expand_call (exp, target, ignore)
size_int (reg_parm_stack_space));
#endif
}
#endif
}
else
{
@ -1269,16 +1266,16 @@ expand_call (exp, target, ignore)
/ STACK_BYTES) * STACK_BYTES);
#endif
#ifdef REG_PARM_STACK_SPACE
args_size.constant = MAX (args_size.constant,
reg_parm_stack_space);
#ifdef MAYBE_REG_PARM_STACK_SPACE
if (reg_parm_stack_space == 0)
args_size.constant = 0;
#endif
#ifndef OUTGOING_REG_PARM_STACK_SPACE
args_size.constant -= reg_parm_stack_space;
#endif
#endif
}
@ -1444,7 +1441,7 @@ expand_call (exp, target, ignore)
Another approach might be to try to reorder the argument
evaluations to avoid this conflicting stack usage. */
#if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
#ifndef OUTGOING_REG_PARM_STACK_SPACE
/* Since we will be writing into the entire argument area, the
map must be allocated for its entire size, not just the part that
is the responsibility of the caller. */
@ -1516,7 +1513,7 @@ expand_call (exp, target, ignore)
to initialize an argument. */
if (stack_arg_under_construction)
{
#if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
#ifndef OUTGOING_REG_PARM_STACK_SPACE
rtx push_size = GEN_INT (reg_parm_stack_space + args_size.constant);
#else
rtx push_size = GEN_INT (args_size.constant);
@ -1695,6 +1692,7 @@ expand_call (exp, target, ignore)
}
#if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
/* The argument list is the property of the called routine and it
may clobber it. If the fixed area has been used for previous
parameters, we must save and restore it.
@ -2322,6 +2320,7 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
struct arg *argvec;
int old_inhibit_defer_pop = inhibit_defer_pop;
rtx call_fusage = 0;
int reg_parm_stack_space = 0;
#if defined(ACCUMULATE_OUTGOING_ARGS) && defined(REG_PARM_STACK_SPACE)
/* Define the boundary of the register parm stack space that needs to be
save, if any. */
@ -2337,7 +2336,6 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
#ifdef REG_PARM_STACK_SPACE
/* Size of the stack reserved for parameter registers. */
int reg_parm_stack_space = 0;
#ifdef MAYBE_REG_PARM_STACK_SPACE
reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
#else
@ -2433,16 +2431,11 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
if (argvec[count].size.var)
abort ();
#ifndef REG_PARM_STACK_SPACE
if (argvec[count].partial)
if (reg_parm_stack_space == 0 && argvec[count].partial)
argvec[count].size.constant -= argvec[count].partial * UNITS_PER_WORD;
#endif
if (argvec[count].reg == 0 || argvec[count].partial != 0
#ifdef REG_PARM_STACK_SPACE
|| 1
#endif
)
|| reg_parm_stack_space > 0)
args_size.constant += argvec[count].size.constant;
FUNCTION_ARG_ADVANCE (args_so_far, mode, (tree) 0, 1);
@ -2464,12 +2457,11 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
/ STACK_BYTES) * STACK_BYTES);
#endif
#ifdef REG_PARM_STACK_SPACE
args_size.constant = MAX (args_size.constant,
reg_parm_stack_space);
#ifndef OUTGOING_REG_PARM_STACK_SPACE
args_size.constant -= reg_parm_stack_space;
#endif
#endif
if (args_size.constant > current_function_outgoing_args_size)
@ -2489,7 +2481,8 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
evaluations to avoid this conflicting stack usage. */
needed = args_size.constant;
#if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
#ifndef OUTGOING_REG_PARM_STACK_SPACE
/* Since we will be writing into the entire argument area, the
map must be allocated for its entire size, not just the part that
is the responsibility of the caller. */
@ -2638,17 +2631,14 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
for (i = lower_bound; i < upper_bound; i++)
if (stack_usage_map[i]
#ifdef REG_PARM_STACK_SPACE
/* Don't store things in the fixed argument area at this point;
it has already been saved. */
&& i > reg_parm_stack_space
#endif
)
&& i > reg_parm_stack_space)
break;
if (i != upper_bound)
{
/* We need to make a save area. See what mode we can make it. */
/* We need to make a save area. See what mode we can make it. */
enum machine_mode save_mode
= mode_for_size (argvec[argnum].size.constant * BITS_PER_UNIT,
MODE_INT, 1);
@ -2661,7 +2651,8 @@ emit_library_call VPROTO((rtx orgfun, int no_queue, enum machine_mode outmode,
}
#endif
emit_push_insn (val, mode, NULL_TREE, NULL_RTX, 0, partial, reg, 0,
argblock, GEN_INT (argvec[argnum].offset.constant));
argblock, GEN_INT (argvec[argnum].offset.constant),
reg_parm_stack_space);
#ifdef ACCUMULATE_OUTGOING_ARGS
/* Now mark the segment we just used. */
@ -2825,6 +2816,7 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
int pcc_struct_value = 0;
int struct_value_size = 0;
int is_const;
int reg_parm_stack_space = 0;
#ifdef ACCUMULATE_OUTGOING_ARGS
int needed;
#endif
@ -2838,7 +2830,6 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
#ifdef ACCUMULATE_OUTGOING_ARGS
/* Size of the stack reserved for parameter registers. */
int reg_parm_stack_space = 0;
int initial_highest_arg_in_use = highest_outgoing_arg_in_use;
char *initial_stack_usage_map = stack_usage_map;
#endif
@ -2938,10 +2929,7 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
if (argvec[count].reg == 0 || argvec[count].partial != 0
#ifdef REG_PARM_STACK_SPACE
|| 1
#endif
)
|| reg_parm_stack_space > 0)
args_size.constant += argvec[count].size.constant;
FUNCTION_ARG_ADVANCE (args_so_far, Pmode, (tree) 0, 1);
@ -3008,16 +2996,11 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
if (argvec[count].size.var)
abort ();
#ifndef REG_PARM_STACK_SPACE
if (argvec[count].partial)
if (reg_parm_stack_space == 0 && argvec[count].partial)
argvec[count].size.constant -= argvec[count].partial * UNITS_PER_WORD;
#endif
if (argvec[count].reg == 0 || argvec[count].partial != 0
#ifdef REG_PARM_STACK_SPACE
|| 1
#endif
)
|| reg_parm_stack_space > 0)
args_size.constant += argvec[count].size.constant;
FUNCTION_ARG_ADVANCE (args_so_far, mode, (tree) 0, 1);
@ -3038,12 +3021,11 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
/ STACK_BYTES) * STACK_BYTES);
#endif
#ifdef REG_PARM_STACK_SPACE
args_size.constant = MAX (args_size.constant,
reg_parm_stack_space);
#ifndef OUTGOING_REG_PARM_STACK_SPACE
args_size.constant -= reg_parm_stack_space;
#endif
#endif
if (args_size.constant > current_function_outgoing_args_size)
@ -3063,7 +3045,8 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
evaluations to avoid this conflicting stack usage. */
needed = args_size.constant;
#if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE)
#ifndef OUTGOING_REG_PARM_STACK_SPACE
/* Since we will be writing into the entire argument area, the
map must be allocated for its entire size, not just the part that
is the responsibility of the caller. */
@ -3212,17 +3195,14 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
for (i = lower_bound; i < upper_bound; i++)
if (stack_usage_map[i]
#ifdef REG_PARM_STACK_SPACE
/* Don't store things in the fixed argument area at this point;
it has already been saved. */
&& i > reg_parm_stack_space
#endif
)
&& i > reg_parm_stack_space)
break;
if (i != upper_bound)
{
/* We need to make a save area. See what mode we can make it. */
/* We need to make a save area. See what mode we can make it. */
enum machine_mode save_mode
= mode_for_size (argvec[argnum].size.constant * BITS_PER_UNIT,
MODE_INT, 1);
@ -3236,7 +3216,8 @@ emit_library_call_value VPROTO((rtx orgfun, rtx value, int no_queue,
}
#endif
emit_push_insn (val, mode, NULL_TREE, NULL_RTX, 0, partial, reg, 0,
argblock, GEN_INT (argvec[argnum].offset.constant));
argblock, GEN_INT (argvec[argnum].offset.constant),
reg_parm_stack_space);
#ifdef ACCUMULATE_OUTGOING_ARGS
/* Now mark the segment we just used. */
@ -3491,12 +3472,9 @@ store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl,
for (i = lower_bound; i < upper_bound; i++)
if (stack_usage_map[i]
#ifdef REG_PARM_STACK_SPACE
/* Don't store things in the fixed argument area at this point;
it has already been saved. */
&& i > reg_parm_stack_space
#endif
)
&& i > reg_parm_stack_space)
break;
if (i != upper_bound)
@ -3642,9 +3620,9 @@ store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl,
/* This isn't already where we want it on the stack, so put it there.
This can either be done with push or copy insns. */
emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX,
0, partial, reg, used - size,
argblock, ARGS_SIZE_RTX (arg->offset));
emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), NULL_RTX, 0,
partial, reg, used - size, argblock,
ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space);
}
else
{
@ -3676,7 +3654,8 @@ store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl,
emit_push_insn (arg->value, arg->mode, TREE_TYPE (pval), size_rtx,
TYPE_ALIGN (TREE_TYPE (pval)) / BITS_PER_UNIT, partial,
reg, excess, argblock, ARGS_SIZE_RTX (arg->offset));
reg, excess, argblock, ARGS_SIZE_RTX (arg->offset),
reg_parm_stack_space);
}

File diff suppressed because it is too large Load Diff

View File

@ -433,7 +433,7 @@ static const short yycheck[] = { 4,
26, 27, 23, 24, 25, 26, 27, 0, 9
};
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
#line 3 "/usr/share/bison.simple"
#line 3 "/usr/cygnus/latest-940103/share/bison.simple"
/* Skeleton output parser for bison,
Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
@ -626,7 +626,7 @@ __yy_memcpy (char *to, char *from, int count)
#endif
#endif
#line 196 "/usr/share/bison.simple"
#line 196 "/usr/cygnus/latest-940103/share/bison.simple"
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
into yyparse. The argument should have type void *.
@ -1207,7 +1207,7 @@ case 40:
break;}
}
/* the action file gets copied in in place of this dollarsign */
#line 498 "/usr/share/bison.simple"
#line 498 "/usr/cygnus/latest-940103/share/bison.simple"
yyvsp -= yylen;
yyssp -= yylen;

View File

@ -7072,8 +7072,8 @@ make_field_assignment (x)
pos = get_pos_from_mask ((~ c1) & GET_MODE_MASK (GET_MODE (dest)), &len);
if (pos < 0 || pos + len > GET_MODE_BITSIZE (GET_MODE (dest))
|| (GET_MODE_BITSIZE (GET_MODE (other)) <= HOST_BITS_PER_WIDE_INT
&& (c1 & nonzero_bits (other, GET_MODE (other))) != 0))
|| GET_MODE_BITSIZE (GET_MODE (dest)) > HOST_BITS_PER_WIDE_INT
|| (c1 & nonzero_bits (other, GET_MODE (dest))) != 0)
return x;
assign = make_extraction (VOIDmode, dest, pos, NULL_RTX, len, 1, 1, 0);
@ -9324,6 +9324,13 @@ gen_binary (code, mode, op0, op1)
&& GET_RTX_CLASS (GET_CODE (op1)) != 'o')))
return gen_rtx_combine (code, mode, op1, op0);
/* If we are turning off bits already known off in OP0, we need not do
an AND. */
else if (code == AND && GET_CODE (op1) == CONST_INT
&& GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_WIDE_INT
&& (nonzero_bits (op0, mode) & ~ INTVAL (op1)) == 0)
return op0;
return gen_rtx_combine (code, mode, op0, op1);
}
@ -10127,6 +10134,32 @@ simplify_comparison (code, pop0, pop1)
op0 = gen_lowpart_for_combine (tmode, XEXP (op0, 0));
continue;
}
/* If this is (and:M1 (subreg:M2 X 0) (const_int C1)) where C1 fits
in both M1 and M2 and the SUBREG is either paradoxical or
represents the low part, permute the SUBREG and the AND and
try again. */
if (GET_CODE (XEXP (op0, 0)) == SUBREG
&& ((mode_width
>= GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0)))))
|| subreg_lowpart_p (XEXP (op0, 0)))
&& GET_CODE (XEXP (op0, 1)) == CONST_INT
&& mode_width <= HOST_BITS_PER_WIDE_INT
&& (GET_MODE_BITSIZE (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
<= HOST_BITS_PER_WIDE_INT)
&& (INTVAL (XEXP (op0, 1)) & ~ mask) == 0
&& 0 == (~ GET_MODE_MASK (GET_MODE (SUBREG_REG (XEXP (op0, 0))))
& INTVAL (XEXP (op0, 1))))
{
op0
= gen_lowpart_for_combine
(mode,
gen_binary (AND, GET_MODE (SUBREG_REG (XEXP (op0, 0))),
SUBREG_REG (XEXP (op0, 0)), XEXP (op0, 1)));
continue;
}
break;
case ASHIFT:
@ -11459,15 +11492,21 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
if (reg_set_p (XEXP (note, 0), PATTERN (tem)))
{
rtx set = single_set (tem);
rtx inner_dest = 0;
if (set != 0)
for (inner_dest = SET_DEST (set);
GET_CODE (inner_dest) == STRICT_LOW_PART
|| GET_CODE (inner_dest) == SUBREG
|| GET_CODE (inner_dest) == ZERO_EXTRACT;
inner_dest = XEXP (inner_dest, 0))
;
/* Verify that it was the set, and not a clobber that
modified the register. */
if (set != 0 && ! side_effects_p (SET_SRC (set))
&& (rtx_equal_p (XEXP (note, 0), SET_DEST (set))
|| (GET_CODE (SET_DEST (set)) == SUBREG
&& rtx_equal_p (XEXP (note, 0),
XEXP (SET_DEST (set), 0)))))
&& rtx_equal_p (XEXP (note, 0), inner_dest))
{
/* Move the notes and links of TEM elsewhere.
This might delete other dead insns recursively.
@ -11484,6 +11523,20 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
NOTE_LINE_NUMBER (tem) = NOTE_INSN_DELETED;
NOTE_SOURCE_FILE (tem) = 0;
}
/* If the register is both set and used here, put the
REG_DEAD note here, but place a REG_UNUSED note
here too unless there already is one. */
else if (reg_referenced_p (XEXP (note, 0),
PATTERN (tem)))
{
place = tem;
if (! find_regno_note (tem, REG_UNUSED,
REGNO (XEXP (note, 0))))
REG_NOTES (tem)
= gen_rtx (EXPR_LIST, REG_UNUSED, XEXP (note, 0),
REG_NOTES (tem));
}
else
{
PUT_REG_NOTE_KIND (note, REG_UNUSED);
@ -11540,13 +11593,12 @@ distribute_notes (notes, from_insn, i3, i2, elim_i2, elim_i1)
}
/* If the register is set or already dead at PLACE, we needn't do
anything with this note if it is still a REG_DEAD note.
anything with this note if it is still a REG_DEAD note.
We can here if it is set at all, not if is it totally replace,
which is what `dead_or_set_p' checks, so also check for it being
set partially. */
Note that we cannot use just `dead_or_set_p' here since we can
convert an assignment to a register into a bit-field assignment.
Therefore, we must also omit the note if the register is the
target of a bitfield assignment. */
if (place && REG_NOTE_KIND (note) == REG_DEAD)
{
int regno = REGNO (XEXP (note, 0));

View File

@ -41,7 +41,7 @@
/* Whether atol must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_ATOL
/* Whether sbrk must be declared even if <unistd.h> is included. */
/* Whether sbrk must be declared even if <stdlib.h> is included. */
#undef NEED_DECLARATION_SBRK
/* Whether abort must be declared even if <stdlib.h> is included. */
@ -101,6 +101,9 @@
/* Define if you have the strtoul function. */
#undef HAVE_STRTOUL
/* Define if you have the sysconf function. */
#undef HAVE_SYSCONF
/* Define if you have the vprintf function. */
#undef HAVE_VPRINTF

38
gcc/config.sub vendored
View File

@ -1,6 +1,6 @@
#! /bin/sh
# Configuration validation subroutine script, version 1.1.
# Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
# This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software
# can handle that machine. It does not imply ALL GNU software can.
@ -165,7 +165,7 @@ case $basic_machine in
# We use `pc' rather than `unknown'
# because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users.
i[3456]86)
i[34567]86)
basic_machine=$basic_machine-pc
;;
# Object if more than one company name word.
@ -174,7 +174,7 @@ case $basic_machine in
exit 1
;;
# Recognize the basic CPU types with company name.
vax-* | tahoe-* | i[3456]86-* | i860-* | m32r-* | m68k-* | m68000-* \
vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
| power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
@ -368,19 +368,19 @@ case $basic_machine in
os=-mvs
;;
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
i[3456]86v32)
i[34567]86v32)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv32
;;
i[3456]86v4*)
i[34567]86v4*)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv4
;;
i[3456]86v)
i[34567]86v)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-sysv
;;
i[3456]86sol2)
i[34567]86sol2)
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
os=-solaris2
;;
@ -487,25 +487,23 @@ case $basic_machine in
pc532 | pc532-*)
basic_machine=ns32k-pc532
;;
pentium | p5)
basic_machine=i586-intel
pentium | p5 | k5 | nexen)
basic_machine=i586-pc
;;
pentiumpro | p6)
basic_machine=i686-intel
pentiumpro | p6 | k6 | 6x86)
basic_machine=i686-pc
;;
pentium-* | p5-*)
pentiumii | pentium2)
basic_machine=i786-pc
;;
pentium-* | p5-* | k5-* | nexen-*)
basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pentiumpro-* | p6-*)
pentiumpro-* | p6-* | k6-* | 6x86-*)
basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
k5)
# We don't have specific support for AMD's K5 yet, so just call it a Pentium
basic_machine=i586-amd
;;
nexen)
# We don't have specific support for Nexgen yet, so just call it a Pentium
basic_machine=i586-nexgen
pentiumii-* | pentium2-*)
basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
pn)
basic_machine=pn-gould

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for DEC Alpha w/ELF.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Richard Henderson (rth@tamu.edu).
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
/* Output routines for GCC for ARM/RISCiX.
Copyright (C) 1991, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Copyright (C) 1991, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl)
and Martin Simmons (@harleqn.co.uk).
More major hacks by Richard Earnshaw (rwe11@cl.cam.ac.uk)
@ -3271,6 +3271,16 @@ arm_reload_in_hi (operands)
rtx base = find_replacement (&XEXP (operands[1], 0));
emit_insn (gen_zero_extendqisi2 (operands[2], gen_rtx (MEM, QImode, base)));
/* Handle the case where the address is too complex to be offset by 1. */
if (GET_CODE (base) == MINUS
|| (GET_CODE (base) == PLUS && GET_CODE (XEXP (base, 1)) != CONST_INT))
{
rtx base_plus = gen_rtx (REG, SImode, REGNO (operands[0]));
emit_insn (gen_rtx (SET, VOIDmode, base_plus, base));
base = base_plus;
}
emit_insn (gen_zero_extendqisi2 (gen_rtx (SUBREG, SImode, operands[0], 0),
gen_rtx (MEM, QImode,
plus_constant (base, 1))));
@ -3524,6 +3534,7 @@ find_barrier (from, max_count)
{
int count = 0;
rtx found_barrier = 0;
rtx last = from;
while (from && count < max_count)
{
@ -3537,11 +3548,12 @@ find_barrier (from, max_count)
&& CONSTANT_POOL_ADDRESS_P (SET_SRC (PATTERN (from))))
{
rtx src = SET_SRC (PATTERN (from));
count += 2;
count += 8;
}
else
count += get_attr_length (from);
last = from;
from = NEXT_INSN (from);
}
@ -3552,7 +3564,7 @@ find_barrier (from, max_count)
rtx label = gen_label_rtx ();
if (from)
from = PREV_INSN (from);
from = PREV_INSN (last);
else
from = get_last_insn ();

View File

@ -1,5 +1,5 @@
;;- Machine description for Advanced RISC Machines' ARM for GNU compiler
;; Copyright (C) 1991, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
;; Copyright (C) 1991, 93-97, 1998 Free Software Foundation, Inc.
;; Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl)
;; and Martin Simmons (@harleqn.co.uk).
;; More major hacks by Richard Earnshaw (rwe11@cl.cam.ac.uk)

View File

@ -1,6 +1,6 @@
# Just for these, we omit the frame pointer since it makes such a big
# difference. It is then pointless adding debugging.
LIBGCC2_CFLAGS=-O2 -fomit-frame-pointer $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) -g0
LIBGCC2_CFLAGS=-O2 -fomit-frame-pointer $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) -g0
# Don't build enquire
ENQUIRE=

View File

@ -21,7 +21,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#define YES_UNDERSCORES
#define DBX_DEBUGGING_INFO
@ -150,10 +149,9 @@ do \
while (0)
#endif
/* This macro gets just the user-specified name
out of the string in a SYMBOL_REF. Discard
trailing @[NUM] encoded by ENCODE_SECTION_INFO.
Do we need the stripping of leading '*'? */
/* This macro gets just the user-specified name out of the string in a
SYMBOL_REF. Discard trailing @[NUM] encoded by ENCODE_SECTION_INFO. */
#undef STRIP_NAME_ENCODING
#define STRIP_NAME_ENCODING(VAR,SYMBOL_NAME) \
do { \
@ -172,7 +170,6 @@ do { \
(VAR) = _name; \
} while (0)
/* Emit code to check the stack when allocating more that 4000
bytes in one go. */

View File

@ -4,7 +4,8 @@
#include <i386/linux.h>
#undef CPP_PREDEFINES
#define CPP_PREDEFINES GNU_CPP_PREDEFINES("i386")
#define CPP_PREDEFINES "-Di386 -Acpu(i386) -Amachine(i386) \
-Dunix -Asystem(unix) -DMACH -Asystem(mach) -D__GNU__ -Asystem(gnu)"
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (i386 GNU)");

View File

@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler for Intel X86
(386, 486, Pentium).
Copyright (C) 1988, 92, 94-97, 1998 Free Software Foundation, Inc.
Copyright (C) 1988, 92, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -436,12 +436,6 @@ extern int ix86_arch;
/* Required on the 386 since it doesn't have bitfield insns. */
#define PCC_BITFIELD_TYPE_MATTERS 1
/* An integer expression for the size in bits of the largest integer
machine mode that should actually be used. All integer machine modes of
this size or smaller can be used for structures and unions with the
appropriate sizes. */
#define MAX_FIXED_MODE_SIZE 32
/* Maximum power of 2 that code can be aligned to. */
#define MAX_CODE_ALIGN 6 /* 64 byte alignment */
@ -1870,6 +1864,7 @@ while (0)
#define CONST_COSTS(RTX,CODE,OUTER_CODE) \
case CONST_INT: \
return (unsigned) INTVAL (RTX) < 256 ? 0 : 1; \
case CONST: \
case LABEL_REF: \
case SYMBOL_REF: \

View File

@ -1,5 +1,5 @@
; GCC machine description for Intel X86.
;; Copyright (C) 1988, 94-97, 1998 Free Software Foundation, Inc.
;; Copyright (C) 1988, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
;; Mostly by William Schelter.
;; This file is part of GNU CC.
@ -7378,11 +7378,10 @@ byte_xor_operation:
(define_expand "movsicc"
[(match_dup 4)
(parallel [(set (match_operand 0 "register_operand" "")
(set (match_operand 0 "register_operand" "")
(if_then_else:SI (match_operand 1 "comparison_operator" "")
(match_operand:SI 2 "general_operand" "")
(match_operand:SI 3 "general_operand" "")))
(clobber (match_scratch:SI 4 "=&r"))])]
(match_operand:SI 2 "nonimmediate_operand" "")
(match_operand:SI 3 "nonimmediate_operand" "")))]
"TARGET_CMOVE"
"
{
@ -7391,11 +7390,10 @@ byte_xor_operation:
(define_expand "movhicc"
[(match_dup 4)
(parallel [(set (match_operand 0 "register_operand" "")
(set (match_operand 0 "register_operand" "")
(if_then_else:HI (match_operand 1 "comparison_operator" "")
(match_operand:HI 2 "general_operand" "")
(match_operand:HI 3 "general_operand" "")))
(clobber (match_scratch:SI 4 "=&r"))])]
(match_operand:HI 2 "nonimmediate_operand" "")
(match_operand:HI 3 "nonimmediate_operand" "")))]
"TARGET_CMOVE"
"
{
@ -7403,146 +7401,80 @@ byte_xor_operation:
}")
(define_insn "movsicc_1"
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,&r,rm")
[(set (match_operand:SI 0 "nonimmediate_operand" "=r,r,&r")
(if_then_else:SI (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
(match_operand:SI 2 "general_operand" "rm,0,rm,g")
(match_operand:SI 3 "general_operand" "0,rm,rm,g")))
(clobber (match_scratch:SI 4 "X,X,X,=&r"))]
[(cc0) (const_int 0)])
(match_operand:SI 2 "nonimmediate_operand" "rm,0,rm")
(match_operand:SI 3 "nonimmediate_operand" "0,rm,rm")))]
"TARGET_CMOVE"
"*
{
if (which_alternative == 0)
switch (which_alternative)
{
case 0:
/* r <- cond ? arg : r */
output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
}
else if (which_alternative == 1)
{
break;
case 1:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
}
else if (which_alternative == 2)
{
break;
case 2:
/* r <- cond ? arg1 : arg2 */
output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
break;
}
else if (which_alternative == 3)
{
/* r <- cond ? arg1 : arg2 */
rtx xops[3];
xops[0] = gen_label_rtx ();
xops[1] = gen_label_rtx ();
xops[2] = operands[1];
output_asm_insn (\"j%c2 %l0\", xops);
if (! rtx_equal_p (operands[0], operands[2]))
if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[2]) == MEM)
{
output_asm_insn (AS2 (mov%z2,%2,%4), operands);
output_asm_insn (AS2 (mov%z2,%4,%0), operands);
}
else
output_asm_insn (AS2 (mov%z0,%2,%0), operands);
output_asm_insn (\"jmp %l1\", xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
if (! rtx_equal_p (operands[0], operands[3]))
{
if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[3]) == MEM)
{
output_asm_insn (AS2 (mov%z3,%3,%4), operands);
output_asm_insn (AS2 (mov%z3,%4,%0), operands);
}
else
output_asm_insn (AS2 (mov%z0,%3,%0), operands);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
}
RET;
}")
(define_insn "movhicc_1"
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,&r,rm")
[(set (match_operand:HI 0 "nonimmediate_operand" "=r,r,&r")
(if_then_else:HI (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
(match_operand:HI 2 "general_operand" "rm,0,rm,g")
(match_operand:HI 3 "general_operand" "0,rm,rm,g")))
(clobber (match_scratch:SI 4 "X,X,X,=&r"))]
[(cc0) (const_int 0)])
(match_operand:HI 2 "nonimmediate_operand" "rm,0,rm")
(match_operand:HI 3 "nonimmediate_operand" "0,rm,rm")))]
"TARGET_CMOVE"
"*
{
if (which_alternative == 0)
switch (which_alternative)
{
case 0:
/* r <- cond ? arg : r */
output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
}
else if (which_alternative == 1)
{
break;
case 1:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
}
else if (which_alternative == 2)
{
break;
case 2:
/* r <- cond ? arg1 : arg2 */
output_asm_insn (AS2 (cmov%C1,%2,%0), operands);
output_asm_insn (AS2 (cmov%c1,%3,%0), operands);
break;
}
else if (which_alternative == 3)
{
/* r <- cond ? arg1 : arg2 */
rtx xops[3];
xops[0] = gen_label_rtx ();
xops[1] = gen_label_rtx ();
xops[2] = operands[1];
output_asm_insn (\"j%c2 %l0\", xops);
if (! rtx_equal_p (operands[0], operands[2]))
if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[2]) == MEM)
{
output_asm_insn (AS2 (mov%z2,%2,%4), operands);
output_asm_insn (AS2 (mov%z2,%4,%0), operands);
}
else
output_asm_insn (AS2 (mov%z0,%2,%0), operands);
output_asm_insn (\"jmp %l1\", xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
if (! rtx_equal_p (operands[0], operands[3]))
{
if (GET_CODE (operands[0]) == MEM && GET_CODE (operands[3]) == MEM)
{
output_asm_insn (AS2 (mov%z3,%3,%4), operands);
output_asm_insn (AS2 (mov%z3,%4,%0), operands);
}
else
output_asm_insn (AS2 (mov%z0,%3,%0), operands);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
}
RET;
}")
;; We need to disable the FP forms of these since they do not support
;; memory as written, but no input reloads are permitted for insns
;; that use cc0. Also, movxfcc is not present.
(define_expand "movsfcc"
[(match_dup 4)
(set (match_operand 0 "general_operand" "")
(set (match_operand 0 "register_operand" "")
(if_then_else:SF (match_operand 1 "comparison_operator" "")
(match_operand:SF 2 "general_operand" "")
(match_operand:SF 3 "general_operand" "")))]
"TARGET_CMOVE"
(match_operand:SF 2 "register_operand" "")
(match_operand:SF 3 "register_operand" "")))]
"0 && TARGET_CMOVE"
"
{
int i;
for (i = 2; i <= 3; i++)
{
if ((reload_in_progress | reload_completed) == 0
&& CONSTANT_P (operands[i]))
{
operands[i] = force_const_mem (SFmode, operands[i]);
}
}
operands[4] = i386_compare_gen (i386_compare_op0, i386_compare_op1);
}")
@ -7550,211 +7482,85 @@ byte_xor_operation:
[(match_dup 4)
(set (match_operand 0 "register_operand" "t")
(if_then_else:DF (match_operand 1 "comparison_operator" "")
(match_operand:DF 2 "general_operand" "")
(match_operand:DF 3 "general_operand" "")))]
"TARGET_CMOVE"
(match_operand:DF 2 "register_operand" "")
(match_operand:DF 3 "register_operand" "")))]
"0 && TARGET_CMOVE"
"
{
int i;
for (i = 2; i <= 3; i++)
{
if ((reload_in_progress | reload_completed) == 0
&& CONSTANT_P (operands[i]))
{
operands[i] = force_const_mem (DFmode, operands[i]);
}
}
operands[4] = i386_compare_gen (i386_compare_op0, i386_compare_op1);
}")
(define_expand "movxfcc"
[(match_dup 4)
(set (match_operand 0 "register_operand" "t")
(set (match_operand 0 "register_operand" "")
(if_then_else:XF (match_operand 1 "comparison_operator" "")
(match_operand:XF 2 "general_operand" "")
(match_operand:XF 3 "general_operand" "")))]
"TARGET_CMOVE"
(match_operand:XF 2 "register_operand" "")
(match_operand:XF 3 "register_operand" "")))]
"0 && TARGET_CMOVE"
"
{
int i;
for (i = 2; i <= 3; i++)
{
if ((reload_in_progress | reload_completed) == 0
&& CONSTANT_P (operands[i]))
{
operands[i] = force_const_mem (XFmode, operands[i]);
}
}
operands[4] = i386_compare_gen (i386_compare_op0, i386_compare_op1);
}")
(define_insn "movsfcc_1"
[(set (match_operand:SF 0 "general_operand" "=f,=f,=f,=f")
[(set (match_operand:SF 0 "general_operand" "=f,f,&f")
(if_then_else:SF (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
(match_operand:SF 2 "general_operand" "0,f,f,fFm")
(match_operand:SF 3 "general_operand" "f,0,f,fFm")))]
[(cc0) (const_int 0)])
(match_operand:SF 2 "register_operand" "0,f,f")
(match_operand:SF 3 "register_operand" "f,0,f")))]
"TARGET_CMOVE"
"*
{
if (which_alternative == 0)
switch (which_alternative)
{
case 0:
/* r <- cond ? arg : r */
output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
}
else if (which_alternative == 1)
{
break;
case 1:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
}
else if (which_alternative == 2)
{
break;
case 2:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
break;
}
else if (which_alternative == 3)
{
/* r <- cond ? arg1 : arg2 */
rtx xops[3];
xops[0] = gen_label_rtx ();
xops[1] = gen_label_rtx ();
xops[2] = operands[1];
output_asm_insn (\"j%f2 %l0\", xops);
if (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM)
output_asm_insn (AS1 (fld%z2,%y2), operands);
else
{
operands[2] = XEXP (operands[2], 0);
output_asm_insn (AS1 (fld%z2,%y2), operands);
}
output_asm_insn (\"jmp %l1\", xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
if (STACK_REG_P (operands[3]) || GET_CODE (operands[0]) == MEM)
output_asm_insn (AS1 (fld%z3,%y3), operands);
else
{
operands[3] = XEXP (operands[3], 0);
output_asm_insn (AS1 (fld%z3,%y3), operands);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
}
RET;
}")
(define_insn "movdfcc_1"
[(set (match_operand:DF 0 "general_operand" "=f,=f,=f,=f")
[(set (match_operand:DF 0 "general_operand" "=f,f,&f")
(if_then_else:DF (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
(match_operand:DF 2 "general_operand" "0,f,f,fFm")
(match_operand:DF 3 "general_operand" "f,0,f,fFm")))]
[(cc0) (const_int 0)])
(match_operand:DF 2 "register_operand" "0,f,f")
(match_operand:DF 3 "register_operand" "f,0,f")))]
"TARGET_CMOVE"
"*
{
if (which_alternative == 0)
switch (which_alternative)
{
case 0:
/* r <- cond ? arg : r */
output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
}
else if (which_alternative == 1)
{
break;
case 1:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
}
else if (which_alternative == 2)
{
break;
case 2:
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
break;
}
else if (which_alternative == 3)
{
/* r <- cond ? arg1 : arg2 */
rtx xops[3];
xops[0] = gen_label_rtx ();
xops[1] = gen_label_rtx ();
xops[2] = operands[1];
output_asm_insn (\"j%f2 %l0\", xops);
if (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM)
output_asm_insn (AS1 (fld%z2,%y2), operands);
else
{
operands[2] = XEXP (operands[2], 0);
output_asm_insn (AS1 (fld%z2,%y2), operands);
}
output_asm_insn (\"jmp %l1\", xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
if (STACK_REG_P (operands[3]) || GET_CODE (operands[0]) == MEM)
output_asm_insn (AS1 (fld%z3,%y3), operands);
else
{
operands[3] = XEXP (operands[3], 0);
output_asm_insn (AS1 (fld%z3,%y3), operands);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
}
RET;
}")
(define_insn "movxfcc_1"
[(set (match_operand:XF 0 "register_operand" "=f,=f,=f,=f")
(if_then_else:XF (match_operator 1 "comparison_operator"
[(cc0) (const_int 0)])
(match_operand:XF 2 "register_operand" "0,f,f,fFm")
(match_operand:XF 3 "register_operand" "f,0,f,fFm")))]
"TARGET_CMOVE"
"*
{
if (which_alternative == 0)
{
/* r <- cond ? arg : r */
output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
}
else if (which_alternative == 1)
{
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
}
else if (which_alternative == 2)
{
/* r <- cond ? r : arg */
output_asm_insn (AS2 (fcmov%F1,%2,%0), operands);
output_asm_insn (AS2 (fcmov%f1,%3,%0), operands);
}
else if (which_alternative == 3)
{
/* r <- cond ? arg1 : arg2 */
rtx xops[3];
xops[0] = gen_label_rtx ();
xops[1] = gen_label_rtx ();
xops[2] = operands[1];
output_asm_insn (\"j%f2 %l0\", xops);
if (STACK_REG_P (operands[2]) || GET_CODE (operands[2]) == MEM)
output_asm_insn (AS1 (fld%z2,%y2), operands);
else
{
operands[2] = XEXP (operands[2], 0);
output_asm_insn (AS1 (fld%z2,%y2), operands);
}
output_asm_insn (\"jmp %l1\", xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[0]));
if (STACK_REG_P (operands[3]) || GET_CODE (operands[0]) == MEM)
output_asm_insn (AS1 (fld%z3,%y3), operands);
else
{
operands[3] = XEXP (operands[3], 0);
output_asm_insn (AS1 (fld%z3,%y3), operands);
}
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (xops[1]));
}
RET;
}")

View File

@ -2,7 +2,7 @@
hosting on Windows32, using GNU tools and the Windows32 API Library,
as distinct from winnt.h, which is used to build GCC for use with a
windows style library and tool set and uses the Microsoft tools.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -47,7 +47,7 @@ Boston, MA 02111-1307, USA. */
/* Include in the mingw32 libraries with libgcc */
#undef LIBGCC_SPEC
#define LIBGCC_SPEC "-lmingw32 -lgcc -lmoldname -lcrtdll"
#define LIBGCC_SPEC "-lmingw32 -lgcc -lmoldname -lmsvcrt"
/* Specify a different entry point when linking a DLL */
#undef LINK_SPEC
@ -55,9 +55,9 @@ Boston, MA 02111-1307, USA. */
"%{mwindows:--subsystem windows} %{mdll:--dll -e _DllMainCRTStartup@12}"
#undef STARTFILE_SPEC
#define STARTFILE_SPEC "%{mdll:dllcrt1%O%s} %{!mdll:crt1%O%s}"
#define STARTFILE_SPEC "%{mdll:dllcrt2%O%s} %{!mdll:crt2%O%s}"
#define MATH_LIBRARY "-lcrtdll"
#define MATH_LIBRARY "-lmsvcrt"
/* Output STRING, a string representing a filename, to FILE. We canonicalize
it to be in MS-DOS format. */

View File

@ -1,5 +1,5 @@
/* Configuration for GNU C-compiler for Intel 80386 running GO32.
Copyright (C) 1988, 1996 Free Software Foundation, Inc.
Copyright (C) 1988, 1996, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -33,4 +33,3 @@ Boston, MA 02111-1307, USA. */
#define DIR_SEPARATOR '\\'
#define NO_SYS_SIGLIST 1

View File

@ -1,6 +1,6 @@
/* Configuration for GNU C-compiler for hosting on Windows32.
using GNU tools and the Windows32 API Library.
Copyright (C) 1997 Free Software Foundation, Inc.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -34,7 +34,6 @@ Boston, MA 02111-1307, USA. */
#endif
#define NO_SYS_SIGLIST 1
#define link(a,b) -1
#define environ _environ
/* Even though we support "/", allow "\" since everybody tests both. */

View File

@ -1,18 +1,7 @@
/* Configuration for GCC for Intel i386 running SCO. */
#include "i386/xm-sysv3.h"
/* Big buffers improve performance. */
#define IO_BUFFER_SIZE (0x8000 - 1024)
/* OpenServer provides no sys_siglist,
but does offer the same data under another name. */
#define sys_siglist _sys_siglist
#undef SYS_SIGLIST_DECLARED
#define SYS_SIGLIST_DECLARED
/* If not compiled with GNU C, use the portable alloca. */
#ifndef __GNUC__
#define USE_C_ALLOCA
#endif

View File

@ -1,16 +1,5 @@
/* Configuration for GCC for Intel i386 running System V Release 4. */
#include "i386/xm-i386.h"
#include "xm-svr4.h"
/* If not compiled with GNU C, use the portable alloca. */
#ifndef __GNUC__
#define USE_C_ALLOCA
#endif
#ifdef __HIGHC__
#include <alloca.h> /* for MetaWare High-C on NCR System 3000 */
#endif
/* Univel, at least, has a small ARG_MAX. Defining this is harmless
except for causing extra stat calls in the driver program. */
#define SMALL_ARG_MAX

View File

@ -1,5 +1,5 @@
/* Subroutines for insn-output.c for Intel 860
Copyright (C) 1989, 1991, 1997 Free Software Foundation, Inc.
Copyright (C) 1989, 1991, 1997, 1998 Free Software Foundation, Inc.
Derived from sparc.c.
Written by Richard Stallman (rms@ai.mit.edu).
@ -1435,7 +1435,8 @@ output_delayed_branch (template, operands, insn)
/* Now recognize the insn which we put in its delay slot.
We must do this after outputting the branch insn,
since operands may just be a pointer to `recog_operand'. */
INSN_CODE (delay_insn) = insn_code_number = recog (pat, delay_insn);
INSN_CODE (delay_insn) = insn_code_number
= recog (pat, delay_insn, NULL_PTR);
if (insn_code_number == -1)
abort ();
@ -1489,7 +1490,7 @@ output_delay_insn (delay_insn)
}
#ifdef REGISTER_CONSTRAINTS
if (! constrain_operands (insn_code_number))
if (! constrain_operands (insn_code_number, 1))
abort ();
#endif

View File

@ -1,5 +1,5 @@
/* Subroutines used for code generation on intel 80960.
Copyright (C) 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1992, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Steven McGeady, Intel Corp.
Additional Work by Glenn Colon-Bonet, Jonathan Shapiro, Andy Wilson
Converted to GCC 2.0 by Jim Wilson and Michael Tiemann, Cygnus Support.
@ -589,8 +589,13 @@ emit_move_sequence (operands, mode)
adding 4 to the memory address may not yield a valid insn. */
/* ??? We don't always need the scratch, but that would complicate things.
Maybe later. */
/* ??? We must also handle stores to pseudos here, because the pseudo may be
replaced with a MEM later. This would be cleaner if we didn't have
a separate pattern for unaligned DImode/TImode stores. */
if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
&& GET_CODE (operands[0]) == MEM
&& (GET_CODE (operands[0]) == MEM
|| (GET_CODE (operands[0]) == REG
&& REGNO (operands[0]) >= FIRST_PSEUDO_REGISTER))
&& GET_CODE (operands[1]) == REG
&& REGNO (operands[1]) < FIRST_PSEUDO_REGISTER
&& ! HARD_REGNO_MODE_OK (REGNO (operands[1]), mode))

View File

@ -1,5 +1,5 @@
;;- Machine description for Intel 80960 chip for GNU C compiler
;; Copyright (C) 1992, 1995 Free Software Foundation, Inc.
;; Copyright (C) 1992, 1995, 1998 Free Software Foundation, Inc.
;; Contributed by Steven McGeady, Intel Corp.
;; Additional work by Glenn Colon-Bonet, Jonathan Shapiro, Andy Wilson
;; Converted to GCC 2.0 by Jim Wilson and Michael Tiemann, Cygnus Support.
@ -867,17 +867,20 @@
[(set_attr "type" "move,move,load,load,store")])
(define_insn "*store_unaligned_di_reg"
[(set (match_operand:DI 0 "memory_operand" "=m")
(match_operand:DI 1 "register_operand" "d"))
(clobber (match_scratch:SI 2 "=&d"))]
[(set (match_operand:DI 0 "general_operand" "=d,m")
(match_operand:DI 1 "register_operand" "d,d"))
(clobber (match_scratch:SI 2 "=X,&d"))]
""
"*
{
if (which_alternative == 0)
return i960_output_move_double (operands[0], operands[1]);
operands[3] = gen_rtx (MEM, word_mode, operands[2]);
operands[4] = adj_offsettable_operand (operands[3], UNITS_PER_WORD);
return \"lda %0,%2\;st %1,%3\;st %D1,%4\";
}"
[(set_attr "type" "store")])
[(set_attr "type" "move,store")])
(define_expand "movti"
[(set (match_operand:TI 0 "general_operand" "")
@ -946,19 +949,22 @@
[(set_attr "type" "move,move,load,load,store")])
(define_insn "*store_unaligned_ti_reg"
[(set (match_operand:TI 0 "memory_operand" "=m")
(match_operand:TI 1 "register_operand" "d"))
(clobber (match_scratch:SI 2 "=&d"))]
[(set (match_operand:TI 0 "general_operand" "=d,m")
(match_operand:TI 1 "register_operand" "d,d"))
(clobber (match_scratch:SI 2 "=X,&d"))]
""
"*
{
if (which_alternative == 0)
return i960_output_move_quad (operands[0], operands[1]);
operands[3] = gen_rtx (MEM, word_mode, operands[2]);
operands[4] = adj_offsettable_operand (operands[3], UNITS_PER_WORD);
operands[5] = adj_offsettable_operand (operands[4], UNITS_PER_WORD);
operands[6] = adj_offsettable_operand (operands[5], UNITS_PER_WORD);
return \"lda %0,%2\;st %1,%3\;st %D1,%4\;st %E1,%5\;st %F1,%6\";
}"
[(set_attr "type" "store")])
[(set_attr "type" "move,store")])
(define_expand "store_multiple"
[(set (match_operand:SI 0 "" "") ;;- dest
@ -2209,7 +2215,13 @@
[(set (pc) (match_operand:SI 0 "register_operand" "d"))
(use (label_ref (match_operand 1 "" "")))]
""
"bx (%0)"
"*
{
if (flag_pic)
return \"bx %l1(%0)\";
else
return \"bx (%0)\";
}"
[(set_attr "type" "branch")])
;;- jump to subroutine

View File

@ -1,7 +1,7 @@
/* Definitions for Linux-based GNU systems with ELF format
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Eric Youngdale.
Modified for stabs-in-ELF by H.J. Lu.
Modified for stabs-in-ELF by H.J. Lu (hjl@lucon.org).
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. Sun 68000/68020 version.
Copyright (C) 1987, 88, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 93-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
;;- Machine description for GNU compiler, Motorola 68000 Version
;; Copyright (C) 1987, 88, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
;; Copyright (C) 1987, 88, 93-97, 1998 Free Software Foundation, Inc.
;; This file is part of GNU CC.

View File

@ -22,13 +22,8 @@ Boston, MA 02111-1307, USA. */
#define USG 1
#include "m68k/xm-m68k.h"
#define NO_SYS_SIGLIST
/* do not use alloca from -lPW with cc, because function epilogues use %sp */
#ifndef __GNUC__
#define USE_C_ALLOCA
#ifdef __STDC__
extern void *alloca ();
#else

View File

@ -19,8 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "m88k/xm-m88k.h"
#define R_OK 4
#define W_OK 2
#define X_OK 1

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. 64 bit ABI support.
Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
Copyright (C) 1994, 1995, 1996, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -63,16 +63,10 @@ Boston, MA 02111-1307, USA. */
#define MAX_ARGS_IN_REGISTERS (mips_abi == ABI_32 ? 4 : 8)
#undef REG_PARM_STACK_SPACE
#if 0
/* ??? This is necessary in order for the ABI_32 support to work. However,
expr.c (emit_push_insn) has no support for a REG_PARM_STACK_SPACE
definition that returns zero. That would have to be fixed before this
can be enabled. */
#define REG_PARM_STACK_SPACE(FNDECL) \
(mips_abi == ABI_32 \
? (MAX_ARGS_IN_REGISTERS*UNITS_PER_WORD) - FIRST_PARM_OFFSET (FNDECL) \
: 0)
#endif
#define FUNCTION_ARG_PADDING(MODE, TYPE) \
(! BYTES_BIG_ENDIAN \
@ -184,8 +178,7 @@ extern struct rtx_def *mips_function_value ();
} \
}
/* ??? Should disable for mips_abi == ABI32. */
#define STRICT_ARGUMENT_NAMING
#define STRICT_ARGUMENT_NAMING (mips_abi != ABI_32)
/* A C expression that indicates when an argument must be passed by
reference. If nonzero for an argument, a copy of that argument is

View File

@ -1,6 +1,6 @@
/* Definitions of target machine for GNU compiler. MIPS version with
GOFAST floating point library.
Copyright (C) 1994, 1997 Free Software Foundation, Inc.
Copyright (C) 1994, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.

View File

@ -29,6 +29,8 @@ Boston, MA 02111-1307, USA. */
#endif
/* Mostly like ECOFF. */
#include "mips/mips.h"
#include "gofast.h"
#include "mips/ecoff.h"
/* We need to use .esize and .etype instead of .size and .type to

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler. Iris version 5.
Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc.
Copyright (C) 1993, 1995, 1996, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -23,6 +23,8 @@ Boston, MA 02111-1307, USA. */
#endif
#define ABICALLS_ASM_OP ".option pic2"
#include "mips/iris3.h"
#include "mips/mips.h"
#include "mips/iris4.h"
/* Irix 5 doesn't use COFF, so disable special COFF handling in collect2.c. */

View File

@ -1,7 +1,5 @@
/* Definitions of target machine for GNU compiler. Irix version 5 with gas. */
#include "mips/iris5.h"
/* Enable debugging. */
#define DBX_DEBUGGING_INFO
#define SDB_DEBUGGING_INFO

View File

@ -5036,7 +5036,7 @@ mips_output_external (file, decl, name)
#ifdef ASM_OUTPUT_UNDEF_FUNCTION
if (TREE_CODE (decl) == FUNCTION_DECL
/* ??? Don't include alloca, since gcc will always expand it
inline. If we don't do this, libg++ fails to build. */
inline. If we don't do this, the C++ library fails to build. */
&& strcmp (name, "alloca")
/* ??? Don't include __builtin_next_arg, because then gcc will not
bootstrap under Irix 5.1. */
@ -6616,7 +6616,8 @@ mips_expand_prologue ()
}
if (TARGET_ABICALLS && mips_abi != ABI_32)
emit_insn (gen_loadgp (XEXP (DECL_RTL (current_function_decl), 0)));
emit_insn (gen_loadgp (XEXP (DECL_RTL (current_function_decl), 0),
gen_rtx (REG, DImode, 25)));
}
/* If we are profiling, make sure no instructions are scheduled before

View File

@ -5639,10 +5639,11 @@ move\\t%0,%z4\\n\\
(define_insn "loadgp"
[(set (reg:DI 28)
(unspec_volatile:DI [(match_operand:DI 0 "address_operand" "")] 2))
(unspec_volatile:DI [(match_operand:DI 0 "address_operand" "")
(match_operand:DI 1 "register_operand" "")] 2))
(clobber (reg:DI 1))]
""
"%[lui\\t$1,%%hi(%%neg(%%gp_rel(%a0)))\\n\\taddiu\\t$1,$1,%%lo(%%neg(%%gp_rel(%a0)))\\n\\tdaddu\\t$gp,$1,$25%]"
"%[lui\\t$1,%%hi(%%neg(%%gp_rel(%a0)))\\n\\taddiu\\t$1,$1,%%lo(%%neg(%%gp_rel(%a0)))\\n\\tdaddu\\t$gp,$1,%1%]"
[(set_attr "type" "move")
(set_attr "mode" "DI")
(set_attr "length" "3")])

View File

@ -1,5 +1,5 @@
/* Definitions for rtems targeting a MIPS ORION using ecoff.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Joel Sherrill (joel@OARcorp.com).
This file is part of GNU CC.
@ -19,8 +19,6 @@ along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include "mips/elforion.h"
/* Specify predefined symbols in preprocessor. */
#undef CPP_PREDEFINES

View File

@ -19,9 +19,9 @@ host_xm_file=config/i386/xm-dos.h
/^xmake_file=/ d
/^tmake_file=/ d
/^version=/ c\
version=2.8.0
version=2.8.1
/^mainversion=/ c\
mainversion=2.8.0
mainversion=2.8.1
s/CC = cc/CC = gcc/
s/:\$/: \$/g
s/^ \ *\.\// /

View File

@ -1,5 +1,5 @@
/* Subroutines used for code generation on IBM RS/6000.
Copyright (C) 1991, 93-7, 1998 Free Software Foundation, Inc.
Copyright (C) 1991, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for IBM RS/6000.
Copyright (C) 1992, 93-7, 1998 Free Software Foundation, Inc.
Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
This file is part of GNU CC.
@ -2054,8 +2054,8 @@ typedef struct rs6000_args
/* Define the magic numbers that we recognize as COFF.
AIX 4.3 adds U803XTOCMAGIC (0757) for 64-bit executables, but collect2.c
does not include files in the correct order to conditionally define
the symbolic name in this macro. */
does not include these files in the right order to conditionally define
the value in the macro. */
#define MY_ISCOFF(magic) \
((magic) == U802WRMAGIC || (magic) == U802ROMAGIC \

View File

@ -1,5 +1,4 @@
# configuration for IBM rs6000 running aix
# Show we need to use the C version of ALLOCA
ALLOCA=alloca.o

View File

@ -1,26 +1 @@
/* Configuration for GNU C-compiler for hosting on Windows NT.
using a unix style C library.
Copyright (C) 1995, 1997 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define NO_STAB_H
#include "rs6000/xm-rs6000.h"
#define EXECUTABLE_SUFFIX ".exe"

View File

@ -1,5 +1,5 @@
/* Configuration for GNU C-compiler for PowerPC running System V.4.
Copyright (C) 1995 Free Software Foundation, Inc.
Copyright (C) 1995, 1998 Free Software Foundation, Inc.
Cloned from sparc/xm-sysv4.h by Michael Meissner (meissner@cygnus.com).
@ -48,8 +48,6 @@ Boston, MA 02111-1307, USA. */
#ifdef __linux__
#include "xm-linux.h"
#else
#include "xm-svr4.h"
#endif
/* if not compiled with GNU C, use the C alloca and use only int bitfields. */

View File

@ -1,5 +1,5 @@
/* Definitions for SPARC running Linux-based GNU systems with ELF.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by Eddie C. Dost (ecd@skynet.be)
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
/* Definitions for 64-bit SPARC running Linux-based GNU systems with ELF.
Copyright 1996, 1997 Free Software Foundation, Inc.
Copyright 1996, 1997, 1998 Free Software Foundation, Inc.
Contributed by David S. Miller (davem@caip.rutgers.edu)
This file is part of GNU CC.

View File

@ -1505,6 +1505,10 @@ pic_setup_code ()
start_sequence ();
/* If -O0, show the PIC register remains live before this. */
if (obey_regdecls)
emit_insn (gen_rtx (USE, VOIDmode, pic_offset_table_rtx));
l1 = gen_label_rtx ();
pic_pc_rtx = gen_rtx (CONST, Pmode,
@ -5124,14 +5128,14 @@ sparc_type_code (type)
register tree type;
{
register unsigned long qualifiers = 0;
register unsigned shift = 6;
register unsigned shift;
/* Only the first 30 bits of the qualifier are valid. We must refrain from
setting more, since some assemblers will give an error for this. Also,
we must be careful to avoid shifts of 32 bits or more to avoid getting
unpredictable results. */
for (;;)
for (shift = 6; shift < 30; shift += 2, type = TREE_TYPE (type))
{
switch (TREE_CODE (type))
{
@ -5139,27 +5143,18 @@ sparc_type_code (type)
return qualifiers;
case ARRAY_TYPE:
if (shift < 30)
qualifiers |= (3 << shift);
shift += 2;
type = TREE_TYPE (type);
qualifiers |= (3 << shift);
break;
case FUNCTION_TYPE:
case METHOD_TYPE:
if (shift < 30)
qualifiers |= (2 << shift);
shift += 2;
type = TREE_TYPE (type);
qualifiers |= (2 << shift);
break;
case POINTER_TYPE:
case REFERENCE_TYPE:
case OFFSET_TYPE:
if (shift < 30)
qualifiers |= (1 << shift);
shift += 2;
type = TREE_TYPE (type);
qualifiers |= (1 << shift);
break;
case RECORD_TYPE:
@ -5179,10 +5174,7 @@ sparc_type_code (type)
/* If this is a range type, consider it to be the underlying
type. */
if (TREE_TYPE (type) != 0)
{
type = TREE_TYPE (type);
break;
}
break;
/* Carefully distinguish all the standard types of C,
without messing up if the language is not C. We do this by
@ -5208,6 +5200,11 @@ sparc_type_code (type)
return (qualifiers | (TREE_UNSIGNED (type) ? 15 : 5));
case REAL_TYPE:
/* If this is a range type, consider it to be the underlying
type. */
if (TREE_TYPE (type) != 0)
break;
/* Carefully distinguish all the standard types of C,
without messing up if the language is not C. */
@ -5234,6 +5231,8 @@ sparc_type_code (type)
abort (); /* Not a type! */
}
}
return qualifiers;
}
/* Nested function support. */

View File

@ -1,5 +1,5 @@
/* Definitions of target machine for GNU compiler, for Sun SPARC.
Copyright (C) 1987, 88, 89, 92, 94-7, 1998 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 89, 92, 94-97, 1998 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com).
64 bit SPARC V9 support by Michael Tiemann, Jim Wilson, and Doug Evans,
at Cygnus Support.
@ -2162,9 +2162,8 @@ extern struct rtx_def *sparc_builtin_saveregs ();
is defined, then all arguments are treated as named. Otherwise, all named
arguments except the last are treated as named.
For the v9 we want NAMED to mean what it says it means. */
/* ??? This needn't be set for v8, but I don't want to make this runtime
selectable if I don't have to. */
#define STRICT_ARGUMENT_NAMING
#define STRICT_ARGUMENT_NAMING TARGET_V9
/* Generate RTL to flush the register windows so as to make arbitrary frames
available. */

View File

@ -1,7 +1,6 @@
/* Target definitions for GNU compiler for Sparc running System V.4
Copyright (C) 1991, 1992, 1995, 1996, 1997 Free Software Foundation, Inc.
Written by Ron Guilmette (rfg@netcom.com).
Copyright (C) 1991, 92, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com).
This file is part of GNU CC.
@ -136,10 +135,7 @@ do { ASM_OUTPUT_ALIGN ((FILE), Pmode == SImode ? 2 : 3); \
f0-f31 32-63 40-71
*/
#define DBX_REGISTER_NUMBER(REGNO) \
(((REGNO) < 32) ? (REGNO) \
: ((REGNO) < 63) ? ((REGNO) + 8) \
: (abort (), 0))
#define DBX_REGISTER_NUMBER(REGNO) ((REGNO) < 32 ? (REGNO) : (REGNO) + 8)
/* A set of symbol definitions for assembly pseudo-ops which will
get us switched to various sections of interest. These are used

View File

@ -24,5 +24,3 @@ Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include <string.h>
#endif
#include <xm-linux.h>

View File

@ -1,5 +1,3 @@
#include "sparc/xm-sysv4.h"
/* If not compiled with GNU C, include the system's <alloca.h> header. */
#ifndef __GNUC__
#include <alloca.h>

View File

@ -2,8 +2,7 @@
# crtstuff.c. This is only really needed when we are going to use gcc/g++
# to produce a shared library, but since we don't know ahead of time when
# we will be doing that, we just always use -fPIC when compiling the
# routines in crtstuff.c.
# Similarly for TARGET_LIBGCC2_CFLAGS
# routines in crtstuff.c. Likewise for libgcc2.c.
CRTSTUFF_T_CFLAGS = -fPIC
TARGET_LIBGCC2_CFLAGS = -fPIC

View File

@ -1,5 +1,5 @@
;;- Machine description for GNU compiler, Vax Version
;; Copyright (C) 1987, 88, 91, 94, 95, 1996 Free Software Foundation, Inc.
;; Copyright (C) 1987, 88, 91, 94-96, 1998 Free Software Foundation, Inc.
;; This file is part of GNU CC.
@ -1837,9 +1837,12 @@
;; Note that operand 1 is total size of args, in bytes,
;; and what the call insn wants is the number of words.
;; It is used in the call instruction as a byte, but in the addl2 as
;; a word. Since the only time we actually use it in the call instruction
;; is when it is a constant, SImode (for addl2) is the proper mode.
(define_insn "call_pop"
[(call (match_operand:QI 0 "memory_operand" "m")
(match_operand:QI 1 "general_operand" "g"))
(match_operand:SI 1 "general_operand" "g"))
(set (reg:SI 14) (plus:SI (reg:SI 14)
(match_operand:SI 3 "immediate_operand" "i")))]
""
@ -1854,7 +1857,7 @@
(define_insn "call_value_pop"
[(set (match_operand 0 "" "=g")
(call (match_operand:QI 1 "memory_operand" "m")
(match_operand:QI 2 "general_operand" "g")))
(match_operand:SI 2 "general_operand" "g")))
(set (reg:SI 14) (plus:SI (reg:SI 14)
(match_operand:SI 4 "immediate_operand" "i")))]
""
@ -1870,7 +1873,7 @@
;; operands. In that case, combine may simplify the adjustment of sp.
(define_insn ""
[(call (match_operand:QI 0 "memory_operand" "m")
(match_operand:QI 1 "general_operand" "g"))
(match_operand:SI 1 "general_operand" "g"))
(set (reg:SI 14) (reg:SI 14))]
""
"*
@ -1884,7 +1887,7 @@
(define_insn ""
[(set (match_operand 0 "" "=g")
(call (match_operand:QI 1 "memory_operand" "m")
(match_operand:QI 2 "general_operand" "g")))
(match_operand:SI 2 "general_operand" "g")))
(set (reg:SI 14) (reg:SI 14))]
""
"*

View File

@ -304,9 +304,9 @@ const_section () \
/* The following definitions are used in libgcc2.c with the __main
function. The _SHR symbol is used when the sharable image library
for libg++ is used - this is picked up automatically by the linker
and this symbol points to the start of the __CTOR_LIST__ from libg++.
If libg++ is not being used, then __CTOR_LIST_SHR__ occurs just after
for the C++ library is used - this is picked up automatically by the linker
and this symbol points to the start of __CTOR_LIST__ from the C++ library.
If the C++ library is not used, then __CTOR_LIST_SHR__ occurs just after
__CTOR_LIST__, and essentially points to the same list as __CTOR_LIST. */
#ifdef L__main

View File

@ -13,7 +13,7 @@ s/$(srcdir)\/c-gperf/c-gperf/g
/^lang_specs_files=/ d
/^lang_options_files=/ d
/^version=/ c\
version=2.8.0
version=2.8.1
s/CC = cc/CC = cl/
s/^SHELL =.*/SHELL =/
s/CFLAGS = -g/CFLAGS =/

View File

@ -1036,6 +1036,10 @@ Sat Feb 7 16:48:54 1998 Jason Merrill <jason@yorick.cygnus.com>
* parse.y (nomods_initdcl0): Add constructor_declarator case.
Fri Feb 6 21:32:25 1998 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* config-lang.in (diff_excludes): Use basename only.
Thu Feb 5 19:10:40 1998 Jason Merrill <jason@yorick.cygnus.com>
* tinfo2.cc: Add tinfo for signed char.
@ -1937,6 +1941,8 @@ Wed Nov 26 01:11:24 1997 Jason Merrill <jason@yorick.cygnus.com>
* decl2.c (delete_sanity): resolve_offset_ref.
* except.c: Call terminate without caching so many bits.
* except.c (expand_start_catch_block): Fix catching a reference
to pointer.

View File

@ -1,7 +1,7 @@
/* Functions related to invoking methods and overloaded functions.
Copyright (C) 1987, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 92-97, 1998 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com) and
hacked by Brendan Kehoe (brendan@cygnus.com).
modified by Brendan Kehoe (brendan@cygnus.com).
This file is part of GNU CC.

View File

@ -32,7 +32,7 @@ compilers="cc1plus\$(exeext)"
stagestuff="g++\$(exeext) g++-cross\$(exeext) cc1plus\$(exeext)"
diff_excludes="-x cp/parse.c -x cp/parse.h"
diff_excludes="-x parse.c -x parse.h"
headers='$(CXX_EXTRA_HEADERS)'

View File

@ -1,6 +1,6 @@
/* Process declarations and variables for C++ compiler.
Copyright (C) 1988, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Hacked by Michael Tiemann (tiemann@cygnus.com)
/* Process declarations and variables for C compiler.
Copyright (C) 1988, 92-97, 1998 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com)
This file is part of GNU CC.
@ -170,7 +170,6 @@ static void record_builtin_type PROTO((enum rid, char *, tree));
static int member_function_or_else PROTO((tree, tree, char *));
static void bad_specifiers PROTO((tree, char *, int, int, int, int,
int));
static tree make_implicit_typename PROTO((tree, tree));
/* a node which has tree code ERROR_MARK, and whose type is itself.
All erroneous expressions are replaced with this node. All functions

View File

@ -1,5 +1,5 @@
/* Handle exceptional things in C++.
Copyright (C) 1989, 92-96, 1997 Free Software Foundation, Inc.
Copyright (C) 1989, 92-97, 1998 Free Software Foundation, Inc.
Contributed by Michael Tiemann <tiemann@cygnus.com>
Rewritten by Mike Stump <mrs@cygnus.com>, based upon an
initial re-implementation courtesy Tad Hunt.

View File

@ -1,5 +1,5 @@
// Functions for Exception Support for -*- C++ -*-
// Copyright (C) 1994, 1995, 1996 Free Software Foundation
// Copyright (C) 1994, 1995, 1996, 1998 Free Software Foundation
// This file is part of GNU CC.

View File

@ -3,7 +3,7 @@
Copyright (C) 1987, 89, 92-97, 1998 Free Software Foundation, Inc.
Contributed by Michael Tiemann (tiemann@cygnus.com)
This file is part of GNU CC.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by

View File

@ -934,7 +934,7 @@ to test whether a header is compiled by a C compiler or a C++ compiler.
@item __STRICT_ANSI__
@findex __STRICT_ANSI__
This macro is defined if and only if the @samp{-ansi} switch was
GNU C defines this macro if and only if the @samp{-ansi} switch was
specified when GNU C was invoked. Its definition is the null string.
This macro exists primarily to direct certain GNU header files not to
define certain traditional Unix constructs which are incompatible with
@ -956,48 +956,46 @@ the nesting level is zero.
@item __VERSION__
@findex __VERSION__
This macro expands to a string which describes the version number of
This macro expands to a string constant which describes the version number of
GNU C@. The string is normally a sequence of decimal numbers separated
by periods, such as @samp{"2.6.0"}. The only reasonable use of this
macro is to incorporate it into a string constant.
by periods, such as @samp{"2.6.0"}.
@item __OPTIMIZE__
@findex __OPTIMIZE__
This macro is defined in optimizing compilations. It causes certain
GNU header files to define alternative macro definitions for some
system library functions. It is unwise to refer to or test the
definition of this macro unless you make very sure that programs will
execute with the same effect regardless.
GNU CC defines this macro in optimizing compilations. It causes certain
GNU header files to define alternative macro definitions for some system
library functions. You should not refer to or test the definition of
this macro unless you make very sure that programs will execute with the
same effect regardless.
@item __CHAR_UNSIGNED__
@findex __CHAR_UNSIGNED__
This macro is defined if and only if the data type @code{char} is
unsigned on the target machine. It exists to cause the standard
header file @file{limits.h} to work correctly. It is bad practice
to refer to this macro yourself; instead, refer to the standard
macros defined in @file{limits.h}. The preprocessor uses
this macro to determine whether or not to sign-extend large character
constants written in octal; see @ref{#if Directive,,The @samp{#if} Directive}.
GNU C defines this macro if and only if the data type @code{char} is
unsigned on the target machine. It exists to cause the standard header
file @file{limits.h} to work correctly. You should not refer to this
macro yourself; instead, refer to the standard macros defined in
@file{limits.h}. The preprocessor uses this macro to determine whether
or not to sign-extend large character constants written in octal; see
@ref{#if Directive,,The @samp{#if} Directive}.
@item __REGISTER_PREFIX__
@findex __REGISTER_PREFIX__
This macro expands to a string describing the prefix applied to cpu
registers in assembler code. It can be used to write assembler code
that is usable in multiple environments. For example, in the
@samp{m68k-aout} environment it expands to the string @samp{""},
but in the @samp{m68k-coff} environment it expands to the string
@samp{"%"}.
This macro expands to a string (not a string constant) describing the
prefix applied to CPU registers in assembler code. You can use it to
write assembler code that is usable in multiple environments. For
example, in the @samp{m68k-aout} environment it expands to the null
string, but in the @samp{m68k-coff} environment it expands to the string
@samp{%}.
@item __USER_LABEL_PREFIX__
@findex __USER_LABEL_PREFIX__
This macro expands to a string describing the prefix applied to user
generated labels in assembler code. It can be used to write assembler
code that is usable in multiple environments. For example, in the
@samp{m68k-aout} environment it expands to the string @samp{"_"}, but in
the @samp{m68k-coff} environment it expands to the string @samp{""}.
This does not work with the @samp{-mno-underscores} option that the
i386 OSF/rose and m88k targets provide nor with the @samp{-mcall*} options
of the rs6000 System V Release 4 target.
Similar to @code{__REGISTER_PREFIX__}, but describes the prefix applied
to user generated labels in assembler code. For example, in the
@samp{m68k-aout} environment it expands to the string @samp{_}, but in
the @samp{m68k-coff} environment it expands to the null string. This
does not work with the @samp{-mno-underscores} option that the i386
OSF/rose and m88k targets provide nor with the @samp{-mcall*} options of
the rs6000 System V Release 4 target.
@end table
@node Nonstandard Predefined,, Standard Predefined, Predefined
@ -2687,7 +2685,7 @@ Only the directories you have specified with @samp{-I} options
@findex -nostdinc++
Do not search for header files in the C++-specific standard directories,
but do still search the other standard directories.
(This option is used when building libg++.)
(This option is used when building the C++ library.)
@item -remap
@findex -remap

View File

@ -1,5 +1,5 @@
/* CPP Library.
Copyright (C) 1986, 87, 89, 92-7, 1998 Free Software Foundation, Inc.
Copyright (C) 1986, 87, 89, 92-97, 1998 Free Software Foundation, Inc.
Contributed by Per Bothner, 1994-95.
Based on CCCP program by Paul Rubin, June 1986
Adapted to ANSI C, Richard Stallman, Jan 1987
@ -369,7 +369,8 @@ struct directive {
char command_reads_line; /* One if rest of line is read by func. */
};
#define IS_INCLUDE_DIRECTIVE_TYPE(t) (T_INCLUDE <= (t) && (t) <= T_IMPORT)
#define IS_INCLUDE_DIRECTIVE_TYPE(t) \
((int) T_INCLUDE <= (int) (t) && (int) (t) <= (int) T_IMPORT)
/* Here is the actual list of #-directives, most-often-used first.
The initialize_builtins function assumes #define is the very first. */
@ -7494,6 +7495,7 @@ cpp_error_from_errno (pfile, name)
cpp_reader *pfile;
char *name;
{
int e = errno;
cpp_buffer *ip = cpp_file_buffer (pfile);
cpp_print_containing_files (pfile);
@ -7501,7 +7503,7 @@ cpp_error_from_errno (pfile, name)
if (ip != NULL)
cpp_file_line_for_message (ip->nominal_fname, ip->lineno, -1);
cpp_message (pfile, 1, "%s: %s", name, my_strerror (errno));
cpp_message (pfile, 1, "%s: %s", name, my_strerror (e));
}
void

View File

@ -1,6 +1,6 @@
/* Specialized bits of code needed to support construction and
destruction of file-scope objects in C++ code.
Copyright (C) 1991, 94-97, 1998 Free Software Foundation, Inc.
Copyright (C) 1991, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@monkeys.com).
This file is part of GNU CC.
@ -389,11 +389,14 @@ __do_global_ctors_aux () /* prologue goes in .text section */
asm (INIT_SECTION_ASM_OP);
DO_GLOBAL_CTORS_BODY;
ON_EXIT (__do_global_dtors, 0);
#ifdef FORCE_INIT_SECTION_ALIGN
FORCE_INIT_SECTION_ALIGN;
#endif
} /* epilogue and body go in .init section */
#ifdef FORCE_INIT_SECTION_ALIGN
FORCE_INIT_SECTION_ALIGN;
#endif
asm (TEXT_SECTION_ASM_OP);
#endif /* OBJECT_FORMAT_ELF */
#else /* defined(INIT_SECTION_ASM_OP) */

View File

@ -2277,6 +2277,10 @@ set_nonvarying_address_components (addr, size, pbase, pstart, pend)
start = 0;
end = 0;
if (flag_pic && GET_CODE (base) == PLUS
&& XEXP (base, 0) == pic_offset_table_rtx)
base = XEXP (base, 1);
/* Registers with nonvarying addresses usually have constant equivalents;
but the frame pointer register is also possible. */
if (GET_CODE (base) == REG

View File

@ -1,5 +1,5 @@
/* Output Dwarf2 format symbol table information from the GNU C compiler.
Copyright (C) 1992, 1993, 95-97, 1998 Free Software Foundation, Inc.
Copyright (C) 1992, 93, 95, 96, 97, 1998 Free Software Foundation, Inc.
Contributed by Gary Funck (gary@intrepid.com).
Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
Extensively modified by Jason Merrill (jason@cygnus.com).
@ -578,18 +578,26 @@ expand_builtin_dwarf_reg_size (reg_tree, target)
continue;
mode = reg_raw_mode[i];
/* CCmode is arbitrarily given a size of 4 bytes. It is more useful
to use the same size as word_mode, since that reduces the number
of ranges we need. It should not matter, since the result should
never be used for a condition code register anyways. */
if (mode == CCmode)
if (GET_MODE_CLASS (mode) == MODE_CC)
mode = word_mode;
size = GET_MODE_SIZE (mode);
/* If this register is not valid in the specified mode and
we have a previous size, use that for the size of this
register to avoid making junk tiny ranges. */
if (! HARD_REGNO_MODE_OK (i, mode) && last_size != -1)
size = last_size;
if (size != last_size)
{
ranges[n_ranges].beg = i;
ranges[n_ranges].size = last_size = GET_MODE_SIZE (reg_raw_mode[i]);
ranges[n_ranges].size = last_size = size;
++n_ranges;
if (n_ranges >= 5)
abort ();

View File

@ -1412,21 +1412,42 @@ int cprop() {
c=0; char_max=0;
c++;
if (setjmp(lab)==0) { /* Yields char_max */
while (c>char_max) {
char_max=c;
c++;
}
if (bits_per_byte <= 16) {
if (setjmp(lab)==0) { /* Yields char_max */
while (c>char_max) {
char_max=c;
c++;
}
} else {
Vprintf("%sCharacter overflow generates a trap!%s\n",
co, oc);
}
c=0; char_min=0;
c--;
if (setjmp(lab)==0) { /* Yields char_min */
while (c<char_min) {
char_min=c;
c--;
}
}
} else {
Vprintf("%sCharacter overflow generates a trap!%s\n", co, oc);
}
c=0; char_min=0;
c--;
if (setjmp(lab)==0) { /* Yields char_min */
while (c<char_min) {
char_min=c;
c--;
}
/* An exhaustive search here is impracticable ;-) */
c = (1 << (bits_per_byte - 1)) - 1;
char_max = c;
c++;
if (c > char_max)
char_max = ~0;
c = 0;
char_min = 0;
c--;
if (c < char_min) {
c = (1 << (bits_per_byte - 1)) - 1;
c = -c;
char_min = c;
c--;
if (c < char_min)
char_min = c;
}
}
if (c_signed && char_min == 0) {
Vprintf("%sBEWARE! Chars are pseudo-unsigned:%s\n", co, oc);

View File

@ -1,5 +1,5 @@
/* Implements exception handling.
Copyright (C) 1989, 92-96, 1997 Free Software Foundation, Inc.
Copyright (C) 1989, 92-97, 1998 Free Software Foundation, Inc.
Contributed by Mike Stump <mrs@cygnus.com>.
This file is part of GNU CC.

View File

@ -1,5 +1,5 @@
/* Subroutines for manipulating rtx's in semantically interesting ways.
Copyright (C) 1987, 91, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Copyright (C) 1987, 91, 94-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -1366,7 +1366,8 @@ probe_stack_range (first, size)
/* If we have to generate explicit probes, see if we have a constant
small number of them to generate. If so, that's the easy case. */
if (GET_CODE (size) == CONST_INT && INTVAL (size) < 10)
if (GET_CODE (size) == CONST_INT
&& INTVAL (size) < 10 * STACK_CHECK_PROBE_INTERVAL)
{
HOST_WIDE_INT offset;

View File

@ -1,6 +1,6 @@
/* Medium-level subroutines: convert bit-field store and extract
and shifts, multiplies and divides to rtl instructions.
Copyright (C) 1987, 88, 89, 92-6, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 89, 92-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -907,6 +907,8 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
offset += SUBREG_WORD (op0);
inner_size = MIN (inner_size, BITS_PER_WORD);
if (BYTES_BIG_ENDIAN && (outer_size < inner_size))
{
bitpos += inner_size - outer_size;
@ -1076,7 +1078,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
{
int xbitpos = bitpos, xoffset = offset;
rtx bitsize_rtx, bitpos_rtx;
rtx last = get_last_insn();
rtx last = get_last_insn ();
rtx xop0 = op0;
rtx xtarget = target;
rtx xspec_target = spec_target;
@ -1140,7 +1142,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
/* If op0 is a register, we need it in MAXMODE (which is usually
SImode). to make it acceptable to the format of extzv. */
if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != maxmode)
abort ();
goto extzv_loses;
if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
xop0 = gen_rtx_SUBREG (maxmode, xop0, 0);
@ -1216,7 +1218,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
{
int xbitpos = bitpos, xoffset = offset;
rtx bitsize_rtx, bitpos_rtx;
rtx last = get_last_insn();
rtx last = get_last_insn ();
rtx xop0 = op0, xtarget = target;
rtx xspec_target = spec_target;
rtx xspec_target_subreg = spec_target_subreg;
@ -1274,7 +1276,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
/* If op0 is a register, we need it in MAXMODE (which is usually
SImode) to make it acceptable to the format of extv. */
if (GET_CODE (xop0) == SUBREG && GET_MODE (xop0) != maxmode)
abort ();
goto extv_loses;
if (GET_CODE (xop0) == REG && GET_MODE (xop0) != maxmode)
xop0 = gen_rtx_SUBREG (maxmode, xop0, 0);

View File

@ -169,7 +169,7 @@ static rtx store_field PROTO((rtx, int, int, enum machine_mode, tree,
enum machine_mode, int, int, int));
static tree save_noncopied_parts PROTO((tree, tree));
static tree init_noncopied_parts PROTO((tree, tree));
static int safe_from_p PROTO((rtx, tree));
static int safe_from_p PROTO((rtx, tree, int));
static int fixed_type_p PROTO((tree));
static rtx var_rtx PROTO((tree));
static int get_pointer_alignment PROTO((tree, unsigned));
@ -930,6 +930,41 @@ convert_move (to, from, unsignedp)
}
/* Handle pointer conversion */ /* SPEE 900220 */
if (to_mode == PQImode)
{
if (from_mode != QImode)
from = convert_to_mode (QImode, from, unsignedp);
#ifdef HAVE_truncqipqi2
if (HAVE_truncqipqi2)
{
emit_unop_insn (CODE_FOR_truncqipqi2, to, from, UNKNOWN);
return;
}
#endif /* HAVE_truncqipqi2 */
abort ();
}
if (from_mode == PQImode)
{
if (to_mode != QImode)
{
from = convert_to_mode (QImode, from, unsignedp);
from_mode = QImode;
}
else
{
#ifdef HAVE_extendpqiqi2
if (HAVE_extendpqiqi2)
{
emit_unop_insn (CODE_FOR_extendpqiqi2, to, from, UNKNOWN);
return;
}
#endif /* HAVE_extendpqiqi2 */
abort ();
}
}
if (to_mode == PSImode)
{
if (from_mode != SImode)
@ -1595,7 +1630,7 @@ emit_block_move (x, y, size, align)
actual mode mask. */
&& ((GET_CODE (size) == CONST_INT
&& ((unsigned HOST_WIDE_INT) INTVAL (size)
<= GET_MODE_MASK (mode)))
<= (GET_MODE_MASK (mode) >> 1)))
|| GET_MODE_BITSIZE (mode) >= BITS_PER_WORD)
&& (insn_operand_predicate[(int) code][0] == 0
|| (*insn_operand_predicate[(int) code][0]) (x, BLKmode))
@ -2096,7 +2131,7 @@ clear_storage (object, size, align)
definitely be less than the actual mode mask. */
&& ((GET_CODE (size) == CONST_INT
&& ((unsigned HOST_WIDE_INT) INTVAL (size)
<= GET_MODE_MASK (mode)))
<= (GET_MODE_MASK (mode) >> 1)))
|| GET_MODE_BITSIZE (mode) >= BITS_PER_WORD)
&& (insn_operand_predicate[(int) code][0] == 0
|| (*insn_operand_predicate[(int) code][0]) (object,
@ -2418,11 +2453,15 @@ get_push_address (size)
to store the arg. On machines with push insns, ARGS_ADDR is 0 when a
argument block has not been preallocated.
ARGS_SO_FAR is the size of args previously pushed for this call. */
ARGS_SO_FAR is the size of args previously pushed for this call.
REG_PARM_STACK_SPACE is nonzero if functions require stack space
for arguments passed in registers. If nonzero, it will be the number
of bytes required. */
void
emit_push_insn (x, mode, type, size, align, partial, reg, extra,
args_addr, args_so_far)
args_addr, args_so_far, reg_parm_stack_space)
register rtx x;
enum machine_mode mode;
tree type;
@ -2433,6 +2472,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
int extra;
rtx args_addr;
rtx args_so_far;
int reg_parm_stack_space;
{
rtx xinner;
enum direction stack_direction
@ -2479,11 +2519,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
skip the part of stack space corresponding to the registers.
Otherwise, start copying to the beginning of the stack space,
by setting SKIP to 0. */
#ifndef REG_PARM_STACK_SPACE
skip = 0;
#else
skip = used;
#endif
skip = (reg_parm_stack_space == 0) ? 0 : used;
#ifdef PUSH_ROUNDING
/* Do it with several push insns if that doesn't take lots of insns
@ -2598,75 +2634,54 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
INTVAL (size), align);
goto ret;
}
/* Try the most limited insn first, because there's no point
including more than one in the machine description unless
the more limited one has some advantage. */
#ifdef HAVE_movstrqi
if (HAVE_movstrqi
&& GET_CODE (size) == CONST_INT
&& ((unsigned HOST_WIDE_INT) INTVAL (size)
<= GET_MODE_MASK (QImode)))
else
{
rtx pat = gen_movstrqi (gen_rtx_MEM (BLKmode, temp),
xinner, size, GEN_INT (align));
if (pat != 0)
rtx opalign = GEN_INT (align);
enum machine_mode mode;
rtx target = gen_rtx (MEM, BLKmode, temp);
for (mode = GET_CLASS_NARROWEST_MODE (MODE_INT);
mode != VOIDmode;
mode = GET_MODE_WIDER_MODE (mode))
{
emit_insn (pat);
goto ret;
enum insn_code code = movstr_optab[(int) mode];
if (code != CODE_FOR_nothing
&& ((GET_CODE (size) == CONST_INT
&& ((unsigned HOST_WIDE_INT) INTVAL (size)
<= (GET_MODE_MASK (mode) >> 1)))
|| GET_MODE_BITSIZE (mode) >= BITS_PER_WORD)
&& (insn_operand_predicate[(int) code][0] == 0
|| ((*insn_operand_predicate[(int) code][0])
(target, BLKmode)))
&& (insn_operand_predicate[(int) code][1] == 0
|| ((*insn_operand_predicate[(int) code][1])
(xinner, BLKmode)))
&& (insn_operand_predicate[(int) code][3] == 0
|| ((*insn_operand_predicate[(int) code][3])
(opalign, VOIDmode))))
{
rtx op2 = convert_to_mode (mode, size, 1);
rtx last = get_last_insn ();
rtx pat;
if (insn_operand_predicate[(int) code][2] != 0
&& ! ((*insn_operand_predicate[(int) code][2])
(op2, mode)))
op2 = copy_to_mode_reg (mode, op2);
pat = GEN_FCN ((int) code) (target, xinner,
op2, opalign);
if (pat)
{
emit_insn (pat);
goto ret;
}
else
delete_insns_since (last);
}
}
}
#endif
#ifdef HAVE_movstrhi
if (HAVE_movstrhi
&& GET_CODE (size) == CONST_INT
&& ((unsigned HOST_WIDE_INT) INTVAL (size)
<= GET_MODE_MASK (HImode)))
{
rtx pat = gen_movstrhi (gen_rtx_MEM (BLKmode, temp),
xinner, size, GEN_INT (align));
if (pat != 0)
{
emit_insn (pat);
goto ret;
}
}
#endif
#ifdef HAVE_movstrsi
if (HAVE_movstrsi)
{
rtx pat = gen_movstrsi (gen_rtx_MEM (BLKmode, temp),
xinner, size, GEN_INT (align));
if (pat != 0)
{
emit_insn (pat);
goto ret;
}
}
#endif
#ifdef HAVE_movstrdi
if (HAVE_movstrdi)
{
rtx pat = gen_movstrdi (gen_rtx_MEM (BLKmode, temp),
xinner, size, GEN_INT (align));
if (pat != 0)
{
emit_insn (pat);
goto ret;
}
}
#endif
#ifdef HAVE_movstrti
if (HAVE_movstrti)
{
rtx pat = gen_movstrti (gen_rtx (MEM, BLKmode, temp),
xinner, size, GEN_INT (align));
if (pat != 0)
{
emit_insn (pat);
goto ret;
}
}
#endif
#ifndef ACCUMULATE_OUTGOING_ARGS
/* If the source is referenced relative to the stack pointer,
@ -2732,11 +2747,7 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
skip the part of stack space corresponding to the registers.
Otherwise, start copying to the beginning of the stack space,
by setting SKIP to 0. */
#ifndef REG_PARM_STACK_SPACE
skip = 0;
#else
skip = not_stack;
#endif
skip = (reg_parm_stack_space == 0) ? 0 : not_stack;
if (CONSTANT_P (x) && ! LEGITIMATE_CONSTANT_P (x))
x = validize_mem (force_const_mem (mode, x));
@ -2760,7 +2771,8 @@ emit_push_insn (x, mode, type, size, align, partial, reg, extra,
word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
0, args_addr,
GEN_INT (args_offset + ((i - not_stack + skip)
* UNITS_PER_WORD)));
* UNITS_PER_WORD)),
reg_parm_stack_space);
}
else
{
@ -4389,12 +4401,12 @@ get_inner_reference (exp, pbitsize, pbitpos, poffset, pmode,
*pbitpos += TREE_INT_CST_LOW (index);
else
{
if (contains_placeholder_p (index))
index = build (WITH_RECORD_EXPR, sizetype, index, exp);
offset = size_binop (PLUS_EXPR, offset,
convert (sizetype,
size_binop (FLOOR_DIV_EXPR, index,
size_int (BITS_PER_UNIT))));
if (contains_placeholder_p (offset))
offset = build (WITH_RECORD_EXPR, sizetype, offset, exp);
size_binop (FLOOR_DIV_EXPR, index,
size_int (BITS_PER_UNIT)));
}
}
else if (TREE_CODE (exp) != NON_LVALUE_EXPR
@ -4444,6 +4456,7 @@ get_memory_usage_from_modifier (modifier)
switch (modifier)
{
case EXPAND_NORMAL:
case EXPAND_SUM:
return MEMORY_USE_RO;
break;
case EXPAND_MEMORY_USE_WO:
@ -4452,10 +4465,12 @@ get_memory_usage_from_modifier (modifier)
case EXPAND_MEMORY_USE_RW:
return MEMORY_USE_RW;
break;
case EXPAND_INITIALIZER:
case EXPAND_MEMORY_USE_DONT:
case EXPAND_SUM:
/* EXPAND_CONST_ADDRESS and EXPAND_INITIALIZER are converted into
MEMORY_USE_DONT, because they are modifiers to a call of
expand_expr in the ADDR_EXPR case of expand_expr. */
case EXPAND_CONST_ADDRESS:
case EXPAND_INITIALIZER:
return MEMORY_USE_DONT;
case EXPAND_MEMORY_USE_BAD:
default:
@ -4599,12 +4614,15 @@ init_noncopied_parts (lhs, list)
}
/* Subroutine of expand_expr: return nonzero iff there is no way that
EXP can reference X, which is being modified. */
EXP can reference X, which is being modified. TOP_P is nonzero if this
call is going to be used to determine whether we need a temporary
for EXP, as opposed to a recursive call to this function. */
static int
safe_from_p (x, exp)
safe_from_p (x, exp, top_p)
rtx x;
tree exp;
int top_p;
{
rtx exp_rtl = 0;
int i, nops;
@ -4615,8 +4633,8 @@ safe_from_p (x, exp)
(except for arrays that have TYPE_ARRAY_MAX_SIZE set).
So we assume here that something at a higher level has prevented a
clash. This is somewhat bogus, but the best we can do. Only
do this when X is BLKmode. */
|| (TREE_TYPE (exp) != 0 && TYPE_SIZE (TREE_TYPE (exp)) != 0
do this when X is BLKmode and when we are at the top level. */
|| (top_p && TREE_TYPE (exp) != 0 && TYPE_SIZE (TREE_TYPE (exp)) != 0
&& TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
&& (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
|| TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
@ -4653,19 +4671,19 @@ safe_from_p (x, exp)
case 'x':
if (TREE_CODE (exp) == TREE_LIST)
return ((TREE_VALUE (exp) == 0
|| safe_from_p (x, TREE_VALUE (exp)))
|| safe_from_p (x, TREE_VALUE (exp), 0))
&& (TREE_CHAIN (exp) == 0
|| safe_from_p (x, TREE_CHAIN (exp))));
|| safe_from_p (x, TREE_CHAIN (exp), 0)));
else
return 0;
case '1':
return safe_from_p (x, TREE_OPERAND (exp, 0));
return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
case '2':
case '<':
return (safe_from_p (x, TREE_OPERAND (exp, 0))
&& safe_from_p (x, TREE_OPERAND (exp, 1)));
return (safe_from_p (x, TREE_OPERAND (exp, 0), 0)
&& safe_from_p (x, TREE_OPERAND (exp, 1), 0));
case 'e':
case 'r':
@ -4678,7 +4696,8 @@ safe_from_p (x, exp)
{
case ADDR_EXPR:
return (staticp (TREE_OPERAND (exp, 0))
|| safe_from_p (x, TREE_OPERAND (exp, 0)));
|| safe_from_p (x, TREE_OPERAND (exp, 0), 0)
|| TREE_STATIC (exp));
case INDIRECT_REF:
if (GET_CODE (x) == MEM)
@ -4713,7 +4732,7 @@ safe_from_p (x, exp)
break;
case CLEANUP_POINT_EXPR:
return safe_from_p (x, TREE_OPERAND (exp, 0));
return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
case SAVE_EXPR:
exp_rtl = SAVE_EXPR_RTL (exp);
@ -4722,7 +4741,7 @@ safe_from_p (x, exp)
case BIND_EXPR:
/* The only operand we look at is operand 1. The rest aren't
part of the expression. */
return safe_from_p (x, TREE_OPERAND (exp, 1));
return safe_from_p (x, TREE_OPERAND (exp, 1), 0);
case METHOD_CALL_EXPR:
/* This takes a rtx argument, but shouldn't appear here. */
@ -4739,7 +4758,7 @@ safe_from_p (x, exp)
nops = tree_code_length[(int) TREE_CODE (exp)];
for (i = 0; i < nops; i++)
if (TREE_OPERAND (exp, i) != 0
&& ! safe_from_p (x, TREE_OPERAND (exp, i)))
&& ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
return 0;
}
@ -5190,7 +5209,7 @@ expand_expr (exp, target, tmode, modifier)
if (mode == VOIDmode)
temp = const0_rtx;
else
temp = assign_temp (type, 0, 0, 0);
temp = assign_temp (type, 3, 0, 0);
SAVE_EXPR_RTL (exp) = temp;
if (!optimize && GET_CODE (temp) == REG)
@ -5215,6 +5234,8 @@ expand_expr (exp, target, tmode, modifier)
EXPAND_MEMORY_USE_BAD);
else
store_expr (TREE_OPERAND (exp, 0), temp, 0);
TREE_USED (exp) = 1;
}
/* If the mode of SAVE_EXPR_RTL does not match that of the expression, it
@ -5247,7 +5268,7 @@ expand_expr (exp, target, tmode, modifier)
tree placeholder_expr;
/* If there is an object on the head of the placeholder list,
see if some object in its references is of type TYPE. For
see if some object in it of type TYPE or a pointer to it. For
further information, see tree.def. */
for (placeholder_expr = placeholder_list;
placeholder_expr != 0;
@ -5258,26 +5279,38 @@ expand_expr (exp, target, tmode, modifier)
tree old_list = placeholder_list;
tree elt;
/* See if the object is the type that we want. */
if ((TYPE_MAIN_VARIANT (TREE_TYPE
(TREE_PURPOSE (placeholder_expr)))
== need_type))
object = TREE_PURPOSE (placeholder_expr);
/* Find the outermost reference that is of the type we want. */
/* Find the outermost reference that is of the type we want.
If none, see if any object has a type that is a pointer to
the type we want. */
for (elt = TREE_PURPOSE (placeholder_expr);
elt != 0 && object == 0
&& (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e');
elt = ((TREE_CODE (elt) == COMPOUND_EXPR
|| TREE_CODE (elt) == COND_EXPR)
? TREE_OPERAND (elt, 1) : TREE_OPERAND (elt, 0)))
if (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_OPERAND (elt, 0)))
elt != 0 && object == 0;
elt
= ((TREE_CODE (elt) == COMPOUND_EXPR
|| TREE_CODE (elt) == COND_EXPR)
? TREE_OPERAND (elt, 1)
: (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
? TREE_OPERAND (elt, 0) : 0))
if (TYPE_MAIN_VARIANT (TREE_TYPE (elt)) == need_type)
object = elt;
for (elt = TREE_PURPOSE (placeholder_expr);
elt != 0 && object == 0;
elt
= ((TREE_CODE (elt) == COMPOUND_EXPR
|| TREE_CODE (elt) == COND_EXPR)
? TREE_OPERAND (elt, 1)
: (TREE_CODE_CLASS (TREE_CODE (elt)) == 'r'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '1'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == '2'
|| TREE_CODE_CLASS (TREE_CODE (elt)) == 'e')
? TREE_OPERAND (elt, 0) : 0))
if (POINTER_TYPE_P (TREE_TYPE (elt))
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (elt)))
== need_type))
object = TREE_OPERAND (elt, 0);
object = build1 (INDIRECT_REF, need_type, elt);
if (object != 0)
{
@ -5387,7 +5420,7 @@ expand_expr (exp, target, tmode, modifier)
all operands are constant, put it in memory as well. */
else if ((TREE_STATIC (exp)
&& ((mode == BLKmode
&& ! (target != 0 && safe_from_p (target, exp)))
&& ! (target != 0 && safe_from_p (target, exp, 1)))
|| TREE_ADDRESSABLE (exp)
|| (TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
&& (move_by_pieces_ninsns
@ -5414,7 +5447,7 @@ expand_expr (exp, target, tmode, modifier)
{
/* Handle calls that pass values in multiple non-contiguous
locations. The Irix 6 ABI has examples of this. */
if (target == 0 || ! safe_from_p (target, exp)
if (target == 0 || ! safe_from_p (target, exp, 1)
|| GET_CODE (target) == PARALLEL)
{
if (mode != BLKmode && ! TREE_ADDRESSABLE (exp))
@ -5622,8 +5655,6 @@ expand_expr (exp, target, tmode, modifier)
if (DECL_BIT_FIELD (TREE_PURPOSE (elt)))
{
int bitsize = DECL_FIELD_SIZE (TREE_PURPOSE (elt));
enum machine_mode imode
= TYPE_MODE (TREE_TYPE (TREE_PURPOSE (elt)));
if (TREE_UNSIGNED (TREE_TYPE (TREE_PURPOSE (elt))))
{
@ -5632,8 +5663,11 @@ expand_expr (exp, target, tmode, modifier)
}
else
{
enum machine_mode imode
= TYPE_MODE (TREE_TYPE (TREE_PURPOSE (elt)));
tree count
= build_int_2 (imode - bitsize, 0);
= build_int_2 (GET_MODE_BITSIZE (imode) - bitsize,
0);
op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
target, 0);
@ -5673,7 +5707,8 @@ expand_expr (exp, target, tmode, modifier)
!= INTEGER_CST)
? target : NULL_RTX),
VOIDmode,
modifier == EXPAND_INITIALIZER ? modifier : 0);
modifier == EXPAND_INITIALIZER
? modifier : EXPAND_NORMAL);
/* If this is a constant, put it into a register if it is a
legitimate constant and memory if it isn't. */
@ -6166,7 +6201,7 @@ expand_expr (exp, target, tmode, modifier)
goto binop;
preexpand_calls (exp);
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1)))
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
subtarget = 0;
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, ro_modifier);
@ -6311,7 +6346,7 @@ expand_expr (exp, target, tmode, modifier)
GEN_INT (TREE_INT_CST_LOW (TREE_OPERAND (exp, 1))));
}
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1)))
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
subtarget = 0;
/* Check for multiplying things that have been extended
@ -6394,7 +6429,7 @@ expand_expr (exp, target, tmode, modifier)
case ROUND_DIV_EXPR:
case EXACT_DIV_EXPR:
preexpand_calls (exp);
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1)))
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
subtarget = 0;
/* Possible optimization: compute the dividend with EXPAND_SUM
then if the divisor is constant can optimize the case
@ -6412,7 +6447,7 @@ expand_expr (exp, target, tmode, modifier)
case CEIL_MOD_EXPR:
case ROUND_MOD_EXPR:
preexpand_calls (exp);
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1)))
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
subtarget = 0;
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
@ -6464,12 +6499,12 @@ expand_expr (exp, target, tmode, modifier)
return op0;
return expand_abs (mode, op0, target, unsignedp,
safe_from_p (target, TREE_OPERAND (exp, 0)));
safe_from_p (target, TREE_OPERAND (exp, 0), 1));
case MAX_EXPR:
case MIN_EXPR:
target = original_target;
if (target == 0 || ! safe_from_p (target, TREE_OPERAND (exp, 1))
if (target == 0 || ! safe_from_p (target, TREE_OPERAND (exp, 1), 1)
|| (GET_CODE (target) == MEM && MEM_VOLATILE_P (target))
|| GET_MODE (target) != mode
|| (GET_CODE (target) == REG
@ -6584,7 +6619,7 @@ expand_expr (exp, target, tmode, modifier)
case LROTATE_EXPR:
case RROTATE_EXPR:
preexpand_calls (exp);
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1)))
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
subtarget = 0;
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
return expand_shift (code, mode, op0, TREE_OPERAND (exp, 1), target,
@ -6632,7 +6667,7 @@ expand_expr (exp, target, tmode, modifier)
case TRUTH_ANDIF_EXPR:
case TRUTH_ORIF_EXPR:
if (! ignore
&& (target == 0 || ! safe_from_p (target, exp)
&& (target == 0 || ! safe_from_p (target, exp, 1)
/* Make sure we don't have a hard reg (such as function's return
value) live across basic blocks, if not optimizing. */
|| (!optimize && GET_CODE (target) == REG
@ -6760,7 +6795,7 @@ expand_expr (exp, target, tmode, modifier)
if (ignore)
temp = 0;
else if (original_target
&& (safe_from_p (original_target, TREE_OPERAND (exp, 0))
&& (safe_from_p (original_target, TREE_OPERAND (exp, 0), 1)
|| (singleton && GET_CODE (original_target) == REG
&& REGNO (original_target) >= FIRST_PSEUDO_REGISTER
&& original_target == var_rtx (singleton)))
@ -6809,7 +6844,7 @@ expand_expr (exp, target, tmode, modifier)
= invert_truthvalue (TREE_OPERAND (exp, 0));
result = do_store_flag (TREE_OPERAND (exp, 0),
(safe_from_p (temp, singleton)
(safe_from_p (temp, singleton, 1)
? temp : NULL_RTX),
mode, BRANCH_COST <= 1);
@ -6819,7 +6854,7 @@ expand_expr (exp, target, tmode, modifier)
(TREE_OPERAND
(binary_op, 1)),
0),
(safe_from_p (temp, singleton)
(safe_from_p (temp, singleton, 1)
? temp : NULL_RTX), 0);
if (result)
@ -6846,7 +6881,7 @@ expand_expr (exp, target, tmode, modifier)
if it is a hard register, because evaluating the condition
might clobber it. */
if ((binary_op
&& ! safe_from_p (temp, TREE_OPERAND (binary_op, 1)))
&& ! safe_from_p (temp, TREE_OPERAND (binary_op, 1), 1))
|| (GET_CODE (temp) == REG
&& REGNO (temp) < FIRST_PSEUDO_REGISTER))
temp = gen_reg_rtx (mode);
@ -6887,7 +6922,7 @@ expand_expr (exp, target, tmode, modifier)
TREE_OPERAND (exp, 1), 0)
&& (! TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 0))
|| TREE_CODE (TREE_OPERAND (exp, 1)) == SAVE_EXPR)
&& safe_from_p (temp, TREE_OPERAND (exp, 2)))
&& safe_from_p (temp, TREE_OPERAND (exp, 2), 1))
{
if (GET_CODE (temp) == REG && REGNO (temp) < FIRST_PSEUDO_REGISTER)
temp = gen_reg_rtx (mode);
@ -6905,7 +6940,7 @@ expand_expr (exp, target, tmode, modifier)
TREE_OPERAND (exp, 2), 0)
&& (! TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 0))
|| TREE_CODE (TREE_OPERAND (exp, 2)) == SAVE_EXPR)
&& safe_from_p (temp, TREE_OPERAND (exp, 1)))
&& safe_from_p (temp, TREE_OPERAND (exp, 1), 1))
{
if (GET_CODE (temp) == REG && REGNO (temp) < FIRST_PSEUDO_REGISTER)
temp = gen_reg_rtx (mode);
@ -7039,6 +7074,7 @@ expand_expr (exp, target, tmode, modifier)
/* Mark it as expanded. */
TREE_OPERAND (exp, 1) = NULL_TREE;
TREE_USED (slot) = 1;
store_expr (exp1, target, 0);
expand_decl_cleanup (NULL_TREE, cleanups);
@ -7153,7 +7189,8 @@ expand_expr (exp, target, tmode, modifier)
/* Are we taking the address of a nested function? */
if (TREE_CODE (TREE_OPERAND (exp, 0)) == FUNCTION_DECL
&& decl_function_context (TREE_OPERAND (exp, 0)) != 0
&& ! DECL_NO_STATIC_CHAIN (TREE_OPERAND (exp, 0)))
&& ! DECL_NO_STATIC_CHAIN (TREE_OPERAND (exp, 0))
&& ! TREE_STATIC (exp))
{
op0 = trampoline_address (TREE_OPERAND (exp, 0));
op0 = force_operand (op0, target);
@ -7367,7 +7404,7 @@ expand_expr (exp, target, tmode, modifier)
from the optab already placed in `this_optab'. */
binop:
preexpand_calls (exp);
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1)))
if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
subtarget = 0;
op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
@ -8017,7 +8054,7 @@ expand_builtin (exp, target, subtarget, mode, ignore)
case BUILT_IN_APPLY:
if (arglist == 0
/* Arg could be non-pointer if user redeclared this fcn wrong. */
|| TREE_CODE (TREE_TYPE (TREE_VALUE (arglist))) != POINTER_TYPE
|| ! POINTER_TYPE_P (TREE_TYPE (TREE_VALUE (arglist)))
|| TREE_CHAIN (arglist) == 0
|| TREE_CODE (TREE_TYPE (TREE_VALUE (TREE_CHAIN (arglist)))) != POINTER_TYPE
|| TREE_CHAIN (TREE_CHAIN (arglist)) == 0
@ -10600,7 +10637,7 @@ do_store_flag (exp, target, mode, only_cheap)
if (subtarget == 0 || GET_CODE (subtarget) != REG
|| GET_MODE (subtarget) != operand_mode
|| ! safe_from_p (subtarget, inner))
|| ! safe_from_p (subtarget, inner, 1))
subtarget = 0;
op0 = expand_expr (inner, subtarget, VOIDmode, 0);
@ -10650,7 +10687,7 @@ do_store_flag (exp, target, mode, only_cheap)
preexpand_calls (exp);
if (subtarget == 0 || GET_CODE (subtarget) != REG
|| GET_MODE (subtarget) != operand_mode
|| ! safe_from_p (subtarget, arg1))
|| ! safe_from_p (subtarget, arg1, 1))
subtarget = 0;
op0 = expand_expr (arg0, subtarget, VOIDmode, 0);

View File

@ -1,5 +1,5 @@
/* Definitions for code generation pass of GNU compiler.
Copyright (C) 1987, 91-96, 1997 Free Software Foundation, Inc.
Copyright (C) 1987, 91-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -138,7 +138,7 @@ extern int target_temp_slot_level;
struct args_size
{
int constant;
HOST_WIDE_INT constant;
tree var;
};
#endif
@ -200,6 +200,11 @@ enum direction {none, upward, downward}; /* Value has this type. */
#define FUNCTION_ARG_BOUNDARY(MODE, TYPE) PARM_BOUNDARY
#endif
/* Provide a default value for STRICT_ARGUMENT_NAMING. */
#ifndef STRICT_ARGUMENT_NAMING
#define STRICT_ARGUMENT_NAMING 0
#endif
/* Nonzero if we do not know how to pass TYPE solely in registers.
We cannot do so in the following cases:
@ -729,7 +734,7 @@ extern rtx gen_push_operand PROTO((void));
#ifdef TREE_CODE
/* Generate code to push something onto the stack, given its mode and type. */
extern void emit_push_insn PROTO((rtx, enum machine_mode, tree, rtx, int,
int, rtx, int, rtx, rtx));
int, rtx, int, rtx, rtx, int));
/* Emit library call. */
extern void emit_library_call PVPROTO((rtx orgfun, int no_queue,

View File

@ -2726,16 +2726,17 @@ In addition, operating systems on one type of cpu may differ in how they
name the registers; then you would need additional conditionals. For
example, some 68000 operating systems call this register @code{%a5}.
Eventually there may be a way of asking the compiler to choose a register
automatically, but first we need to figure out how it should choose and
how to enable you to guide the choice. No solution is evident.
Defining such a register variable does not reserve the register; it
remains available for other uses in places where flow control determines
the variable's value is not live. However, these registers are made
unavailable for use in the reload pass. I would not be surprised if
excessive use of this feature leaves the compiler too few available
registers to compile certain functions.
unavailable for use in the reload pass; excessive use of this feature
leaves the compiler too few available registers to compile certain
functions.
This option does not guarantee that GNU CC will generate code that has
this variable in the register you specify at all times. You may not
code an explicit reference to this register in an @code{asm} statement
and assume it will always refer to this variable.
@node Alternate Keywords
@section Alternate Keywords

View File

@ -1,5 +1,5 @@
/* Convert RTL to assembler code and output it, for GNU compiler.
Copyright (C) 1987, 88, 89, 92-7, 1998 Free Software Foundation, Inc.
Copyright (C) 1987, 88, 89, 92-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -3825,11 +3825,16 @@ only_leaf_regs_used ()
int i;
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{
if ((regs_ever_live[i] || global_regs[i])
&& ! permitted_reg_in_leaf_functions[i])
return 0;
}
if ((regs_ever_live[i] || global_regs[i])
&& ! permitted_reg_in_leaf_functions[i])
return 0;
if (current_function_uses_pic_offset_table
&& pic_offset_table_rtx != 0
&& GET_CODE (pic_offset_table_rtx) == REG
&& ! permitted_reg_in_leaf_functions[REGNO (pic_offset_table_rtx)])
return 0;
return 1;
}

View File

@ -252,9 +252,10 @@ while [ $# != 0 ]; do
# But the argument to egrep must be kept small, or many versions of egrep
# won't be able to handle it.
#
# We use the pattern [!-.0-~] instead of [^/ ] to match a noncomment
# We use the pattern [!-.0-z{|}~] instead of [^/ ] to match a noncomment
# following #else or #endif because some buggy egreps think [^/] matches
# newline, and they thus think `#else ' matches `#e[ndiflse]*[ ]+[^/ ]'.
# [!-.0-~] does not work properly on AIX 4.1.
#
# We use the pattern [^a-zA-Z0-9_][_a-ce-km-z][a-z0-9] to match an identifier
# following #if or #elif that is not surrounded by __. The `a-ce-km-z'
@ -263,7 +264,7 @@ while [ $# != 0 ]; do
# identifiers below start with `d' or `l'. It also greatly improves
# performance, since many files contain lines of the form `#if ... defined ...'
# or `#if lint'.
if egrep '//|[ _]_IO|CTRL|^#define.NULL|^#e[nl][ds][ief]*[ ]+[!-.0-~]|^#[el]*if.*[^a-zA-Z0-9_][_a-ce-km-zA-Z][a-zA-Z0-9]' $file >/dev/null; then
if egrep '//|[ _]_IO|CTRL|^#define.NULL|^#e[nl][ds][ief]*[ ]+[!-.0-z\{\|\}\~]|^#[el]*if.*[^a-zA-Z0-9_][_a-ce-km-zA-Z][a-zA-Z0-9]' $file >/dev/null; then
if [ -r $file ]; then
cp $file $2/$file >/dev/null 2>&1 \
|| echo "Can't copy $file"
@ -922,17 +923,21 @@ fi
if [ -r ${LIB}/$file ]; then
echo Fixing $file
if grep _GCC_SIZE_T ${LIB}/$file >/dev/null
then size_t_pattern='<<< do not double-wrap the size_t typedef >>>'
else size_t_pattern='typedef[ a-zA-Z_]*[ ]size_t[ ]*;'
fi
sed -e 's/int abort/void abort/g' \
-e 's/int free/void free/g' \
-e 's/char[ ]*\*[ ]*calloc/void \* calloc/g' \
-e 's/char[ ]*\*[ ]*malloc/void \* malloc/g' \
-e 's/char[ ]*\*[ ]*realloc/void \* realloc/g' \
-e 's/int[ ][ ]*exit/void exit/g' \
-e '/typedef[ a-zA-Z_]*[ ]size_t[ ]*;/i\
-e "/$size_t_pattern/"'i\
#ifndef _GCC_SIZE_T\
#define _GCC_SIZE_T
' \
-e '/typedef[ a-zA-Z_]*[ ]size_t[ ]*;/a\
-e "/$size_t_pattern/"'a\
#endif
' \
${LIB}/$file > ${LIB}/${file}.sed
@ -1856,6 +1861,7 @@ fi
# comment. Fortunately, HP/UX already uses #ifndefs in limits.h; if
# we find a #ifndef FLT_MIN we assume that all the required #ifndefs
# are there, and we do not add them ourselves.
# Also fix a nested comment problem in sys/limits.h on Motorola sysV68 R3V7.1
for file in limits.h sys/limits.h; do
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then
mkdir ${LIB}/sys 2>/dev/null
@ -1905,6 +1911,7 @@ for file in limits.h sys/limits.h; do
-e '/[ ]DBL_DIG[ ]/a\
#endif
'\
-e '/^\(\/\*#define HUGE_VAL 3\.[0-9e+]* *\)\/\*/s//\1/'\
${LIB}/$file > ${LIB}/${file}.sed
rm -f ${LIB}/$file; mv ${LIB}/${file}.sed ${LIB}/$file
fi
@ -2871,7 +2878,7 @@ if [ -r ${LIB}/$file ]; then
fi
# sys/lc_core.h on some versions of OSF1/4.x pollutes the namespace by
# defining regex.h related types. This causes libg++ build and usage failures.
# defining regex.h types. This causes C++ library build and usage failures.
# Fixing this correctly requires checking and modifying 3 files.
for file in reg_types.h regex.h sys/lc_core.h; do
if [ -r $file ] && [ ! -r ${LIB}/$file ]; then

View File

@ -1853,13 +1853,15 @@ insn_dead_p (x, needed, call_ok)
regset needed;
int call_ok;
{
register RTX_CODE code = GET_CODE (x);
enum rtx_code code = GET_CODE (x);
/* If setting something that's a reg or part of one,
see if that register's altered value will be live. */
if (code == SET)
{
register rtx r = SET_DEST (x);
rtx r = SET_DEST (x);
/* A SET that is a subroutine call cannot be dead. */
if (! call_ok && GET_CODE (SET_SRC (x)) == CALL)
return 0;
@ -1873,15 +1875,13 @@ insn_dead_p (x, needed, call_ok)
&& rtx_equal_p (r, last_mem_set))
return 1;
while (GET_CODE (r) == SUBREG
|| GET_CODE (r) == STRICT_LOW_PART
|| GET_CODE (r) == ZERO_EXTRACT
|| GET_CODE (r) == SIGN_EXTRACT)
while (GET_CODE (r) == SUBREG || GET_CODE (r) == STRICT_LOW_PART
|| GET_CODE (r) == ZERO_EXTRACT)
r = SUBREG_REG (r);
if (GET_CODE (r) == REG)
{
register int regno = REGNO (r);
int regno = REGNO (r);
/* Don't delete insns to set global regs. */
if ((regno < FIRST_PSEUDO_REGISTER && global_regs[regno])
@ -1913,26 +1913,33 @@ insn_dead_p (x, needed, call_ok)
return 1;
}
}
/* If performing several activities,
insn is dead if each activity is individually dead.
Also, CLOBBERs and USEs can be ignored; a CLOBBER or USE
that's inside a PARALLEL doesn't make the insn worth keeping. */
else if (code == PARALLEL)
{
register int i = XVECLEN (x, 0);
int i = XVECLEN (x, 0);
for (i--; i >= 0; i--)
{
rtx elt = XVECEXP (x, 0, i);
if (!insn_dead_p (elt, needed, call_ok)
&& GET_CODE (elt) != CLOBBER
&& GET_CODE (elt) != USE)
return 0;
}
if (GET_CODE (XVECEXP (x, 0, i)) != CLOBBER
&& GET_CODE (XVECEXP (x, 0, i)) != USE
&& ! insn_dead_p (XVECEXP (x, 0, i), needed, call_ok))
return 0;
return 1;
}
/* We do not check CLOBBER or USE here.
An insn consisting of just a CLOBBER or just a USE
should not be deleted. */
/* A CLOBBER of a pseudo-register that is dead serves no purpose. That
is not necessarily true for hard registers. */
else if (code == CLOBBER && GET_CODE (XEXP (x, 0)) == REG
&& REGNO (XEXP (x, 0)) >= FIRST_PSEUDO_REGISTER
&& ! REGNO_REG_SET_P (needed, REGNO (XEXP (x, 0))))
return 1;
/* We do not check other CLOBBER or USE here. An insn consisting of just
a CLOBBER or just a USE should not be deleted. */
return 0;
}

View File

@ -176,7 +176,7 @@ force_fit_type (t, overflow)
low = TREE_INT_CST_LOW (t);
high = TREE_INT_CST_HIGH (t);
if (TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
if (POINTER_TYPE_P (TREE_TYPE (t)))
prec = POINTER_SIZE;
else
prec = TYPE_PRECISION (TREE_TYPE (t));
@ -1499,7 +1499,7 @@ fold_convert (t, arg1)
register tree type = TREE_TYPE (t);
int overflow = 0;
if (TREE_CODE (type) == POINTER_TYPE || INTEGRAL_TYPE_P (type))
if (POINTER_TYPE_P (type) || INTEGRAL_TYPE_P (type))
{
if (TREE_CODE (arg1) == INTEGER_CST)
{
@ -1519,12 +1519,12 @@ fold_convert (t, arg1)
if ARG1 is a too-large unsigned value and T is signed.
But don't indicate an overflow if converting a pointer. */
TREE_OVERFLOW (t)
= (TREE_OVERFLOW (arg1)
|| (force_fit_type (t,
(TREE_INT_CST_HIGH (arg1) < 0
&& (TREE_UNSIGNED (type)
< TREE_UNSIGNED (TREE_TYPE (arg1)))))
&& TREE_CODE (TREE_TYPE (arg1)) != POINTER_TYPE));
= ((force_fit_type (t,
(TREE_INT_CST_HIGH (arg1) < 0
& (TREE_UNSIGNED (type)
< TREE_UNSIGNED (TREE_TYPE (arg1)))))
&& ! POINTER_TYPE_P (TREE_TYPE (arg1)))
|| TREE_OVERFLOW (arg1));
TREE_CONSTANT_OVERFLOW (t)
= TREE_OVERFLOW (t) | TREE_CONSTANT_OVERFLOW (arg1);
}
@ -5128,7 +5128,7 @@ fold (expr)
if CONST+INCR overflows or if foo+incr might overflow.
This optimization is invalid for floating point due to rounding.
For pointer types we assume overflow doesn't happen. */
if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE
if (POINTER_TYPE_P (TREE_TYPE (varop))
|| (! FLOAT_TYPE_P (TREE_TYPE (varop))
&& (code == EQ_EXPR || code == NE_EXPR)))
{
@ -5163,7 +5163,7 @@ fold (expr)
}
else if (constop && TREE_CODE (varop) == POSTDECREMENT_EXPR)
{
if (TREE_CODE (TREE_TYPE (varop)) == POINTER_TYPE
if (POINTER_TYPE_P (TREE_TYPE (varop))
|| (! FLOAT_TYPE_P (TREE_TYPE (varop))
&& (code == EQ_EXPR || code == NE_EXPR)))
{
@ -5357,7 +5357,7 @@ fold (expr)
/* An unsigned comparison against 0 can be simplified. */
if (integer_zerop (arg1)
&& (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
|| TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE)
|| POINTER_TYPE_P (TREE_TYPE (arg1)))
&& TREE_UNSIGNED (TREE_TYPE (arg1)))
{
switch (TREE_CODE (t))
@ -5392,7 +5392,7 @@ fold (expr)
&& TREE_INT_CST_LOW (arg1) == ((HOST_WIDE_INT) 1 << (width - 1)) - 1
&& TREE_INT_CST_HIGH (arg1) == 0
&& (INTEGRAL_TYPE_P (TREE_TYPE (arg1))
|| TREE_CODE (TREE_TYPE (arg1)) == POINTER_TYPE)
|| POINTER_TYPE_P (TREE_TYPE (arg1)))
&& TREE_UNSIGNED (TREE_TYPE (arg1)))
{
switch (TREE_CODE (t))

View File

@ -360,7 +360,7 @@ struct temp_slot
slot above. May be an EXPR_LIST if multiple addresses exist. */
rtx address;
/* The size, in units, of the slot. */
int size;
HOST_WIDE_INT size;
/* The value of `sequence_rtl_expr' when this temporary is allocated. */
tree rtl_expr;
/* Non-zero if this temporary is currently in use. */
@ -373,10 +373,10 @@ struct temp_slot
int keep;
/* The offset of the slot from the frame_pointer, including extra space
for alignment. This info is for combine_temp_slots. */
int base_offset;
HOST_WIDE_INT base_offset;
/* The size of the slot, including extra space for alignment. This
info is for combine_temp_slots. */
int full_size;
HOST_WIDE_INT full_size;
};
/* List of all temporaries allocated, both available and in use. */
@ -386,6 +386,10 @@ struct temp_slot *temp_slots;
/* Current nesting level for temporaries. */
int temp_slot_level;
/* Current nesting level for variables in a block. */
int var_temp_slot_level;
/* This structure is used to record MEMs or pseudos used to replace VAR, any
SUBREGs of VAR, and any MEMs containing VAR as an address. We need to
@ -404,7 +408,7 @@ struct fixup_replacement
static struct temp_slot *find_temp_slot_from_address PROTO((rtx));
static void put_reg_into_stack PROTO((struct function *, rtx, tree,
enum machine_mode, enum machine_mode,
int, int));
int, int, int));
static void fixup_var_refs PROTO((rtx, enum machine_mode, int));
static struct fixup_replacement
*find_fixup_replacement PROTO((struct fixup_replacement **, rtx));
@ -448,9 +452,11 @@ find_function_data (decl)
tree decl;
{
struct function *p;
for (p = outer_function_chain; p; p = p->next)
if (p->decl == decl)
return p;
abort ();
}
@ -513,6 +519,8 @@ push_function_context_to (context)
p->function_call_count = function_call_count;
p->temp_slots = temp_slots;
p->temp_slot_level = temp_slot_level;
p->target_temp_slot_level = target_temp_slot_level;
p->var_temp_slot_level = var_temp_slot_level;
p->fixup_var_refs_queue = 0;
p->epilogue_delay_list = current_function_epilogue_delay_list;
p->args_info = current_function_args_info;
@ -523,9 +531,10 @@ push_function_context_to (context)
save_expr_status (p);
save_stmt_status (p);
save_varasm_status (p, context);
if (save_machine_status)
(*save_machine_status) (p);
init_emit ();
}
void
@ -542,6 +551,7 @@ pop_function_context_from (context)
tree context;
{
struct function *p = outer_function_chain;
struct var_refs_queue *queue;
outer_function_chain = p->next;
@ -592,6 +602,8 @@ pop_function_context_from (context)
function_call_count = p->function_call_count;
temp_slots = p->temp_slots;
temp_slot_level = p->temp_slot_level;
target_temp_slot_level = p->target_temp_slot_level;
var_temp_slot_level = p->var_temp_slot_level;
current_function_epilogue_delay_list = p->epilogue_delay_list;
reg_renumber = 0;
current_function_args_info = p->args_info;
@ -608,11 +620,8 @@ pop_function_context_from (context)
/* Finish doing put_var_into_stack for any of our variables
which became addressable during the nested function. */
{
struct var_refs_queue *queue = p->fixup_var_refs_queue;
for (; queue; queue = queue->next)
fixup_var_refs (queue->modified, queue->promoted_mode, queue->unsignedp);
}
for (queue = p->fixup_var_refs_queue; queue; queue = queue->next)
fixup_var_refs (queue->modified, queue->promoted_mode, queue->unsignedp);
free (p);
@ -655,7 +664,7 @@ get_frame_size ()
rtx
assign_stack_local (mode, size, align)
enum machine_mode mode;
int size;
HOST_WIDE_INT size;
int align;
{
register rtx x, addr;
@ -724,7 +733,7 @@ assign_stack_local (mode, size, align)
rtx
assign_outer_stack_local (mode, size, align, function)
enum machine_mode mode;
int size;
HOST_WIDE_INT size;
int align;
struct function *function;
{
@ -792,13 +801,15 @@ assign_outer_stack_local (mode, size, align, function)
KEEP is 1 if this slot is to be retained after a call to
free_temp_slots. Automatic variables for a block are allocated
with this flag. KEEP is 2, if we allocate a longer term temporary,
whose lifetime is controlled by CLEANUP_POINT_EXPRs. */
with this flag. KEEP is 2 if we allocate a longer term temporary,
whose lifetime is controlled by CLEANUP_POINT_EXPRs. KEEP is 3
if we are to allocate something at an inner level to be treated as
a variable in the block (e.g., a SAVE_EXPR). */
rtx
assign_stack_temp (mode, size, keep)
enum machine_mode mode;
int size;
HOST_WIDE_INT size;
int keep;
{
struct temp_slot *p, *best_p = 0;
@ -831,7 +842,7 @@ assign_stack_temp (mode, size, keep)
if (GET_MODE (best_p->slot) == BLKmode)
{
int alignment = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
int rounded_size = CEIL_ROUND (size, alignment);
HOST_WIDE_INT rounded_size = CEIL_ROUND (size, alignment);
if (best_p->size - rounded_size >= alignment)
{
@ -862,11 +873,14 @@ assign_stack_temp (mode, size, keep)
/* If we still didn't find one, make a new temporary. */
if (p == 0)
{
int frame_offset_old = frame_offset;
HOST_WIDE_INT frame_offset_old = frame_offset;
p = (struct temp_slot *) oballoc (sizeof (struct temp_slot));
/* If the temp slot mode doesn't indicate the alignment,
use the largest possible, so no one will be disappointed. */
p->slot = assign_stack_local (mode, size, mode == BLKmode ? -1 : 0);
/* The following slot size computation is necessary because we don't
know the actual size of the temporary slot until assign_stack_local
has performed all the frame alignment and size rounding for the
@ -879,6 +893,7 @@ assign_stack_temp (mode, size, keep)
#else
p->size = size;
#endif
/* Now define the fields used by combine_temp_slots. */
#ifdef FRAME_GROWS_DOWNWARD
p->base_offset = frame_offset;
@ -901,6 +916,11 @@ assign_stack_temp (mode, size, keep)
p->level = target_temp_slot_level;
p->keep = 0;
}
else if (keep == 3)
{
p->level = var_temp_slot_level;
p->keep = 0;
}
else
{
p->level = temp_slot_level;
@ -933,7 +953,7 @@ assign_temp (type, keep, memory_required, dont_promote)
if (mode == BLKmode || memory_required)
{
int size = int_size_in_bytes (type);
HOST_WIDE_INT size = int_size_in_bytes (type);
rtx tmp;
/* Unfortunately, we don't yet know how to allocate variable-sized
@ -969,12 +989,19 @@ combine_temp_slots ()
{
struct temp_slot *p, *q;
struct temp_slot *prev_p, *prev_q;
/* Determine where to free back to after this function. */
rtx free_pointer = rtx_alloc (CONST_INT);
int num_slots;
/* If there are a lot of temp slots, don't do anything unless
high levels of optimizaton. */
if (! flag_expensive_optimizations)
for (p = temp_slots, num_slots = 0; p; p = p->next, num_slots++)
if (num_slots > 100 || (num_slots > 10 && optimize == 0))
return;
for (p = temp_slots, prev_p = 0; p; p = prev_p ? prev_p->next : temp_slots)
{
int delete_p = 0;
if (! p->in_use && GET_MODE (p->slot) == BLKmode)
for (q = p->next, prev_q = p; q; q = prev_q->next)
{
@ -1014,9 +1041,6 @@ combine_temp_slots ()
else
prev_p = p;
}
/* Free all the RTL made by plus_constant. */
rtx_free (free_pointer);
}
/* Find the temp slot corresponding to the object at address X. */
@ -1032,6 +1056,7 @@ find_temp_slot_from_address (x)
{
if (! p->in_use)
continue;
else if (XEXP (p->slot, 0) == x
|| p->address == x
|| (GET_CODE (x) == PLUS
@ -1051,7 +1076,7 @@ find_temp_slot_from_address (x)
}
/* Indicate that NEW is an alternate way of referring to the temp slot
that previous was known by OLD. */
that previously was known by OLD. */
void
update_temp_slot_address (old, new)
@ -1254,6 +1279,17 @@ push_temp_slots ()
temp_slot_level++;
}
/* Likewise, but save the new level as the place to allocate variables
for blocks. */
void
push_temp_slots_for_block ()
{
push_temp_slots ();
var_temp_slot_level = temp_slot_level;
}
/* Pop a temporary nesting level. All slots in use in the current level
are freed. */
@ -1279,6 +1315,7 @@ init_temp_slots ()
/* We have not allocated any temporaries yet. */
temp_slots = 0;
temp_slot_level = 0;
var_temp_slot_level = 0;
target_temp_slot_level = 0;
}
@ -1332,6 +1369,7 @@ put_var_into_stack (decl)
can_use_addressof
= (function == 0
&& optimize > 0
/* FIXME make it work for promoted modes too */
&& decl_mode == promoted_mode
#ifdef NON_SAVING_SETJMP
@ -1357,7 +1395,9 @@ put_var_into_stack (decl)
else
put_reg_into_stack (function, reg, TREE_TYPE (decl),
promoted_mode, decl_mode,
TREE_SIDE_EFFECTS (decl), 0);
TREE_SIDE_EFFECTS (decl), 0,
TREE_USED (decl)
|| DECL_INITIAL (decl) != 0);
}
else if (GET_CODE (reg) == CONCAT)
{
@ -1368,14 +1408,18 @@ put_var_into_stack (decl)
#ifdef FRAME_GROWS_DOWNWARD
/* Since part 0 should have a lower address, do it second. */
put_reg_into_stack (function, XEXP (reg, 1), part_type, part_mode,
part_mode, TREE_SIDE_EFFECTS (decl), 0);
part_mode, TREE_SIDE_EFFECTS (decl), 0,
TREE_USED (decl) || DECL_INITIAL (decl) != 0);
put_reg_into_stack (function, XEXP (reg, 0), part_type, part_mode,
part_mode, TREE_SIDE_EFFECTS (decl), 0);
part_mode, TREE_SIDE_EFFECTS (decl), 0,
TREE_USED (decl) || DECL_INITIAL (decl) != 0);
#else
put_reg_into_stack (function, XEXP (reg, 0), part_type, part_mode,
part_mode, TREE_SIDE_EFFECTS (decl), 0);
part_mode, TREE_SIDE_EFFECTS (decl), 0,
TREE_USED (decl) || DECL_INITIAL (decl) != 0);
put_reg_into_stack (function, XEXP (reg, 1), part_type, part_mode,
part_mode, TREE_SIDE_EFFECTS (decl), 0);
part_mode, TREE_SIDE_EFFECTS (decl), 0,
TREE_USED (decl) || DECL_INITIAL (decl) != 0);
#endif
/* Change the CONCAT into a combined MEM for both parts. */
@ -1405,17 +1449,19 @@ put_var_into_stack (decl)
into the stack frame of FUNCTION (0 means the current function).
DECL_MODE is the machine mode of the user-level data type.
PROMOTED_MODE is the machine mode of the register.
VOLATILE_P is nonzero if this is for a "volatile" decl. */
VOLATILE_P is nonzero if this is for a "volatile" decl.
USED_P is nonzero if this reg might have already been used in an insn. */
static void
put_reg_into_stack (function, reg, type, promoted_mode, decl_mode, volatile_p,
original_regno)
original_regno, used_p)
struct function *function;
rtx reg;
tree type;
enum machine_mode promoted_mode, decl_mode;
int volatile_p;
int original_regno;
int used_p;
{
rtx new = 0;
int regno = original_regno;
@ -1454,7 +1500,8 @@ put_reg_into_stack (function, reg, type, promoted_mode, decl_mode, volatile_p,
/* Now make sure that all refs to the variable, previously made
when it was a register, are fixed up to be valid again. */
if (function)
if (used_p && function != 0)
{
struct var_refs_queue *temp;
@ -1473,7 +1520,7 @@ put_reg_into_stack (function, reg, type, promoted_mode, decl_mode, volatile_p,
function->fixup_var_refs_queue = temp;
pop_obstacks ();
}
else
else if (used_p)
/* Variable is local; fix it up now. */
fixup_var_refs (reg, promoted_mode, TREE_UNSIGNED (type));
}
@ -1561,7 +1608,9 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel)
while (insn)
{
rtx next = NEXT_INSN (insn);
rtx set, prev, prev_set;
rtx note;
if (GET_RTX_CLASS (GET_CODE (insn)) == 'i')
{
/* If this is a CLOBBER of VAR, delete it.
@ -1587,14 +1636,22 @@ fixup_var_refs_insns (var, promoted_mode, unsignedp, insn, toplevel)
}
/* The insn to load VAR from a home in the arglist
is now a no-op. When we see it, just delete it. */
is now a no-op. When we see it, just delete it.
Similarly if this is storing VAR from a register from which
it was loaded in the previous insn. This will occur
when an ADDRESSOF was made for an arglist slot. */
else if (toplevel
&& GET_CODE (PATTERN (insn)) == SET
&& SET_DEST (PATTERN (insn)) == var
&& (set = single_set (insn)) != 0
&& SET_DEST (set) == var
/* If this represents the result of an insn group,
don't delete the insn. */
&& find_reg_note (insn, REG_RETVAL, NULL_RTX) == 0
&& rtx_equal_p (SET_SRC (PATTERN (insn)), var))
&& (rtx_equal_p (SET_SRC (set), var)
|| (GET_CODE (SET_SRC (set)) == REG
&& (prev = prev_nonnote_insn (insn)) != 0
&& (prev_set = single_set (prev)) != 0
&& SET_DEST (prev_set) == SET_SRC (set)
&& rtx_equal_p (SET_SRC (prev_set), var))))
{
/* In unoptimized compilation, we shouldn't call delete_insn
except in jump.c doing warnings. */
@ -1862,7 +1919,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
{
enum machine_mode wanted_mode = VOIDmode;
enum machine_mode is_mode = GET_MODE (tem);
int pos = INTVAL (XEXP (x, 2));
HOST_WIDE_INT pos = INTVAL (XEXP (x, 2));
#ifdef HAVE_extzv
if (GET_CODE (x) == ZERO_EXTRACT)
@ -1876,7 +1933,7 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
if (wanted_mode != VOIDmode
&& GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
{
int offset = pos / BITS_PER_UNIT;
HOST_WIDE_INT offset = pos / BITS_PER_UNIT;
rtx old_pos = XEXP (x, 2);
rtx newmem;
@ -2062,12 +2119,12 @@ fixup_var_refs_1 (var, promoted_mode, loc, insn, replacements)
enum machine_mode wanted_mode
= insn_operand_mode[(int) CODE_FOR_insv][0];
enum machine_mode is_mode = GET_MODE (tem);
int pos = INTVAL (XEXP (outerdest, 2));
HOST_WIDE_INT pos = INTVAL (XEXP (outerdest, 2));
/* If we have a narrower mode, we can do something. */
if (GET_MODE_SIZE (wanted_mode) < GET_MODE_SIZE (is_mode))
{
int offset = pos / BITS_PER_UNIT;
HOST_WIDE_INT offset = pos / BITS_PER_UNIT;
rtx old_pos = XEXP (outerdest, 2);
rtx newmem;
@ -2472,7 +2529,7 @@ optimize_bit_field (body, insn, equiv_mem)
that we are now getting rid of,
and then for which byte of the word is wanted. */
register int offset = INTVAL (XEXP (bitfield, 2));
HOST_WIDE_INT offset = INTVAL (XEXP (bitfield, 2));
rtx insns;
/* Adjust OFFSET to count bits from low-address byte. */
@ -2638,7 +2695,9 @@ gen_mem_addressof (reg, decl)
MEM_VOLATILE_P (reg) = TREE_SIDE_EFFECTS (decl);
MEM_IN_STRUCT_P (reg) = AGGREGATE_TYPE_P (type);
fixup_var_refs (reg, GET_MODE (reg), TREE_UNSIGNED (type));
if (TREE_USED (decl) || DECL_INITIAL (decl) != 0)
fixup_var_refs (reg, GET_MODE (reg), TREE_UNSIGNED (type));
return reg;
}
@ -2670,7 +2729,8 @@ put_addressof_into_stack (r)
put_reg_into_stack (0, reg, TREE_TYPE (decl), GET_MODE (reg),
DECL_MODE (decl), TREE_SIDE_EFFECTS (decl),
ADDRESSOF_REGNO (r));
ADDRESSOF_REGNO (r),
TREE_USED (decl) || DECL_INITIAL (decl) != 0);
}
/* Helper function for purge_addressof. See if the rtx expression at *LOC
@ -2721,9 +2781,16 @@ purge_addressof_1 (loc, insn, force)
else if (code == MEM && GET_CODE (XEXP (x, 0)) == ADDRESSOF && ! force)
{
rtx sub = XEXP (XEXP (x, 0), 0);
if (GET_CODE (sub) == MEM)
sub = gen_rtx_MEM (GET_MODE (x), copy_rtx (XEXP (sub, 0)));
if (GET_CODE (sub) == REG && GET_MODE (x) != GET_MODE (sub))
if (GET_CODE (sub) == REG && MEM_VOLATILE_P (x))
{
put_addressof_into_stack (XEXP (x, 0));
return;
}
else if (GET_CODE (sub) == REG && GET_MODE (x) != GET_MODE (sub))
{
if (! BYTES_BIG_ENDIAN && ! WORDS_BIG_ENDIAN)
{
@ -2847,7 +2914,8 @@ instantiate_decls (fndecl, valid_only)
/* Process all parameters of the function. */
for (decl = DECL_ARGUMENTS (fndecl); decl; decl = TREE_CHAIN (decl))
{
int size = int_size_in_bytes (TREE_TYPE (decl));
HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (decl));
instantiate_decl (DECL_RTL (decl), size, valid_only);
/* If the parameter was promoted, then the incoming RTL mode may be
@ -2977,7 +3045,7 @@ instantiate_virtual_regs_1 (loc, object, extra_insns)
rtx x;
RTX_CODE code;
rtx new = 0;
int offset = 0;
HOST_WIDE_INT offset;
rtx temp;
rtx seq;
int i, j;
@ -3652,17 +3720,7 @@ assign_parms (fndecl, second_time)
/* Set NAMED_ARG if this arg should be treated as a named arg. For
most machines, if this is a varargs/stdarg function, then we treat
the last named arg as if it were anonymous too. */
#ifdef STRICT_ARGUMENT_NAMING
int named_arg = 1;
#else
int named_arg = ! last_named;
#endif
/* If this is a varargs function, then we want to treat the last named
argument as if it was an aggregate, because it might be accessed as
one by the va_arg macros. This is necessary to make the aliasing
code handle this parm correctly. */
if (hide_last_arg && last_named)
aggregate = 1;
int named_arg = STRICT_ARGUMENT_NAMING ? 1 : ! last_named;
if (TREE_TYPE (parm) == error_mark_node
/* This can happen after weird syntax errors
@ -4269,7 +4327,7 @@ assign_parms (fndecl, second_time)
}
/* For pointer data type, suggest pointer register. */
if (TREE_CODE (TREE_TYPE (parm)) == POINTER_TYPE)
if (POINTER_TYPE_P (TREE_TYPE (parm)))
mark_reg_pointer (parmreg,
(TYPE_ALIGN (TREE_TYPE (TREE_TYPE (parm)))
/ BITS_PER_UNIT));
@ -4324,9 +4382,7 @@ assign_parms (fndecl, second_time)
emit_move_insn (validize_mem (stack_parm),
validize_mem (entry_parm));
}
if (flag_check_memory_usage
&& entry_parm != stack_parm
&& promoted_mode != nominal_mode)
if (flag_check_memory_usage)
{
push_to_sequence (conversion_insns);
emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
@ -4811,7 +4867,7 @@ fix_lexical_addr (addr, var)
tree var;
{
rtx basereg;
int displacement;
HOST_WIDE_INT displacement;
tree context = decl_function_context (var);
struct function *fp;
rtx base = 0;

View File

@ -1,5 +1,5 @@
/* Structure for saving state for a nested function.
Copyright (C) 1989, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
Copyright (C) 1989, 92-97, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -108,6 +108,8 @@ struct function
int function_call_count;
struct temp_slot *temp_slots;
int temp_slot_level;
int target_temp_slot_level;
int var_temp_slot_level;
/* This slot is initialized as 0 and is added to
during the nested function. */
struct var_refs_queue *fixup_var_refs_queue;

View File

@ -1,5 +1,5 @@
/* ANSI and traditional C compatibility macros.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of GNU CC.
@ -77,6 +77,9 @@ Boston, MA 02111-1307, USA. */
#endif /* ! __STDC__ */
/* We don't have autoconf for libgcc2.c since it's a target, so don't
define these functions, which aren't used there anyway. */
#ifndef IN_LIBGCC2
#ifndef bcopy
# ifdef HAVE_BCOPY
# ifdef NEED_DECLARATION_BCOPY
@ -119,4 +122,6 @@ int bcmp ();
# endif
#endif
#endif /* IN_LIBGCC2 */
#endif /* ANSIDECL_H */

View File

@ -2,7 +2,7 @@
for getting g++ file-scope static objects constructed. This file
will get included either by libgcc2.c (for systems that don't support
a .init section) or by crtstuff.c (for those that do).
Copyright (C) 1991, 1995, 1996 Free Software Foundation, Inc.
Copyright (C) 1991, 1995, 1996, 1998 Free Software Foundation, Inc.
Contributed by Ron Guilmette (rfg@segfault.us.com)
This file is part of GNU CC.
@ -39,8 +39,6 @@ Boston, MA 02111-1307, USA. */
#ifdef HAVE_ATEXIT
#if defined (WINNT) || defined (NEED_ATEXIT)
extern int atexit (void (*) (void));
#else
extern void atexit (void (*) (void));
#endif
#define ON_EXIT(FUNC,ARG) atexit ((FUNC))
#else

View File

@ -2527,7 +2527,7 @@ process_command (argc, argv)
}
else if (! strcmp (argv[i], "-dumpversion"))
{
printf ("%s\n", version_string);
printf ("%s\n", spec_version);
exit (0);
}
else if (! strcmp (argv[i], "-dumpmachine"))
@ -2746,6 +2746,36 @@ process_command (argc, argv)
spec_version = p + 1;
compiler_version = spec_version;
warn_std_ptr = &warn_std;
/* Validate the version number. Use the same checks
done when inserting it into a spec.
The format of the version string is
([^0-9]*-)?[0-9]+[.][0-9]+([.][0-9]+)?([- ].*)? */
{
char *v = compiler_version;
/* Ignore leading non-digits. i.e. "foo-" in "foo-2.7.2". */
while (! isdigit (*v))
v++;
if (v > compiler_version && v[-1] != '-')
fatal ("invalid version number format");
/* Set V after the first period. */
while (isdigit (*v))
v++;
if (*v != '.')
fatal ("invalid version number format");
v++;
while (isdigit (*v))
v++;
if (*v != 0 && *v != ' ' && *v != '.' && *v != '-')
fatal ("invalid version number format");
}
break;
case 'c':
@ -2901,23 +2931,23 @@ process_command (argc, argv)
for (j = 4; argv[i][j]; j++)
if (argv[i][j] == ',')
{
infiles[n_infiles].language = 0;
infiles[n_infiles].language = "*";
infiles[n_infiles++].name
= save_string (argv[i] + prev, j - prev);
prev = j + 1;
}
/* Record the part after the last comma. */
infiles[n_infiles].language = 0;
infiles[n_infiles].language = "*";
infiles[n_infiles++].name = argv[i] + prev;
}
else if (strcmp (argv[i], "-Xlinker") == 0)
{
infiles[n_infiles].language = 0;
infiles[n_infiles].language = "*";
infiles[n_infiles++].name = argv[++i];
}
else if (strncmp (argv[i], "-l", 2) == 0)
{
infiles[n_infiles].language = 0;
infiles[n_infiles].language = "*";
infiles[n_infiles++].name = argv[i];
}
else if (strcmp (argv[i], "-specs") == 0)
@ -4528,7 +4558,15 @@ main (argc, argv)
as a unit. If GCC_EXEC_PREFIX is defined, base
standard_startfile_prefix on that as well. */
if (*standard_startfile_prefix == '/'
|| *standard_startfile_prefix == DIR_SEPARATOR)
|| *standard_startfile_prefix == DIR_SEPARATOR
|| *standard_startfile_prefix == '$'
#ifdef __MSDOS__
/* Check for disk name on MS-DOS-based systems. */
|| (standard_startfile_prefix[1] == ':'
&& (standard_startfile_prefix[2] == DIR_SEPARATOR
|| standard_startfile_prefix[2] == '/'))
#endif
)
add_prefix (&startfile_prefixes, standard_startfile_prefix, "BINUTILS",
0, 0, NULL_PTR);
else
@ -4796,7 +4834,7 @@ main (argc, argv)
/* Find the proper compilation spec for the file name NAME,
whose length is LENGTH. LANGUAGE is the specified language,
or 0 if none specified. */
or 0 if this file is to be passed to the linker. */
static struct compiler *
lookup_compiler (name, length, language)
@ -4806,19 +4844,19 @@ lookup_compiler (name, length, language)
{
struct compiler *cp;
/* Look for the language, if one is spec'd. */
/* If this was specified by the user to be a linker input, indicate that. */
if (language != 0 && language[0] == '*')
return 0;
/* Otherwise, look for the language, if one is spec'd. */
if (language != 0)
{
for (cp = compilers + n_compilers - 1; cp >= compilers; cp--)
{
if (language != 0)
{
if (cp->suffix[0] == '@'
&& !strcmp (cp->suffix + 1, language))
return cp;
}
}
if (cp->suffix[0] == '@' && !strcmp (cp->suffix + 1, language))
return cp;
error ("language %s not recognized", language);
return 0;
}
/* Look for a suffix. */
@ -4826,23 +4864,24 @@ lookup_compiler (name, length, language)
{
if (/* The suffix `-' matches only the file name `-'. */
(!strcmp (cp->suffix, "-") && !strcmp (name, "-"))
||
(strlen (cp->suffix) < length
/* See if the suffix matches the end of NAME. */
|| (strlen (cp->suffix) < length
/* See if the suffix matches the end of NAME. */
#ifdef OS2
&& (!strcmp (cp->suffix,
name + length - strlen (cp->suffix))
|| !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
&& !strcasecmp (cp->suffix,
name + length - strlen (cp->suffix)))))
&& ((!strcmp (cp->suffix,
name + length - strlen (cp->suffix))
|| !strpbrk (cp->suffix, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))
&& !strcasecmp (cp->suffix,
name + length - strlen (cp->suffix)))
#else
&& !strcmp (cp->suffix,
name + length - strlen (cp->suffix))))
&& !strcmp (cp->suffix,
name + length - strlen (cp->suffix))
#endif
))
{
if (cp->spec[0][0] == '@')
{
struct compiler *new;
/* An alias entry maps a suffix to a language.
Search for the language; pass 0 for NAME and LENGTH
to avoid infinite recursion if language not found.
@ -4854,6 +4893,7 @@ lookup_compiler (name, length, language)
(char *) new->spec, sizeof new->spec);
return new;
}
/* A non-alias entry: return it. */
return cp;
}
@ -4968,6 +5008,8 @@ pfatal_pexecute (errmsg_fmt, errmsg_arg)
char *errmsg_fmt;
char *errmsg_arg;
{
int save_errno = errno;
if (errmsg_arg)
{
/* Space for trailing '\0' is in %s. */
@ -4976,7 +5018,7 @@ pfatal_pexecute (errmsg_fmt, errmsg_arg)
errmsg_fmt = msg;
}
fatal ("%s: %s", errmsg_fmt, my_strerror (errno));
fatal ("%s: %s", errmsg_fmt, my_strerror (save_errno));
}
/* More 'friendly' abort that prints the line and file.

View File

@ -86,9 +86,6 @@
In the case of the sharable library, only one library needs to be
linked to.
If you need to link to libg++, it is easiest to use the command
procedure supplied with libg++ to link your program.
2 /CASE_HACK
/[NO]CASE_HACK D=/CASE_HACK

View File

@ -111,23 +111,21 @@ notice identical to this one except for the removal of this paragraph
@end ignore
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
sections entitled ``GNU General Public License,'' ``Funding for Free
Software,'' and ``Protect Your Freedom---Fight `Look And Feel'@w{}'' are
included exactly as in the original, and provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.
sections entitled ``GNU General Public License'' and ``Funding for Free
Software'' are included exactly as in the original, and provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that the sections entitled ``GNU General Public License,''
``Funding for Free Software,'' and ``Protect Your Freedom---Fight `Look
And Feel'@w{}'', and this permission notice, may be included in
translations approved by the Free Software Foundation instead of in the
original English.
except that the sections entitled ``GNU General Public License'' and
``Funding for Free Software'', and this permission notice, may be
included in translations approved by the Free Software Foundation
instead of in the original English.
@end ifinfo
@setchapternewpage odd
@c @finalout
@titlepage
@ifset INTERNALS
@ifset USING
@ -144,23 +142,23 @@ original English.
@sp 2
@center Richard M. Stallman
@sp 3
@center Last updated 7 January 1998
@center Last updated 16 March 1998
@sp 1
@c The version number appears three times more in this file.
@c The version number appears five times more in this file.
@center for egcs-1.0
@page
@vskip 0pt plus 1filll
Copyright @copyright{} 1988, 89, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
Copyright @copyright{} 1988, 89, 92, 93, 94, 95, 96, 98 Free Software Foundation, Inc.
@sp 2
For EGCS Version 1.0@*
@sp 1
Published by the Free Software Foundation @*
59 Temple Place - Suite 330@*
Boston, MA 02111-1307, USA@*
Last printed November, 1995.@*
Last printed April, 1998.@*
Printed copies are available for $50 each.@*
ISBN 1-882114-36-1
ISBN 1-882114-37-X
@sp 1
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
@ -168,19 +166,17 @@ are preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
sections entitled ``GNU General Public License,'' ``Funding for Free
Software,'' and ``Protect Your Freedom---Fight `Look And Feel'@w{}'' are
included exactly as in the original, and provided that the entire
resulting derived work is distributed under the terms of a permission
notice identical to this one.
sections entitled ``GNU General Public License'' and ``Funding for Free
Software'' are included exactly as in the original, and provided that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions,
except that the sections entitled ``GNU General Public License,''
``Funding for Free Software,'' and ``Protect Your Freedom---Fight `Look
And Feel'@w{}'', and this permission notice, may be included in
translations approved by the Free Software Foundation instead of in the
original English.
except that the sections entitled ``GNU General Public License'' and
``Funding for Free Software'', and this permission notice, may be
included in translations approved by the Free Software Foundation
instead of in the original English.
@end titlepage
@page
@ -236,7 +232,7 @@ bugs. It corresponds to EGCS version 1.0.
@end ifset
* Funding:: How to help assure funding for free software.
* Look and Feel:: Protect your freedom---fight ``look and feel''.
* GNU/Linux:: Linux and the GNU Project
* Copying:: GNU General Public License says
how you can copy and share GNU CC.
@ -1122,7 +1118,7 @@ the ordinary C compiler. If you do so, you must specify the following
options:
@smallexample
-L/usr/local/lib/gcc-lib/we32k-att-sysv/2.7.1 -lgcc -lc_s
-L/usr/local/lib/gcc-lib/we32k-att-sysv/2.8.1 -lgcc -lc_s
@end smallexample
The first specifies where to find the library @file{libgcc.a}
@ -3864,9 +3860,9 @@ procedure will build all combinations of compatible options.
For example, if you set @code{MULTILIB_OPTIONS} to @samp{m68000/m68020
msoft-float}, @file{Makefile} will build special versions of
@file{libgcc.a} using the sets of options @samp{-m68000}, @samp{-m68020},
@samp{-msoft-float}, @samp{-m68000 -msoft-float}, and @samp{-m68020
-msoft-float}.
@file{libgcc.a} using the following sets of options: @samp{-m68000},
@samp{-m68020}, @samp{-msoft-float}, @samp{-m68000 -msoft-float}, and
@samp{-m68020 -msoft-float}.
@findex MULTILIB_DIRNAMES
@item MULTILIB_DIRNAMES
@ -3877,7 +3873,7 @@ Write one element in @code{MULTILIB_DIRNAMES} for each element in
default value will be @code{MULTILIB_OPTIONS}, with all slashes treated
as spaces.
For example, if @code{MULTILIB_OPTIONS} is specified as @samp{m68000/m68020
For example, if @code{MULTILIB_OPTIONS} is set to @samp{m68000/m68020
msoft-float}, then the default value of @code{MULTILIB_DIRNAMES} is
@samp{m68000 m68020 msoft-float}. You may specify a different value if
you desire a different set of directory names.
@ -3992,191 +3988,104 @@ Verbatim copying and redistribution of this section is permitted
without royalty; alteration is not permitted.
@end display
@node Look and Feel
@unnumbered Protect Your Freedom---Fight ``Look And Feel''
@c the above chapter heading overflows onto the next line. --mew 1/26/93
@node GNU/Linux
@unnumbered Linux and the GNU Project
@quotation
@i{This section is a political message from the League for Programming
Freedom to the users of GNU CC. We have included it here because the
issue of interface copyright is important to the GNU project.}
@end quotation
Many computer users run a modified version of the GNU system every
day, without realizing it. Through a peculiar turn of events, the
version of GNU which is widely used today is more often known as
``Linux'', and many users are not aware of the extent of its
connection with the GNU Project.
Apple, Lotus, and now CDC have tried to create a new form of legal
monopoly: a copyright on a user interface.
There really is a Linux; it is a kernel, and these people are using
it. But you can't use a kernel by itself; a kernel is useful only as
part of a whole system. The system in which Linux is typically used
is a modified variant of the GNU system---in other words, a Linux-based
GNU system.
An interface is a kind of language---a set of conventions for
communication between two entities, human or machine. Until a few years
ago, the law seemed clear: interfaces were outside the domain of
copyright, so programmers could program freely and implement whatever
interface the users demanded. Imitating de-facto standard interfaces,
sometimes with improvements, was standard practice in the computer
field. These improvements, if accepted by the users, caught on and
became the norm; in this way, much progress took place.
Many users are not fully aware of the distinction between the kernel,
which is Linux, and the whole system, which they also call ``Linux''.
The ambiguous use of the name doesn't promote understanding.
Computer users, and most software developers, were happy with this state
of affairs. However, large companies such as Apple and Lotus would
prefer a different system---one in which they can own interfaces and
thereby rid themselves of all serious competitors. They hope that
interface copyright will give them, in effect, monopolies on major
classes of software.
Programmers generally know that Linux is a kernel. But since they
have generally heard the whole system called ``Linux'' as well, they
often envisage a history which fits that name. For example, many
believe that once Linus Torvalds finished writing the kernel, his
friends looked around for other free software, and for no particular
reason most everything necessary to make a Unix-like system was
already available.
Other large companies such as IBM and Digital also favor interface
monopolies, for the same reason: if languages become property, they
expect to own many de-facto standard languages. But Apple and Lotus are
the ones who have actually sued. Apple's lawsuit was defeated, for
reasons only partly related to the general issue of interface copyright.
What they found was no accident---it was the GNU system. The available
free software added up to a complete system because the GNU Project
had been working since 1984 to make one. The GNU Manifesto
had set forth the goal of developing a free Unix-like system, called
GNU. By the time Linux was written, the system was almost finished.
Lotus won lawsuits against two small companies, which were thus put out
of business. Then Lotus sued Borland; Lotus won in the trial court (no
surprise, since it was the same court that had ruled for Lotus twice
before), but the court of appeals ruled in favor of Borland, which was
assisted by a friend-of-the-court brief from the League for Programming
Freedom.
Most free software projects have the goal of developing a particular
program for a particular job. For example, Linus Torvalds set out to
write a Unix-like kernel (Linux); Donald Knuth set out to write a text
formatter (TeX); Bob Scheifler set out to develop a window system (X
Windows). It's natural to measure the contribution of this kind of
project by specific programs that came from the project.
Lotus appealed the case to the Supreme Court, which heard the case but
was unable to reach a decision. This failure means that the appeals
court decision stands, in one portion of the United States, and may
influence the other appeals courts, but it does not set a nationwide
precedent. The battle is not over, and it is not limited to the United
States.
If we tried to measure the GNU Project's contribution in this way,
what would we conclude? One CD-ROM vendor found that in their ``Linux
distribution'', GNU software was the largest single contingent, around
28% of the total source code, and this included some of the essential
major components without which there could be no system. Linux itself
was about 3%. So if you were going to pick a name for the system
based on who wrote the programs in the system, the most appropriate
single choice would be ``GNU''.
The battle is extending into other areas of software as well. In 1995 a
company that produced a simulator for a CDC computer was shut down by a
copyright lawsuit, in which CDC charged that the simulator infringed the
copyright on the manuals for the computer.
But we don't think that is the right way to consider the question.
The GNU Project was not, is not, a project to develop specific
software packages. It was not a project to develop a C compiler,
although we did. It was not a project to develop a text editor,
although we developed one. The GNU Project's aim was to develop
@emph{a complete free Unix-like system}.
If the monopolists get their way, they will hobble the software field:
Many people have made major contributions to the free software in the
system, and they all deserve credit. But the reason it is @emph{a
system}---and not just a collection of useful programs---is because the
GNU Project set out to make it one. We wrote the programs that were
needed to make a @emph{complete} free system. We wrote essential but
unexciting major components, such as the assembler and linker, because
you can't have a system without them. A complete system needs more
than just programming tools, so we wrote other components as well,
such as the Bourne Again SHell, the PostScript interpreter
Ghostscript, and the GNU C library.
@itemize @bullet
@item
Gratuitous incompatibilities will burden users. Imagine if each car
manufacturer had to design a different way to start, stop, and steer a
car.
By the early 90s we had put together the whole system aside from the
kernel (and we were also working on a kernel, the GNU Hurd, which runs
on top of Mach). Developing this kernel has been a lot harder than we
expected, and we are still working on finishing it.
@item
Users will be ``locked in'' to whichever interface they learn; then they
will be prisoners of one supplier, who will charge a monopolistic price.
Fortunately, you don't have to wait for it, because Linux is working
now. When Linus Torvalds wrote Linux, he filled the last major gap.
People could then put Linux together with the GNU system to make a
complete free system: a Linux-based GNU system (or GNU/Linux system,
for short).
@item
Large companies have an unfair advantage wherever lawsuits become
commonplace. Since they can afford to sue, they can intimidate smaller
developers with threats even when they don't really have a case.
Putting them together sounds simple, but it was not a trivial job.
The GNU C library (called glibc for short) needed substantial changes.
Integrating a complete system as a distribution that would work ``out
of the box'' was a big job, too. It required addressing the issue of
how to install and boot the system---a problem we had not tackled,
because we hadn't yet reached that point. The people who developed
the various system distributions made a substantial contribution.
@item
Interface improvements will come slower, since incremental evolution
through creative partial imitation will no longer occur.
@end itemize
If interface monopolies are accepted, other large companies are waiting
to grab theirs:
@itemize @bullet
@item
Adobe is expected to claim a monopoly on the interfaces of various
popular application programs, if Lotus ultimately wins the case against
Borland.
@item
Open Computing magazine reported a Microsoft vice president as threatening
to sue people who imitate the interface of Windows.
@end itemize
Users invest a great deal of time and money in learning to use computer
interfaces. Far more, in fact, than software developers invest in
developing @emph{and even implementing} the interfaces. Whoever can own
an interface, has made its users into captives, and misappropriated
their investment.
To protect our freedom from monopolies like these, a group of
programmers and users have formed a grass-roots political organization,
the League for Programming Freedom.
The purpose of the League is to oppose monopolistic practices such as
interface copyright and software patents. The League calls for a return
to the legal policies of the recent past, in which programmers could
program freely. The League is not concerned with free software as an
issue, and is not affiliated with the Free Software Foundation.
The League's activities include publicizing the issues, as is being done
here, and filing friend-of-the-court briefs on behalf of defendants sued
by monopolists.
The League's membership rolls include Donald Knuth, the foremost
authority on algorithms, John McCarthy, inventor of Lisp, Marvin Minsky,
founder of the MIT Artificial Intelligence lab, Guy L. Steele, Jr.,
author of well-known books on Lisp and C, as well as Richard Stallman,
the developer of GNU CC. Please join and add your name to the list.
Membership dues in the League are $42 per year for programmers, managers
and professionals; $10.50 for students; $21 for others.
Activist members are especially important, but members who have no time
to give are also important. Surveys at major ACM conferences have
indicated a vast majority of attendees agree with the League on both
issues (interface copyrights and software patents). If just ten percent
of the programmers who agree with the League join the League, we will
probably triumph.
To join, or for more information, send electronic mail to
the address @code{lpf@@uunet.uu.net} or write to:
@display
League for Programming Freedom
1 Kendall Square #143
P.O. Box 9171
Cambridge, MA 02139
@end display
In addition to joining the League, here are some suggestions from the
League for other things you can do to protect your freedom to write
programs:
@itemize @bullet
@item
Tell your friends and colleagues about this issue and how it threatens
to ruin the computer industry.
@item
Mention that you are a League member in your @file{.signature}, and
mention the League's email address for inquiries.
@item
Ask the companies you consider working for or working with to make
statements against software monopolies, and give preference to those
that do.
@item
When employers ask you to sign contracts giving them copyright on your
work, insist on a clause saying they will not claim the copyright covers
imitating the interface.
@item
When employers ask you to sign contracts giving them patent rights,
insist on clauses saying they can use these rights only defensively.
Don't rely on ``company policy,'' since that can change at any time;
don't rely on an individual executive's private word, since that person
may be replaced. Get a commitment just as binding as the commitment
they get from you.
@item
Write to Congress to explain the importance of these issues.
@display
House Subcommittee on Intellectual Property
2137 Rayburn Bldg
Washington, DC 20515
Senate Subcommittee on Patents, Trademarks and Copyrights
United States Senate
Washington, DC 20510
@end display
(These committees have received lots of mail already; let's give them
even more.)
@end itemize
Democracy means nothing if you don't use it. Stand up and be counted!
The GNU Project supports GNU/Linux systems as well as @emph{the}
GNU system---even with funds. We funded the rewriting of the
Linux-related extensions to the GNU C library, so that now they are
well integrated, and the newest GNU/Linux systems use the current
library release with no changes. We also funded an early stage of the
development of Debian GNU/Linux.
We use Linux-based GNU systems today for most of our work, and we hope
you use them too. But please don't confuse the public by using the
name ``Linux'' ambiguously. Linux is the kernel, one of the essential
major components of the system. The system as a whole is more or less
the GNU system.
@node Copying
@unnumbered GNU GENERAL PUBLIC LICENSE

View File

@ -361,6 +361,7 @@ int optimize = 0;
They won't actually be used. */
struct _global_rtl global_rtl;
rtx pic_offset_table_rtx;
static rtx attr_rtx PVPROTO((enum rtx_code, ...));
#ifdef HAVE_VPRINTF

View File

@ -67,8 +67,8 @@ to specify a configuration when building a native compiler unless
wrong.
In those cases, specify the build machine's @dfn{configuration name}
with the @samp{--build} option; the host and target will default to be
the same as the build machine. (If you are building a cross-compiler,
with the @samp{--host} option; the host and target will default to be
the same as the host machine. (If you are building a cross-compiler,
see @ref{Cross-Compiler}.)
Here is an example:
@ -261,18 +261,19 @@ If you want to install its files somewhere else, specify
is a directory name to use instead of @file{/usr/local} for all purposes
with one exception: the directory @file{/usr/local/include} is searched
for header files no matter where you install the compiler. To override
this name, use the @code{--local-prefix} option below.
this name, use the @code{--with-local-prefix} option below. The directory
you specify need not exist, but its parent directory must exist.
@item
Specify @samp{--local-prefix=@var{dir}} if you want the compiler to
Specify @samp{--with-local-prefix=@var{dir}} if you want the compiler to
search directory @file{@var{dir}/include} for locally installed header
files @emph{instead} of @file{/usr/local/include}.
You should specify @samp{--local-prefix} @strong{only} if your site has
You should specify @samp{--with-local-prefix} @strong{only} if your site has
a different convention (not @file{/usr/local}) for where to put
site-specific files.
The default value for @samp{--local-prefix} is @file{/usr/local}
The default value for @samp{--with-local-prefix} is @file{/usr/local}
regardless of the value of @samp{--prefix}. Specifying @samp{--prefix}
has no effect on which directory GNU CC searches for local header files.
This may seem counterintuitive, but actually it is logical.
@ -283,8 +284,8 @@ any in that directory---are not part of GNU CC. They are part of other
programs---perhaps many others. (GNU CC installs its own header files
in another directory which is based on the @samp{--prefix} value.)
@strong{Do not} specify @file{/usr} as the @samp{--local-prefix}! The
directory you use for @samp{--local-prefix} @strong{must not} contain
@strong{Do not} specify @file{/usr} as the @samp{--with-local-prefix}! The
directory you use for @samp{--with-local-prefix} @strong{must not} contain
any of the system's standard header files. If it did contain them,
certain programs would be miscompiled (including GNU Emacs, on certain
targets), because this would override and nullify the header file
@ -507,11 +508,11 @@ This copies the files @file{cc1}, @file{cpp} and @file{libgcc.a} to
files @file{cc1}, @file{cpp} and @file{libgcc.a} in the directory
@file{/usr/local/lib/gcc-lib/@var{target}/@var{version}}, which is where
the compiler driver program looks for them. Here @var{target} is the
target machine type specified when you ran @file{configure}, and
@var{version} is the version number of GNU CC. This naming scheme
permits various versions and/or cross-compilers to coexist.
It also copies the executables for compilers for other languages
(e.g., @file{cc1plus} for C++) to the same directory.
canonicalized form of target machine type specified when you ran
@file{configure}, and @var{version} is the version number of GNU CC.
This naming scheme permits various versions and/or cross-compilers to
coexist. It also copies the executables for compilers for other
languages (e.g., @file{cc1plus} for C++) to the same directory.
This also copies the driver program @file{xgcc} into
@file{/usr/local/bin/gcc}, so that it appears in typical execution
@ -542,7 +543,13 @@ distribute a C runtime library, it also does not include a C++ runtime
library. All I/O functionality, special class libraries, etc., are
provided by the C++ runtime library.
Here's one way to build and install a C++ runtime library for GNU CC:
The standard C++ runtime library for GNU CC is called @samp{libstdc++}.
An obsolescent library @samp{libg++} may also be available, but it's
necessary only for older software that hasn't been converted yet; if
you don't know whether you need @samp{libg++} then you probably don't
need it.
Here's one way to build and install @samp{libstdc++} for GNU CC:
@itemize @bullet
@item
@ -856,9 +863,10 @@ particular configuration.
AMD Am29050 used in a system running a variant of BSD Unix.
@item decstation-*
DECstations can support three different personalities: Ultrix,
DEC OSF/1, and OSF/rose. To configure GCC for these platforms
use the following configurations:
MIPS-based DECstations can support three different personalities:
Ultrix, DEC OSF/1, and OSF/rose. (Alpha-based DECstation products have
a configuration name beginning with @samp{alpha-dec}.) To configure GCC
for these platforms use the following configurations:
@table @samp
@item decstation-ultrix
@ -1109,7 +1117,7 @@ that configuration with + the @samp{--with-gnu-as} and @samp{--with-gnu-ld}
options to @code{configure}.
Note the C compiler that comes
with this system cannot compile GNU CC. You can fine binaries of GNU CC
with this system cannot compile GNU CC. You can find binaries of GNU CC
for bootstrapping on @code{jagubox.gsfc.nasa.gov}.
You will also a patched version of @file{/bin/ld} there that
raises some of the arbitrary limits found in the original.
@ -1962,9 +1970,13 @@ To install the cross-compiler, use @samp{make install}, as usual.
@cindex Sun installation
@cindex installing GNU CC on the Sun
On Solaris (version 2.1), do not use the linker or other tools in
On Solaris, do not use the linker or other tools in
@file{/usr/ucb} to build GNU CC. Use @code{/usr/ccs/bin}.
If the assembler reports @samp{Error: misaligned data} when bootstrapping,
you are probably using an obsolete version of the GNU assembler. Upgrade
to the latest version of GNU @code{binutils}, or use the Solaris assembler.
Make sure the environment variable @code{FLOAT_OPTION} is not set when
you compile @file{libgcc.a}. If this option were set to @code{f68881}
when @file{libgcc.a} is compiled, the resulting code would demand to be

View File

@ -1,7 +1,7 @@
@setfilename INSTALL
@set INSTALLONLY
@c This file itself, install1.texi, does not apear in the GCC distribution.
@c This file itself, install1.texi, does not appear in the GCC distribution.
@c The immediately following lines apply to the INSTALL file
@c which is generated using this file.
This file documents the installation of the GNU compiler.

View File

@ -82,13 +82,13 @@ static void set_block_abstract_flags PROTO((tree, int));
void set_decl_abstract_flags PROTO((tree, int));
/* Returns the Ith entry in the label_map contained in MAP. If the
Ith entry has not yet been set, it is assumed to be a fresh label.
Essentially, we use this function to perform a lazy initialization
of label_map, thereby avoiding huge memory explosions when the
label_map gets very large. */
Ith entry has not yet been set, return a fresh label. This function
performs a lazy initialization of label_map, thereby avoiding huge memory
explosions when the label_map gets very large. */
rtx
get_label_from_map (map, i)
struct inline_remap* map;
struct inline_remap *map;
int i;
{
rtx x = map->label_map[i];
@ -99,7 +99,6 @@ get_label_from_map (map, i)
return x;
}
/* Zero if the current function (whose FUNCTION_DECL is FNDECL)
is safe and reasonable to integrate into other functions.
Nonzero means value is a warning message with a single %s
@ -116,9 +115,7 @@ function_cannot_inline_p (fndecl)
register tree parms;
rtx result;
/* No inlines with varargs. `grokdeclarator' gives a warning
message about that if `inline' is specified. This code
it put in to catch the volunteers. */
/* No inlines with varargs. */
if ((last && TREE_VALUE (last) != void_type_node)
|| current_function_varargs)
return "varargs function cannot be inline";
@ -298,6 +295,7 @@ initialize_for_inline (fndecl, min_labelno, max_labelno, max_reg, copy)
parms = TREE_CHAIN (parms), i++)
{
rtx p = DECL_RTL (parms);
int copied_incoming = 0;
/* If we have (mem (addressof (mem ...))), use the inner MEM since
otherwise the copy_rtx call below will not unshare the MEM since
@ -320,7 +318,8 @@ initialize_for_inline (fndecl, min_labelno, max_labelno, max_reg, copy)
&& GET_CODE (DECL_INCOMING_RTL (parms)) == MEM
&& (XEXP (DECL_RTL (parms), 0)
== XEXP (DECL_INCOMING_RTL (parms), 0))))
DECL_INCOMING_RTL (parms) = new;
DECL_INCOMING_RTL (parms) = new, copied_incoming = 1;
DECL_RTL (parms) = new;
}
@ -342,6 +341,23 @@ initialize_for_inline (fndecl, min_labelno, max_labelno, max_reg, copy)
/* This flag is cleared later
if the function ever modifies the value of the parm. */
TREE_READONLY (parms) = 1;
/* Copy DECL_INCOMING_RTL if not done already. This can
happen if DECL_RTL is a reg. */
if (copy && ! copied_incoming)
{
p = DECL_INCOMING_RTL (parms);
/* If we have (mem (addressof (mem ...))), use the inner MEM since
otherwise the copy_rtx call below will not unshare the MEM since
it shares ADDRESSOF. */
if (GET_CODE (p) == MEM && GET_CODE (XEXP (p, 0)) == ADDRESSOF
&& GET_CODE (XEXP (XEXP (p, 0), 0)) == MEM)
p = XEXP (XEXP (p, 0), 0);
if (GET_CODE (p) == MEM)
DECL_INCOMING_RTL (parms) = copy_rtx (p);
}
}
/* Assume we start out in the insns that set up the parameters. */
@ -1423,7 +1439,7 @@ expand_inline_function (fndecl, parms, target, ignore, type,
arg_vals[i] = copy_to_mode_reg (GET_MODE (loc), arg_vals[i]);
if (arg_vals[i] != 0 && GET_CODE (arg_vals[i]) == REG
&& TREE_CODE (TREE_TYPE (formal)) == POINTER_TYPE)
&& POINTER_TYPE_P (TREE_TYPE (formal)))
mark_reg_pointer (arg_vals[i],
(TYPE_ALIGN (TREE_TYPE (TREE_TYPE (formal)))
/ BITS_PER_UNIT));
@ -1790,9 +1806,10 @@ expand_inline_function (fndecl, parms, target, ignore, type,
pushlevel (0);
expand_start_bindings (0);
/* Make new label equivalences for the labels in the called function. */
for (i = min_labelno; i < max_labelno; i++)
map->label_map[i] = NULL_RTX;
/* Initialize label_map. get_label_from_map will actually make
the labels. */
bzero ((char *) &map->label_map [min_labelno],
(max_labelno - min_labelno) * sizeof (rtx));
/* Perform postincrements before actually calling the function. */
emit_queue ();
@ -1991,9 +2008,8 @@ expand_inline_function (fndecl, parms, target, ignore, type,
break;
case CODE_LABEL:
copy =
emit_label (get_label_from_map(map,
CODE_LABEL_NUMBER (insn)));
copy = emit_label (get_label_from_map (map,
CODE_LABEL_NUMBER (insn)));
LABEL_NAME (copy) = LABEL_NAME (insn);
map->const_age++;
break;
@ -2012,12 +2028,14 @@ expand_inline_function (fndecl, parms, target, ignore, type,
&& NOTE_LINE_NUMBER (insn) != NOTE_INSN_FUNCTION_BEG
&& NOTE_LINE_NUMBER (insn) != NOTE_INSN_DELETED)
{
copy = emit_note (NOTE_SOURCE_FILE (insn), NOTE_LINE_NUMBER (insn));
if (copy && (NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_BEG
|| NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_END))
copy = emit_note (NOTE_SOURCE_FILE (insn),
NOTE_LINE_NUMBER (insn));
if (copy
&& (NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_BEG
|| NOTE_LINE_NUMBER (copy) == NOTE_INSN_EH_REGION_END))
{
rtx label =
get_label_from_map (map, NOTE_BLOCK_NUMBER (copy));
rtx label
= get_label_from_map (map, NOTE_BLOCK_NUMBER (copy));
/* We have to forward these both to match the new exception
region. */

Some files were not shown because too many files have changed in this diff Show More