* 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:
parent
31031eddac
commit
e5e809f419
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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:
|
177
gcc/Makefile.in
177
gcc/Makefile.in
|
@ -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
|
||||
|
|
9
gcc/NEWS
9
gcc/NEWS
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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))
|
||||
|
|
10
gcc/c-decl.c
10
gcc/c-decl.c
|
@ -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;
|
||||
|
|
|
@ -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; };
|
||||
|
||||
|
|
28
gcc/c-lex.c
28
gcc/c-lex.c
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
414
gcc/c-typeck.c
414
gcc/c-typeck.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
145
gcc/calls.c
145
gcc/calls.c
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
536
gcc/cccp.c
536
gcc/cccp.c
File diff suppressed because it is too large
Load Diff
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 ();
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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=
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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)");
|
||||
|
|
|
@ -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: \
|
||||
|
|
|
@ -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;
|
||||
}")
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")])
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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/^ \ *\.\// /
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
# configuration for IBM rs6000 running aix
|
||||
|
||||
# Show we need to use the C version of ALLOCA
|
||||
ALLOCA=alloca.o
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -24,5 +24,3 @@ Boston, MA 02111-1307, USA. */
|
|||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#endif
|
||||
|
||||
#include <xm-linux.h>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))]
|
||||
""
|
||||
"*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 =/
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)'
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
60
gcc/cpp.texi
60
gcc/cpp.texi
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
12
gcc/expmed.c
12
gcc/expmed.c
|
@ -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);
|
||||
|
||||
|
|
329
gcc/expr.c
329
gcc/expr.c
|
@ -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);
|
||||
|
|
11
gcc/expr.h
11
gcc/expr.h
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
17
gcc/final.c
17
gcc/final.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
43
gcc/flow.c
43
gcc/flow.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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))
|
||||
|
|
182
gcc/function.c
182
gcc/function.c
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
96
gcc/gcc.c
96
gcc/gcc.c
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
315
gcc/gcc.texi
315
gcc/gcc.texi
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue