summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorobrien <obrien@FreeBSD.org>1999-11-01 08:28:22 +0000
committerobrien <obrien@FreeBSD.org>1999-11-01 08:28:22 +0000
commit244fe162cc15cf5fc410c04d9cea91e1b8dbbf3c (patch)
tree85e4baa6cb7b1e8696f4261920a9a73b6e9e86c6 /contrib
parent054afb0053ea87f2cd3711acb86d2e366f7ef631 (diff)
parent4b66dfb9030fa6d9912fcf3dfbe3fa8a4fa0a3fc (diff)
downloadFreeBSD-src-244fe162cc15cf5fc410c04d9cea91e1b8dbbf3c.zip
FreeBSD-src-244fe162cc15cf5fc410c04d9cea91e1b8dbbf3c.tar.gz
This commit was generated by cvs2svn to compensate for changes in r52750,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/gcc/ChangeLog180
-rw-r--r--contrib/gcc/c-lang.c8
-rw-r--r--contrib/gcc/c-typeck.c3
-rw-r--r--contrib/gcc/collect2.c5
-rw-r--r--contrib/gcc/combine.c51
-rw-r--r--contrib/gcc/config/i386/sol2.h27
-rw-r--r--contrib/gcc/config/i386/sol2gas.h11
-rw-r--r--contrib/gcc/config/openbsd.h5
-rw-r--r--contrib/gcc/config/sparc/sparc.c2
-rw-r--r--contrib/gcc/config/sparc/sparc.md4
-rw-r--r--contrib/gcc/configure.in19
-rw-r--r--contrib/gcc/cp/ChangeLog21
-rw-r--r--contrib/gcc/cp/cp-tree.h4
-rw-r--r--contrib/gcc/cp/decl2.c12
-rw-r--r--contrib/gcc/cp/pt.c18
-rw-r--r--contrib/gcc/cppinit.c3
-rw-r--r--contrib/gcc/cse.c10
-rw-r--r--contrib/gcc/f/ChangeLog4
-rw-r--r--contrib/gcc/f/version.c2
-rw-r--r--contrib/gcc/fix-header.c2
-rw-r--r--contrib/gcc/fold-const.c6
-rw-r--r--contrib/gcc/gcse.c9
-rw-r--r--contrib/gcc/haifa-sched.c2
-rw-r--r--contrib/gcc/jump.c106
-rw-r--r--contrib/gcc/local-alloc.c3
-rw-r--r--contrib/gcc/loop.c54
-rw-r--r--contrib/gcc/reg-stack.c10
-rw-r--r--contrib/gcc/regmove.c34
-rw-r--r--contrib/gcc/sched.c2
-rw-r--r--contrib/gcc/tlink.c6
-rw-r--r--contrib/gcc/version.c2
31 files changed, 493 insertions, 132 deletions
diff --git a/contrib/gcc/ChangeLog b/contrib/gcc/ChangeLog
index 446c775..41cfebf 100644
--- a/contrib/gcc/ChangeLog
+++ b/contrib/gcc/ChangeLog
@@ -1,3 +1,183 @@
+Sun Oct 24 23:54:10 PDT 1999 Jeff Law (law@cygnus.com)
+
+ * gcc-2.95.2 Released.
+
+Mon Oct 25 00:43:05 1999 Jeffrey A Law (law@cygnus.com)
+
+ * loop.c (note_set_pseudo_multiple_uses_retval): New variable.
+ (note_set_pseudo_multiple_uses): New function.
+ (check_dbra_loop): Use not_set_pseudo_multiple_uses to determine
+ if a pseudo set in the loop exit is used elsewhere.
+
+Wed Oct 20 10:46:41 1999 Richard Earnshaw (rearnsha@arm.com)
+
+ * jump.c (jump_optimize_1): More accurately detect casesi insns.
+
+Wed Oct 20 22:57:58 1999 Jeffrey A Law (law@cygnus.com)
+
+ * toplev.c (main): Do not turn on strict aliasing by default.
+ * invoke.texi: Corresponding changes.
+
+ * sparc.md (movsf_const_intreg): If splitting, length must be > 1.
+ (movdf_const_intreg_sp64): Similarly.
+
+ * local-alloc.c (update_equiv_regs): Check the correct insn
+ for pre-existing REG_EQUIV notes.
+
+Tue Oct 19 02:03:00 1999 Jeffrey A Law (law@cygnus.com)
+
+ Revert this change. Gavin's patch to operand_equal_p is a better fix.
+ * fold-const.c (fold_range_test): Do not try to fold the range
+ test if the rhs or lhs has side effects.
+
+ Fri Sep 17 15:05:27 1999 Gavin Romig-Koch <gavin@cygnus.com>
+ * fold-const.c (operand_equal_p): Pay attention to side effects.
+
+ * reg-stack.c (stack_result): Aggregates are not returned in
+ stack registers.
+
+Mon Oct 18 01:41:35 1999 Jeffrey A Law (law@cygnus.com)
+
+ * combine.c (get_last_value): If the last set of a register
+ is after subst_low_cuid, then we can not use it to determine
+ the register's last value.
+
+Sat Oct 16 15:20:15 1999 Jeffrey A Law (law@cygnus.com)
+
+ Sat Oct 16 00:07:01 1999 Richard Henderson <rth@cygnus.com>
+ * gcse.c (hash_expr_1): Add in MEM_ALIAS_SET.
+ (expr_equiv_p): Reject memories with different alias sets.
+
+Wed Oct 13 01:46:14 1999 Jeffrey A Law (law@cygnus.com)
+
+ Wed Oct 13 01:44:29 1999 Carol LePage <carolo@hal.com>
+ * configure.in (sparc-hal-solaris2*): Fix xm_file, xm_defines,
+ float_format and thread_file definitions.
+ * configure: Rebuilt.
+
+Tue Oct 12 17:09:38 1999 David Edelsohn <edelsohn@gnu.org>
+
+ * collect2.c (main): Do preliminary link on AIX if rflag.
+
+Mon Oct 11 23:35:19 1999 Jeffrey A Law (law@cygnus.com)
+
+ Fri Sep 3 09:14:32 1999 Marc Espie <espie@tetto.liafa.jussieu.fr>
+ * tlink.c (scan_linker_output): Skip the initial underscore in
+ a mangled name if appropriate.
+
+ Fri Aug 27 19:19:43 CEST 1999 Marc Espie <espie@cvs.openbsd.org>
+ * config/openbsd.h (SET_ASM_OP): Define.
+
+ Mon Oct 4 08:54:12 1999 Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+ * cppinit.c (is_idchar initializer): Loosen tests to accept
+ gcc 2.>6 and >2.
+
+ Tue Jun 29 01:37:53 1999 Jeffrey A Law (law@cygnus.com)
+ * pa.h (CPP_SPEC): Conditionally add -D__STDC_EXT__ to the cpp
+ command line.
+
+ Thu Sep 2 20:08:23 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
+ * regmove.c (fixup_match_1): Don't change an unchanging register.
+ (stable_but_for_p): Renamed to:
+ (stable_and_no_regs_but_for_p). Reject unchanging registers too.
+ Changed all callers.
+
+ Tue Aug 17 22:06:11 1999 Jan Hubicka <hubicka@freesoft.cz>
+ * haifa-sched.c (insn_unit): Fix typo on out of range test.
+ * sched.c (insn_unit): Likewise.
+
+Sun Oct 10 20:58:27 1999 David Edelsohn <edelsohn@gnu.org>
+
+ * rs6000.md (scc patterns): Disable most SImode variants if
+ TARGET_POWERPC64.
+ * rs6000.c (expand_block_move): Fix gen_movsi typos.
+
+ Thu Oct 7 23:06:50 1999 Richard Henderson <rth@cygnus.com>
+ * rs6000.md (fix_truncdfsi2_internal+1): Emit a clobber
+ before the fctiwz insn.
+
+ Thu Oct 7 00:36:17 1999 Diego Novillo <dnovillo@cygnus.com>
+ * config/rs6000/rs6000.c (secondary_reload_class): For TARGET_ELF
+ make sure that HIGH instructions are copied into BASE_REGS.
+
+Thu Sep 30 05:40:34 1999 Richard Earnshaw <rearnsha@arm.com>
+
+ * c-lang.c (finish_file case ndef ASM_OUTPUT_{CON,DE}STRUCTOR):
+ Correctly build argument list to constructor and destructor functions.
+
+Wed Sep 22 17:55:31 1999 David Edelsohn <edelsohn@gnu.org>
+
+ * rs6000.c (expand_block_move): DImode loads and stores require
+ word-aligned displacements. Increment address registers with
+ adddi3 on 64-bit platform. Use TARGET_POWERPC64 not TARGET_64BIT.
+
+Wed Sep 22 07:07:44 1999 Alexandre Oliva <oliva@lsd.ic.unicamp.br>
+
+ * config/i386/sol2.h (PREFERRED_DEBUGGING_TYPE): Use stabs.
+ (ASM_SPEC): Moved from sol2dbg.h. Added work-around for gas.
+ * config/i386/sol2dbg.h: Removed.
+ * config/i386/sol2gas.h: New file, to enable gas work-around.
+ * configure.in: Use i386/sol2gas.h on Solaris/x86 --with-gas.
+ Don't use sol2dbg.h.
+ * configure: Rebuilt.
+
+Wed Sep 15 21:20:38 1999 Mark Mitchell <mark@codesourcery.com>
+
+ * c-typeck.c (qualify_type): Merge qualifiers from both types.
+
+Wed Sep 15 10:07:27 1999 Scott Bambrough <scottb@netwinder.org>
+
+ * config/arm/linux-elf.h: define NO_IMPLICIT_EXTERN_C
+
+Tue Sep 7 16:50:59 1999 David Edelsohn <edelsohn@gnu.org>
+
+ * rs6000.h (ASM_FILE_START): Specify complete filename, including
+ path, in .file directive.
+
+Tue Sep 7 01:27:21 1999 Jeffrey A Law (law@cygnus.com)
+
+ Thu Sep 2 00:06:43 1999 Jeffrey A Law (law@cygnus.com)
+ * fold-const.c (fold_range_test): Do not try to fold the range
+ test if the rhs or lhs has side effects.
+
+ Sun Aug 29 03:27:23 1999 Scott Weikart <scott@igc.apc.org>
+ * fix-header.c (main): Do not pass a null pointer to strcmp.
+
+ Thu Aug 19 14:42:38 1999 Mike Stump <mrs@wrs.com>
+ Mark Mitchell <mark@codesourcery.com>
+ * c-common.c (c_get_alias_set): Fix support for pointers and
+ references.
+
+ Fri Aug 27 01:03:48 1999 Jim Kingdon <http://developer.redhat.com>
+ with much help from Jeffrey A Law and Richard Henderson
+ * i386.md: In the 6 insns which call output_fix_trunc,
+ earlyclobber operands[0].
+
+ Fri Aug 27 01:01:51 1999 Philip Blundell <pb@nexus.co.uk>
+ * jump.c (duplicate_loop_exit_test): Call reg_scan_update after
+ creating new registers.
+
+ Fri Aug 27 15:35:24 1999 Jeffrey A Law (law@cygnus.com)
+ * cse.c (fold_rtx): Work around bug in Sun V5.0 compilers.
+ * pa.c (emit_move_sequence): Do not stop on SUBREG_WORD of an
+ operand.
+
+ Tue Aug 31 11:51:06 1999 Jim Kingdon <http://developer.redhat.com>
+ * i386.c (output_strlen_unroll): Don't write xops[7]
+ label if it wasn't set.
+
+ Fri Aug 27 09:36:17 1999 Andreas Schwab <schwab@suse.de>
+ * function.c (assign_stack_temp_for_type): Fix change of Mar 5 for
+ the fact that ALIGN is measured in bits, not bytes.
+
+ Wed Aug 25 14:00:18 1999 Jason Merrill <jason@yorick.cygnus.com>
+ * c-common.c (combine_strings): Always set TREE_CONSTANT.
+
+Wed Aug 18 01:16:43 1999 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.c (sparc_block_profiler): Fix typo in Aug 2
+ change.
+
Mon Aug 16 01:29:24 PDT 1999 Jeff Law (law@cygnus.com)
* gcc-2.95.1 Released.
diff --git a/contrib/gcc/c-lang.c b/contrib/gcc/c-lang.c
index 4c55411..7da6798 100644
--- a/contrib/gcc/c-lang.c
+++ b/contrib/gcc/c-lang.c
@@ -175,7 +175,9 @@ finish_file ()
{
tree fnname = get_file_function_name ('I');
start_function (void_list_node,
- build_parse_node (CALL_EXPR, fnname, void_list_node,
+ build_parse_node (CALL_EXPR, fnname,
+ tree_cons (NULL_TREE, NULL_TREE,
+ void_list_node),
NULL_TREE),
NULL_TREE, NULL_TREE, 0);
fnname = DECL_ASSEMBLER_NAME (current_function_decl);
@@ -195,7 +197,9 @@ finish_file ()
{
tree fnname = get_file_function_name ('D');
start_function (void_list_node,
- build_parse_node (CALL_EXPR, fnname, void_list_node,
+ build_parse_node (CALL_EXPR, fnname,
+ tree_cons (NULL_TREE, NULL_TREE,
+ void_list_node),
NULL_TREE),
NULL_TREE, NULL_TREE, 0);
fnname = DECL_ASSEMBLER_NAME (current_function_decl);
diff --git a/contrib/gcc/c-typeck.c b/contrib/gcc/c-typeck.c
index 854baf8..154d830 100644
--- a/contrib/gcc/c-typeck.c
+++ b/contrib/gcc/c-typeck.c
@@ -167,7 +167,8 @@ static tree
qualify_type (type, like)
tree type, like;
{
- return c_build_qualified_type (type, TYPE_QUALS (like));
+ return c_build_qualified_type (type,
+ TYPE_QUALS (type) | TYPE_QUALS (like));
}
/* Return the common type of two types.
diff --git a/contrib/gcc/collect2.c b/contrib/gcc/collect2.c
index 121ad39..e5d6452 100644
--- a/contrib/gcc/collect2.c
+++ b/contrib/gcc/collect2.c
@@ -1515,7 +1515,7 @@ main (argc, argv)
/* On AIX we do this later. */
#ifndef COLLECT_EXPORT_LIST
- do_tlink (ld1_argv, object_lst);
+ do_tlink (ld1_argv, object_lst);
#endif
/* If -r or they will be run via some other method, do not build the
@@ -1527,6 +1527,9 @@ main (argc, argv)
)
{
#ifdef COLLECT_EXPORT_LIST
+ /* Do the link we avoided above if we are exiting. */
+ do_tlink (ld1_argv, object_lst);
+
/* But make sure we delete the export file we may have created. */
if (export_file != 0 && export_file[0])
maybe_unlink (export_file);
diff --git a/contrib/gcc/combine.c b/contrib/gcc/combine.c
index 0b64a86..57b2e86 100644
--- a/contrib/gcc/combine.c
+++ b/contrib/gcc/combine.c
@@ -10834,56 +10834,9 @@ get_last_value (x)
return 0;
/* If the value was set in a later insn than the ones we are processing,
- we can't use it even if the register was only set once, but make a quick
- check to see if the previous insn set it to something. This is commonly
- the case when the same pseudo is used by repeated insns.
-
- This does not work if there exists an instruction which is temporarily
- not on the insn chain. */
-
+ we can't use it even if the register was only set once. */
if (INSN_CUID (reg_last_set[regno]) >= subst_low_cuid)
- {
- rtx insn, set;
-
- /* We can not do anything useful in this case, because there is
- an instruction which is not on the insn chain. */
- if (subst_prev_insn)
- return 0;
-
- /* Skip over USE insns. They are not useful here, and they may have
- been made by combine, in which case they do not have a INSN_CUID
- value. We can't use prev_real_insn, because that would incorrectly
- take us backwards across labels. Skip over BARRIERs also, since
- they could have been made by combine. If we see one, we must be
- optimizing dead code, so it doesn't matter what we do. */
- for (insn = prev_nonnote_insn (subst_insn);
- insn && ((GET_CODE (insn) == INSN
- && GET_CODE (PATTERN (insn)) == USE)
- || GET_CODE (insn) == BARRIER
- || INSN_CUID (insn) >= subst_low_cuid);
- insn = prev_nonnote_insn (insn))
- ;
-
- if (insn
- && (set = single_set (insn)) != 0
- && rtx_equal_p (SET_DEST (set), x))
- {
- value = SET_SRC (set);
-
- /* Make sure that VALUE doesn't reference X. Replace any
- explicit references with a CLOBBER. If there are any remaining
- references (rare), don't use the value. */
-
- if (reg_mentioned_p (x, value))
- value = replace_rtx (copy_rtx (value), x,
- gen_rtx_CLOBBER (GET_MODE (x), const0_rtx));
-
- if (reg_overlap_mentioned_p (x, value))
- return 0;
- }
- else
- return 0;
- }
+ return 0;
/* If the value has all its registers valid, return it. */
if (get_last_value_validate (&value, reg_last_set[regno],
diff --git a/contrib/gcc/config/i386/sol2.h b/contrib/gcc/config/i386/sol2.h
index cc5a089..b254a10 100644
--- a/contrib/gcc/config/i386/sol2.h
+++ b/contrib/gcc/config/i386/sol2.h
@@ -21,6 +21,33 @@ Boston, MA 02111-1307, USA. */
#include "i386/sysv4.h"
+/* We use stabs-in-elf for debugging, because that is what the native
+ toolchain uses. */
+#undef PREFERRED_DEBUGGING_TYPE
+#define PREFERRED_DEBUGGING_TYPE DBX_DEBUG
+
+#if ! GAS_REJECTS_MINUS_S
+
+/*
+ Changed from config/svr4.h in the following ways:
+
+ - Removed -Yd (neither the sun bundled assembler nor gas accept it).
+ - Added "-s" so that stabs are not discarded.
+*/
+
+#undef ASM_SPEC
+#define ASM_SPEC \
+ "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*} -s"
+
+#else /* GAS_REJECTS_MINUS_S */
+
+/* Same as above, except for -s, unsupported by GNU as. */
+#undef ASM_SPEC
+#define ASM_SPEC \
+ "%{v:-V} %{Qy:} %{!Qn:-Qy} %{n} %{T} %{Ym,*} %{Wa,*:%*}"
+
+#endif /* GAS_REJECTS_MINUS_S */
+
/* The Solaris 2.0 x86 linker botches alignment of code sections.
It tries to align to a 16 byte boundary by padding with 0x00000090
ints, rather than 0x90 bytes (nop). This generates trash in the
diff --git a/contrib/gcc/config/i386/sol2gas.h b/contrib/gcc/config/i386/sol2gas.h
new file mode 100644
index 0000000..7f2c962
--- /dev/null
+++ b/contrib/gcc/config/i386/sol2gas.h
@@ -0,0 +1,11 @@
+/* Definitions of target machine for GNU compiler, for SPARC running
+ Solaris 2 with GNU as up to 2.9.5.0.12.
+
+ Copyright (C) 1999 Free Software Foundation, Inc.
+*/
+
+#ifndef GAS_DOES_NOT_SUPPORT_MINUS_S
+#define GAS_DOES_NOT_SUPPORT_MINUS_S 1
+#endif
+
+#include "i386/sol2.h"
diff --git a/contrib/gcc/config/openbsd.h b/contrib/gcc/config/openbsd.h
index 30f2494..e95fbda 100644
--- a/contrib/gcc/config/openbsd.h
+++ b/contrib/gcc/config/openbsd.h
@@ -165,13 +165,16 @@ Boston, MA 02111-1307, USA. */
/* OpenBSD assembler is hacked to have .type & .size support even in a.out
format object files. Functions size are supported but not activated
- yet (look for GRACE_PERIOD_EXPIRED in gas/config/obj-aout.c). */
+ yet (look for GRACE_PERIOD_EXPIRED in gas/config/obj-aout.c).
+ SET_ASM_OP is needed for attribute alias to work. */
#undef TYPE_ASM_OP
#undef SIZE_ASM_OP
+#undef SET_ASM_OP
#define TYPE_ASM_OP ".type"
#define SIZE_ASM_OP ".size"
+#define SET_ASM_OP ".set"
/* The following macro defines the format used to output the second
operand of the .type assembler directive. */
diff --git a/contrib/gcc/config/sparc/sparc.c b/contrib/gcc/config/sparc/sparc.c
index ad12ec3..45862a7 100644
--- a/contrib/gcc/config/sparc/sparc.c
+++ b/contrib/gcc/config/sparc/sparc.c
@@ -7779,7 +7779,7 @@ sparc_block_profiler(file, blockno)
assemble_name (file, LPBX);
fputs ("),%g2\n", file);
- fputs ("\tor\t%o2,%lo(", file);
+ fputs ("\tor\t%g2,%lo(", file);
assemble_name (file, LPBX);
fputs ("),%g2\n", file);
diff --git a/contrib/gcc/config/sparc/sparc.md b/contrib/gcc/config/sparc/sparc.md
index 02170b7..cb008b1 100644
--- a/contrib/gcc/config/sparc/sparc.md
+++ b/contrib/gcc/config/sparc/sparc.md
@@ -2838,7 +2838,7 @@
return \"#\";
}"
[(set_attr "type" "move")
- (set_attr "length" "1")])
+ (set_attr "length" "1,2")])
;; There isn't much I can do about this, if I change the
;; mode then flow info gets really confused because the
@@ -3013,7 +3013,7 @@
return \"#\";
}"
[(set_attr "type" "move")
- (set_attr "length" "1")])
+ (set_attr "length" "1,2,2")])
(define_split
[(set (match_operand:DF 0 "register_operand" "")
diff --git a/contrib/gcc/configure.in b/contrib/gcc/configure.in
index 448e0f8..e43c157 100644
--- a/contrib/gcc/configure.in
+++ b/contrib/gcc/configure.in
@@ -1399,9 +1399,9 @@ changequote(,)dnl
changequote([,])dnl
xm_file="xm-siglist.h xm-alloca.h ${xm_file}"
xm_defines="USG POSIX SMALL_ARG_MAX"
- if test x$stabs = xyes
- then
- tm_file=i386/sol2dbg.h
+ if test x$gas = xyes; then
+ # Only needed if gas does not support -s
+ tm_file=i386/sol2gas.h
else
tm_file=i386/sol2.h
fi
@@ -3103,12 +3103,21 @@ changequote([,])dnl
fi
;;
sparc-hal-solaris2*)
- xm_file=sparc/xm-sol2.h
+ xm_file="xm-siglist.h sparc/xm-sysv4.h sparc/xm-sol2.h"
+ xm_defines="USG POSIX"
tm_file="sparc/sol2.h sparc/hal.h"
tmake_file="sparc/t-halos sparc/t-sol2"
xmake_file=sparc/x-sysv4
extra_parts="crt1.o crti.o crtn.o gmon.o crtbegin.o crtend.o"
- broken_install=yes
+ case $machine in
+ *-*-solaris2.[0-4])
+ float_format=i128
+ ;;
+ *)
+ float_format=none
+ ;;
+ esac
+ thread_file='solaris'
;;
sparc-*-solaris2*)
if test x$gnu_ld = xyes
diff --git a/contrib/gcc/cp/ChangeLog b/contrib/gcc/cp/ChangeLog
index 82d1a8b..efa30ed 100644
--- a/contrib/gcc/cp/ChangeLog
+++ b/contrib/gcc/cp/ChangeLog
@@ -1,3 +1,24 @@
+Sun Oct 24 23:54:10 PDT 1999 Jeff Law (law@cygnus.com)
+
+ * gcc-2.95.2 Released.
+
+1999-09-06 Mark Mitchell <mark@codesourcery.com>
+
+ * pt.c (tsubst): Back out 1999-08-06 patch. Use fold and
+ decl_constant_value to simplify array bounds.
+
+1999-08-19 Jason Merrill <jason@yorick.cygnus.com>
+
+ * cp-tree.h: Declare flag_use_repository.
+ * pt.c (do_decl_instantiation): Don't complain about duplicate
+ instantiation with -frepo.
+ (do_type_instantiation): Likewise.
+
+1999-08-14 Jason Merrill <jason@yorick.cygnus.com>
+
+ * decl2.c (lookup_arg_dependent): Note that we've already checked
+ the current namespace.
+
Mon Aug 16 01:29:24 PDT 1999 Jeff Law (law@cygnus.com)
* gcc-2.95.1 Released.
diff --git a/contrib/gcc/cp/cp-tree.h b/contrib/gcc/cp/cp-tree.h
index 7d64307..7180915 100644
--- a/contrib/gcc/cp/cp-tree.h
+++ b/contrib/gcc/cp/cp-tree.h
@@ -543,6 +543,10 @@ extern int flag_guiding_decls;
and class qualifiers. */
extern int flag_do_squangling;
+/* Nonzero means generate separate instantiation control files and juggle
+ them at link time. */
+extern int flag_use_repository;
+
/* Nonzero if we want to issue diagnostics that the standard says are not
required. */
extern int flag_optional_diags;
diff --git a/contrib/gcc/cp/decl2.c b/contrib/gcc/cp/decl2.c
index 84f491f..d6fb7bf 100644
--- a/contrib/gcc/cp/decl2.c
+++ b/contrib/gcc/cp/decl2.c
@@ -4892,11 +4892,19 @@ lookup_arg_dependent (name, fns, args)
tree args;
{
struct arg_lookup k;
+
k.name = name;
k.functions = fns;
- k.namespaces = NULL_TREE;
k.classes = NULL_TREE;
-
+
+ /* Note that we've already looked at the current namespace during normal
+ unqualified lookup, unless we found a decl in function scope. */
+ if (fns && ! TREE_PERMANENT (OVL_CURRENT (fns)))
+ k.namespaces = NULL_TREE;
+ else
+ k.namespaces = scratch_tree_cons (current_decl_namespace (),
+ NULL_TREE, NULL_TREE);
+
push_scratch_obstack ();
arg_assoc_args (&k, args);
pop_obstacks ();
diff --git a/contrib/gcc/cp/pt.c b/contrib/gcc/cp/pt.c
index 47fa99a..ddbea0a 100644
--- a/contrib/gcc/cp/pt.c
+++ b/contrib/gcc/cp/pt.c
@@ -6130,6 +6130,11 @@ tsubst (t, args, complain, in_decl)
if (max == error_mark_node)
return error_mark_node;
+ /* See if we can reduce this expression to something simpler. */
+ max = maybe_fold_nontype_arg (max);
+ if (!processing_template_decl && TREE_READONLY_DECL_P (max))
+ max = decl_constant_value (max);
+
if (processing_template_decl
/* When providing explicit arguments to a template
function, but leaving some arguments for subsequent
@@ -6137,8 +6142,11 @@ tsubst (t, args, complain, in_decl)
not PROCESSING_TEMPLATE_DECL. */
|| TREE_CODE (max) != INTEGER_CST)
{
- return build_index_type (build_min
- (MINUS_EXPR, sizetype, max, integer_one_node));
+ tree itype = make_node (INTEGER_TYPE);
+ TYPE_MIN_VALUE (itype) = size_zero_node;
+ TYPE_MAX_VALUE (itype) = build_min (MINUS_EXPR, sizetype, max,
+ integer_one_node);
+ return itype;
}
if (integer_zerop (omax))
@@ -8924,7 +8932,7 @@ do_decl_instantiation (declspecs, declarator, storage)
We check DECL_INTERFACE_KNOWN so as not to complain when the
first instantiation was `extern' and the second is not, and
EXTERN_P for the opposite case. */
- if (DECL_INTERFACE_KNOWN (result) && !extern_p)
+ if (DECL_INTERFACE_KNOWN (result) && !extern_p && !flag_use_repository)
cp_pedwarn ("duplicate explicit instantiation of `%#D'", result);
/* If we've already instantiated the template, just return now. */
@@ -9052,8 +9060,8 @@ do_type_instantiation (t, storage)
If CLASSTYPE_INTERFACE_ONLY, then the first explicit
instantiation was `extern', and if EXTERN_P then the second
is. Both cases are OK. */
- if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p)
- cp_error ("duplicate explicit instantiation of `%#T'", t);
+ if (!CLASSTYPE_INTERFACE_ONLY (t) && !extern_p && !flag_use_repository)
+ cp_pedwarn ("duplicate explicit instantiation of `%#T'", t);
/* If we've already instantiated the template, just return now. */
if (!CLASSTYPE_INTERFACE_ONLY (t))
diff --git a/contrib/gcc/cppinit.c b/contrib/gcc/cppinit.c
index f9bc306..4fb3ca8 100644
--- a/contrib/gcc/cppinit.c
+++ b/contrib/gcc/cppinit.c
@@ -209,7 +209,8 @@ enum { QUOTE = 0, BRACKET, SYSTEM, AFTER };
/* If gcc is in use (stage2/stage3) we can make these tables initialized
data. */
-#if defined __GNUC__ && __GNUC__ >= 2
+#if defined __GNUC__ && (__GNUC__ > 2 \
+ || (__GNUC__ == 2 && __GNUC_MINOR__ > 6))
/* Table to tell if a character is legal as the second or later character
of a C identifier. */
U_CHAR is_idchar[256] =
diff --git a/contrib/gcc/cse.c b/contrib/gcc/cse.c
index 45613ed..7182b74 100644
--- a/contrib/gcc/cse.c
+++ b/contrib/gcc/cse.c
@@ -5861,7 +5861,15 @@ fold_rtx (x, insn)
hence not save anything) or be incorrect. */
if (const_arg1 != 0 && GET_CODE (const_arg1) == CONST_INT
&& INTVAL (const_arg1) < 0
- && - INTVAL (const_arg1) >= 0
+ /* This used to test
+
+ - INTVAL (const_arg1) >= 0
+
+ But The Sun V5.0 compilers mis-compiled that test. So
+ instead we test for the problematic value in a more direct
+ manner and hope the Sun compilers get it correct. */
+ && INTVAL (const_arg1) !=
+ ((HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
&& GET_CODE (folded_arg1) == REG)
{
rtx new_const = GEN_INT (- INTVAL (const_arg1));
diff --git a/contrib/gcc/f/ChangeLog b/contrib/gcc/f/ChangeLog
index a3755f4..2e81815 100644
--- a/contrib/gcc/f/ChangeLog
+++ b/contrib/gcc/f/ChangeLog
@@ -1,3 +1,7 @@
+Sun Oct 24 23:54:10 PDT 1999 Jeff Law (law@cygnus.com)
+
+ * gcc-2.95.2 Released.
+
Mon Aug 16 01:29:24 PDT 1999 Jeff Law (law@cygnus.com)
* gcc-2.95.1 Released.
diff --git a/contrib/gcc/f/version.c b/contrib/gcc/f/version.c
index 97605df..5e8381f 100644
--- a/contrib/gcc/f/version.c
+++ b/contrib/gcc/f/version.c
@@ -1 +1 @@
-const char *ffe_version_string = "0.5.25 19990816 (release)";
+const char *ffe_version_string = "0.5.25 19991024 (release)";
diff --git a/contrib/gcc/fix-header.c b/contrib/gcc/fix-header.c
index af0577e..1e6c5c4 100644
--- a/contrib/gcc/fix-header.c
+++ b/contrib/gcc/fix-header.c
@@ -1140,7 +1140,7 @@ main (argc, argv)
if (entry->flags)
add_symbols (entry->flags, entry->names);
entry++;
- if (strcmp (entry->name, CONTINUED) != 0)
+ if (!entry->name || strcmp (entry->name, CONTINUED) != 0)
break;
}
}
diff --git a/contrib/gcc/fold-const.c b/contrib/gcc/fold-const.c
index dc9ca93..55dcf9b 100644
--- a/contrib/gcc/fold-const.c
+++ b/contrib/gcc/fold-const.c
@@ -2177,6 +2177,12 @@ operand_equal_p (arg0, arg1, only_const)
TREE_OPERAND (arg1, 0), 0));
case 'r':
+ /* If either of the pointer (or reference) expressions we are dereferencing
+ contain a side effect, these cannot be equal. */
+ if (TREE_SIDE_EFFECTS (arg0)
+ || TREE_SIDE_EFFECTS (arg1))
+ return 0;
+
switch (TREE_CODE (arg0))
{
case INDIRECT_REF:
diff --git a/contrib/gcc/gcse.c b/contrib/gcc/gcse.c
index deebc73..cddd7ac 100644
--- a/contrib/gcc/gcse.c
+++ b/contrib/gcc/gcse.c
@@ -1394,6 +1394,7 @@ hash_expr_1 (x, mode, do_not_record_p)
return 0;
}
hash += (unsigned) MEM;
+ hash += MEM_ALIAS_SET (x);
x = XEXP (x, 0);
goto repeat;
@@ -1526,6 +1527,14 @@ expr_equiv_p (x, y)
case REG:
return REGNO (x) == REGNO (y);
+ case MEM:
+ /* Can't merge two expressions in different alias sets, since we can
+ decide that the expression is transparent in a block when it isn't,
+ due to it being set with the different alias set. */
+ if (MEM_ALIAS_SET (x) != MEM_ALIAS_SET (y))
+ return 0;
+ break;
+
/* For commutative operations, check both orders. */
case PLUS:
case MULT:
diff --git a/contrib/gcc/haifa-sched.c b/contrib/gcc/haifa-sched.c
index d4d2121..4214476 100644
--- a/contrib/gcc/haifa-sched.c
+++ b/contrib/gcc/haifa-sched.c
@@ -2849,7 +2849,7 @@ insn_unit (insn)
range, don't cache it. */
if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT
|| unit >= 0
- || (~unit & ((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
+ || (unit & ~((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
INSN_UNIT (insn) = unit;
}
return (unit > 0 ? unit - 1 : unit);
diff --git a/contrib/gcc/jump.c b/contrib/gcc/jump.c
index e24adb2..32eebd1 100644
--- a/contrib/gcc/jump.c
+++ b/contrib/gcc/jump.c
@@ -371,19 +371,23 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan, mark_labels_only)
int diff_vec_p = GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC;
int len = XVECLEN (pat, diff_vec_p);
rtx dispatch = prev_real_insn (insn);
+ rtx set;
for (i = 0; i < len; i++)
if (XEXP (XVECEXP (pat, diff_vec_p, i), 0)
!= XEXP (XVECEXP (pat, diff_vec_p, 0), 0))
break;
+
if (i == len
&& dispatch != 0
&& GET_CODE (dispatch) == JUMP_INSN
&& JUMP_LABEL (dispatch) != 0
- /* Don't mess with a casesi insn. */
- && !(GET_CODE (PATTERN (dispatch)) == SET
- && (GET_CODE (SET_SRC (PATTERN (dispatch)))
- == IF_THEN_ELSE))
+ /* Don't mess with a casesi insn.
+ XXX according to the comment before computed_jump_p(),
+ all casesi insns should be a parallel of the jump
+ and a USE of a LABEL_REF. */
+ && ! ((set = single_set (dispatch)) != NULL
+ && (GET_CODE (SET_SRC (set)) == IF_THEN_ELSE))
&& next_real_insn (JUMP_LABEL (dispatch)) == insn)
{
redirect_tablejump (dispatch,
@@ -2548,7 +2552,7 @@ duplicate_loop_exit_test (loop_start)
rtx loop_start;
{
rtx insn, set, reg, p, link;
- rtx copy = 0;
+ rtx copy = 0, first_copy = 0;
int num_insns = 0;
rtx exitcode = NEXT_INSN (JUMP_LABEL (next_nonnote_insn (loop_start)));
rtx lastexit;
@@ -2661,19 +2665,20 @@ duplicate_loop_exit_test (loop_start)
/* Now copy each insn. */
for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn))
- switch (GET_CODE (insn))
- {
- case BARRIER:
- copy = emit_barrier_before (loop_start);
- break;
- case NOTE:
- /* Only copy line-number notes. */
- if (NOTE_LINE_NUMBER (insn) >= 0)
- {
- copy = emit_note_before (NOTE_LINE_NUMBER (insn), loop_start);
- NOTE_SOURCE_FILE (copy) = NOTE_SOURCE_FILE (insn);
- }
- break;
+ {
+ switch (GET_CODE (insn))
+ {
+ case BARRIER:
+ copy = emit_barrier_before (loop_start);
+ break;
+ case NOTE:
+ /* Only copy line-number notes. */
+ if (NOTE_LINE_NUMBER (insn) >= 0)
+ {
+ copy = emit_note_before (NOTE_LINE_NUMBER (insn), loop_start);
+ NOTE_SOURCE_FILE (copy) = NOTE_SOURCE_FILE (insn);
+ }
+ break;
case INSN:
copy = emit_insn_before (copy_rtx (PATTERN (insn)), loop_start);
@@ -2694,32 +2699,38 @@ duplicate_loop_exit_test (loop_start)
replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
break;
- case JUMP_INSN:
- copy = emit_jump_insn_before (copy_rtx (PATTERN (insn)), loop_start);
- if (reg_map)
- replace_regs (PATTERN (copy), reg_map, max_reg, 1);
- mark_jump_label (PATTERN (copy), copy, 0);
- if (REG_NOTES (insn))
- {
- REG_NOTES (copy) = copy_rtx (REG_NOTES (insn));
- if (reg_map)
- replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
- }
+ case JUMP_INSN:
+ copy = emit_jump_insn_before (copy_rtx (PATTERN (insn)), loop_start);
+ if (reg_map)
+ replace_regs (PATTERN (copy), reg_map, max_reg, 1);
+ mark_jump_label (PATTERN (copy), copy, 0);
+ if (REG_NOTES (insn))
+ {
+ REG_NOTES (copy) = copy_rtx (REG_NOTES (insn));
+ if (reg_map)
+ replace_regs (REG_NOTES (copy), reg_map, max_reg, 1);
+ }
- /* If this is a simple jump, add it to the jump chain. */
+ /* If this is a simple jump, add it to the jump chain. */
- if (INSN_UID (copy) < max_jump_chain && JUMP_LABEL (copy)
- && simplejump_p (copy))
- {
- jump_chain[INSN_UID (copy)]
- = jump_chain[INSN_UID (JUMP_LABEL (copy))];
- jump_chain[INSN_UID (JUMP_LABEL (copy))] = copy;
- }
- break;
+ if (INSN_UID (copy) < max_jump_chain && JUMP_LABEL (copy)
+ && simplejump_p (copy))
+ {
+ jump_chain[INSN_UID (copy)]
+ = jump_chain[INSN_UID (JUMP_LABEL (copy))];
+ jump_chain[INSN_UID (JUMP_LABEL (copy))] = copy;
+ }
+ break;
- default:
- abort ();
- }
+ default:
+ abort ();
+ }
+
+ /* Record the first insn we copied. We need it so that we can
+ scan the copied insns for new pseudo registers. */
+ if (! first_copy)
+ first_copy = copy;
+ }
/* Now clean up by emitting a jump to the end label and deleting the jump
at the start of the loop. */
@@ -2727,6 +2738,14 @@ duplicate_loop_exit_test (loop_start)
{
copy = emit_jump_insn_before (gen_jump (get_label_after (insn)),
loop_start);
+
+ /* Record the first insn we copied. We need it so that we can
+ scan the copied insns for new pseudo registers. This may not
+ be strictly necessary since we should have copied at least one
+ insn above. But I am going to be safe. */
+ if (! first_copy)
+ first_copy = copy;
+
mark_jump_label (PATTERN (copy), copy, 0);
if (INSN_UID (copy) < max_jump_chain
&& INSN_UID (JUMP_LABEL (copy)) < max_jump_chain)
@@ -2738,6 +2757,11 @@ duplicate_loop_exit_test (loop_start)
emit_barrier_before (loop_start);
}
+ /* Now scan from the first insn we copied to the last insn we copied
+ (copy) for new pseudo registers. Do this after the code to jump to
+ the end label since that might create a new pseudo too. */
+ reg_scan_update (first_copy, copy, max_reg);
+
/* Mark the exit code as the virtual top of the converted loop. */
emit_note_before (NOTE_INSN_LOOP_VTOP, exitcode);
diff --git a/contrib/gcc/local-alloc.c b/contrib/gcc/local-alloc.c
index d1df595..2fc3aec 100644
--- a/contrib/gcc/local-alloc.c
+++ b/contrib/gcc/local-alloc.c
@@ -759,7 +759,8 @@ update_equiv_regs ()
&& REG_N_SETS (regno) == 1
&& reg_equiv_init_insns[regno] != 0
&& reg_equiv_init_insns[regno] != const0_rtx
- && ! find_reg_note (insn, REG_EQUIV, NULL_RTX)
+ && ! find_reg_note (XEXP (reg_equiv_init_insns[regno], 0),
+ REG_EQUIV, NULL_RTX)
&& ! contains_replace_regs (XEXP (dest, 0), reg_equiv_replace))
{
rtx init_insn = XEXP (reg_equiv_init_insns[regno], 0);
diff --git a/contrib/gcc/loop.c b/contrib/gcc/loop.c
index 7acd727..7ee92e1 100644
--- a/contrib/gcc/loop.c
+++ b/contrib/gcc/loop.c
@@ -283,6 +283,9 @@ static struct movable *the_movables;
FILE *loop_dump_stream;
+/* For communicating return values from note_set_pseudo_multiple_uses. */
+static int note_set_pseudo_multiple_uses_retval;
+
/* Forward declarations. */
static void verify_dominator PROTO((int));
@@ -297,6 +300,7 @@ static void count_one_set PROTO((rtx, rtx, varray_type, rtx *));
static void count_loop_regs_set PROTO((rtx, rtx, varray_type, varray_type,
int *, int));
static void note_addr_stored PROTO((rtx, rtx));
+static void note_set_pseudo_multiple_uses PROTO((rtx, rtx));
static int loop_reg_used_before_p PROTO((rtx, rtx, rtx, rtx, rtx));
static void scan_loop PROTO((rtx, rtx, rtx, int, int));
#if 0
@@ -3140,6 +3144,36 @@ note_addr_stored (x, y)
loop_store_mems = gen_rtx_EXPR_LIST (VOIDmode, x, loop_store_mems);
}
+
+/* X is a value modified by an INSN that references a biv inside a loop
+ exit test (ie, X is somehow related to the value of the biv). If X
+ is a pseudo that is used more than once, then the biv is (effectively)
+ used more than once. */
+
+static void
+note_set_pseudo_multiple_uses (x, y)
+ rtx x;
+ rtx y ATTRIBUTE_UNUSED;
+{
+ if (x == 0)
+ return;
+
+ while (GET_CODE (x) == STRICT_LOW_PART
+ || GET_CODE (x) == SIGN_EXTRACT
+ || GET_CODE (x) == ZERO_EXTRACT
+ || GET_CODE (x) == SUBREG)
+ x = XEXP (x, 0);
+
+ if (GET_CODE (x) != REG || REGNO (x) < FIRST_PSEUDO_REGISTER)
+ return;
+
+ /* If we do not have usage information, or if we know the register
+ is used more than once, note that fact for check_dbra_loop. */
+ if (REGNO (x) >= max_reg_before_loop
+ || ! VARRAY_RTX (reg_single_usage, REGNO (x))
+ || VARRAY_RTX (reg_single_usage, REGNO (x)) == const0_rtx)
+ note_set_pseudo_multiple_uses_retval = 1;
+}
/* Return nonzero if the rtx X is invariant over the current loop.
@@ -7765,10 +7799,22 @@ check_dbra_loop (loop_end, insn_count, loop_start, loop_info)
&& REGNO (SET_DEST (set)) == bl->regno)
/* An insn that sets the biv is okay. */
;
- else if (p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
- || p == prev_nonnote_insn (loop_end))
- /* Don't bother about the end test. */
- ;
+ else if ((p == prev_nonnote_insn (prev_nonnote_insn (loop_end))
+ || p == prev_nonnote_insn (loop_end))
+ && reg_mentioned_p (bivreg, PATTERN (p)))
+ {
+ /* If either of these insns uses the biv and sets a pseudo
+ that has more than one usage, then the biv has uses
+ other than counting since it's used to derive a value
+ that is used more than one time. */
+ note_set_pseudo_multiple_uses_retval = 0;
+ note_stores (PATTERN (p), note_set_pseudo_multiple_uses);
+ if (note_set_pseudo_multiple_uses_retval)
+ {
+ no_use_except_counting = 0;
+ break;
+ }
+ }
else if (reg_mentioned_p (bivreg, PATTERN (p)))
{
no_use_except_counting = 0;
diff --git a/contrib/gcc/reg-stack.c b/contrib/gcc/reg-stack.c
index dd4a87e..42caefa 100644
--- a/contrib/gcc/reg-stack.c
+++ b/contrib/gcc/reg-stack.c
@@ -1186,8 +1186,16 @@ static rtx
stack_result (decl)
tree decl;
{
- rtx result = DECL_RTL (DECL_RESULT (decl));
+ rtx result;
+ /* If the value is supposed to be returned in memory, then clearly
+ it is not returned in a stack register. */
+ if (aggregate_value_p (DECL_RESULT (decl)))
+ return 0;
+
+ result = DECL_RTL (DECL_RESULT (decl));
+ /* ?!? What is this code supposed to do? Can this code actually
+ trigger if we kick out aggregates above? */
if (result != 0
&& ! (GET_CODE (result) == REG
&& REGNO (result) < FIRST_PSEUDO_REGISTER))
diff --git a/contrib/gcc/regmove.c b/contrib/gcc/regmove.c
index 81a3520..8008595 100644
--- a/contrib/gcc/regmove.c
+++ b/contrib/gcc/regmove.c
@@ -62,7 +62,7 @@ static int find_matches PROTO((rtx, struct match *));
static int fixup_match_1 PROTO((rtx, rtx, rtx, rtx, rtx, int, int, int, FILE *))
;
static int reg_is_remote_constant_p PROTO((rtx, rtx, rtx));
-static int stable_but_for_p PROTO((rtx, rtx, rtx));
+static int stable_and_no_regs_but_for_p PROTO((rtx, rtx, rtx));
static int regclass_compatible_p PROTO((int, int));
static int loop_depth;
@@ -1663,6 +1663,12 @@ fixup_match_1 (insn, set, src, src_subreg, dst, backward, operand_number,
rtx src_note = find_reg_note (insn, REG_DEAD, src), dst_note;
int length, s_length, true_loop_depth;
+ /* If SRC is marked as unchanging, we may not change it.
+ ??? Maybe we could get better code by removing the unchanging bit
+ instead, and changing it back if we don't succeed? */
+ if (RTX_UNCHANGING_P (src))
+ return 0;
+
if (! src_note)
{
/* Look for (set (regX) (op regA constX))
@@ -1679,7 +1685,7 @@ fixup_match_1 (insn, set, src, src_subreg, dst, backward, operand_number,
&& XEXP (SET_SRC (set), 0) == src
&& GET_CODE (XEXP (SET_SRC (set), 1)) == CONST_INT)
insn_const = INTVAL (XEXP (SET_SRC (set), 1));
- else if (! stable_but_for_p (SET_SRC (set), src, dst))
+ else if (! stable_and_no_regs_but_for_p (SET_SRC (set), src, dst))
return 0;
else
/* We might find a src_note while scanning. */
@@ -2089,10 +2095,16 @@ fixup_match_1 (insn, set, src, src_subreg, dst, backward, operand_number,
}
-/* return nonzero if X is stable but for mentioning SRC or mentioning /
- changing DST . If in doubt, presume it is unstable. */
+/* return nonzero if X is stable and mentions no regsiters but for
+ mentioning SRC or mentioning / changing DST . If in doubt, presume
+ it is unstable.
+ The rationale is that we want to check if we can move an insn easily
+ while just paying attention to SRC and DST. A register is considered
+ stable if it has the RTX_UNCHANGING_P bit set, but that would still
+ leave the burden to update REG_DEAD / REG_UNUSED notes, so we don't
+ want any registers but SRC and DST. */
static int
-stable_but_for_p (x, src, dst)
+stable_and_no_regs_but_for_p (x, src, dst)
rtx x, src, dst;
{
RTX_CODE code = GET_CODE (x);
@@ -2103,13 +2115,19 @@ stable_but_for_p (x, src, dst)
int i;
char *fmt = GET_RTX_FORMAT (code);
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
- if (fmt[i] == 'e' && ! stable_but_for_p (XEXP (x, i), src, dst))
+ if (fmt[i] == 'e'
+ && ! stable_and_no_regs_but_for_p (XEXP (x, i), src, dst))
return 0;
return 1;
}
case 'o':
- if (x == src || x == dst)
- return 1;
+ if (code == REG)
+ return x == src || x == dst;
+ /* If this is a MEM, look inside - there might be a register hidden in
+ the address of an unchanging MEM. */
+ if (code == MEM
+ && ! stable_and_no_regs_but_for_p (XEXP (x, 0), src, dst))
+ return 0;
/* fall through */
default:
return ! rtx_unstable_p (x);
diff --git a/contrib/gcc/sched.c b/contrib/gcc/sched.c
index e8cd070..f09a68a 100644
--- a/contrib/gcc/sched.c
+++ b/contrib/gcc/sched.c
@@ -587,7 +587,7 @@ insn_unit (insn)
range, don't cache it. */
if (FUNCTION_UNITS_SIZE < HOST_BITS_PER_SHORT
|| unit >= 0
- || (~unit & ((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
+ || (unit & ~((1 << (HOST_BITS_PER_SHORT - 1)) - 1)) == 0)
INSN_UNIT (insn) = unit;
}
return (unit > 0 ? unit - 1 : unit);
diff --git a/contrib/gcc/tlink.c b/contrib/gcc/tlink.c
index 9f058c9..882c1ab 100644
--- a/contrib/gcc/tlink.c
+++ b/contrib/gcc/tlink.c
@@ -654,7 +654,11 @@ scan_linker_output (fname)
if (dem)
sym = symbol_hash_lookup (dem->mangled, false);
else
- sym = symbol_hash_lookup (p, false);
+ {
+ if (*p == '_' && prepends_underscore)
+ ++p;
+ sym = symbol_hash_lookup (p, false);
+ }
}
}
diff --git a/contrib/gcc/version.c b/contrib/gcc/version.c
index d28821d..877d64d 100644
--- a/contrib/gcc/version.c
+++ b/contrib/gcc/version.c
@@ -1 +1 @@
-char *version_string = "2.95.1 19990816 (release)";
+char *version_string = "2.95.2 19991024 (release)";
OpenPOWER on IntegriCloud