-Index: gcc-4_2-branch/libgomp/configure
-===================================================================
---- gcc-4_2-branch/libgomp/configure (revision 123014)
-+++ gcc-4_2-branch/libgomp/configure (revision 124164)
-@@ -9315,7 +9315,7 @@
- # does some of this, but throws away the result.
-
- ldver=`$LD --version 2>/dev/null | head -1 | \
-- sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
-+ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'`
-
- libgomp_gnu_ld_version=`echo $ldver | \
- $AWK -F. '{ if (NF<3) $3=0; print ($1*100+$2)*100+$3 }'`
-Index: gcc-4_2-branch/libgomp/ChangeLog
-===================================================================
---- gcc-4_2-branch/libgomp/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/libgomp/ChangeLog (revision 124164)
-@@ -1,3 +1,9 @@
-+2007-03-18 Andreas Schwab <schwab@suse.de>
-+
-+ * acinclude.m4: Adjust regular expression for ld version
-+ extraction.
-+ * configure: Regenerate.
-+
- 2007-02-07 Jakub Jelinek <jakub@redhat.com>
+Index: configure
+===================================================================
+--- configure (.../tags/gcc_4_2_0_release) (revision 125292)
++++ configure (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -7337,6 +7337,12 @@
+ #line 7338 "configure"
+ #include "confdefs.h"
+
++#if (__GNUC__ < 3) \
++ || (__GNUC__ == 3 && (__GNUC_MINOR__ < 3 \
++ || (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ < 1)))
++#error http://gcc.gnu.org/PR29382
++#endif
++
+ int main() {
- PR c++/30703
-Index: gcc-4_2-branch/libgomp/acinclude.m4
-===================================================================
---- gcc-4_2-branch/libgomp/acinclude.m4 (revision 123014)
-+++ gcc-4_2-branch/libgomp/acinclude.m4 (revision 124164)
-@@ -148,7 +148,7 @@
- # does some of this, but throws away the result.
- changequote(,)
- ldver=`$LD --version 2>/dev/null | head -1 | \
-- sed -e 's/GNU ld version \([0-9.][0-9.]*\).*/\1/'`
-+ sed -e 's/GNU ld \(version \)\{0,1\}\(([^)]*) \)\{0,1\}\([0-9.][0-9.]*\).*/\3/'`
- changequote([,])
- libgomp_gnu_ld_version=`echo $ldver | \
- $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'`
-Index: gcc-4_2-branch/gcc/tree-vrp.c
+ ; return 0; }
+Index: gcc/tree-vrp.c
===================================================================
---- gcc-4_2-branch/gcc/tree-vrp.c (revision 123014)
-+++ gcc-4_2-branch/gcc/tree-vrp.c (revision 124164)
-@@ -266,6 +266,10 @@
-
- cmp = compare_values (min, max);
- gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
-+
-+ if (needs_overflow_infinity (TREE_TYPE (min)))
-+ gcc_assert (!is_overflow_infinity (min)
-+ || !is_overflow_infinity (max));
- }
-
- if (t == VR_UNDEFINED || t == VR_VARYING)
-@@ -314,6 +318,23 @@
- bitmap_clear (vr->equiv);
+--- gcc/tree-vrp.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/tree-vrp.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -195,7 +195,28 @@
+ || operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0)));
}
-+/* Set value range VR to a single value. This function is only called
-+ with values we get from statements, and exists to clear the
-+ TREE_OVERFLOW flag so that we don't think we have an overflow
-+ infinity when we shouldn't. */
-+
-+static inline void
-+set_value_range_to_value (value_range_t *vr, tree val)
++/* If VAL is now an overflow infinity, return VAL. Otherwise, return
++ the same value with TREE_OVERFLOW clear. This can be used to avoid
++ confusing a regular value with an overflow value. */
+
++static inline tree
++avoid_overflow_infinity (tree val)
+{
-+ gcc_assert (is_gimple_min_invariant (val));
-+ if (is_overflow_infinity (val))
++ if (!is_overflow_infinity (val))
++ return val;
++
++ if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
++ return TYPE_MAX_VALUE (TREE_TYPE (val));
++ else
+ {
-+ val = copy_node (val);
-+ TREE_OVERFLOW (val) = 0;
++#ifdef ENABLE_CHECKING
++ gcc_assert (operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
++#endif
++ return TYPE_MIN_VALUE (TREE_TYPE (val));
+ }
-+ set_value_range (vr, VR_RANGE, val, val, NULL);
+}
+
++
+ /* Return whether VAL is equal to the maximum value of its type. This
+ will be true for a positive overflow infinity. We can't do a
+ simple equality comparison with TYPE_MAX_VALUE because C typedefs
+@@ -351,23 +372,11 @@
+ infinity when we shouldn't. */
+
+ static inline void
+-set_value_range_to_value (value_range_t *vr, tree val)
++set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
+ {
+ gcc_assert (is_gimple_min_invariant (val));
+- if (is_overflow_infinity (val))
+- {
+- if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
+- val = TYPE_MAX_VALUE (TREE_TYPE (val));
+- else
+- {
+-#ifdef ENABLE_CHECKING
+- gcc_assert (operand_equal_p (val,
+- TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
+-#endif
+- val = TYPE_MIN_VALUE (TREE_TYPE (val));
+- }
+- }
+- set_value_range (vr, VR_RANGE, val, val, NULL);
++ val = avoid_overflow_infinity (val);
++ set_value_range (vr, VR_RANGE, val, val, equiv);
+ }
+
/* Set value range VR to a non-negative range of type TYPE.
- OVERFLOW_INFINITY indicates whether to use a overflow infinity
- rather than TYPE_MAX_VALUE; this should be true if we determine
-@@ -1565,7 +1586,7 @@
+@@ -411,8 +420,7 @@
+ static inline void
+ set_value_range_to_null (value_range_t *vr, tree type)
+ {
+- tree zero = build_int_cst (type, 0);
+- set_value_range (vr, VR_RANGE, zero, zero, vr->equiv);
++ set_value_range_to_value (vr, build_int_cst (type, 0), vr->equiv);
+ }
+
+
+@@ -1028,6 +1036,8 @@
+ cond_code = swap_tree_comparison (TREE_CODE (cond));
+ }
+
++ limit = avoid_overflow_infinity (limit);
++
+ type = TREE_TYPE (limit);
+ gcc_assert (limit != var);
+
+@@ -1619,7 +1629,7 @@
if (TREE_CODE (op0) == SSA_NAME)
vr0 = *(get_value_range (op0));
else if (is_gimple_min_invariant (op0))
-- set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
-+ set_value_range_to_value (&vr0, op0);
+- set_value_range_to_value (&vr0, op0);
++ set_value_range_to_value (&vr0, op0, NULL);
else
set_value_range_to_varying (&vr0);
-@@ -1573,7 +1594,7 @@
+@@ -1627,7 +1637,7 @@
if (TREE_CODE (op1) == SSA_NAME)
vr1 = *(get_value_range (op1));
else if (is_gimple_min_invariant (op1))
-- set_value_range (&vr1, VR_RANGE, op1, op1, NULL);
-+ set_value_range_to_value (&vr1, op1);
+- set_value_range_to_value (&vr1, op1);
++ set_value_range_to_value (&vr1, op1, NULL);
else
set_value_range_to_varying (&vr1);
-@@ -1892,10 +1913,18 @@
- return;
- }
-
-+ /* We punt if:
-+ 1) [-INF, +INF]
-+ 2) [-INF, +-INF(OVF)]
-+ 3) [+-INF(OVF), +INF]
-+ 4) [+-INF(OVF), +-INF(OVF)]
-+ We learn nothing when we have INF and INF(OVF) on both sides.
-+ Note that we do accept [-INF, -INF] and [+INF, +INF] without
-+ overflow. */
- if ((min == TYPE_MIN_VALUE (TREE_TYPE (min))
-- || is_negative_overflow_infinity (min))
-+ || is_overflow_infinity (min))
- && (max == TYPE_MAX_VALUE (TREE_TYPE (max))
-- || is_positive_overflow_infinity (max)))
-+ || is_overflow_infinity (max)))
- {
- set_value_range_to_varying (vr);
- return;
-@@ -1946,7 +1975,7 @@
+@@ -2006,7 +2016,7 @@
if (TREE_CODE (op0) == SSA_NAME)
vr0 = *(get_value_range (op0));
else if (is_gimple_min_invariant (op0))
-- set_value_range (&vr0, VR_RANGE, op0, op0, NULL);
-+ set_value_range_to_value (&vr0, op0);
+- set_value_range_to_value (&vr0, op0);
++ set_value_range_to_value (&vr0, op0, NULL);
else
set_value_range_to_varying (&vr0);
-@@ -2078,7 +2107,9 @@
- min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
- else if (needs_overflow_infinity (TREE_TYPE (expr)))
- {
-- if (supports_overflow_infinity (TREE_TYPE (expr)))
-+ if (supports_overflow_infinity (TREE_TYPE (expr))
-+ && !is_overflow_infinity (vr0.min)
-+ && vr0.min != TYPE_MIN_VALUE (TREE_TYPE (expr)))
- min = positive_overflow_infinity (TREE_TYPE (expr));
- else
- {
-@@ -2254,6 +2285,18 @@
- if (needs_overflow_infinity (TREE_TYPE (expr)))
- {
- gcc_assert (code != NEGATE_EXPR && code != ABS_EXPR);
-+
-+ /* If both sides have overflowed, we don't know
-+ anything. */
-+ if ((is_overflow_infinity (vr0.min)
-+ || TREE_OVERFLOW (min))
-+ && (is_overflow_infinity (vr0.max)
-+ || TREE_OVERFLOW (max)))
-+ {
-+ set_value_range_to_varying (vr);
-+ return;
-+ }
-+
- if (is_overflow_infinity (vr0.min))
- min = vr0.min;
- else if (TREE_OVERFLOW (min))
-@@ -2350,7 +2393,7 @@
+@@ -2393,7 +2403,10 @@
+ its type may be different from _Bool. Convert VAL to EXPR's
+ type. */
+ val = fold_convert (TREE_TYPE (expr), val);
+- set_value_range (vr, VR_RANGE, val, val, vr->equiv);
++ if (is_gimple_min_invariant (val))
++ set_value_range_to_value (vr, val, vr->equiv);
++ else
++ set_value_range (vr, VR_RANGE, val, val, vr->equiv);
+ }
+ else
+ set_value_range_to_varying (vr);
+@@ -2424,7 +2437,7 @@
else if (TREE_CODE_CLASS (code) == tcc_comparison)
extract_range_from_comparison (vr, expr);
else if (is_gimple_min_invariant (expr))
-- set_value_range (vr, VR_RANGE, expr, expr, NULL);
-+ set_value_range_to_value (vr, expr);
+- set_value_range_to_value (vr, expr);
++ set_value_range_to_value (vr, expr, NULL);
else
set_value_range_to_varying (vr);
-@@ -4514,6 +4557,17 @@
- return;
- }
+@@ -4156,7 +4169,7 @@
+ t = retval = NULL_TREE;
+ EXECUTE_IF_SET_IN_BITMAP (e2, 0, i2, bi2)
+ {
+- bool sop;
++ bool sop = false;
-+ /* Check for useless ranges. */
-+ if (INTEGRAL_TYPE_P (TREE_TYPE (min))
-+ && ((min == TYPE_MIN_VALUE (TREE_TYPE (min))
-+ || is_overflow_infinity (min))
-+ && (max == TYPE_MAX_VALUE (TREE_TYPE (max))
-+ || is_overflow_infinity (max))))
-+ {
-+ set_value_range_to_varying (vr0);
-+ return;
-+ }
-+
- /* The resulting set of equivalences is the intersection of
- the two sets. */
- if (vr0->equiv && vr1->equiv && vr0->equiv != vr1->equiv)
-@@ -4639,6 +4693,12 @@
- vr_arg = *(get_value_range (arg));
- else
- {
-+ if (is_overflow_infinity (arg))
-+ {
-+ arg = copy_node (arg);
-+ TREE_OVERFLOW (arg) = 0;
-+ }
-+
- vr_arg.type = VR_RANGE;
- vr_arg.min = arg;
- vr_arg.max = arg;
-Index: gcc-4_2-branch/gcc/doc/invoke.texi
-===================================================================
---- gcc-4_2-branch/gcc/doc/invoke.texi (revision 123014)
-+++ gcc-4_2-branch/gcc/doc/invoke.texi (revision 124164)
-@@ -695,9 +695,11 @@
- -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard}
-
- @emph{Score Options}
--@gccoptlist{-mel -mel @gol
-+@gccoptlist{-meb -mel @gol
-+-mnhwloop @gol
-+-muls @gol
- -mmac @gol
---mscore5u -mscore7}
-+-mscore5 -mscore5u -mscore7 -mscore7d}
-
- @emph{SH Options}
- @gccoptlist{-m1 -m2 -m2e -m3 -m3e @gol
-@@ -2834,7 +2836,7 @@
-
- @item -Wstrict-overflow
- @item -Wstrict-overflow=@var{n}
--@opindex -Wstrict-overflow
-+@opindex Wstrict-overflow
- This option is only active when @option{-fstrict-overflow} is active.
- It warns about cases where the compiler optimizes based on the
- assumption that signed overflow does not occur. Note that it does not
-@@ -2847,7 +2849,10 @@
- overflow never does, in fact, occur. Therefore this warning can
- easily give a false positive: a warning about code which is not
- actually a problem. To help focus on important issues, several
--warning levels are defined.
-+warning levels are defined. No warnings are issued for the use of
-+undefined signed overflow when estimating how many iterations a loop
-+will require, in particular when determining whether a loop will be
-+executed at all.
-
- @table @option
- @item -Wstrict-overflow=1
-@@ -4673,7 +4678,7 @@
- arithmetic on them. This produces better code by making all memory
- references potential common subexpressions. When they are not common
- subexpressions, instruction combination should eliminate the separate
--register-load. This option is now a nop and will be removed in 4.2.
-+register-load. This option is now a nop and will be removed in 4.3.
-
- @item -fforce-addr
- @opindex fforce-addr
-@@ -5298,7 +5303,7 @@
- @option{-funroll-loops},
-
- @item -fsplit-ivs-in-unroller
--@opindex -fsplit-ivs-in-unroller
-+@opindex fsplit-ivs-in-unroller
- Enables expressing of values of induction variables in later iterations
- of the unrolled loop using the value in the first iteration. This breaks
- long dependency chains, thus improving efficiency of the scheduling passes.
-@@ -5311,7 +5316,7 @@
- This optimization is enabled by default.
-
- @item -fvariable-expansion-in-unroller
--@opindex -fvariable-expansion-in-unroller
-+@opindex fvariable-expansion-in-unroller
- With this option, the compiler will create multiple copies of some
- local variables when unrolling a loop which can result in superior code.
-
-@@ -8161,13 +8166,13 @@
- @samp{"PrivateHeaders"} or @samp{"Headers"} directory.
-
- @item -gused
--@opindex -gused
-+@opindex gused
- Emit debugging information for symbols that are used. For STABS
- debugging format, this enables @option{-feliminate-unused-debug-symbols}.
- This is by default ON@.
-
- @item -gfull
--@opindex -gfull
-+@opindex gfull
- Emit debugging information for all symbols and types.
-
- @item -mmacosx-version-min=@var{version}
-@@ -8189,7 +8194,7 @@
- @option{-mlong-branch} for PowerPC targets.
-
- @item -mone-byte-bool
--@opindex -mone-byte-bool
-+@opindex mone-byte-bool
- Override the defaults for @samp{bool} so that @samp{sizeof(bool)==1}.
- By default @samp{sizeof(bool)} is @samp{4} when compiling for
- Darwin/PowerPC and @samp{1} when compiling for Darwin/x86, so this
-@@ -8238,12 +8243,12 @@
- output file being linked. See man ld(1) for more information.
-
- @item -dynamiclib
--@opindex -dynamiclib
-+@opindex dynamiclib
- When passed this option, GCC will produce a dynamic library instead of
- an executable when linking, using the Darwin @file{libtool} command.
-
- @item -force_cpusubtype_ALL
--@opindex -force_cpusubtype_ALL
-+@opindex force_cpusubtype_ALL
- This causes GCC's output file to have the @var{ALL} subtype, instead of
- one controlled by the @option{-mcpu} or @option{-march} option.
-
-@@ -9759,7 +9764,9 @@
- The 32-bit environment sets int, long and pointer to 32 bits and
- generates code that runs on any i386 system.
- The 64-bit environment sets int to 32 bits and long and pointer
--to 64 bits and generates code for AMD's x86-64 architecture.
-+to 64 bits and generates code for AMD's x86-64 architecture. For
-+darwin only the -m64 option turns off the @option{-fno-pic} and
-+@option{-mdynamic-no-pic} options.
-
- @item -mno-red-zone
- @opindex no-red-zone
-@@ -9947,8 +9954,8 @@
-
- @item -mno-sched-br-data-spec
- @itemx -msched-br-data-spec
--@opindex -mno-sched-br-data-spec
--@opindex -msched-br-data-spec
-+@opindex mno-sched-br-data-spec
-+@opindex msched-br-data-spec
- (Dis/En)able data speculative scheduling before reload.
- This will result in generation of the ld.a instructions and
- the corresponding check instructions (ld.c / chk.a).
-@@ -9956,8 +9963,8 @@
-
- @item -msched-ar-data-spec
- @itemx -mno-sched-ar-data-spec
--@opindex -msched-ar-data-spec
--@opindex -mno-sched-ar-data-spec
-+@opindex msched-ar-data-spec
-+@opindex mno-sched-ar-data-spec
- (En/Dis)able data speculative scheduling after reload.
- This will result in generation of the ld.a instructions and
- the corresponding check instructions (ld.c / chk.a).
-@@ -9965,8 +9972,8 @@
-
- @item -mno-sched-control-spec
- @itemx -msched-control-spec
--@opindex -mno-sched-control-spec
--@opindex -msched-control-spec
-+@opindex mno-sched-control-spec
-+@opindex msched-control-spec
- (Dis/En)able control speculative scheduling. This feature is
- available only during region scheduling (i.e. before reload).
- This will result in generation of the ld.s instructions and
-@@ -9975,8 +9982,8 @@
-
- @item -msched-br-in-data-spec
- @itemx -mno-sched-br-in-data-spec
--@opindex -msched-br-in-data-spec
--@opindex -mno-sched-br-in-data-spec
-+@opindex msched-br-in-data-spec
-+@opindex mno-sched-br-in-data-spec
- (En/Dis)able speculative scheduling of the instructions that
- are dependent on the data speculative loads before reload.
- This is effective only with @option{-msched-br-data-spec} enabled.
-@@ -9984,8 +9991,8 @@
-
- @item -msched-ar-in-data-spec
- @itemx -mno-sched-ar-in-data-spec
--@opindex -msched-ar-in-data-spec
--@opindex -mno-sched-ar-in-data-spec
-+@opindex msched-ar-in-data-spec
-+@opindex mno-sched-ar-in-data-spec
- (En/Dis)able speculative scheduling of the instructions that
- are dependent on the data speculative loads after reload.
- This is effective only with @option{-msched-ar-data-spec} enabled.
-@@ -9993,8 +10000,8 @@
-
- @item -msched-in-control-spec
- @itemx -mno-sched-in-control-spec
--@opindex -msched-in-control-spec
--@opindex -mno-sched-in-control-spec
-+@opindex msched-in-control-spec
-+@opindex mno-sched-in-control-spec
- (En/Dis)able speculative scheduling of the instructions that
- are dependent on the control speculative loads.
- This is effective only with @option{-msched-control-spec} enabled.
-@@ -10002,8 +10009,8 @@
-
- @item -msched-ldc
- @itemx -mno-sched-ldc
--@opindex -msched-ldc
--@opindex -mno-sched-ldc
-+@opindex msched-ldc
-+@opindex mno-sched-ldc
- (En/Dis)able use of simple data speculation checks ld.c .
- If disabled, only chk.a instructions will be emitted to check
- data speculative loads.
-@@ -10011,8 +10018,8 @@
-
- @item -mno-sched-control-ldc
- @itemx -msched-control-ldc
--@opindex -mno-sched-control-ldc
--@opindex -msched-control-ldc
-+@opindex mno-sched-control-ldc
-+@opindex msched-control-ldc
- (Dis/En)able use of ld.c instructions to check control speculative loads.
- If enabled, in case of control speculative load with no speculatively
- scheduled dependent instructions this load will be emitted as ld.sa and
-@@ -10021,14 +10028,14 @@
-
- @item -mno-sched-spec-verbose
- @itemx -msched-spec-verbose
--@opindex -mno-sched-spec-verbose
--@opindex -msched-spec-verbose
-+@opindex mno-sched-spec-verbose
-+@opindex msched-spec-verbose
- (Dis/En)able printing of the information about speculative motions.
-
- @item -mno-sched-prefer-non-data-spec-insns
- @itemx -msched-prefer-non-data-spec-insns
--@opindex -mno-sched-prefer-non-data-spec-insns
--@opindex -msched-prefer-non-data-spec-insns
-+@opindex mno-sched-prefer-non-data-spec-insns
-+@opindex msched-prefer-non-data-spec-insns
- If enabled, data speculative instructions will be chosen for schedule
- only if there are no other choices at the moment. This will make
- the use of the data speculation much more conservative.
-@@ -10036,8 +10043,8 @@
-
- @item -mno-sched-prefer-non-control-spec-insns
- @itemx -msched-prefer-non-control-spec-insns
--@opindex -mno-sched-prefer-non-control-spec-insns
--@opindex -msched-prefer-non-control-spec-insns
-+@opindex mno-sched-prefer-non-control-spec-insns
-+@opindex msched-prefer-non-control-spec-insns
- If enabled, control speculative instructions will be chosen for schedule
- only if there are no other choices at the moment. This will make
- the use of the control speculation much more conservative.
-@@ -10045,8 +10052,8 @@
-
- @item -mno-sched-count-spec-in-critical-path
- @itemx -msched-count-spec-in-critical-path
--@opindex -mno-sched-count-spec-in-critical-path
--@opindex -msched-count-spec-in-critical-path
-+@opindex mno-sched-count-spec-in-critical-path
-+@opindex msched-count-spec-in-critical-path
- If enabled, speculative dependencies will be considered during
- computation of the instructions priorities. This will make the use of the
- speculation a bit more conservative.
-@@ -12273,25 +12280,41 @@
- These options are defined for Score implementations:
-
- @table @gcctabopt
--@item -mel
--@opindex -mel
--Compile code for little endian mode.
--
- @item -meb
- @opindex meb
- Compile code for big endian mode. This is the default.
-
-+@item -mel
-+@opindex mel
-+Compile code for little endian mode.
-+
-+@item -mnhwloop
-+@opindex mnhwloop
-+Disable generate bcnz instruction.
-+
-+@item -muls
-+@opindex muls
-+Enable generate unaligned load and store instruction.
-+
- @item -mmac
- @opindex mmac
- Enable the use of multiply-accumulate instructions. Disabled by default.
-
-+@item -mscore5
-+@opindex mscore5
-+Specify the SCORE5 as the target architecture.
-+
- @item -mscore5u
- @opindex mscore5u
- Specify the SCORE5U of the target architecture.
-
- @item -mscore7
- @opindex mscore7
--Specify the SCORE7 of the target architecture. This is the default.
-+Specify the SCORE7 as the target architecture. This is the default.
-+
-+@item -mscore7d
-+@opindex mscore7d
-+Specify the SCORE7D as the target architecture.
- @end table
-
- @node SH Options
-Index: gcc-4_2-branch/gcc/doc/md.texi
-===================================================================
---- gcc-4_2-branch/gcc/doc/md.texi (revision 123014)
-+++ gcc-4_2-branch/gcc/doc/md.texi (revision 124164)
-@@ -2814,7 +2814,7 @@
- cp1 + cp2 + cp3 registers.
-
- @item I
--Unsigned 15 bit integer (in the range 0 to 32767).
-+High 16-bit constant (32-bit constant with 16 LSBs zero).
-
- @item J
- Unsigned 5 bit integer (in the range 0 to 31).
-@@ -2831,18 +2831,6 @@
- @item N
- Signed 14 bit integer (in the range @minus{}8192 to 8191).
-
--@item O
--Signed 15 bit integer (in the range @minus{}16384 to 16383).
--
--@item P
--Signed 12 bit integer (in the range @minus{}2048 to 2047).
--
--@item J
--An integer constant with exactly a single bit set.
--
--@item Q
--An integer constant.
--
- @item Z
- Any SYMBOL_REF.
- @end table
-Index: gcc-4_2-branch/gcc/DATESTAMP
-===================================================================
---- gcc-4_2-branch/gcc/DATESTAMP (revision 123014)
-+++ gcc-4_2-branch/gcc/DATESTAMP (revision 124164)
-@@ -1 +1 @@
--20070317
-+20070425
-Index: gcc-4_2-branch/gcc/tree-ssa-loop-ch.c
-===================================================================
---- gcc-4_2-branch/gcc/tree-ssa-loop-ch.c (revision 123014)
-+++ gcc-4_2-branch/gcc/tree-ssa-loop-ch.c (revision 124164)
-@@ -1,5 +1,5 @@
- /* Loop header copying on trees.
-- Copyright (C) 2004, 2005 Free Software Foundation, Inc.
-+ Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-
- This file is part of GCC.
-
-@@ -204,6 +204,27 @@
- continue;
- }
+ value_range_t vr2 = *(vr_value[i2]);
-+ /* If the loop has the form "for (i = j; i < j + 10; i++)" then
-+ this copying can introduce a case where we rely on undefined
-+ signed overflow to eliminate the preheader condition, because
-+ we assume that "j < j + 10" is true. We don't want to warn
-+ about that case for -Wstrict-overflow, because in general we
-+ don't warn about overflow involving loops. Prevent the
-+ warning by setting TREE_NO_WARNING. */
-+ if (warn_strict_overflow > 0)
-+ {
-+ unsigned int i;
-+
-+ for (i = 0; i < n_bbs; ++i)
-+ {
-+ tree last;
-+
-+ last = last_stmt (copied_bbs[i]);
-+ if (TREE_CODE (last) == COND_EXPR)
-+ TREE_NO_WARNING (last) = 1;
-+ }
-+ }
-+
- /* Ensure that the latch and the preheader is simple (we know that they
- are not now, since there was the loop exit condition. */
- loop_split_edge_with (loop_preheader_edge (loop), NULL);
-Index: gcc-4_2-branch/gcc/reload.c
+Index: gcc/DATESTAMP
===================================================================
---- gcc-4_2-branch/gcc/reload.c (revision 123014)
-+++ gcc-4_2-branch/gcc/reload.c (revision 124164)
-@@ -1853,7 +1853,12 @@
- || ! (TEST_HARD_REG_BIT
- (reg_class_contents[(int) rld[secondary_out].class],
- REGNO (XEXP (note, 0)))))))
-- && ! fixed_regs[REGNO (XEXP (note, 0))])
-+ && ! fixed_regs[REGNO (XEXP (note, 0))]
-+ /* Check that we don't use a hardreg for an uninitialized
-+ pseudo. See also find_dummy_reload(). */
-+ && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER
-+ || ! bitmap_bit_p (ENTRY_BLOCK_PTR->il.rtl->global_live_at_end,
-+ ORIGINAL_REGNO (XEXP (note, 0)))))
- {
- rld[output_reload].reg_rtx
- = gen_rtx_REG (rld[output_reload].outmode,
-Index: gcc-4_2-branch/gcc/builtins.c
-===================================================================
---- gcc-4_2-branch/gcc/builtins.c (revision 123014)
-+++ gcc-4_2-branch/gcc/builtins.c (revision 124164)
-@@ -5492,14 +5492,19 @@
- rtx target, bool ignore)
- {
- rtx val, mem;
-+ enum machine_mode old_mode;
-
- /* Expand the operands. */
- mem = get_builtin_sync_mem (TREE_VALUE (arglist), mode);
-
- arglist = TREE_CHAIN (arglist);
- val = expand_expr (TREE_VALUE (arglist), NULL, mode, EXPAND_NORMAL);
-- /* If VAL is promoted to a wider mode, convert it back to MODE. */
-- val = convert_to_mode (mode, val, 1);
-+ /* If VAL is promoted to a wider mode, convert it back to MODE. Take care
-+ of CONST_INTs, where we know the old_mode only from the call argument. */
-+ old_mode = GET_MODE (val);
-+ if (old_mode == VOIDmode)
-+ old_mode = TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist)));
-+ val = convert_modes (mode, old_mode, val, 1);
-
- if (ignore)
- return expand_sync_operation (mem, val, code);
-@@ -5517,19 +5522,28 @@
- bool is_bool, rtx target)
- {
- rtx old_val, new_val, mem;
-+ enum machine_mode old_mode;
-
- /* Expand the operands. */
- mem = get_builtin_sync_mem (TREE_VALUE (arglist), mode);
-
- arglist = TREE_CHAIN (arglist);
- old_val = expand_expr (TREE_VALUE (arglist), NULL, mode, EXPAND_NORMAL);
-- /* If OLD_VAL is promoted to a wider mode, convert it back to MODE. */
-- old_val = convert_to_mode (mode, old_val, 1);
-+ /* If VAL is promoted to a wider mode, convert it back to MODE. Take care
-+ of CONST_INTs, where we know the old_mode only from the call argument. */
-+ old_mode = GET_MODE (old_val);
-+ if (old_mode == VOIDmode)
-+ old_mode = TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist)));
-+ old_val = convert_modes (mode, old_mode, old_val, 1);
-
- arglist = TREE_CHAIN (arglist);
- new_val = expand_expr (TREE_VALUE (arglist), NULL, mode, EXPAND_NORMAL);
-- /* If NEW_VAL is promoted to a wider mode, convert it back to MODE. */
-- new_val = convert_to_mode (mode, new_val, 1);
-+ /* If VAL is promoted to a wider mode, convert it back to MODE. Take care
-+ of CONST_INTs, where we know the old_mode only from the call argument. */
-+ old_mode = GET_MODE (new_val);
-+ if (old_mode == VOIDmode)
-+ old_mode = TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist)));
-+ new_val = convert_modes (mode, old_mode, new_val, 1);
-
- if (is_bool)
- return expand_bool_compare_and_swap (mem, old_val, new_val, target);
-@@ -5548,14 +5562,19 @@
- rtx target)
+--- gcc/DATESTAMP (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/DATESTAMP (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1 +1 @@
+-20070514
++20070603
+Index: gcc/pointer-set.c
+===================================================================
+--- gcc/pointer-set.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/pointer-set.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -22,13 +22,12 @@
+ #include "system.h"
+ #include "pointer-set.h"
+
+-/* A pointer sets is represented as a simple open-addressing hash
++/* A pointer set is represented as a simple open-addressing hash
+ table. Simplifications: The hash code is based on the value of the
+ pointer, not what it points to. The number of buckets is always a
+ power of 2. Null pointers are a reserved value. Deletion is not
+- supported. There is no mechanism for user control of hash
+- function, equality comparison, initial size, or resizing policy.
+-*/
++ supported (yet). There is no mechanism for user control of hash
++ function, equality comparison, initial size, or resizing policy. */
+
+ struct pointer_set_t
{
- rtx val, mem;
-+ enum machine_mode old_mode;
-
- /* Expand the operands. */
- mem = get_builtin_sync_mem (TREE_VALUE (arglist), mode);
-
- arglist = TREE_CHAIN (arglist);
- val = expand_expr (TREE_VALUE (arglist), NULL, mode, EXPAND_NORMAL);
-- /* If VAL is promoted to a wider mode, convert it back to MODE. */
-- val = convert_to_mode (mode, val, 1);
-+ /* If VAL is promoted to a wider mode, convert it back to MODE. Take care
-+ of CONST_INTs, where we know the old_mode only from the call argument. */
-+ old_mode = GET_MODE (val);
-+ if (old_mode == VOIDmode)
-+ old_mode = TYPE_MODE (TREE_TYPE (TREE_VALUE (arglist)));
-+ val = convert_modes (mode, old_mode, val, 1);
-
- return expand_sync_lock_test_and_set (mem, val, target);
+@@ -114,22 +113,16 @@
+ }
}
-Index: gcc-4_2-branch/gcc/fold-const.c
-===================================================================
---- gcc-4_2-branch/gcc/fold-const.c (revision 123014)
-+++ gcc-4_2-branch/gcc/fold-const.c (revision 124164)
-@@ -7052,7 +7052,7 @@
- {
- tree type = TREE_TYPE (expr);
- int total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
-- int byte, offset, word, words;
-+ int byte, offset, word, words, bitpos;
- unsigned char value;
- /* There are always 32 bits in each long, no matter the size of
-@@ -7062,19 +7062,20 @@
-
- if (total_bytes > len)
- return 0;
-- words = total_bytes / UNITS_PER_WORD;
-+ words = 32 / UNITS_PER_WORD;
-
- real_to_target (tmp, TREE_REAL_CST_PTR (expr), TYPE_MODE (type));
-
-- for (byte = 0; byte < total_bytes; byte++)
-+ for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
-+ bitpos += BITS_PER_UNIT)
+-/* Subroutine of pointer_set_insert. Inserts P into an empty
+- element of SLOTS, an array of length N_SLOTS. Returns nonzero
+- if P was already present in N_SLOTS. */
+-static int
++/* Subroutine of pointer_set_insert. Return the insertion slot for P into
++ an empty element of SLOTS, an array of length N_SLOTS. */
++static inline size_t
+ insert_aux (void *p, void **slots, size_t n_slots, size_t log_slots)
+ {
+ size_t n = hash1 (p, n_slots, log_slots);
+ while (true)
{
-- int bitpos = byte * BITS_PER_UNIT;
-+ byte = (bitpos / BITS_PER_UNIT) & 3;
- value = (unsigned char) (tmp[bitpos / 32] >> (bitpos & 31));
-
-- if (total_bytes > UNITS_PER_WORD)
-+ if (UNITS_PER_WORD < 4)
- {
- word = byte / UNITS_PER_WORD;
-- if (FLOAT_WORDS_BIG_ENDIAN)
-+ if (WORDS_BIG_ENDIAN)
- word = (words - 1) - word;
- offset = word * UNITS_PER_WORD;
- if (BYTES_BIG_ENDIAN)
-@@ -7083,8 +7084,8 @@
- offset += byte % UNITS_PER_WORD;
- }
+- if (slots[n] == p)
+- return 1;
+- else if (slots[n] == 0)
+- {
+- slots[n] = p;
+- return 0;
+- }
++ if (slots[n] == p || slots[n] == 0)
++ return n;
else
-- offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
-- ptr[offset] = value;
-+ offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
-+ ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)] = value;
- }
- return total_bytes;
- }
-@@ -7241,7 +7242,7 @@
+ {
+ ++n;
+@@ -144,12 +137,10 @@
+ int
+ pointer_set_insert (struct pointer_set_t *pset, void *p)
{
- enum machine_mode mode = TYPE_MODE (type);
- int total_bytes = GET_MODE_SIZE (mode);
-- int byte, offset, word, words;
-+ int byte, offset, word, words, bitpos;
- unsigned char value;
- /* There are always 32 bits in each long, no matter the size of
- the hosts long. We handle floating point representations with
-@@ -7252,16 +7253,17 @@
- total_bytes = GET_MODE_SIZE (TYPE_MODE (type));
- if (total_bytes > len || total_bytes > 24)
- return NULL_TREE;
-- words = total_bytes / UNITS_PER_WORD;
-+ words = 32 / UNITS_PER_WORD;
-
- memset (tmp, 0, sizeof (tmp));
-- for (byte = 0; byte < total_bytes; byte++)
-+ for (bitpos = 0; bitpos < total_bytes * BITS_PER_UNIT;
-+ bitpos += BITS_PER_UNIT)
+- if (insert_aux (p, pset->slots, pset->n_slots, pset->log_slots))
+- return 1;
+-
+- /* We've inserted a new element. Expand the table if necessary to keep
+- the load factor small. */
+- ++pset->n_elements;
++ size_t n;
++
++ /* For simplicity, expand the set even if P is already there. This can be
++ superfluous but can happen at most once. */
+ if (pset->n_elements > pset->n_slots / 4)
{
-- int bitpos = byte * BITS_PER_UNIT;
-- if (total_bytes > UNITS_PER_WORD)
-+ byte = (bitpos / BITS_PER_UNIT) & 3;
-+ if (UNITS_PER_WORD < 4)
- {
- word = byte / UNITS_PER_WORD;
-- if (FLOAT_WORDS_BIG_ENDIAN)
-+ if (WORDS_BIG_ENDIAN)
- word = (words - 1) - word;
- offset = word * UNITS_PER_WORD;
- if (BYTES_BIG_ENDIAN)
-@@ -7270,8 +7272,8 @@
- offset += byte % UNITS_PER_WORD;
- }
- else
-- offset = BYTES_BIG_ENDIAN ? (total_bytes - 1) - byte : byte;
-- value = ptr[offset];
-+ offset = BYTES_BIG_ENDIAN ? 3 - byte : byte;
-+ value = ptr[offset + ((bitpos / BITS_PER_UNIT) & ~3)];
+ size_t new_log_slots = pset->log_slots + 1;
+@@ -158,9 +149,10 @@
+ size_t i;
- tmp[bitpos / 32] |= (unsigned long)value << (bitpos & 31);
- }
-@@ -7732,7 +7734,7 @@
- return fold_build1 (BIT_NOT_EXPR, type, fold_convert (type, tem));
+ for (i = 0; i < pset->n_slots; ++i)
+- {
+- if (pset->slots[i])
+- insert_aux (pset->slots[i], new_slots, new_n_slots, new_log_slots);
++ {
++ void *value = pset->slots[i];
++ n = insert_aux (value, new_slots, new_n_slots, new_log_slots);
++ new_slots[n] = value;
}
-- tem = fold_convert_const (code, type, arg0);
-+ tem = fold_convert_const (code, type, op0);
- return tem ? tem : NULL_TREE;
-
- case VIEW_CONVERT_EXPR:
-@@ -11126,13 +11128,13 @@
- return omit_one_operand (type, integer_zero_node, arg0);
-
- case GE_EXPR:
-- return fold_build2 (EQ_EXPR, type, arg0, arg1);
-+ return fold_build2 (EQ_EXPR, type, op0, op1);
-
- case LE_EXPR:
- return omit_one_operand (type, integer_one_node, arg0);
-
- case LT_EXPR:
-- return fold_build2 (NE_EXPR, type, arg0, arg1);
-+ return fold_build2 (NE_EXPR, type, op0, op1);
-
- /* The GE_EXPR and LT_EXPR cases above are not normally
- reached because of previous transformations. */
-@@ -11147,10 +11149,14 @@
- {
- case GT_EXPR:
- arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
-- return fold_build2 (EQ_EXPR, type, arg0, arg1);
-+ return fold_build2 (EQ_EXPR, type,
-+ fold_convert (TREE_TYPE (arg1), arg0),
-+ arg1);
- case LE_EXPR:
- arg1 = const_binop (PLUS_EXPR, arg1, integer_one_node, 0);
-- return fold_build2 (NE_EXPR, type, arg0, arg1);
-+ return fold_build2 (NE_EXPR, type,
-+ fold_convert (TREE_TYPE (arg1), arg0),
-+ arg1);
- default:
- break;
- }
-@@ -11163,7 +11169,7 @@
- return omit_one_operand (type, integer_zero_node, arg0);
-
- case LE_EXPR:
-- return fold_build2 (EQ_EXPR, type, arg0, arg1);
-+ return fold_build2 (EQ_EXPR, type, op0, op1);
-
- case GE_EXPR:
- return omit_one_operand (type, integer_one_node, arg0);
-@@ -11181,10 +11187,14 @@
- {
- case GE_EXPR:
- arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
-- return fold_build2 (NE_EXPR, type, arg0, arg1);
-+ return fold_build2 (NE_EXPR, type,
-+ fold_convert (TREE_TYPE (arg1), arg0),
-+ arg1);
- case LT_EXPR:
- arg1 = const_binop (MINUS_EXPR, arg1, integer_one_node, 0);
-- return fold_build2 (EQ_EXPR, type, arg0, arg1);
-+ return fold_build2 (EQ_EXPR, type,
-+ fold_convert (TREE_TYPE (arg1), arg0),
-+ arg1);
- default:
- break;
- }
-@@ -11200,12 +11210,11 @@
- and X >= signed_max+1 because previous transformations. */
- if (code == LE_EXPR || code == GT_EXPR)
- {
-- tree st0, st1;
-- st0 = lang_hooks.types.signed_type (TREE_TYPE (arg0));
-- st1 = lang_hooks.types.signed_type (TREE_TYPE (arg1));
-- return fold_build2 (code == LE_EXPR ? GE_EXPR: LT_EXPR,
-- type, fold_convert (st0, arg0),
-- build_int_cst (st1, 0));
-+ tree st;
-+ st = lang_hooks.types.signed_type (TREE_TYPE (arg1));
-+ return fold_build2 (code == LE_EXPR ? GE_EXPR : LT_EXPR,
-+ type, fold_convert (st, arg0),
-+ build_int_cst (st, 0));
- }
- }
- }
-Index: gcc-4_2-branch/gcc/omp-low.c
-===================================================================
---- gcc-4_2-branch/gcc/omp-low.c (revision 123014)
-+++ gcc-4_2-branch/gcc/omp-low.c (revision 124164)
-@@ -2421,6 +2421,7 @@
- block_stmt_iterator si;
- tree entry_stmt;
- edge e;
-+ bool do_cleanup_cfg = false;
-
- entry_stmt = last_stmt (region->entry);
- child_fn = OMP_PARALLEL_FN (entry_stmt);
-@@ -2456,6 +2457,7 @@
- exit_succ_e = single_succ_edge (exit_bb);
- make_edge (new_bb, exit_succ_e->dest, EDGE_FALLTHRU);
- }
-+ do_cleanup_cfg = true;
+ XDELETEVEC (pset->slots);
+@@ -169,5 +161,144 @@
+ pset->slots = new_slots;
}
- else
- {
-@@ -2546,6 +2548,14 @@
- /* Emit a library call to launch the children threads. */
- expand_parallel_call (region, new_bb, entry_stmt, ws_args);
++ n = insert_aux (p, pset->slots, pset->n_slots, pset->log_slots);
++ if (pset->slots[n])
++ return 1;
+
-+ if (do_cleanup_cfg)
-+ {
-+ /* Clean up the unreachable sub-graph we created above. */
-+ free_dominance_info (CDI_DOMINATORS);
-+ free_dominance_info (CDI_POST_DOMINATORS);
-+ cleanup_tree_cfg ();
-+ }
++ pset->slots[n] = p;
++ ++pset->n_elements;
+ return 0;
}
-
-
-Index: gcc-4_2-branch/gcc/objc/objc-act.c
-===================================================================
---- gcc-4_2-branch/gcc/objc/objc-act.c (revision 123014)
-+++ gcc-4_2-branch/gcc/objc/objc-act.c (revision 124164)
-@@ -3632,7 +3632,7 @@
-
- {
- struct _objc_exception_data _stack;
-- id volatile _rethrow = 0;
-+ id _rethrow = 0;
- try
- {
- objc_exception_try_enter (&_stack);
-@@ -3676,7 +3676,6 @@
-
- rethrow_decl = objc_create_temporary_var (objc_object_type);
- cur_try_context->rethrow_decl = rethrow_decl;
-- TREE_THIS_VOLATILE (rethrow_decl) = 1;
- TREE_CHAIN (rethrow_decl) = stack_decl;
-
- /* Build the outermost variable binding level. */
-Index: gcc-4_2-branch/gcc/ChangeLog
-===================================================================
---- gcc-4_2-branch/gcc/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/gcc/ChangeLog (revision 124164)
-@@ -1,3 +1,334 @@
-+2007-04-25 Anatoly Sokolov <aesok@post.ru>
+
-+ PR target/18989
-+ * config/avr/avr.h (ASM_OUTPUT_ALIGN): Redefine.
++/* Pass each pointer in PSET to the function in FN, together with the fixed
++ parameter DATA. If FN returns false, the iteration stops. */
+
-+2007-04-24 Andrew Pinski <andrew_pinski@playstation.sony.com>
-+ Roger Sayle <roger@eyesopen.com>
++void pointer_set_traverse (struct pointer_set_t *pset,
++ bool (*fn) (void *, void *), void *data)
++{
++ size_t i;
++ for (i = 0; i < pset->n_slots; ++i)
++ if (pset->slots[i] && !fn (pset->slots[i], data))
++ break;
++}
+
-+ PR middle-end/30222
-+ * expmed.c (make_tree): Use the correct type, i.e. the inner
-+ type, when constructing the individual elements of a CONST_VECTOR.
++\f
++/* A pointer map is represented the same way as a pointer_set, so
++ the hash code is based on the address of the key, rather than
++ its contents. Null keys are a reserved value. Deletion is not
++ supported (yet). There is no mechanism for user control of hash
++ function, equality comparison, initial size, or resizing policy. */
+
-+2007-04-24 Ian Lance Taylor <iant@google.com>
++struct pointer_map_t
++{
++ size_t log_slots;
++ size_t n_slots; /* n_slots = 2^log_slots */
++ size_t n_elements;
+
-+ PR tree-optimization/31605
-+ * tree-vrp.c (set_value_range): Check that min and max are not
-+ both overflow infinities.
-+ (set_value_range_to_value): New static function.
-+ (extract_range_from_binary_expr): Call set_value_range_to_value.
-+ (extract_range_from_expr): Likewise.
-+ (extract_range_from_unary_expr): Likewise. Don't create a range
-+ which overflows on both sides.
-+ (vrp_meet): Check for a useless range.
-+ (vrp_visit_phi_node): If we see a constant which looks like an
-+ overflow infinity, turn off the TREE_OVERFLOW flag.
++ void **keys;
++ void **values;
++};
+
-+2007-04-24 Ian Lance Taylor <iant@google.com>
++/* Allocate an empty pointer map. */
++struct pointer_map_t *
++pointer_map_create (void)
++{
++ struct pointer_map_t *result = XNEW (struct pointer_map_t);
+
-+ PR tree-optimization/31602
-+ * tree-ssa-loop-ch.c (copy_loop_headers): Set TREE_NO_WARNING for
-+ conditionals in the copied loop header.
-+ * tree-cfg.c (fold_cond_expr_cond): Don't issue undefined overflow
-+ warnings if TREE_NO_WARNING is set.
-+ * doc/invoke.texi (Warning Options): Clarify that
-+ -Wstrict-overflow does not warn about loops.
++ result->n_elements = 0;
++ result->log_slots = 8;
++ result->n_slots = (size_t) 1 << result->log_slots;
+
-+2007-04-24 Andreas Krebbel <krebbel1@de.ibm.com>
++ result->keys = XCNEWVEC (void *, result->n_slots);
++ result->values = XCNEWVEC (void *, result->n_slots);
++ return result;
++}
+
-+ PR target/31641
-+ * config/s390/s390.c (s390_expand_setmem): Don't ICE for constant length
-+ argument of 0 for memset.
-+ (s390_expand_movmem, s390_expand_setmem, s390_expand_cmpmem): Use
-+ unsigned shift instead of the signed variant.
++/* Reclaims all memory associated with PMAP. */
++void pointer_map_destroy (struct pointer_map_t *pmap)
++{
++ XDELETEVEC (pmap->keys);
++ XDELETEVEC (pmap->values);
++ XDELETE (pmap);
++}
+
-+2007-04-24 Daniel Franke <franke.daniel@gmail.com>
++/* Returns a pointer to the value to which P maps, if PMAP contains P. P
++ must be nonnull. Return NULL if PMAP does not contain P.
+
-+ * doc/invoke.texi: Removed leading '-' from option index entries.
++ Collisions are resolved by linear probing. */
++void **
++pointer_map_contains (struct pointer_map_t *pmap, void *p)
++{
++ size_t n = hash1 (p, pmap->n_slots, pmap->log_slots);
+
-+2007-04-22 Andrew Pinski <andrew_pinski@playstation.sony.com>
++ while (true)
++ {
++ if (pmap->keys[n] == p)
++ return &pmap->values[n];
++ else if (pmap->keys[n] == 0)
++ return NULL;
++ else
++ {
++ ++n;
++ if (n == pmap->n_slots)
++ n = 0;
++ }
++ }
++}
+
-+ PR middle-end/31448
-+ * expr.c (reduce_to_bit_field_precision): Handle
-+ CONST_INT rtx's.
++/* Inserts P into PMAP if it wasn't already there. Returns a pointer
++ to the value. P must be nonnull. */
++void **
++pointer_map_insert (struct pointer_map_t *pmap, void *p)
++{
++ size_t n;
+
-+2007-04-20 Richard Henderson <rth@redhat.com>
++ /* For simplicity, expand the map even if P is already there. This can be
++ superfluous but can happen at most once. */
++ if (pmap->n_elements > pmap->n_slots / 4)
++ {
++ size_t new_log_slots = pmap->log_slots + 1;
++ size_t new_n_slots = pmap->n_slots * 2;
++ void **new_keys = XCNEWVEC (void *, new_n_slots);
++ void **new_values = XCNEWVEC (void *, new_n_slots);
++ size_t i;
++
++ for (i = 0; i < pmap->n_slots; ++i)
++ if (pmap->keys[i])
++ {
++ void *key = pmap->keys[i];
++ n = insert_aux (key, new_keys, new_n_slots, new_log_slots);
++ new_keys[n] = key;
++ new_values[n] = pmap->values[i];
++ }
+
-+ PR target/28623
-+ * config/alpha/alpha.c (get_unaligned_address): Remove extra_offset
-+ argument; update all callers.
-+ (get_unaligned_offset): New.
-+ * config/alpha/alpha.md (extendqidi2, extendhidi2): Don't use
-+ get_unaligned_address, just pass on the address directly.
-+ (unaligned_extendqidi): Use gen_lowpart instead of open-coding
-+ the subreg in the helper patterns.
-+ (unaligned_extendqidi_le): Use get_unaligned_offset.
-+ (unaligned_extendqidi_be, unaligned_extendhidi_le): Likewise.
-+ (unaligned_extendhidi_be): Likewise.
-+ (unaligned_extendhidi): Tidy.
-+ * config/alpha/alpha-protos.h: Update.
++ XDELETEVEC (pmap->keys);
++ XDELETEVEC (pmap->values);
++ pmap->n_slots = new_n_slots;
++ pmap->log_slots = new_log_slots;
++ pmap->keys = new_keys;
++ pmap->values = new_values;
++ }
+
-+2007-04-21 Richard Guenther <rguenther@suse.de>
++ n = insert_aux (p, pmap->keys, pmap->n_slots, pmap->log_slots);
++ if (!pmap->keys[n])
++ {
++ ++pmap->n_elements;
++ pmap->keys[n] = p;
++ }
+
-+ PR middle-end/31136
-+ * fold-const.c (fold_unary): Call fold_convert_const on the
-+ original tree.
++ return &pmap->values[n];
++}
+
-+2007-04-20 Richard Henderson <rth@redhat.com>
++/* Pass each pointer in PMAP to the function in FN, together with the pointer
++ to the value and the fixed parameter DATA. If FN returns false, the
++ iteration stops. */
+
-+ * config/alpha/linux.h (CPP_SPEC): Undef before redefine.
++void pointer_map_traverse (struct pointer_map_t *pmap,
++ bool (*fn) (void *, void **, void *), void *data)
++{
++ size_t i;
++ for (i = 0; i < pmap->n_slots; ++i)
++ if (pmap->keys[i] && !fn (pmap->keys[i], &pmap->values[i], data))
++ break;
++}
+Index: gcc/pointer-set.h
+===================================================================
+--- gcc/pointer-set.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/pointer-set.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -22,11 +22,21 @@
+ #define POINTER_SET_H
+
+ struct pointer_set_t;
+-
+ struct pointer_set_t *pointer_set_create (void);
+ void pointer_set_destroy (struct pointer_set_t *pset);
+
+ int pointer_set_contains (struct pointer_set_t *pset, void *p);
+ int pointer_set_insert (struct pointer_set_t *pset, void *p);
++void pointer_set_traverse (struct pointer_set_t *, bool (*) (void *, void *),
++ void *);
+
++struct pointer_map_t;
++struct pointer_map_t *pointer_map_create (void);
++void pointer_map_destroy (struct pointer_map_t *pmap);
+
-+2007-04-20 Bernd Schmidt <bernd.schmidt@analog.com>
++void **pointer_map_contains (struct pointer_map_t *pmap, void *p);
++void **pointer_map_insert (struct pointer_map_t *pmap, void *p);
++void pointer_map_traverse (struct pointer_map_t *,
++ bool (*) (void *, void **, void *), void *);
+
-+ * reload.c (combine_reloads): When trying to use a dying register,
-+ check whether it's uninitialized and don't use if so.
+ #endif /* POINTER_SET_H */
+Index: gcc/fold-const.c
+===================================================================
+--- gcc/fold-const.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fold-const.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -12634,9 +12634,14 @@
+ /* ... fall through ... */
+
+ default:
+- if (truth_value_p (TREE_CODE (t)))
+- /* Truth values evaluate to 0 or 1, which is nonnegative. */
+- return 1;
++ {
++ tree type = TREE_TYPE (t);
++ if ((TYPE_PRECISION (type) != 1 || TYPE_UNSIGNED (type))
++ && truth_value_p (TREE_CODE (t)))
++ /* Truth values evaluate to 0 or 1, which is nonnegative unless we
++ have a signed:1 type (where the value is -1 and 0). */
++ return true;
++ }
+ }
+
+ /* We don't know sign of `t', so be conservative and return false. */
+Index: gcc/DEV-PHASE
+===================================================================
+--- gcc/DEV-PHASE (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/DEV-PHASE (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1 @@
++prerelease
+Index: gcc/ChangeLog
+===================================================================
+--- gcc/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,174 @@
++2007-05-31 H.J. Lu <hongjiu.lu@intel.com>
+
-+2007-04-20 Jakub Jelinek <jakub@redhat.com>
++ Backport from mainline:
++ 2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
+
-+ * config/i386/i386.c (bdesc_2arg): Use ORDERED rather than UNORDERED
-+ for __builtin_ia32_cmpordss.
++ * config/i386/i386.c (__builtin_ia32_vec_ext_v2df): Mark it
++ with MASK_SSE2.
++ (__builtin_ia32_vec_ext_v2di): Likewise.
++ (__builtin_ia32_vec_ext_v4si): Likewise.
++ (__builtin_ia32_vec_ext_v8hi): Likewise.
++ (__builtin_ia32_vec_set_v8hi): Likewise.
+
-+ PR tree-optimization/31632
-+ * fold-const.c (fold_binary): Use op0 and op1 instead of arg0
-+ and arg1 for optimizations of comparison against min/max values.
-+ Fold arg0 to arg1's type for optimizations of comparison against
-+ min+1 and max-1 values.
++2007-05-31 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
+
-+2007-04-19 Eric Botcazou <ebotcazou@libertysurf.fr>
++ Backport from mainline:
++ 2007-05-05 Aurelien Jarno <aurelien@aurel32.net>
+
-+ PR rtl-optimization/29841
-+ * cfgbuild.c (control_flow_insn_p): Return TRUE for unconditional
-+ trap instructions.
-+ * sched-deps.c (sched_analyze_insn): Prevent all non-jump instructions
-+ that may cause control flow transfer from being moved.
++ * config/pa/pa.md: Split tgd_load, tld_load and tie_load
++ into pic and non-pic versions. Mark r19 as used for
++ tgd_load_pic, tld_load_pic and tie_load_pic. Mark r27 as used
++ for tgd_load, tld_load and tie_load .
++ * config/pa/pa.c (legitimize_tls_address): Emit pic or non-pic
++ version of tgd_load, tld_load and tie_load depending on the
++ value of flag_pic.
+
-+2007-04-18 Anatoly Sokolov <aesok@post.ru>
++2007-05-27 Daniel Berlin <dberlin@dberlin.org>
+
-+ * config/avr/avr.c (ptrreg_to_str): Replace error() with
-+ output_operand_lossage().
++ Fix PR/30052
++ Backport PTA solver from mainline
+
-+2007-04-17 Anatoly Sokolov <aesok@post.ru>
++ * pointer-set.c: Copy from mainline
++ * pointer-set.h: Ditto.
++ * tree-ssa-structalias.c: Copy solver portions from mainline.
++ * Makefile.in (tree-ssa-structalias.o): Update dependencies
+
-+ PR target/30483
-+ * config/avr/avr.c (ptrreg_to_str): Replace gcc_unreachable() with
-+ error().
++2007-05-30 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
+
-+2007-04-17 Jan Hubicka <jh@suse.cz>
++ * tree-vrp.c (compare_names): Initialize sop.
+
-+ PR middle-end/30700
-+ * dwarf2out.c (reference_to_unused): Ask cgraph for functions
-+ availablility; add more sanity checking; ask varpool only about
-+ VAR_DECL.
++2007-05-30 Jakub Jelinek <jakub@redhat.com>
+
-+2007-04-17 H.J. Lu <hongjiu.lu@intel.com>
++ PR tree-optimization/31769
++ * except.c (duplicate_eh_regions): Clear prev_try if
++ ERT_MUST_NOT_THROW region is inside of ERT_TRY region.
+
-+ * Backport from mainline:
-+ 2007-04-17 H.J. Lu <hongjiu.lu@intel.com>
++2007-05-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
-+ * config/i386/sse.md (sse_vmaddv4sf3): Use register_operand
-+ on "0".
-+ (sse_vmmulv4sf3): Likewise.
-+ (sse2_vmaddv2df3): Likewise.
-+ (sse2_vmmulv2df3): Likewise.
++ PR tree-opt/32100
++ * fold-const.c (tree_expr_nonnegative_warnv_p): Don't
++ return true when truth_value_p is true and the type
++ is of signed:1.
+
-+2007-04-16 Matthias Klose <doko@debian.org>
++2007-05-27 H.J. Lu <hongjiu.lu@intel.com>
+
-+ * config/alpha/linux.h (CPP_SPEC): Define.
-+ * config/arm/linux-gas.h (SUBTARGET_CPP_SPEC): Extend.
++ Backport from mainline:
++ 2007-05-25 Uros Bizjak <ubizjak@gmail.com>
++
++ * config/i386/sse.md (*vec_extractv2di_1_sse2): Do not calculate
++ "memory" attribute for "sseishft" type insn without operands[2].
++
++ 2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
++
++ * config/i386/sse.md (*vec_extractv2di_1_sse2): Correct shift.
++
++2007-05-22 Ian Lance Taylor <iant@google.com>
++
++ * tree-vrp.c (avoid_overflow_infinity): New static function,
++ broken out of set_value_range_to_value.
++ (set_value_range_to_value): Call avoid_overflow_infinity.
++ (extract_range_from_assert): Likewise.
++
++2007-05-23 Chen Liqin <liqin@sunnorth.com.cn>
++
++ PR target/30987
++ * config/score/misc.md (bitclr_c, bitset_c, bittgl_c): remove.
++ * config/score/predicate.md (const_pow2, const_npow2): remove.
++ * config/score/score.h (ASM_OUTPUT_EXTERNAL): add ASM_OUTPUT_EXTERNAL undef.
++ PR target/30474
++ * config/score/score.c (score_print_operand): makes sure that only lower
++ bits are used.
++
++2007-05-21 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/31167
++ Backport from mainline.
++ * config/i386/i386.md (*addti3_1, *addti3_1 splitter): Use
++ x86_64_general_operand as operand[2] predicate. Remove "iF"
++ from operand constraints and use "e" constraint instead.
++ (*subti3_1, *subti3_1 splitter): Ditto.
++ (*negti2_1, *negti2_1 splitter): Use nonimmediate_operand as
++ operand[1] predicate.
++
++2007-05-21 Uros Bizjak <ubizjak@gmail.com>
++
++ PR target/30041
++ Backport from mainline.
++ * config/i386/sse.md ("*sse3_movddup"): Use operands[0] and
++ operands[1] in insn constraint. Correct type attribute to sselog1.
++
++2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
++
++ PR target/31701
++ Backport from mainline.
++ * config/sh/sh.c (output_stack_adjust): Avoid using the frame
++ register itself to hold the offset constant. Tell flow the use
++ of r4 and r5 when they are used.
++
++2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
++
++ PR target/31480
++ Backport from mainline.
++ * config/sh/sh.md (length): Check if prev_nonnote_insn (insn)
++ is null.
++
++2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
++
++ PR target/31022
++ Backport from mainline.
++ * config/sh/sh.c (sh_adjust_cost): Use the result of single_set
++ instead of PATTERN.
++
++2007-05-20 Kaz Kojima <kkojima@gcc.gnu.org>
++
++ PR target/27405
++ Backport from mainline.
++ * config/sh/sh.md (cmp{eq,gt,gtu}{si,di}_media): Remove.
++ (cmpsi{eq,gt,gtu}{si,di}_media): Rename to
++ cmp{eq,gt,gtu}{si,di}_media.
++ (*cmpne0si_media): Remove.
++ (*movsicc_umin): Adjust gen_cmp*_media call.
++ (unordered): Change the mode of unordered and operands[1] to
++ SImode.
++ (seq): Adjust gen_cmp*_media calls. Make the mode of
++ a temporary result of compare SImode if needed. If the mode
++ of operands[0] is DImode, extend the temporary result to DImode.
++ (slt, sle, sgt, sge, sgtu, sltu, sleu, sgue, sne): Likewise.
++ (sunorderd): Change the mode of match_operand and unorderd to
++ SImode.
++ (cmpeq{sf,df}_media): Remove.
++ (cmpsieq{sf,df}_media): Rename to cmpeq{sf,df}_media.
++ (cmp{gt,ge,un}{sf,df}_media): Change the mode of match_operand
++ and compare operation to SImode.
++
++2007-05-18 Joseph Myers <joseph@codesourcery.com>
++
++ * config/soft-fp/double.h, config/soft-fp/extended.h,
++ config/soft-fp/floatundidf.c, config/soft-fp/floatundisf.c,
++ config/soft-fp/floatunsidf.c, config/soft-fp/floatunsisf.c,
++ config/soft-fp/op-2.h, config/soft-fp/op-4.h,
++ config/soft-fp/op-common.h, config/soft-fp/quad.h: Update from
++ glibc CVS.
++
++2007-05-17 Ian Lance Taylor <iant@google.com>
++
++ PR tree-optimization/31953
++ * tree-vrp.c (set_value_range_to_value): Add equiv parameter.
++ Change all callers.
++ (set_value_range_to_null): Call set_value_range_to_value.
++ (extract_range_from_comparison): Likewise.
++
++2007-05-17 Eric Botcazou <ebotcazou@libertysurf.fr>
++
++ PR rtl-optimization/31691
++ * combine.c (simplify_set): Build a new src pattern instead of
++ substituting its operands in the COMPARE case.
++
++2007-05-14 Mark Mitchell <mark@codesourcery.com>
++
++ * BASE-VER: Set to 4.2.1.
++ * DEV-PHASE: Set to prerelease.
++
+ 2007-05-13 Release Manager
+
+ * GCC 4.2.0 released.
+@@ -307,7 +478,8 @@
+ 2007-04-03 Stuart Hastings <stuart@apple.com>
+
+ PR 31281
+- * objc/objc-act.c (next_sjlj_build_catch_list): Delete volatile from rethrow decl.
++ * objc/objc-act.c (next_sjlj_build_catch_list): Delete volatile
++ from rethrow decl.
+ * cse.c (record_jump_equiv): Bail out on CCmode comparisons.
+
+ 2007-04-03 Jakub Jelinek <jakub@redhat.com>
+Index: gcc/testsuite/gcc.c-torture/execute/vrp-7.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/vrp-7.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/vrp-7.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,20 @@
++
++void abort (void);
+
-+2007-04-16 Anatoly Sokolov <aesok@post.ru>
++struct T
++{
++ int b : 1;
++} t;
+
-+ * config/avr/avr.c (avr_arch_types): Rearranging array.
-+ (enum avr_arch): Add.
-+ (avr_mcu_types): Use avr_arch enumeration constants instead of
-+ numbers.
-+ * config/avr/avr.h (LINK_SPEC): Simplify.
++void __attribute__((noinline)) foo (int f)
++{
++ t.b = (f & 0x10) ? 1 : 0;
++}
+
-+2007-04-16 Jan Hubicka <jh@suse.cz>
++int main (void)
++{
++ foo (0x10);
++ if (!t.b)
++ abort ();
++ return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/execute/20070517-1.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/execute/20070517-1.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.c-torture/execute/20070517-1.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,41 @@
++/* PR rtl-optimization/31691 */
++/* Origin: Chi-Hua Chen <stephaniechc-gccbug@yahoo.com> */
+
-+ PR target/27869
-+ * config/i386/sse.md
-+ (sse_vmaddv4sf3, sse_vmmulv4sf3): Remove '%' modifier.
-+ (sse_vmsmaxv4sf3_finite, sse_vmsminv4sf3_finite): Remove.
-+ (sse2_vmaddv2df3, sse2_vmmulv2df3): Remove '%' modifier.
-+ (sse2_vmsmaxv2df3_finite, sse2_vmsminv2df3_finite): Remove.
++extern void abort (void);
+
-+2007-04-16 H.J. Lu <hongjiu.lu@intel.com>
++static int get_kind(int) __attribute__ ((noinline));
+
-+ * Backport from mainline:
-+ 2007-04-16 H.J. Lu <hongjiu.lu@intel.com>
++static int get_kind(int v)
++{
++ volatile int k = v;
++ return k;
++}
+
-+ PR target/31582
-+ * config/i386/i386.c (ix86_expand_vec_set_builtin): Make a
-+ copy of source, pass it to ix86_expand_vector_set and return
-+ it as target.
++static int some_call(void) __attribute__ ((noinline));
+
-+2007-04-14 Andrew Pinski <andrew_pinski@playstation.sony.com>
++static int some_call(void)
++{
++ return 0;
++}
+
-+ PR c/31520
-+ * c-decl.c (finish_decl): Grab the type of the decl after the call
-+ to store_init_value.
++static void example (int arg)
++{
++ int tmp, kind = get_kind (arg);
+
-+2007-04-14 Jakub Jelinek <jakub@redhat.com>
++ if (kind == 9 || kind == 10 || kind == 5)
++ {
++ if (some_call() == 0)
++ {
++ if (kind == 9 || kind == 10)
++ tmp = arg;
++ else
++ abort();
++ }
++ }
++}
+
-+ PR c++/25874
-+ * omp-low.c (expand_omp_parallel): If child_cfun->cfg, free dominators,
-+ post dominators and cleanup cfg before returning.
++int main(void)
++{
++ example(10);
++ return 0;
++}
+Index: gcc/testsuite/gcc.c-torture/compile/pr31953.c
+===================================================================
+--- gcc/testsuite/gcc.c-torture/compile/pr31953.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.c-torture/compile/pr31953.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,14 @@
++struct WView
++{
++ int hexedit_mode:1;
++};
++toggle_hexedit_mode (struct WView *view)
++{
++ if (view->hexedit_mode)
++ {
++ }
++ else
++ {
++ view->hexedit_mode = !view->hexedit_mode;
++ }
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-vec-3.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-vec-3.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-vec-3.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,37 @@
++/* { dg-do run { target i?86-*-* x86_64-*-* } } */
++/* { dg-options "-O2 -msse2" } */
+
-+2007-04-11 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
++#include "sse2-check.h"
+
-+ * pa.c (pa_som_asm_init_sections): Ensure that cfun->machine is not
-+ null before emitting a .nsubspa directive.
++#include <emmintrin.h>
+
-+2007-04-08 Anatoly Sokolov <aesok@post.ru>
++static void
++sse2_test (void)
++{
++ union
++ {
++ __m128i x;
++ char c[16];
++ short s[8];
++ int i[4];
++ long long ll[2];
++ } val1;
++ int res[4];
++ int masks[4];
++ int i;
++
++ for (i = 0; i < 16; i++)
++ val1.c[i] = i;
++
++ res[0] = __builtin_ia32_vec_ext_v4si ((__v4si)val1.x, 0);
++ res[1] = __builtin_ia32_vec_ext_v4si ((__v4si)val1.x, 1);
++ res[2] = __builtin_ia32_vec_ext_v4si ((__v4si)val1.x, 2);
++ res[3] = __builtin_ia32_vec_ext_v4si ((__v4si)val1.x, 3);
++
++ for (i = 0; i < 4; i++)
++ masks[i] = i;
++
++ for (i = 0; i < 4; i++)
++ if (res[i] != val1.i [masks[i]])
++ abort ();
++}
+Index: gcc/testsuite/gcc.target/i386/pr31167.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/pr31167.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/pr31167.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,20 @@
++/* { dg-do compile { target x86_64-*-* } } */
++/* { dg-options "-O" } */
+
-+ PR target/29932
-+ * config/avr/predicates.md (io_address_operand): Delete predicate.
-+ (low_io_address_operand): Don't use 'mode' argument.
-+ (higth_io_address_operand): Rename ...
-+ (high_io_address_operand): ... to this. Don't use 'mode' argument.
-+ * config/avr/avr.md (*sbix_branch_tmp, *sbix_branch_tmp_bit7): Adjust
-+ for above change.
++typedef int int32_t;
+
-+2007-04-07 Anatoly Sokolov <aesok@post.ru>
++int32_t round32hi (const __int128_t arg)
++{
++ const int SHIFT = 96;
++ const int mshift = 96;
++ const __int128_t M = (~(__int128_t) 0) << mshift;
++ const __int128_t L = (~M) + 1;
++ const __int128_t L1 = ((__int128_t) L) >> 1;
++ const __int128_t Mlo = ((__int128_t) (~M)) >> 1;
++ __int128_t vv = arg & M;
++
++ if ((arg & (L1)) && ((arg & Mlo) || (arg & L)))
++ vv += L;
++
++ return (int32_t) (vv >> SHIFT);
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-vec-4.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-vec-4.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-vec-4.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,41 @@
++/* { dg-do run { target i?86-*-* x86_64-*-* } } */
++/* { dg-options "-O2 -msse2" } */
+
-+ PR target/30289
-+ * config/avr/avr.md (*clrmemqi, *clrmemhi): Mark operand 4 as
-+ earlyclobber.
++#include "sse2-check.h"
+
-+2007-04-05 Anatoly Sokolov <aesok@post.ru>
++#include <emmintrin.h>
+
-+ PR target/25448
-+ * config/avr/avr.c (avr_handle_fndecl_attribute): Use the
-+ DECL_ASSEMBLER_NAME, not the DECL_NAME.
++static void
++sse2_test (void)
++{
++ union
++ {
++ __m128i x;
++ char c[16];
++ short s[8];
++ int i[4];
++ long long ll[2];
++ } val1;
++ short res[8];
++ int masks[8];
++ int i;
++
++ for (i = 0; i < 16; i++)
++ val1.c[i] = i;
++
++ res[0] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 0);
++ res[1] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 1);
++ res[2] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 2);
++ res[3] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 3);
++ res[4] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 4);
++ res[5] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 5);
++ res[6] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 6);
++ res[7] = __builtin_ia32_vec_ext_v8hi ((__v8hi)val1.x, 7);
++
++ for (i = 0; i < 8; i++)
++ masks[i] = i;
++
++ for (i = 0; i < 8; i++)
++ if (res[i] != val1.s [masks[i]])
++ abort ();
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-check.h
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-check.h (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-check.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,20 @@
++#include <stdio.h>
++#include <stdlib.h>
+
-+2007-04-04 Richard Henderson <rth@redhat.com>
++#include "../../gcc.dg/i386-cpuid.h"
+
-+ PR target/31361
-+ * config/i386/i386.c (ix86_init_mmx_sse_builtins): Remove
-+ v8hi_ftype_v8hi_v2di, v4si_ftype_v4si_v2di. Use like-types for
-+ the variable shift builtins.
-+ (ix86_expand_builtin): Properly expand the variable shift builtins.
-+ * config/i386/sse.md (ashr<mode>3, lshr<mode>3, ashl<mode>3): Make
-+ operand 2 be TImode.
-+ * config/i386/emmintrin.h (_mm_slli_epi16, _mm_slli_epi32,
-+ _mm_slli_epi64, _mm_srai_epi16, _mm_srai_epi32, _mm_srli_epi16,
-+ _mm_srli_epi32, _mm_srli_epi64): Turn into macros.
-+ (_mm_srli_si128, _mm_srli_si128): Fix disabled inline versions.
-+ (_mm_sll_epi16, _mm_sll_epi32, _mm_sll_epi64, _mm_sra_epi16,
-+ _mm_sra_epi32, _mm_srl_epi16, _mm_srl_epi32, _mm_srl_epi64): Use
-+ two-vector shift builtins.
++static void sse2_test (void);
+
-+2007-04-04 Chen liqin <liqin@sunnorth.com.cn>
++int
++main ()
++{
++ unsigned long cpu_facilities;
++
++ cpu_facilities = i386_cpuid_edx ();
+
-+ * config/score/crti.asm: Change _bss_start to __bss_start.
-+ * config/score/score.h (CONDITIONAL_REGISTER_USAGE): Added.
-+ (OUTGOING_REG_PARM_STACK_SPACE) update.
-+ * config/score/score.opt: add options to make backend support
-+ score5, score5u, score7 and score7d.
-+ * config/score/score.md: Likewise.
-+ * config/score/misc.md: Likewise.
-+ * config/score/mac.md: Likewise.
-+ * doc/invoke.texi: Likewise.
-+ * doc/md.texi: update constraints define.
++ /* Run SSE2 test only if host has SSE2 support. */
++ if ((cpu_facilities & bit_SSE2))
++ sse2_test ();
+
-+2007-04-03 Stuart Hastings <stuart@apple.com>
++ exit (0);
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-vec-1.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-vec-1.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-vec-1.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,35 @@
++/* { dg-do run { target i?86-*-* x86_64-*-* } } */
++/* { dg-options "-O2 -msse2" } */
+
-+ PR 31281
-+ * objc/objc-act.c (next_sjlj_build_catch_list): Delete volatile from rethrow decl.
-+ * cse.c (record_jump_equiv): Bail out on CCmode comparisons.
++#include "sse2-check.h"
+
-+2007-04-03 Jakub Jelinek <jakub@redhat.com>
++#include <emmintrin.h>
+
-+ PR middle-end/30704
-+ * fold-const.c (native_encode_real): Encode real.c provided longs
-+ as a series of 32-bit native integers.
-+ (native_interpret_real): Interpret buffer as a series of 32-bit
-+ native integers.
++#define msk0 0
++#define msk1 1
+
-+2007-04-02 Eric Christopher <echristo@apple.com>
++static void
++sse2_test (void)
++{
++ union
++ {
++ __m128d x;
++ double d[2];
++ } val1;
++ double res[2];
++ int masks[2];
++ int i;
+
-+ * doc/invoke.texi (i386 and x86-64 Options): Document -m64
-+ limitations on darwin.
++ val1.d[0] = 23.;
++ val1.d[1] = 45;
+
-+2007-04-02 Anatoly Sokolov <aesok@post.ru>
++ res[0] = __builtin_ia32_vec_ext_v2df ((__v2df)val1.x, msk0);
++ res[1] = __builtin_ia32_vec_ext_v2df ((__v2df)val1.x, msk1);
+
-+ PR target/31137
-+ * config/avr/avr.c (avr_rtx_costs): Add missing 'break' statements.
++ masks[0] = msk0;
++ masks[1] = msk1;
+
-+2007-04-02 H.J. Lu <hongjiu.lu@intel.com>
++ for (i = 0; i < 2; i++)
++ if (res[i] != val1.d [masks[i]])
++ abort ();
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-vec-5.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-vec-5.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-vec-5.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,49 @@
++/* { dg-do run { target i?86-*-* x86_64-*-* } } */
++/* { dg-options "-O2 -msse2" } */
+
-+ * Backport from mainline:
-+ 2007-03-28 Grigory Zagorodnev <grigory_zagorodnev@linux.intel.com>
++#include "sse2-check.h"
+
-+ PR target/31380
-+ * config/i386/sse.md (uminv16qi3): Use UMIN instead of UMAX.
++#include <emmintrin.h>
+
-+2007-03-30 Anatoly Sokolov <aesok@post.ru>
++static void
++sse2_test (void)
++{
++ union
++ {
++ __m128i x;
++ char c[16];
++ short s[8];
++ int i[4];
++ long long ll[2];
++ } val1;
++ char res[16];
++ int masks[16];
++ int i;
++
++ for (i = 0; i < 16; i++)
++ val1.c[i] = i;
++
++ res[0] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 0);
++ res[1] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 1);
++ res[2] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 2);
++ res[3] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 3);
++ res[4] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 4);
++ res[5] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 5);
++ res[6] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 6);
++ res[7] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 7);
++ res[8] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 8);
++ res[9] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 9);
++ res[10] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 10);
++ res[11] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 11);
++ res[12] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 12);
++ res[13] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 13);
++ res[14] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 14);
++ res[15] = __builtin_ia32_vec_ext_v16qi ((__v16qi)val1.x, 15);
++
++ for (i = 0; i < 16; i++)
++ masks[i] = i;
++
++ for (i = 0; i < 16; i++)
++ if (res[i] != val1.c [masks[i]])
++ abort ();
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-vec-2.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-vec-2.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-vec-2.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,35 @@
++/* { dg-do run { target i?86-*-* x86_64-*-* } } */
++/* { dg-options "-O2 -msse2" } */
+
-+ * config/avr/avr.c (avr_override_options): Clear
-+ 'flag_delete_null_pointer_checks'.
++#include "sse2-check.h"
+
-+2007-03-29 Michael Matz <matz@suse.de>
++#include <emmintrin.h>
+
-+ * builtins.c (expand_builtin_sync_operation,
-+ expand_builtin_compare_and_swap,
-+ expand_builtin_lock_test_and_set): Care for extending CONST_INTs
-+ correctly.
++static void
++sse2_test (void)
++{
++ union
++ {
++ __m128i x;
++ char c[16];
++ short s[8];
++ int i[4];
++ long long ll[2];
++ } val1;
++ long long res[2];
++ int masks[2];
++ int i;
++
++ for (i = 0; i < 16; i++)
++ val1.c[i] = i;
++
++ res[0] = __builtin_ia32_vec_ext_v2di ((__v2di)val1.x, 0);
++ res[1] = __builtin_ia32_vec_ext_v2di ((__v2di)val1.x, 1);
++
++ for (i = 0; i < 2; i++)
++ masks[i] = i;
++
++ for (i = 0; i < 2; i++)
++ if (res[i] != val1.ll [masks[i]])
++ abort ();
++}
+Index: gcc/testsuite/gcc.target/i386/sse2-vec-6.c
+===================================================================
+--- gcc/testsuite/gcc.target/i386/sse2-vec-6.c (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gcc.target/i386/sse2-vec-6.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,69 @@
++/* { dg-do run { target i?86-*-* x86_64-*-* } } */
++/* { dg-options "-O2 -msse2" } */
+
-+ * config/i386/sync.md (sync_double_compare_and_swapdi_pic,
-+ sync_double_compare_and_swap_ccdi_pic): Use "SD" as constraint
-+ for operand 3.
++#include "sse2-check.h"
+
-+2007-03-28 Mike Stump <mrs@apple.com>
-+
-+ * config/darwin9.h (ASM_OUTPUT_ALIGNED_COMMON): Add.
-+ * config/darwin.h (MAX_OFILE_ALIGNMENT): Fix.
-+ * config/rs6000/darwin.h (ASM_OUTPUT_ALIGNED_COMMON): Removed #undef.
++#include <emmintrin.h>
++#include <string.h>
+
-+2007-03-27 Anatoly Sokolov <aesok@post.ru>
++static void
++sse2_test (void)
++{
++ union
++ {
++ __m128i x;
++ char c[16];
++ short s[8];
++ int i[4];
++ long long ll[2];
++ } val1, res[16], tmp;
++ short ins[8] = { 8, 5, 9, 4, 2, 6, 1, 20 };
++ int masks[8];
++ int i;
++
++ for (i = 0; i < 16; i++)
++ val1.c[i] = i;
++
++ res[0].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 0);
++ res[1].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 1);
++ res[2].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 2);
++ res[3].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 3);
++ res[4].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 4);
++ res[5].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 5);
++ res[6].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 6);
++ res[7].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[0], 7);
++
++ for (i = 0; i < 8; i++)
++ masks[i] = i;
++
++ for (i = 0; i < 8; i++)
++ {
++ tmp.x = val1.x;
++ tmp.s[masks[i]] = ins[0];
++ if (memcmp (&tmp, &res[i], sizeof (tmp)))
++ abort ();
++ }
+
-+ * config/avr/avr.c (avr_mcu_types): Move at90usb82 device to 'avr4'
-+ architecture.
++ for (i = 0; i < 8; i++)
++ {
++ res[i].x = (__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)val1.x,
++ ins[i], 0);
++ masks[i] = 0;
++ }
+
-+2007-03-26 Ian Lance Taylor <iant@google.com>
++ for (i = 0; i < 8; i++)
++ {
++ tmp.x = val1.x;
++ tmp.s[masks[i]] = ins[i];
++ if (memcmp (&tmp, &res[i], sizeof (tmp)))
++ abort ();
++ }
++}
+Index: gcc/testsuite/ChangeLog
+===================================================================
+--- gcc/testsuite/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/testsuite/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,104 @@
++2007-05-31 H.J. Lu <hongjiu.lu@intel.com>
+
-+ PR tree-optimization/31345
-+ * tree-vrp.c (extract_range_from_binary_expr): Turn ranges like
-+ [+INF, +INF(OVF)] into VARYING.
++ Backport from mainline:
++ 2007-05-25 H.J. Lu <hongjiu.lu@intel.com>
+
-+2007-03-23 Martin Michlmayr <tbm@cyrius.com>
++ * gcc.target/i386/sse2-check.h: New.
++ * gcc.target/i386/sse2-vec-1.c: Likewise.
++ * gcc.target/i386/sse2-vec-2.c: Likewise.
++ * gcc.target/i386/sse2-vec-3.c: Likewise.
++ * gcc.target/i386/sse2-vec-4.c: Likewise.
++ * gcc.target/i386/sse2-vec-5.c: Likewise.
++ * gcc.target/i386/sse2-vec-6.c: Likewise.
+
-+ * doc/invoke.texi (-fforce-mem): Update documentation to reflect
-+ that this option will be removed in 4.3 rather than 4.2.
-+ * opts.c (common_handle_option): Likewise.
++2007-05-31 Paul Thomas <pault@gcc.gnu.org>
+
-+2007-03-21 Mike Stump <mrs@apple.com>
++ PR fortran/31483
++ * gfortran.dg/altreturn_5.f90: New test.
+
-+ * c.opt: Fixup for Objective-C/C++.
++ PR fortran/31540
++ * gfortran.dg/char_result_5.f90: New test.
+
-+2007-03-21 Richard Henderson <rth@redhat.com>
++ PR fortran/31867
++ * gfortran.dg/char_length_5.f90: New test.
+
-+ PR target/31245
-+ * config/i386/emmintrin.h (__m128i, __m128d): Mark may_alias.
-+ * config/i386/mmintrin.h (__m64): Likewise.
-+ * config/i386/xmmintrin.h (__m128): Likewise.
++ PR fortran/31994
++ * gfortran.dg/array_reference_1.f90: New test.
+
-+2007-03-20 Jakub Jelinek <jakub@redhat.com>
++2007-05-22 Tobias Burnus <burnus@net-b.de>
+
-+ PR c/30762
-+ * c-typeck.c (convert_for_assignment): Call comptypes for
-+ RECORD_TYPE or UNION_TYPE.
++ PR fortran/31559
++ Backport from mainline.
++ * primary.c (match_variable): External functions
++ are no variables.
+
-+ PR inline-asm/30505
-+ * reload1.c (reload): Do invalid ASM checking after
-+ cleanup_subreg_operands.
++2007-05-30 Jakub Jelinek <jakub@redhat.com>
+
-+2007-03-19 Jeff Law <law@redhat.com>
++ PR tree-optimization/31769
++ * g++.dg/gomp/pr31769.C: New test.
+
-+ * tree-cfg.c (find_taken_edge): Tighten conditions for
-+ optimizing computed gotos.
++2007-05-28 Andrew Pinski <andrew_pinski@playstation.sony.com>
+
- 2007-03-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
-
- * pa.c (attr_length_call): Partially revert change of 2007-03-09.
-@@ -24,7 +355,7 @@
- PR target/31123
- * pa.md (vdepi_ior): Don't allow zero length deposit. Likewise for
- two unamed patterns.
--
++ PR tree-opt/32100
++ * gcc.c-torture/execute/vrp-7.c: New test.
++
++2007-05-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
- 2007-03-12 Brooks Moses <brooks.moses@codesourcery.com>
-
- * doc/extend.texi: Edit "gnu_inline" documentation.
-@@ -37,7 +368,7 @@
- * doc/passes.texi: Fix gcc.info cross-reference.
-
- 2007-03-12 Daniel Berlin <dberlin@dberlin.org>
--
++ PR libfortran/31964
++ * gfortran.fortran-torture/execute/intrinsic_bitops.f90: Update.
+
- Fix PR tree-optimization/28544
- * tree-ssa-operands.c (add_virtual_operand):
- Move assert triggering on aliasing violations into
-@@ -119,7 +450,7 @@
- (thread_across_edge): Likewise.
- * tree-flow.h (vrp_evaluate_conditional): Update declaration.
- (thread_across_edge): Likewise.
-- * gcc/Makefile.in (tree-vrp.o): Depend upon toplev.h and intl.h.
-+ * Makefile.in (tree-vrp.o): Depend upon toplev.h and intl.h.
-
- 2007-03-05 Ian Lance Taylor <iant@google.com>
-
-@@ -415,7 +746,7 @@
- 2007-03-09 Andrew Pinski <andrew_pinski@playstation.sony.com>
-
- PR tree-opt/28624
-- * tree-ssa-dom.c (eliminate_degenerate_phis): Use a temporary
-+ * tree-ssa-dom.c (eliminate_degenerate_phis): Use a temporary
- bitmap for EXECUTE_IF_SET_IN_BITMAP.
-
- 2006-03-09 Mark Shinwell <shinwell@codesourcery.com>
-@@ -436,7 +767,7 @@
- * builtins.def (lceil, lceilf, lceill, lfloor, lfloorf, lfloorl,
- llceil, llceilf, llceill, llfloor, llfloorf, llfloorl): Mark with
- ATTR_CONST_NOTHROW_LIST.
--
++2007-05-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
- * fold-const.c (tree_expr_nonnegative_p): Handle FIX_TRUNC_EXPR.
-
- 2007-03-08 Andrew Pinski <andrew_pinski@playstation.sony.com>
-@@ -484,11 +815,11 @@
- * doc/invoke.texi (Warning Options): Replace -Werror- with
- -Werror=.
- * opts.c (common_handle_option): Likewise.
--
++ PR libgfortran/31051
++ * gfortran.dg/fmt_t_3.f90: New.
+
- 2007-03-06 Anatoly Sokolov <aesok@post.ru>
-
- * config/avr/avr.c (avr_mcu_types): Add support for ATmega325P,
-- ATmega3250P, ATmega329P, ATmega3290P, AT90USB82 and AT90USB162
-+ ATmega3250P, ATmega329P, ATmega3290P, AT90USB82 and AT90USB162
- devices.
- * config/avr/avr.h (LINK_SPEC, CRT_BINUTILS_SPECS): (Ditto.).
- * config/avr/t-avr (MULTILIB_MATCHES): (Ditto.).
-@@ -509,7 +840,7 @@
- in soft-float DFmode pattern.
- (movdf): Fail if operand1 is a CONST_DOUBLE and operand0 is a hard
- floating register.
-- (movsf): Likewise.
-+ (movsf): Likewise.
-
- 2007-03-05 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
-
-@@ -618,7 +949,7 @@
- 2007-03-01 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
-
- * doc/invoke.texi (Wextra): Delete outdated paragraph.
--
++2007-05-22 Dominique d'Humieres <dominiq@lps.ens.fr>
+
- 2007-02-27 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
-
- * pa/predicates.md (move_src_operand): Allow zero for mode.
-@@ -706,7 +1037,7 @@
- 2007-02-18 Ira Rosen <irar@il.ibm.com>
-
- * tree-ssa-alias.c (may_aliases_intersect): New function.
-- * tree-data-ref.c (ptr_ptr_may_alias_p): Call may_aliases_intersect
-+ * tree-data-ref.c (ptr_ptr_may_alias_p): Call may_aliases_intersect
- for different tags.
- * tree-flow.h (may_aliases_intersect): Add function declaration.
-
-@@ -764,7 +1095,7 @@
-
- 2007-02-06 Rask Ingemann Lamberisen <rask@sygehus.dk>
-
-- PR 30370
-+ PR 30370
- * config/rs6000/t-ppccomm: Correct Makefile typo.
-
- 2007-02-06 Roger Sayle <roger@eyesopen.com>
-@@ -788,7 +1119,7 @@
- 2007-02-05 Bob Wilson <bob.wilson@acm.org>
-
- * config/xtensa/xtensa.c (constantpool_mem_p): Skip over SUBREGs.
--
++ * gfortran.dg/unf_io_convert_3.f90: Fix dg directive.
+
- 2007-02-02 Maxim Kuvyrkov <mkuvyrkov@ispras.ru>
-
- PR target/29682
-@@ -817,7 +1148,7 @@
-
- Revert for x86 darwin:
- 2005-06-19 Uros Bizjak <uros@kss-loka.si>
--
++2007-05-22 Tobias Burnus <burnus@net-b.de>
+
- * config/i386/i386.c (ix86_function_arg_regno_p): Put back the
- code before the following patch under TARGET_MACHO.
- (ix86_function_value_regno_p): Likewise.
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31448.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31448.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31448.c (revision 124164)
-@@ -0,0 +1,36 @@
-+/* PR middle-end/31448, this used to ICE during expand because
-+ reduce_to_bit_field_precision was not ready to handle constants. */
-+
-+typedef struct _st {
-+ int iIndex : 24;
-+ int iIndex1 : 24;
-+} st;
-+st *next;
-+void g(void)
-+{
-+ st *next = 0;
-+ int nIndx;
-+ const static int constreg[] = { 0,};
-+ nIndx = 0;
-+ next->iIndex = constreg[nIndx];
-+}
-+void f(void)
-+{
-+ int nIndx;
-+ const static int constreg[] = { 0xFEFEFEFE,};
-+ nIndx = 0;
-+ next->iIndex = constreg[nIndx];
-+ next->iIndex1 = constreg[nIndx];
-+}
-+int main(void)
-+{
-+ st a;
-+ next = &a;
-+ f();
-+ if (next->iIndex != 0xFFFEFEFE)
-+ __builtin_abort ();
-+ if (next->iIndex1 != 0xFFFEFEFE)
-+ __builtin_abort ();
-+ return 0;
-+}
++ PR fortran/31559
++ Backport from mainline.
++ * func_assign.f90: New test.
+
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31136.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31136.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31136.c (revision 124164)
-@@ -0,0 +1,17 @@
-+extern void abort (void);
++2007-05-21 Uros Bizjak <ubizjak@gmail.com>
+
-+struct S {
-+ unsigned b4:4;
-+ unsigned b6:6;
-+} s;
++ PR target/31167
++ Backport from mainline.
++ * gcc.target/i386/pr31167.c: New test.
+
-+int main()
-+{
-+ s.b6 = 31;
-+ s.b4 = s.b6;
-+ s.b6 = s.b4;
-+ if (s.b6 != 15)
-+ abort ();
-+ return 0;
-+}
++2007-05-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/ieee/pr30704.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/ieee/pr30704.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/ieee/pr30704.c (revision 124164)
-@@ -0,0 +1,57 @@
-+/* PR middle-end/30704 */
++ PR libgfortran/31395
++ * gfortran.dg/fmt_colon.f90: New test.
+
-+typedef __SIZE_TYPE__ size_t;
-+extern void abort (void);
-+extern int memcmp (const void *, const void *, size_t);
-+extern void *memcpy (void *, const void *, size_t);
++2007-05-20 Thomas Koenig <tkoenig@gcc.gnu.org>
+
-+long long
-+__attribute__((noinline))
-+f1 (void)
-+{
-+ long long t;
-+ double d = 0x0.fffffffffffff000p-1022;
-+ memcpy (&t, &d, sizeof (long long));
-+ return t;
-+}
++ PR fortran/31618
++ Backport from trunk.
++ * gfortran.dg/backspace_8.f: New test case.
+
-+double
-+__attribute__((noinline))
-+f2 (void)
-+{
-+ long long t = 0x000fedcba9876543LL;
-+ double d;
-+ memcpy (&d, &t, sizeof (long long));
-+ return d;
-+}
++2007-05-20 Thomas Koenig <tkoenig@gcc.gnu.org>
+
-+int
-+main ()
-+{
-+ union
-+ {
-+ long long ll;
-+ double d;
-+ } u;
++ PR libfortran/31196
++ Backport from trunk.
++ * gfortran.dg/reshape_transpose_1.f90: New test.
+
-+ if (sizeof (long long) != sizeof (double) || __DBL_MIN_EXP__ != -1021)
-+ return 0;
++2007-05-17 Ian Lance Taylor <iant@google.com>
+
-+ u.ll = f1 ();
-+ if (u.d != 0x0.fffffffffffff000p-1022)
-+ abort ();
++ PR tree-optimization/31953
++ * gcc.c-torture/compile/pr31953.c: New test.
+
-+ u.d = f2 ();
-+ if (u.ll != 0x000fedcba9876543LL)
-+ abort ();
++2007-05-17 Eric Botcazou <ebotcazou@libertysurf.fr>
+
-+ double b = 234.0;
-+ long long c;
-+ double d = b;
-+ memcpy (&c, &b, sizeof (double));
-+ long long e = c;
-+ if (memcmp (&e, &d, sizeof (double)) != 0)
-+ abort ();
++ * gcc.c-torture/execute/20070517-1.c: New test.
+
-+ return 0;
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31605.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31605.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/pr31605.c (revision 124164)
-@@ -0,0 +1,13 @@
-+void put_field (unsigned int start, unsigned int len)
-+{
-+ int cur_bitshift = ((start + len) % 8) - 8;
-+ if (cur_bitshift > -8)
-+ exit (0);
-+}
++2007-05-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
+
-+int
-+main ()
-+{
-+ put_field (0, 1);
-+ abort ();
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/mayalias-2.x
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/mayalias-2.x (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/execute/mayalias-2.x (revision 124164)
-@@ -0,0 +1,10 @@
-+set torture_eval_before_compile {
-+ set compiler_conditional_xfail_data {
-+ "PR 28834" \
-+ { "*-*-*" } \
-+ { "-O3 -g" } \
-+ { "" }
-+ }
-+}
++ PR fortran/31725
++ * gfortran.dg/substr_4.f: New test.
+
-+return 0
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/pr31345-1.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/pr31345-1.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/pr31345-1.c (revision 124164)
-@@ -0,0 +1,24 @@
-+/* PR tree-optimization/31345
-+ This caused a crash in VRP when dealing with overflow infinities. */
-+
-+void
-+dpsnaffle (const char *kbuf)
-+{
-+ int hash, thash, head[2], off;
-+ {
-+ int _DP_i;
-+ (hash) = 19780211;
-+ {
-+ (hash) = (hash) + (kbuf)[_DP_i];
-+ }
-+ (hash) = ((hash) * 43321879) & 0x7FFFFFFF;
-+ }
-+ while (off != 0)
-+ {
-+ if (hash > thash) {}
-+ else if (hash < thash)
-+ {
-+ off = head[2];
-+ }
-+ }
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/pr30984.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/pr30984.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/pr30984.c (revision 124164)
-@@ -0,0 +1,7 @@
-+int fs_exec(int ino)
-+{
-+ void *src = 0;
-+ if (ino)
-+ src = (void*)0xe000;
-+ goto *src;
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/20070419-1.c
+ 2007-05-13 Release Manager
+
+ * GCC 4.2.0 released.
+Index: gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_bitops.f90
===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/20070419-1.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.c-torture/compile/20070419-1.c (revision 124164)
-@@ -0,0 +1,17 @@
-+/* PR tree-optimization/31632 */
+--- gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_bitops.f90 (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/testsuite/gfortran.fortran-torture/execute/intrinsic_bitops.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -8,7 +8,8 @@
+ i = 2
+ j = 3
+ k = 12
+-
++ a = 5
++
+ if (.not. btest (i, o+1)) call abort
+ if (btest (i, o+2)) call abort
+ if (iand (i, j) .ne. 2) call abort
+@@ -26,4 +27,6 @@
+ if (ishftc (k, o-30) .ne. 48) call abort
+ if (ishftc (k, o+1, o+3) .ne. 9) call abort
+ if (not (i) .ne. -3) call abort
++ if (ishftc (a, 1, bit_size(a)) .ne. 10) call abort
++ if (ishftc (1, 1, 32) .ne. 2) call abort
+ end program
+Index: gcc/testsuite/g++.dg/gomp/pr31769.C
+===================================================================
+--- gcc/testsuite/g++.dg/gomp/pr31769.C (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/g++.dg/gomp/pr31769.C (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,61 @@
++// PR tree-optimization/31769
++// { dg-options "-O2 -fopenmp" }
++// { dg-do compile }
+
-+struct S
++struct B
+{
-+ long int l;
-+ void *m;
++ B () {}
++ virtual ~B () {}
+};
-+
-+int
-+foo (struct S *x)
-+{
-+ unsigned long a;
-+ a = x->l;
-+ if (a <= ((void *) 0))
-+ x->m = 0;
-+ return 0;
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.target/arm/register-variables.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.target/arm/register-variables.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.target/arm/register-variables.c (revision 124164)
-@@ -0,0 +1,21 @@
-+/* { dg-do run } */
-+/* { dg-options "-O" } */
-+
-+#include <stdlib.h>
-+
-+void __attribute__((noinline))
-+bar(int a, int b)
++struct C
+{
-+ if (a != 43 || b != 42)
-+ abort();
-+}
-+
-+int main(void)
++ C (int x, int y) {}
++};
++template<typename T, int U>
++struct D
+{
-+ register int r0 asm("r0") = 42;
-+ register int r1 asm("r1") = 43;
-+ asm volatile("": "+r" (r0), "+r" (r1));
-+ bar(r1, r0);
-+ return 0;
-+}
-+
-Index: gcc-4_2-branch/gcc/testsuite/gcc.target/i386/ordcmp-1.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.target/i386/ordcmp-1.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.target/i386/ordcmp-1.c (revision 124164)
-@@ -0,0 +1,36 @@
-+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-+/* { dg-options "-O2 -msse2" } */
-+/* { dg-final { scan-assembler "cmpordss" } } */
-+/* { dg-final { scan-assembler "cmpordps" } } */
-+/* { dg-final { scan-assembler "cmpordsd" } } */
-+/* { dg-final { scan-assembler "cmpordpd" } } */
-+/* { dg-final { scan-assembler-not "cmpunordss" } } */
-+/* { dg-final { scan-assembler-not "cmpunordps" } } */
-+/* { dg-final { scan-assembler-not "cmpunordsd" } } */
-+/* { dg-final { scan-assembler-not "cmpunordpd" } } */
-+
-+#include <emmintrin.h>
-+
-+__m128
-+f1 (__m128 x, __m128 y)
++ D () {}
++ ~D () {}
++};
++struct E
+{
-+ return _mm_cmpord_ss (x, y);
-+}
-+
-+__m128
-+f2 (__m128 x, __m128 y)
++ E () {}
++ ~E () {}
++ D<int, 1> e;
++};
++struct A
+{
-+ return _mm_cmpord_ps (x, y);
-+}
-+
-+__m128d
-+f3 (__m128d x, __m128d y)
++ B *b;
++ A () { b = __null; }
++ ~A () { if (b != __null) delete b; }
++};
++struct F : public A
+{
-+ return _mm_cmpord_sd (x, y);
-+}
++ explicit F (int x) { foo (0); }
++ F (const F &x) {}
++ F (F &x, C y) {}
++ F operator () (C x) const
++ {
++ return F (const_cast<F &>(*this), x);
++ }
++ template <typename U> F & operator+= (const U &);
++ void foo (int);
++ E f;
++};
+
-+__m128d
-+f4 (__m128d x, __m128d y)
++int
++main ()
+{
-+ return _mm_cmpord_pd (x, y);
++ try
++ {
++ F f (10);
++ F g (10);
++ C h (0, 9);
++#pragma omp parallel for
++ for (int i = 0; i < 2; ++i)
++ g += f (h);
++ }
++ catch (int &e)
++ {
++ }
+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.target/i386/unordcmp-1.c
+Index: gcc/testsuite/gfortran.dg/char_length_5.f90
===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.target/i386/unordcmp-1.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.target/i386/unordcmp-1.c (revision 124164)
-@@ -0,0 +1,36 @@
-+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-+/* { dg-options "-O2 -msse2" } */
-+/* { dg-final { scan-assembler "cmpunordss" } } */
-+/* { dg-final { scan-assembler "cmpunordps" } } */
-+/* { dg-final { scan-assembler "cmpunordsd" } } */
-+/* { dg-final { scan-assembler "cmpunordpd" } } */
-+/* { dg-final { scan-assembler-not "cmpordss" } } */
-+/* { dg-final { scan-assembler-not "cmpordps" } } */
-+/* { dg-final { scan-assembler-not "cmpordsd" } } */
-+/* { dg-final { scan-assembler-not "cmpordpd" } } */
-+
-+#include <emmintrin.h>
-+
-+__m128
-+f1 (__m128 x, __m128 y)
-+{
-+ return _mm_cmpunord_ss (x, y);
-+}
+--- gcc/testsuite/gfortran.dg/char_length_5.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/char_length_5.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,61 @@
++! { dg-do run }
++! Tests the fix for PR31867, in which the interface evaluation
++! of the character length of 'join' (ie. the length available in
++! the caller) was wrong.
++!
++! Contributed by <beliavsky@aol.com>
++!
++module util_mod
++ implicit none
++contains
++ function join (words, sep) result(str)
++ character (len=*), intent(in) :: words(:),sep
++ character (len = (size (words) - 1) * len_trim (sep) + &
++ sum (len_trim (words))) :: str
++ integer :: i,nw
++ nw = size (words)
++ str = ""
++ if (nw < 1) then
++ return
++ else
++ str = words(1)
++ end if
++ do i=2,nw
++ str = trim (str) // trim (sep) // words(i)
++ end do
++ end function join
++end module util_mod
++!
++program xjoin
++ use util_mod, only: join
++ implicit none
++ integer yy
++ character (len=5) :: words(5:8) = (/"two ","three","four ","five "/), sep = "^#^"
++ character (len=5) :: words2(4) = (/"bat ","ball ","goal ","stump"/), sep2 = "&"
++
++ if (join (words, sep) .ne. "two^#^three^#^four^#^five") call abort ()
++ if (len (join (words, sep)) .ne. 25) call abort ()
++
++ if (join (words(5:6), sep) .ne. "two^#^three") call abort ()
++ if (len (join (words(5:6), sep)) .ne. 11) call abort ()
++
++ if (join (words(7:8), sep) .ne. "four^#^five") call abort ()
++ if (len (join (words(7:8), sep)) .ne. 11) call abort ()
++
++ if (join (words(5:7:2), sep) .ne. "two^#^four") call abort ()
++ if (len (join (words(5:7:2), sep)) .ne. 10) call abort ()
++
++ if (join (words(6:8:2), sep) .ne. "three^#^five") call abort ()
++ if (len (join (words(6:8:2), sep)) .ne. 12) call abort ()
++
++ if (join (words2, sep2) .ne. "bat&ball&goal&stump") call abort ()
++ if (len (join (words2, sep2)) .ne. 19) call abort ()
++
++ if (join (words2(1:2), sep2) .ne. "bat&ball") call abort ()
++ if (len (join (words2(1:2), sep2)) .ne. 8) call abort ()
++
++ if (join (words2(2:4:2), sep2) .ne. "ball&stump") call abort ()
++ if (len (join (words2(2:4:2), sep2)) .ne. 10) call abort ()
++
++end program xjoin
++! { dg-final { cleanup-modules "util_mod" } }
+Index: gcc/testsuite/gfortran.dg/array_reference_1.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/array_reference_1.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/array_reference_1.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,35 @@
++! { dg-do run }
++! Tests the fix for PR31994, aka 31867, in which the offset
++! of 'a' in both subroutines was being evaluated incorrectly.
++! The testcase for PR31867 is char_length_5.f90
++!
++! Contributed by Elizabeth Yip <elizabeth.l.yip@boeing.com>
++! and Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
++!
++program main
++ call PR31994
++ call PR31994_comment6
++contains
++ subroutine PR31994
++ implicit none
++ complex (kind=4), dimension(2,2) :: a, b, c
++ a(1,1) = (1.,1.)
++ a(2,1) = (2.,2.)
++ a(1,2) = (3.,3.)
++ a(2,2) = (4.,4.)
++ b=conjg (transpose (a))
++ c=transpose (a)
++ c=conjg (c)
++ if (any (b .ne. c)) call abort ()
++ end subroutine PR31994
++ subroutine PR31994_comment6
++ implicit none
++ real ,dimension(2,2)::a
++ integer ,dimension(2,2) :: b, c
++ a = reshape ((/1.,2.,3.,4./), (/2,2/))
++ b=int (transpose(a))
++ c = int (a)
++ c = transpose (c)
++ if (any (b .ne. c)) call abort ()
++ end subroutine PR31994_comment6
++END program main
+Index: gcc/testsuite/gfortran.dg/reshape_transpose_1.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/reshape_transpose_1.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/reshape_transpose_1.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,18 @@
++! { dg-do run }
++! PR 31196 - reshape of transposed derived types generated
++! wront results.
++program main
++ implicit none
++ TYPE datatype
++ INTEGER :: I
++ END TYPE datatype
++ character (len=20) line1, line2
++ TYPE(datatype), dimension(2,2) :: data, result
++ data(1,1)%i = 1
++ data(2,1)%i = 2
++ data(1,2)%i = 3
++ data(2,2)%i = 4
++ write (unit=line1, fmt="(4I4)") reshape(transpose(data),shape(data))
++ write (unit=line2, fmt="(4I4)") (/ 1, 3, 2, 4 /)
++ if (line1 /= line2) call abort
++END program main
+Index: gcc/testsuite/gfortran.dg/fmt_colon.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/fmt_colon.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/fmt_colon.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,14 @@
++! { dg-do run }
++! PR31395 Colon edit descriptor is ignored.
++! Test case derived from PR. Prepared by Jerry DeLisle
++! <jvdelisle@gcc.gnu.org>
++PROGRAM test
++ INTEGER :: i = 1
++ character(30) :: astring
++ WRITE(astring, 10) i
++ 10 FORMAT('i =',I2:' this should not print')
++ if (astring.ne."i = 1") call abort
++ write(astring, 20) i, i
++ 20 format('i =',I2:' this should print',I2)
++ if (astring.ne."i = 1 this should print 1") call abort
++END PROGRAM test
+\ No newline at end of file
+Index: gcc/testsuite/gfortran.dg/char_result_13.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/char_result_13.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/char_result_13.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,13 @@
++! { dg-do compile }
++! tests the fix for PR31540, in which the character lengths in
++! parentheses were not resolved.
++!
++! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
++!
++ subroutine pfb()
++ implicit none
++ external pfname1, pfname2
++ character ((136)) pfname1
++ character ((129+7)) pfname2
++ return
++ end
+Index: gcc/testsuite/gfortran.dg/altreturn_5.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/altreturn_5.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/altreturn_5.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,30 @@
++! { dg-do run }
++! Tests the fix for PR31483, in which dummy argument procedures
++! produced an ICE if they had an alternate return.
++!
++! Contributed by Mathias Fröhlich <M.Froehlich@science-computing.de>
++
++ SUBROUTINE R (i, *, *)
++ INTEGER i
++ RETURN i
++ END
++
++ SUBROUTINE PHLOAD (READER, i, res)
++ IMPLICIT NONE
++ EXTERNAL READER
++ integer i
++ character(3) res
++ CALL READER (i, *1, *2)
++ 1 res = "one"
++ return
++ 2 res = "two"
++ return
++ END
++
++ EXTERNAL R
++ character(3) res
++ call PHLOAD (R, 1, res)
++ if (res .ne. "one") call abort ()
++ CALL PHLOAD (R, 2, res)
++ if (res .ne. "two") call abort ()
++ END
+\ No newline at end of file
+Index: gcc/testsuite/gfortran.dg/substr_4.f
+===================================================================
+--- gcc/testsuite/gfortran.dg/substr_4.f (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/substr_4.f (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,69 @@
++! { dg-do run }
++ subroutine test_lower
++ implicit none
++ character(3), dimension(3) :: zsymel,zsymelr
++ common /xx/ zsymel, zsymelr
++ integer :: znsymelr
++ zsymel = (/ 'X', 'Y', ' ' /)
++ zsymelr= (/ 'X', 'Y', ' ' /)
++ znsymelr=2
++ call check_zsymel(zsymel,zsymelr,znsymelr)
++
++ contains
++
++ subroutine check_zsymel(zsymel,zsymelr,znsymelr)
++ implicit none
++ integer znsymelr, isym
++ character(*) zsymel(*),zsymelr(*)
++ character(len=80) buf
++ zsymel(3)(lenstr(zsymel(3))+1:)='X'
++ write (buf,10) (trim(zsymelr(isym)),isym=1,znsymelr)
++10 format(3(a,:,','))
++ if (trim(buf) /= 'X,Y') call abort
++ end subroutine check_zsymel
++
++ function lenstr(s)
++ character(len=*),intent(in) :: s
++ integer :: lenstr
++ if (len_trim(s) /= 0) call abort
++ lenstr = len_trim(s)
++ end function lenstr
++
++ end subroutine test_lower
++
++ subroutine test_upper
++ implicit none
++ character(3), dimension(3) :: zsymel,zsymelr
++ common /xx/ zsymel, zsymelr
++ integer :: znsymelr
++ zsymel = (/ 'X', 'Y', ' ' /)
++ zsymelr= (/ 'X', 'Y', ' ' /)
++ znsymelr=2
++ call check_zsymel(zsymel,zsymelr,znsymelr)
++
++ contains
++
++ subroutine check_zsymel(zsymel,zsymelr,znsymelr)
++ implicit none
++ integer znsymelr, isym
++ character(*) zsymel(*),zsymelr(*)
++ character(len=80) buf
++ zsymel(3)(:lenstr(zsymel(3))+1)='X'
++ write (buf,20) (trim(zsymelr(isym)),isym=1,znsymelr)
++20 format(3(a,:,','))
++ if (trim(buf) /= 'X,Y') call abort
++ end subroutine check_zsymel
++
++ function lenstr(s)
++ character(len=*),intent(in) :: s
++ integer :: lenstr
++ if (len_trim(s) /= 0) call abort
++ lenstr = len_trim(s)
++ end function lenstr
++
++ end subroutine test_upper
+
-+__m128
-+f2 (__m128 x, __m128 y)
-+{
-+ return _mm_cmpunord_ps (x, y);
-+}
++ program test
++ call test_lower
++ call test_upper
++ end program test
+Index: gcc/testsuite/gfortran.dg/fmt_t_3.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/fmt_t_3.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/fmt_t_3.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,15 @@
++! { dg-do run }
++! PR31051 bug with x and t format descriptors.
++! Test case prepared by Jerry DeLisle <jvdelisle@gcc.gnu.org> from PR.
++program t
++ integer, parameter :: n = 9
++ character(len=40) :: fmt
++ character(len=2), dimension(n) :: y
++ open(unit=10, status="scratch")
++ y = 'a '
++ fmt = '(a,1x,(t7, 3a))'
++ write(10, fmt) 'xxxx', (y(i), i = 1,n)
++ rewind(10)
++ read(10, '(a)') fmt
++ if (fmt.ne."xxxx a a a") call abort()
++end program t
+Index: gcc/testsuite/gfortran.dg/backspace_8.f
+===================================================================
+--- gcc/testsuite/gfortran.dg/backspace_8.f (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/backspace_8.f (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,18 @@
++C { dg-do run }
++C PR libfortran/31618 - backspace after an error didn't work.
++ program main
++ character*78 msg
++ open (21, file="backspace_7.dat", form="unformatted")
++ write (21) 42, 43
++ write (21) 4711, 4712
++ write (21) -1, -4
++ rewind (21)
++ read (21) i,j
++ read (21,err=100,end=100) i,j,k
++ call abort
++ 100 continue
++ backspace 21
++ read (21) i,j
++ if (i .ne. 4711 .or. j .ne. 4712) call abort
++ close (21,status="delete")
++ end
+Index: gcc/testsuite/gfortran.dg/func_assign.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/func_assign.f90 (.../tags/gcc_4_2_0_release) (revision 0)
++++ gcc/testsuite/gfortran.dg/func_assign.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -0,0 +1,33 @@
++! { dg-do compile }
++!
++! PR fortran/31559
++! Do not allow assigning to external functions
++!
++! Contributed by Steve Kargl <sgk@troutmask.apl.washington.edu>
++!
++module mod
++ implicit none
++contains
++ integer function bar()
++ bar = 4
++ end function bar
++
++ subroutine a()
++ implicit none
++ real :: fun
++ external fun
++ interface
++ function funget(a)
++ integer :: a
++ end function
++ subroutine sub()
++ end subroutine sub
++ end interface
++ sub = 'a' ! { dg-error "Expected VARIABLE" }
++ fun = 4.4 ! { dg-error "Expected VARIABLE" }
++ funget = 4 ! { dg-error "is not a VALUE" }
++ bar = 5 ! { dg-error "is not a VALUE" }
++ end subroutine a
++end module mod
++
++end
+Index: gcc/testsuite/gfortran.dg/unf_io_convert_3.f90
+===================================================================
+--- gcc/testsuite/gfortran.dg/unf_io_convert_3.f90 (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/testsuite/gfortran.dg/unf_io_convert_3.f90 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,4 +1,4 @@
+-! { dg-do run}
++! { dg-do run }
+ ! { dg-require-effective-target fortran_large_real }
+ program main
+ integer,parameter :: k = selected_real_kind (precision (0.0_8) + 1)
+Index: gcc/fortran/trans-expr.c
+===================================================================
+--- gcc/fortran/trans-expr.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fortran/trans-expr.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -255,6 +255,10 @@
+ gfc_conv_string_parameter (se);
+ else
+ {
++ /* Avoid multiple evaluation of substring start. */
++ if (!CONSTANT_CLASS_P (start.expr) && !DECL_P (start.expr))
++ start.expr = gfc_evaluate_now (start.expr, &se->pre);
++
+ /* Change the start of the string. */
+ if (TYPE_STRING_FLAG (TREE_TYPE (se->expr)))
+ tmp = se->expr;
+@@ -273,6 +277,10 @@
+ gfc_conv_expr_type (&end, ref->u.ss.end, gfc_charlen_type_node);
+ gfc_add_block_to_block (&se->pre, &end.pre);
+ }
+
-+__m128d
-+f3 (__m128d x, __m128d y)
-+{
-+ return _mm_cmpunord_sd (x, y);
-+}
++ if (!CONSTANT_CLASS_P (end.expr) && !DECL_P (end.expr))
++ end.expr = gfc_evaluate_now (end.expr, &se->pre);
+
-+__m128d
-+f4 (__m128d x, __m128d y)
-+{
-+ return _mm_cmpunord_pd (x, y);
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.target/i386/pr30505.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.target/i386/pr30505.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.target/i386/pr30505.c (revision 124164)
-@@ -0,0 +1,19 @@
-+/* PR inline-asm/30505 */
-+/* { dg-do compile { target ilp32 } } */
-+/* { dg-options "-O2" } */
-+
-+unsigned long long a, c;
-+unsigned int b, d;
-+
-+void
-+test ()
-+{
-+ unsigned int e, f;
-+
-+ __asm__ ("divl %5;movl %1, %0;movl %4, %1;divl %5"
-+ : "=&rm" (e), "=a" (f), "=d" (d)
-+ : "1" ((unsigned int) (a >> 32)), "g" ((unsigned int) a),
-+ "rm" (b), "2" (0)
-+ : "cc");
-+ c = (unsigned long long) e << 32 | f;
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr25874.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr25874.c (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/gomp/pr25874.c (revision 124164)
-@@ -1,3 +1,5 @@
-+/* { dg-options "-O -fopenmp" } */
+ tmp = fold_build2 (MINUS_EXPR, gfc_charlen_type_node,
+ build_int_cst (gfc_charlen_type_node, 1),
+ start.expr);
+@@ -2340,17 +2348,23 @@
+
+ /* Generate the actual call. */
+ gfc_conv_function_val (se, sym);
+
- void foo();
+ /* If there are alternate return labels, function type should be
+ integer. Can't modify the type in place though, since it can be shared
+- with other functions. */
++ with other functions. For dummy arguments, the typing is done to
++ to this result, even if it has to be repeated for each call. */
+ if (has_alternate_specifier
+ && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
+ {
+- gcc_assert (! sym->attr.dummy);
+- TREE_TYPE (sym->backend_decl)
+- = build_function_type (integer_type_node,
+- TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
+- se->expr = build_fold_addr_expr (sym->backend_decl);
++ if (!sym->attr.dummy)
++ {
++ TREE_TYPE (sym->backend_decl)
++ = build_function_type (integer_type_node,
++ TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
++ se->expr = build_fold_addr_expr (sym->backend_decl);
++ }
++ else
++ TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
+ }
- inline void bar()
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/pr30762-2.c
+ fntype = TREE_TYPE (TREE_TYPE (se->expr));
+Index: gcc/fortran/trans-array.c
===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/pr30762-2.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/pr30762-2.c (revision 124164)
-@@ -0,0 +1,9 @@
-+/* PR c/30762 */
-+/* { dg-do compile } */
+--- gcc/fortran/trans-array.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fortran/trans-array.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -4422,6 +4422,8 @@
+
+ if (se->direct_byref)
+ base = gfc_index_zero_node;
++ else if (GFC_ARRAY_TYPE_P (TREE_TYPE (desc)))
++ base = gfc_evaluate_now (gfc_conv_array_offset (desc), &loop.pre);
+ else
+ base = NULL_TREE;
+
+@@ -4489,8 +4491,20 @@
+ stride, info->stride[dim]);
+
+ if (se->direct_byref)
+- base = fold_build2 (MINUS_EXPR, TREE_TYPE (base),
+- base, stride);
++ {
++ base = fold_build2 (MINUS_EXPR, TREE_TYPE (base),
++ base, stride);
++ }
++ else if (GFC_ARRAY_TYPE_P (TREE_TYPE (desc)))
++ {
++ tmp = gfc_conv_array_lbound (desc, n);
++ tmp = fold_build2 (MINUS_EXPR, TREE_TYPE (base),
++ tmp, loop.from[dim]);
++ tmp = fold_build2 (MULT_EXPR, TREE_TYPE (base),
++ tmp, gfc_conv_array_stride (desc, n));
++ base = fold_build2 (PLUS_EXPR, TREE_TYPE (base),
++ tmp, base);
++ }
+
+ /* Store the new stride. */
+ tmp = gfc_conv_descriptor_stride (parm, gfc_rank_cst[dim]);
+@@ -4511,7 +4525,8 @@
+ gfc_conv_descriptor_data_set (&loop.pre, parm, offset);
+ }
+
+- if (se->direct_byref && !se->data_not_needed)
++ if ((se->direct_byref || GFC_ARRAY_TYPE_P (TREE_TYPE (desc)))
++ && !se->data_not_needed)
+ {
+ /* Set the offset. */
+ tmp = gfc_conv_descriptor_offset (parm);
+Index: gcc/fortran/gfortran.texi
+===================================================================
+--- gcc/fortran/gfortran.texi (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fortran/gfortran.texi (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -611,7 +611,7 @@
+ to change the representation of data for unformatted files.
+ The syntax for the @env{GFORTRAN_CONVERT_UNIT} variable is:
+ @smallexample
+-GFORTRAN_CONVERT_UNIT: mode | mode ';' exception ;
++GFORTRAN_CONVERT_UNIT: mode | mode ';' exception | exception ;
+ mode: 'native' | 'swap' | 'big_endian' | 'little_endian' ;
+ exception: mode ':' unit_list | unit_list ;
+ unit_list: unit_spec | unit_list unit_spec ;
+@@ -668,7 +668,12 @@
+ setting a default data representation for the whole program. The
+ @code{CONVERT} specifier overrides the @option{-fconvert} compile options.
+
++@emph{Note that the values specified via the GFORTRAN_CONVERT_UNIT
++environment variable will override the CONVERT specifier in the
++open statement}. This is to give control over data formats to
++users who do not have the source code of their program available.
+
++
+ @c =====================================================================
+ @c PART II: LANGUAGE REFERENCE
+ @c =====================================================================
+Index: gcc/fortran/ChangeLog
+===================================================================
+--- gcc/fortran/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fortran/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,30 @@
++2007-05-31 Paul Thomas <pault@gcc.gnu.org>
++
++ PR fortran/31483
++ * trans-expr.c (gfc_conv_function_call): Give a dummy
++ procedure the correct type if it has alternate returns.
++
++
++ PR fortran/31540
++ * resolve.c (resolve_fl_procedure): Resolve constant character
++ lengths.
++
++ PR fortran/31867
++ PR fortran/31994
++ * trans-array.c (gfc_conv_expr_descriptor): Obtain the stored
++ offset for non-descriptor, source arrays and correct for stride
++ not equal to one before writing to field of output descriptor.
++
++2007-05-17 Tobias Burnus <burnus@net-b.de>
++
++ * gfortran.texi (GFORTRAN_CONVERT_UNIT): Improve documentation.
++
++2007-05-16 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
++
++ PR fortran/31725
++ * trans-expr.c (gfc_conv_substring): Evaluate substring bounds
++ only once.
++
+ 2007-05-13 Release Manager
+
+ * GCC 4.2.0 released.
+Index: gcc/fortran/resolve.c
+===================================================================
+--- gcc/fortran/resolve.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fortran/resolve.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -5742,6 +5742,11 @@
+ if (sym->ts.type == BT_CHARACTER)
+ {
+ gfc_charlen *cl = sym->ts.cl;
+
-+typedef struct { int i; } D;
++ if (cl && cl->length && gfc_is_constant_expr (cl->length)
++ && resolve_charlen (cl) == FAILURE)
++ return FAILURE;
+
-+void
-+foo (D x)
-+{
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre1.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre1.c (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre1.c (revision 124164)
-@@ -14,5 +14,5 @@
- e = *a;
- return d + e;
- }
--/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre"} } */
-+/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" { xfail *-*-* } } } */
- /* { dg-final { cleanup-tree-dump "pre" } } */
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre14.c
+ if (!cl || !cl->length || cl->length->expr_type != EXPR_CONSTANT)
+ {
+ if (sym->attr.proc == PROC_ST_FUNCTION)
+Index: gcc/fortran/primary.c
+===================================================================
+--- gcc/fortran/primary.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/fortran/primary.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -2415,7 +2415,8 @@
+
+ case FL_PROCEDURE:
+ /* Check for a nonrecursive function result */
+- if (sym->attr.function && (sym->result == sym || sym->attr.entry))
++ if (sym->attr.function && (sym->result == sym || sym->attr.entry)
++ && !sym->attr.external)
+ {
+ /* If a function result is a derived type, then the derived
+ type may still have to be resolved. */
+Index: gcc/BASE-VER
===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre14.c (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre14.c (revision 124164)
-@@ -15,5 +15,5 @@
- e = (*a)[0];
- return d + e;
- }
--/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre"} } */
-+/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" { xfail *-*-* } } } */
- /* { dg-final { cleanup-tree-dump "pre" } } */
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre15.c
+--- gcc/BASE-VER (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/BASE-VER (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1 +1 @@
+-4.2.0
++4.2.1
+Index: gcc/except.c
+===================================================================
+--- gcc/except.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/except.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1005,7 +1005,11 @@
+ for (prev_try = VEC_index (eh_region, cfun->eh->region_array, outer_region);
+ prev_try && prev_try->type != ERT_TRY;
+ prev_try = prev_try->outer)
+- ;
++ if (prev_try->type == ERT_MUST_NOT_THROW)
++ {
++ prev_try = NULL;
++ break;
++ }
+
+ /* Remap all of the internal catch and cleanup linkages. Since we
+ duplicate entire subtrees, all of the referenced regions will have
+Index: gcc/combine.c
===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre15.c (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/tree-ssa/loadpre15.c (revision 124164)
-@@ -15,5 +15,5 @@
- e = (*a)[t];
- return d + e;
+--- gcc/combine.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/combine.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -5341,14 +5341,14 @@
+ }
+ else if (GET_MODE (op0) == compare_mode && op1 == const0_rtx)
+ {
+- SUBST(SET_SRC (x), op0);
++ SUBST (SET_SRC (x), op0);
+ src = SET_SRC (x);
+ }
+- else
++ /* Otherwise, update the COMPARE if needed. */
++ else if (XEXP (src, 0) != op0 || XEXP (src, 1) != op1)
+ {
+- /* Otherwise, update the COMPARE if needed. */
+- SUBST (XEXP (src, 0), op0);
+- SUBST (XEXP (src, 1), op1);
++ SUBST (SET_SRC (x), gen_rtx_COMPARE (compare_mode, op0, op1));
++ src = SET_SRC (x);
+ }
+ }
+ else
+Index: gcc/Makefile.in
+===================================================================
+--- gcc/Makefile.in (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/Makefile.in (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1839,7 +1839,7 @@
+ tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \
+ $(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \
+ $(TM_H) coretypes.h $(CGRAPH_H) tree-pass.h $(TIMEVAR_H) \
+- gt-tree-ssa-structalias.h $(PARAMS_H)
++ gt-tree-ssa-structalias.h $(PARAMS_H) pointer-set.h
+ tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
+ $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \
+ toplev.h $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \
+Index: gcc/tree-ssa-structalias.c
+===================================================================
+--- gcc/tree-ssa-structalias.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/tree-ssa-structalias.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -51,10 +51,11 @@
+ #include "params.h"
+ #include "tree-ssa-structalias.h"
+ #include "cgraph.h"
++#include "pointer-set.h"
+
+ /* The idea behind this analyzer is to generate set constraints from the
+ program, then solve the resulting constraints in order to generate the
+- points-to sets.
++ points-to sets.
+
+ Set constraints are a way of modeling program analysis problems that
+ involve sets. They consist of an inclusion constraint language,
+@@ -70,33 +71,33 @@
+
+ Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines
+ of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at
+- http://citeseer.ist.psu.edu/heintze01ultrafast.html
++ http://citeseer.ist.psu.edu/heintze01ultrafast.html
+
+- There are three types of constraint expressions, DEREF, ADDRESSOF, and
+- SCALAR. Each constraint expression consists of a constraint type,
+- a variable, and an offset.
+-
++ There are three types of real constraint expressions, DEREF,
++ ADDRESSOF, and SCALAR. Each constraint expression consists
++ of a constraint type, a variable, and an offset.
++
+ SCALAR is a constraint expression type used to represent x, whether
+ it appears on the LHS or the RHS of a statement.
+ DEREF is a constraint expression type used to represent *x, whether
+- it appears on the LHS or the RHS of a statement.
++ it appears on the LHS or the RHS of a statement.
+ ADDRESSOF is a constraint expression used to represent &x, whether
+ it appears on the LHS or the RHS of a statement.
+-
++
+ Each pointer variable in the program is assigned an integer id, and
+ each field of a structure variable is assigned an integer id as well.
+-
++
+ Structure variables are linked to their list of fields through a "next
+ field" in each variable that points to the next field in offset
+- order.
+- Each variable for a structure field has
++ order.
++ Each variable for a structure field has
+
+ 1. "size", that tells the size in bits of that field.
+ 2. "fullsize, that tells the size in bits of the entire structure.
+ 3. "offset", that tells the offset in bits from the beginning of the
+ structure to this field.
+
+- Thus,
++ Thus,
+ struct f
+ {
+ int a;
+@@ -110,50 +111,51 @@
+ foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL
+ bar -> id 3, size 32, offset 0, fullsize 32, next NULL
+
+-
++
+ In order to solve the system of set constraints, the following is
+ done:
+
+ 1. Each constraint variable x has a solution set associated with it,
+ Sol(x).
+-
++
+ 2. Constraints are separated into direct, copy, and complex.
+ Direct constraints are ADDRESSOF constraints that require no extra
+ processing, such as P = &Q
+ Copy constraints are those of the form P = Q.
+- Complex constraints are all the constraints involving dereferences.
+-
++ Complex constraints are all the constraints involving dereferences
++ and offsets (including offsetted copies).
++
+ 3. All direct constraints of the form P = &Q are processed, such
+- that Q is added to Sol(P)
++ that Q is added to Sol(P)
+
+ 4. All complex constraints for a given constraint variable are stored in a
+- linked list attached to that variable's node.
++ linked list attached to that variable's node.
+
+ 5. A directed graph is built out of the copy constraints. Each
+- constraint variable is a node in the graph, and an edge from
++ constraint variable is a node in the graph, and an edge from
+ Q to P is added for each copy constraint of the form P = Q
+-
++
+ 6. The graph is then walked, and solution sets are
+ propagated along the copy edges, such that an edge from Q to P
+ causes Sol(P) <- Sol(P) union Sol(Q).
+-
++
+ 7. As we visit each node, all complex constraints associated with
+ that node are processed by adding appropriate copy edges to the graph, or the
+- appropriate variables to the solution set.
++ appropriate variables to the solution set.
+
+ 8. The process of walking the graph is iterated until no solution
+ sets change.
+
+ Prior to walking the graph in steps 6 and 7, We perform static
+- cycle elimination on the constraint graph, as well
++ cycle elimination on the constraint graph, as well
+ as off-line variable substitution.
+-
++
+ TODO: Adding offsets to pointer-to-structures can be handled (IE not punted
+ on and turned into anything), but isn't. You can just see what offset
+ inside the pointed-to struct it's going to access.
+-
++
+ TODO: Constant bounded arrays can be handled as if they were structs of the
+- same number of elements.
++ same number of elements.
+
+ TODO: Modeling heap and incoming pointers becomes much better if we
+ add fields to them as we discover them, which we could do.
+@@ -161,20 +163,29 @@
+ TODO: We could handle unions, but to be honest, it's probably not
+ worth the pain or slowdown. */
+
+-static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map)))
+-htab_t heapvar_for_stmt;
++static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) htab_t heapvar_for_stmt;
+
+ /* One variable to represent all non-local accesses. */
+ tree nonlocal_all;
+
+ static bool use_field_sensitive = true;
+ static int in_ipa_mode = 0;
++
++/* Used for predecessor bitmaps. */
+ static bitmap_obstack predbitmap_obstack;
+-static bitmap_obstack ptabitmap_obstack;
++
++/* Used for points-to sets. */
++static bitmap_obstack pta_obstack;
++
++/* Used for oldsolution members of variables. */
++static bitmap_obstack oldpta_obstack;
++
++/* Used for per-solver-iteration bitmaps. */
+ static bitmap_obstack iteration_obstack;
+
+ static unsigned int create_variable_info_for (tree, const char *);
+-static void build_constraint_graph (void);
++typedef struct constraint_graph *constraint_graph_t;
++static void unify_nodes (constraint_graph_t, unsigned int, unsigned int, bool);
+
+ DEF_VEC_P(constraint_t);
+ DEF_VEC_ALLOC_P(constraint_t,heap);
+@@ -186,11 +197,13 @@
+ static struct constraint_stats
+ {
+ unsigned int total_vars;
+- unsigned int collapsed_vars;
++ unsigned int nonpointer_vars;
+ unsigned int unified_vars_static;
+ unsigned int unified_vars_dynamic;
+ unsigned int iterations;
+ unsigned int num_edges;
++ unsigned int num_implicit_edges;
++ unsigned int points_to_sets_created;
+ } stats;
+
+ struct variable_info
+@@ -205,7 +218,7 @@
+ tree decl;
+
+ /* Offset of this variable, in bits, from the base variable */
+- unsigned HOST_WIDE_INT offset;
++ unsigned HOST_WIDE_INT offset;
+
+ /* Size of the variable, in bits. */
+ unsigned HOST_WIDE_INT size;
+@@ -216,34 +229,21 @@
+ /* A link to the variable for the next field in this structure. */
+ struct variable_info *next;
+
+- /* Node in the graph that represents the constraints and points-to
+- solution for the variable. */
+- unsigned int node;
+-
+- /* True if the address of this variable is taken. Needed for
+- variable substitution. */
+- unsigned int address_taken:1;
+-
+- /* True if this variable is the target of a dereference. Needed for
+- variable substitution. */
+- unsigned int indirect_target:1;
+-
+ /* True if the variable is directly the target of a dereference.
+ This is used to track which variables are *actually* dereferenced
+- so we can prune their points to listed. This is equivalent to the
+- indirect_target flag when no merging of variables happens. */
++ so we can prune their points to listed. */
+ unsigned int directly_dereferenced:1;
+
+ /* True if this is a variable created by the constraint analysis, such as
+ heap variables and constraints we had to break up. */
+ unsigned int is_artificial_var:1;
+-
++
+ /* True if this is a special variable whose solution set should not be
+ changed. */
+ unsigned int is_special_var:1;
+
+ /* True for variables whose size is not known or variable. */
+- unsigned int is_unknown_size_var:1;
++ unsigned int is_unknown_size_var:1;
+
+ /* True for variables that have unions somewhere in them. */
+ unsigned int has_union:1;
+@@ -254,16 +254,15 @@
+ /* Points-to set for this variable. */
+ bitmap solution;
+
++ /* Old points-to set for this variable. */
++ bitmap oldsolution;
++
+ /* Variable ids represented by this node. */
+ bitmap variables;
+
+- /* Vector of complex constraints for this node. Complex
+- constraints are those involving dereferences. */
+- VEC(constraint_t,heap) *complex;
+-
+- /* Variable id this was collapsed to due to type unsafety.
+- This should be unused completely after build_constraint_graph, or
+- something is broken. */
++ /* Variable id this was collapsed to due to type unsafety. This
++ should be unused completely after build_succ_graph, or something
++ is broken. */
+ struct variable_info *collapsed_to;
+ };
+ typedef struct variable_info *varinfo_t;
+@@ -277,8 +276,8 @@
+
+ DEF_VEC_ALLOC_P(varinfo_t, heap);
+
+-/* Table of variable info structures for constraint variables. Indexed directly
+- by variable info id. */
++/* Table of variable info structures for constraint variables.
++ Indexed directly by variable info id. */
+ static VEC(varinfo_t,heap) *varmap;
+
+ /* Return the varmap element N */
+@@ -286,7 +285,7 @@
+ static inline varinfo_t
+ get_varinfo (unsigned int n)
+ {
+- return VEC_index(varinfo_t, varmap, n);
++ return VEC_index (varinfo_t, varmap, n);
}
--/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre"} } */
-+/* { dg-final { scan-tree-dump-times "Eliminated: 1" 1 "pre" { xfail *-*-* } } } */
- /* { dg-final { cleanup-tree-dump "pre" } } */
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/invalid-call-1.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/invalid-call-1.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/invalid-call-1.c (revision 124164)
-@@ -0,0 +1,17 @@
-+/* PR rtl-optimization/29841 */
-+/* Testcase by Khem Raj <raj.khem@gmail.com> */
-+
-+/* { dg-do compile } */
-+/* { dg-options "-O2" } */
-+/* { dg-options "-O2 -mtune=i586" { target i?86-*-* } } */
-+
-+typedef void (*fp)(void);
-+extern char* bar(void* a1, int a2);
-+extern char* mar(int n);
-+char* cptr;
-+
-+void foo()
-+{
-+ cptr = mar(6);
-+ ((char *(*)(void *,int (*)(void *,unsigned char **),char**))((fp)bar))(0,0,(void*)(0)); /* { dg-warning "" "non-compatible type" } */
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/gnu89-init-4.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/gnu89-init-4.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/gnu89-init-4.c (revision 124164)
-@@ -0,0 +1,12 @@
-+/* Test for GNU extensions to compound literals are giving the correct array bounds */
-+/* { dg-do compile } */
-+/* { dg-options "-std=gnu89 -W -Wall -O2" } */
-+
-+int a[] = (int[4]){1, 1, 2};
-+int f(void)
+
+ /* Return the varmap element N, following the collapsed_to link. */
+@@ -294,7 +293,7 @@
+ static inline varinfo_t
+ get_varinfo_fc (unsigned int n)
+ {
+- varinfo_t v = VEC_index(varinfo_t, varmap, n);
++ varinfo_t v = VEC_index (varinfo_t, varmap, n);
+
+ if (v->collapsed_to)
+ return v->collapsed_to;
+@@ -331,10 +330,9 @@
+ /* Variable that represents non-local variables before we expand it to
+ one for each type. */
+ static unsigned int nonlocal_vars_id;
+-
+ /* Lookup a heap var for FROM, and return it if we find one. */
+
+-static tree
++static tree
+ heapvar_lookup (tree from)
+ {
+ struct tree_map *h, in;
+@@ -367,25 +365,21 @@
+ named NAME, and using constraint graph node NODE. */
+
+ static varinfo_t
+-new_var_info (tree t, unsigned int id, const char *name, unsigned int node)
++new_var_info (tree t, unsigned int id, const char *name)
+ {
+ varinfo_t ret = pool_alloc (variable_info_pool);
+
+ ret->id = id;
+ ret->name = name;
+ ret->decl = t;
+- ret->node = node;
+- ret->address_taken = false;
+- ret->indirect_target = false;
+ ret->directly_dereferenced = false;
+ ret->is_artificial_var = false;
+ ret->is_heap_var = false;
+ ret->is_special_var = false;
+ ret->is_unknown_size_var = false;
+ ret->has_union = false;
+- ret->solution = BITMAP_ALLOC (&ptabitmap_obstack);
+- ret->variables = BITMAP_ALLOC (&ptabitmap_obstack);
+- ret->complex = NULL;
++ ret->solution = BITMAP_ALLOC (&pta_obstack);
++ ret->oldsolution = BITMAP_ALLOC (&oldpta_obstack);
+ ret->next = NULL;
+ ret->collapsed_to = NULL;
+ return ret;
+@@ -395,7 +389,7 @@
+
+ /* An expression that appears in a constraint. */
+
+-struct constraint_expr
++struct constraint_expr
+ {
+ /* Constraint type. */
+ constraint_expr_type type;
+@@ -418,7 +412,7 @@
+ static void do_deref (VEC (ce_s, heap) **);
+
+ /* Our set constraints are made up of two constraint expressions, one
+- LHS, and one RHS.
++ LHS, and one RHS.
+
+ As described in the introduction, our set constraints each represent an
+ operation between set valued variables.
+@@ -434,63 +428,98 @@
+ static VEC(constraint_t,heap) *constraints;
+ static alloc_pool constraint_pool;
+
+-/* An edge in the weighted constraint graph. The edges are weighted,
+- with a bit set in weights meaning their is an edge with that
+- weight.
+- We don't keep the src in the edge, because we always know what it
+- is. */
+
+-struct constraint_edge
++DEF_VEC_I(int);
++DEF_VEC_ALLOC_I(int, heap);
++
++/* The constraint graph is represented as an array of bitmaps
++ containing successor nodes. */
++
++struct constraint_graph
+ {
+- unsigned int dest;
+- bitmap weights;
+-};
++ /* Size of this graph, which may be different than the number of
++ nodes in the variable map. */
++ unsigned int size;
+
+-typedef struct constraint_edge *constraint_edge_t;
+-static alloc_pool constraint_edge_pool;
++ /* Explicit successors of each node. */
++ bitmap *succs;
+
+-/* Return a new constraint edge from SRC to DEST. */
++ /* Implicit predecessors of each node (Used for variable
++ substitution). */
++ bitmap *implicit_preds;
+
+-static constraint_edge_t
+-new_constraint_edge (unsigned int dest)
+-{
+- constraint_edge_t ret = pool_alloc (constraint_edge_pool);
+- ret->dest = dest;
+- ret->weights = NULL;
+- return ret;
+-}
++ /* Explicit predecessors of each node (Used for variable substitution). */
++ bitmap *preds;
+
+-DEF_VEC_P(constraint_edge_t);
+-DEF_VEC_ALLOC_P(constraint_edge_t,heap);
++ /* Indirect cycle representatives, or -1 if the node has no indirect
++ cycles. */
++ int *indirect_cycles;
+
++ /* Representative node for a node. rep[a] == a unless the node has
++ been unified. */
++ unsigned int *rep;
+
+-/* The constraint graph is represented internally in two different
+- ways. The overwhelming majority of edges in the constraint graph
+- are zero weigh edges, and thus, using a vector of contrainst_edge_t
+- is a waste of time and memory, since they have no weights. We
+- simply use a bitmap to store the preds and succs for each node.
+- The weighted edges are stored as a set of adjacency vectors, one
+- per variable. succs[x] is the vector of successors for variable x,
+- and preds[x] is the vector of predecessors for variable x. IOW,
+- all edges are "forward" edges, which is not like our CFG. So
+- remember that preds[x]->src == x, and succs[x]->src == x. */
++ /* Equivalence class representative for a node. This is used for
++ variable substitution. */
++ int *eq_rep;
+
+-struct constraint_graph
+-{
+- bitmap *zero_weight_succs;
+- bitmap *zero_weight_preds;
+- VEC(constraint_edge_t,heap) **succs;
+- VEC(constraint_edge_t,heap) **preds;
++ /* Label for each node, used during variable substitution. */
++ unsigned int *label;
++
++ /* Bitmap of nodes where the bit is set if the node is a direct
++ node. Used for variable substitution. */
++ sbitmap direct_nodes;
++
++ /* Vector of complex constraints for each graph node. Complex
++ constraints are those involving dereferences or offsets that are
++ not 0. */
++ VEC(constraint_t,heap) **complex;
+ };
+
+-typedef struct constraint_graph *constraint_graph_t;
+-
+ static constraint_graph_t graph;
+-static int graph_size;
+
++/* During variable substitution and the offline version of indirect
++ cycle finding, we create nodes to represent dereferences and
++ address taken constraints. These represent where these start and
++ end. */
++#define FIRST_REF_NODE (VEC_length (varinfo_t, varmap))
++#define LAST_REF_NODE (FIRST_REF_NODE + (FIRST_REF_NODE - 1))
++#define FIRST_ADDR_NODE (LAST_REF_NODE + 1)
++
++/* Return the representative node for NODE, if NODE has been unioned
++ with another NODE.
++ This function performs path compression along the way to finding
++ the representative. */
++
++static unsigned int
++find (unsigned int node)
+{
-+ int sum = 0; int i;
-+ for(i = 0;i<4;i++)
-+ sum = a[i];
-+ return sum;
++ gcc_assert (node < graph->size);
++ if (graph->rep[node] != node)
++ return graph->rep[node] = find (graph->rep[node]);
++ return node;
+}
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/darwin-comm.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/darwin-comm.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/darwin-comm.c (revision 124164)
-@@ -0,0 +1,4 @@
-+/* { dg-do compile { target *-*-darwin9* } } */
-+/* { dg-final { scan-assembler ".comm _foo,1,15" } } */
-+
-+char foo __attribute__ ((aligned(32768)));
-Index: gcc-4_2-branch/gcc/testsuite/gcc.dg/pr30762-1.c
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gcc.dg/pr30762-1.c (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gcc.dg/pr30762-1.c (revision 124164)
-@@ -0,0 +1,15 @@
-+/* PR c/30762 */
-+/* { dg-do compile } */
-+/* { dg-options "--combine -O3" } */
-+/* { dg-additional-sources pr30762-2.c } */
+
-+typedef struct { int i; } D;
-+extern void foo (D);
++/* Union the TO and FROM nodes to the TO nodes.
++ Note that at some point in the future, we may want to do
++ union-by-rank, in which case we are going to have to return the
++ node we unified to. */
+
-+void
-+bar (void)
++static bool
++unite (unsigned int to, unsigned int from)
+{
-+ D d;
-+ d.i = 1;
-+ foo (d);
++ gcc_assert (to < graph->size && from < graph->size);
++ if (to != from && graph->rep[from] != to)
++ {
++ graph->rep[from] = to;
++ return true;
++ }
++ return false;
+}
-Index: gcc-4_2-branch/gcc/testsuite/ChangeLog
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/ChangeLog (revision 124164)
-@@ -1,3 +1,164 @@
-+2007-04-24 Paolo Carlini <pcarlini@suse.de>
-+
-+ PR c++/30500
-+ * g++.dg/warn/pragma-system_header3.C: New test.
-+ * g++.dg/warn/pragma-system_header3.h. New.
+
-+2007-04-24 Ian Lance Taylor <iant@google.com>
-+
-+ PR tree-optimization/31605
-+ * gcc.c-torture/execute/pr31605.c: New test.
-+
-+2007-04-24 Andreas Krebbel <krebbel1@de.ibm.com>
-+
-+ PR target/31641
-+ * gcc.c-torture/compile/pr31641.c: New testcase.
-+
-+2007-04-22 Andrew Pinski <andrew_pinski@playstation.sony.com>
-+
-+ PR middle-end/31448
-+ * gcc.c-torture/execute/pr31448.c: New testcase.
-+
-+2007-04-21 Richard Guenther <rguenther@suse.de>
-+
-+ PR middle-end/31136
-+ * gcc.c-torture/execute/pr31136.c: New testcase.
+ /* Create a new constraint consisting of LHS and RHS expressions. */
+
+-static constraint_t
++static constraint_t
+ new_constraint (const struct constraint_expr lhs,
+ const struct constraint_expr rhs)
+ {
+@@ -508,7 +537,7 @@
+ if (c->lhs.type == ADDRESSOF)
+ fprintf (file, "&");
+ else if (c->lhs.type == DEREF)
+- fprintf (file, "*");
++ fprintf (file, "*");
+ fprintf (file, "%s", get_varinfo_fc (c->lhs.var)->name);
+ if (c->lhs.offset != 0)
+ fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->lhs.offset);
+@@ -550,23 +579,24 @@
+ dump_constraints (stderr);
+ }
+
+-/* SOLVER FUNCTIONS
++/* SOLVER FUNCTIONS
+
+ The solver is a simple worklist solver, that works on the following
+ algorithm:
+-
+- sbitmap changed_nodes = all ones;
+- changed_count = number of nodes;
+- For each node that was already collapsed:
+- changed_count--;
+
++ sbitmap changed_nodes = all zeroes;
++ changed_count = 0;
++ For each node that is not already collapsed:
++ changed_count++;
++ set bit in changed nodes
+
-+2007-04-20 Jakub Jelinek <jakub@redhat.com>
+ while (changed_count > 0)
+ {
+ compute topological ordering for constraint graph
+-
+
-+ * gcc.target/i386/ordcmp-1.c: New test.
-+ * gcc.target/i386/unordcmp-1.c: New test.
+ find and collapse cycles in the constraint graph (updating
+ changed if necessary)
+-
+
-+ PR tree-optimization/31632
-+ * gcc.c-torture/compile/20070419-1.c: New test.
+ for each node (n) in the graph in topological order:
+ changed_count--;
+
+@@ -619,11 +649,11 @@
+ }
+
+ /* Return true if two constraints A and B are equal. */
+-
+
-+2007-04-19 Eric Botcazou <ebotcazou@libertysurf.fr>
+ static bool
+ constraint_equal (struct constraint a, struct constraint b)
+ {
+- return constraint_expr_equal (a.lhs, b.lhs)
++ return constraint_expr_equal (a.lhs, b.lhs)
+ && constraint_expr_equal (a.rhs, b.rhs);
+ }
+
+@@ -634,7 +664,7 @@
+ constraint_vec_find (VEC(constraint_t,heap) *vec,
+ struct constraint lookfor)
+ {
+- unsigned int place;
++ unsigned int place;
+ constraint_t found;
+
+ if (vec == NULL)
+@@ -684,7 +714,7 @@
+ /* If this is a properly sized variable, only add offset if it's
+ less than end. Otherwise, it is globbed to a single
+ variable. */
+-
++
+ if ((get_varinfo (i)->offset + offset) < get_varinfo (i)->fullsize)
+ {
+ unsigned HOST_WIDE_INT fieldoffset = get_varinfo (i)->offset + offset;
+@@ -693,15 +723,15 @@
+ continue;
+ bitmap_set_bit (result, v->id);
+ }
+- else if (get_varinfo (i)->is_artificial_var
++ else if (get_varinfo (i)->is_artificial_var
+ || get_varinfo (i)->has_union
+ || get_varinfo (i)->is_unknown_size_var)
+ {
+ bitmap_set_bit (result, i);
+ }
+ }
+-
+- bitmap_copy (set, result);
++
++ bitmap_copy (set, result);
+ BITMAP_FREE (result);
+ }
+
+@@ -727,397 +757,149 @@
+ }
+ }
+
+-/* Insert constraint C into the list of complex constraints for VAR. */
++/* Insert constraint C into the list of complex constraints for graph
++ node VAR. */
+
+ static void
+-insert_into_complex (unsigned int var, constraint_t c)
++insert_into_complex (constraint_graph_t graph,
++ unsigned int var, constraint_t c)
+ {
+- varinfo_t vi = get_varinfo (var);
+- unsigned int place = VEC_lower_bound (constraint_t, vi->complex, c,
++ VEC (constraint_t, heap) *complex = graph->complex[var];
++ unsigned int place = VEC_lower_bound (constraint_t, complex, c,
+ constraint_less);
+- VEC_safe_insert (constraint_t, heap, vi->complex, place, c);
+-}
+
+-
+-/* Compare two constraint edges A and B, return true if they are equal. */
+-
+-static bool
+-constraint_edge_equal (struct constraint_edge a, struct constraint_edge b)
+-{
+- return a.dest == b.dest;
++ /* Only insert constraints that do not already exist. */
++ if (place >= VEC_length (constraint_t, complex)
++ || !constraint_equal (*c, *VEC_index (constraint_t, complex, place)))
++ VEC_safe_insert (constraint_t, heap, graph->complex[var], place, c);
+ }
+
+-/* Compare two constraint edges, return true if A is less than B */
+
+-static bool
+-constraint_edge_less (const constraint_edge_t a, const constraint_edge_t b)
+-{
+- if (a->dest < b->dest)
+- return true;
+- return false;
+-}
+-
+-/* Find the constraint edge that matches LOOKFOR, in VEC.
+- Return the edge, if found, NULL otherwise. */
+-
+-static constraint_edge_t
+-constraint_edge_vec_find (VEC(constraint_edge_t,heap) *vec,
+- struct constraint_edge lookfor)
+-{
+- unsigned int place;
+- constraint_edge_t edge = NULL;
+-
+- place = VEC_lower_bound (constraint_edge_t, vec, &lookfor,
+- constraint_edge_less);
+- if (place >= VEC_length (constraint_edge_t, vec))
+- return NULL;
+- edge = VEC_index (constraint_edge_t, vec, place);
+- if (!constraint_edge_equal (*edge, lookfor))
+- return NULL;
+- return edge;
+-}
+-
+ /* Condense two variable nodes into a single variable node, by moving
+ all associated info from SRC to TO. */
+
+-static void
+-condense_varmap_nodes (unsigned int to, unsigned int src)
++static void
++merge_node_constraints (constraint_graph_t graph, unsigned int to,
++ unsigned int from)
+ {
+- varinfo_t tovi = get_varinfo (to);
+- varinfo_t srcvi = get_varinfo (src);
+ unsigned int i;
+ constraint_t c;
+- bitmap_iterator bi;
+-
+- /* the src node, and all its variables, are now the to node. */
+- srcvi->node = to;
+- EXECUTE_IF_SET_IN_BITMAP (srcvi->variables, 0, i, bi)
+- get_varinfo (i)->node = to;
+-
+- /* Merge the src node variables and the to node variables. */
+- bitmap_set_bit (tovi->variables, src);
+- bitmap_ior_into (tovi->variables, srcvi->variables);
+- bitmap_clear (srcvi->variables);
+-
++
++ gcc_assert (find (from) == to);
++
+ /* Move all complex constraints from src node into to node */
+- for (i = 0; VEC_iterate (constraint_t, srcvi->complex, i, c); i++)
++ for (i = 0; VEC_iterate (constraint_t, graph->complex[from], i, c); i++)
+ {
+ /* In complex constraints for node src, we may have either
+- a = *src, and *src = a. */
+-
++ a = *src, and *src = a, or an offseted constraint which are
++ always added to the rhs node's constraints. */
++
+ if (c->rhs.type == DEREF)
+ c->rhs.var = to;
++ else if (c->lhs.type == DEREF)
++ c->lhs.var = to;
+ else
+- c->lhs.var = to;
++ c->rhs.var = to;
+ }
+- constraint_set_union (&tovi->complex, &srcvi->complex);
+- VEC_free (constraint_t, heap, srcvi->complex);
+- srcvi->complex = NULL;
++ constraint_set_union (&graph->complex[to], &graph->complex[from]);
++ VEC_free (constraint_t, heap, graph->complex[from]);
++ graph->complex[from] = NULL;
+ }
+
+-/* Erase an edge from SRC to SRC from GRAPH. This routine only
+- handles self-edges (e.g. an edge from a to a). */
+
+-static void
+-erase_graph_self_edge (constraint_graph_t graph, unsigned int src)
+-{
+- VEC(constraint_edge_t,heap) *predvec = graph->preds[src];
+- VEC(constraint_edge_t,heap) *succvec = graph->succs[src];
+- struct constraint_edge edge;
+- unsigned int place;
+-
+- edge.dest = src;
+-
+- /* Remove from the successors. */
+- place = VEC_lower_bound (constraint_edge_t, succvec, &edge,
+- constraint_edge_less);
+-
+- /* Make sure we found the edge. */
+-#ifdef ENABLE_CHECKING
+- {
+- constraint_edge_t tmp = VEC_index (constraint_edge_t, succvec, place);
+- gcc_assert (constraint_edge_equal (*tmp, edge));
+- }
+-#endif
+- VEC_ordered_remove (constraint_edge_t, succvec, place);
+-
+- /* Remove from the predecessors. */
+- place = VEC_lower_bound (constraint_edge_t, predvec, &edge,
+- constraint_edge_less);
+-
+- /* Make sure we found the edge. */
+-#ifdef ENABLE_CHECKING
+- {
+- constraint_edge_t tmp = VEC_index (constraint_edge_t, predvec, place);
+- gcc_assert (constraint_edge_equal (*tmp, edge));
+- }
+-#endif
+- VEC_ordered_remove (constraint_edge_t, predvec, place);
+-}
+-
+ /* Remove edges involving NODE from GRAPH. */
+
+ static void
+ clear_edges_for_node (constraint_graph_t graph, unsigned int node)
+ {
+- VEC(constraint_edge_t,heap) *succvec = graph->succs[node];
+- VEC(constraint_edge_t,heap) *predvec = graph->preds[node];
+- bitmap_iterator bi;
+- unsigned int j;
+- constraint_edge_t c = NULL;
+- int i;
+-
+- /* Walk the successors, erase the associated preds. */
+-
+- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[node], 0, j, bi)
+- if (j != node)
+- bitmap_clear_bit (graph->zero_weight_preds[j], node);
+-
+- for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++)
+- if (c->dest != node)
+- {
+- unsigned int place;
+- struct constraint_edge lookfor;
+- constraint_edge_t result;
+-
+- lookfor.dest = node;
+- place = VEC_lower_bound (constraint_edge_t, graph->preds[c->dest],
+- &lookfor, constraint_edge_less);
+- result = VEC_ordered_remove (constraint_edge_t,
+- graph->preds[c->dest], place);
+- pool_free (constraint_edge_pool, result);
+- }
+-
+- /* Walk the preds, erase the associated succs. */
+-
+- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[node], 0, j, bi)
+- if (j != node)
+- bitmap_clear_bit (graph->zero_weight_succs[j], node);
+-
+- for (i =0; VEC_iterate (constraint_edge_t, predvec, i, c); i++)
+- if (c->dest != node)
+- {
+- unsigned int place;
+- struct constraint_edge lookfor;
+- constraint_edge_t result;
+-
+- lookfor.dest = node;
+- place = VEC_lower_bound (constraint_edge_t, graph->succs[c->dest],
+- &lookfor, constraint_edge_less);
+- result = VEC_ordered_remove (constraint_edge_t,
+- graph->succs[c->dest], place);
+- pool_free (constraint_edge_pool, result);
+-
+- }
+-
+- if (graph->zero_weight_preds[node])
+- {
+- BITMAP_FREE (graph->zero_weight_preds[node]);
+- graph->zero_weight_preds[node] = NULL;
+- }
+-
+- if (graph->zero_weight_succs[node])
+- {
+- BITMAP_FREE (graph->zero_weight_succs[node]);
+- graph->zero_weight_succs[node] = NULL;
+- }
+-
+- VEC_free (constraint_edge_t, heap, graph->preds[node]);
+- VEC_free (constraint_edge_t, heap, graph->succs[node]);
+- graph->preds[node] = NULL;
+- graph->succs[node] = NULL;
++ if (graph->succs[node])
++ BITMAP_FREE (graph->succs[node]);
+ }
+
+-static bool edge_added = false;
+-
+-/* Add edge (src, dest) to the graph. */
+-
+-static bool
+-add_graph_edge (constraint_graph_t graph, unsigned int src, unsigned int dest)
+-{
+- unsigned int place;
+- VEC(constraint_edge_t,heap) *vec;
+- struct constraint_edge newe;
+- newe.dest = dest;
+-
+- vec = graph->preds[src];
+- place = VEC_lower_bound (constraint_edge_t, vec, &newe,
+- constraint_edge_less);
+- if (place == VEC_length (constraint_edge_t, vec)
+- || VEC_index (constraint_edge_t, vec, place)->dest != dest)
+- {
+- constraint_edge_t edge = new_constraint_edge (dest);
+-
+- VEC_safe_insert (constraint_edge_t, heap, graph->preds[src],
+- place, edge);
+- edge = new_constraint_edge (src);
+-
+- place = VEC_lower_bound (constraint_edge_t, graph->succs[dest],
+- edge, constraint_edge_less);
+- VEC_safe_insert (constraint_edge_t, heap, graph->succs[dest],
+- place, edge);
+- edge_added = true;
+- stats.num_edges++;
+- return true;
+- }
+- else
+- return false;
+-}
+-
+-
+-/* Return the bitmap representing the weights of edge (SRC, DEST). */
+-
+-static bitmap *
+-get_graph_weights (constraint_graph_t graph, unsigned int src,
+- unsigned int dest)
+-{
+- constraint_edge_t edge;
+- VEC(constraint_edge_t,heap) *vec;
+- struct constraint_edge lookfor;
+-
+- lookfor.dest = dest;
+-
+- vec = graph->preds[src];
+- edge = constraint_edge_vec_find (vec, lookfor);
+- gcc_assert (edge != NULL);
+- return &edge->weights;
+-}
+-
+-/* Allocate graph weight bitmap for the edges associated with SRC and
+- DEST in GRAPH. Both the pred and the succ edges share a single
+- bitmap, so we need to set both edges to that bitmap. */
+-
+-static bitmap
+-allocate_graph_weights (constraint_graph_t graph, unsigned int src,
+- unsigned int dest)
+-{
+- bitmap result;
+- constraint_edge_t edge;
+- VEC(constraint_edge_t,heap) *vec;
+- struct constraint_edge lookfor;
+-
+- result = BITMAP_ALLOC (&ptabitmap_obstack);
+-
+- /* Set the pred weight. */
+- lookfor.dest = dest;
+- vec = graph->preds[src];
+- edge = constraint_edge_vec_find (vec, lookfor);
+- gcc_assert (edge != NULL);
+- edge->weights = result;
+-
+- /* Set the succ weight. */
+- lookfor.dest = src;
+- vec = graph->succs[dest];
+- edge = constraint_edge_vec_find (vec, lookfor);
+- gcc_assert (edge != NULL);
+- edge->weights = result;
+-
+- return result;
+-}
+-
+-
+ /* Merge GRAPH nodes FROM and TO into node TO. */
+
+ static void
+-merge_graph_nodes (constraint_graph_t graph, unsigned int to,
++merge_graph_nodes (constraint_graph_t graph, unsigned int to,
+ unsigned int from)
+ {
+- VEC(constraint_edge_t,heap) *succvec = graph->succs[from];
+- VEC(constraint_edge_t,heap) *predvec = graph->preds[from];
+- int i;
+- constraint_edge_t c;
+- unsigned int j;
+- bitmap_iterator bi;
+-
+- /* Merge all the zero weighted predecessor edges. */
+- if (graph->zero_weight_preds[from])
++ if (graph->indirect_cycles[from] != -1)
+ {
+- if (!graph->zero_weight_preds[to])
+- graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
+-
+- EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_preds[from], 0, j, bi)
++ /* If we have indirect cycles with the from node, and we have
++ none on the to node, the to node has indirect cycles from the
++ from node now that they are unified.
++ If indirect cycles exist on both, unify the nodes that they
++ are in a cycle with, since we know they are in a cycle with
++ each other. */
++ if (graph->indirect_cycles[to] == -1)
+ {
+- if (j != to)
+- {
+- bitmap_clear_bit (graph->zero_weight_succs[j], from);
+- bitmap_set_bit (graph->zero_weight_succs[j], to);
+- }
++ graph->indirect_cycles[to] = graph->indirect_cycles[from];
+ }
+- bitmap_ior_into (graph->zero_weight_preds[to],
+- graph->zero_weight_preds[from]);
+- }
++ else
++ {
++ unsigned int tonode = find (graph->indirect_cycles[to]);
++ unsigned int fromnode = find (graph->indirect_cycles[from]);
+
+- /* Merge all the zero weighted successor edges. */
+- if (graph->zero_weight_succs[from])
+- {
+- if (!graph->zero_weight_succs[to])
+- graph->zero_weight_succs[to] = BITMAP_ALLOC (&ptabitmap_obstack);
+- EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_succs[from], 0, j, bi)
+- {
+- bitmap_clear_bit (graph->zero_weight_preds[j], from);
+- bitmap_set_bit (graph->zero_weight_preds[j], to);
++ if (unite (tonode, fromnode))
++ unify_nodes (graph, tonode, fromnode, true);
+ }
+- bitmap_ior_into (graph->zero_weight_succs[to],
+- graph->zero_weight_succs[from]);
+ }
+
+- /* Merge all the nonzero weighted predecessor edges. */
+- for (i = 0; VEC_iterate (constraint_edge_t, predvec, i, c); i++)
++ /* Merge all the successor edges. */
++ if (graph->succs[from])
+ {
+- unsigned int d = c->dest;
+- bitmap temp;
+- bitmap *weights;
++ if (!graph->succs[to])
++ graph->succs[to] = BITMAP_ALLOC (&pta_obstack);
++ bitmap_ior_into (graph->succs[to],
++ graph->succs[from]);
++ }
+
+- if (c->dest == from)
+- d = to;
++ clear_edges_for_node (graph, from);
++}
+
+- add_graph_edge (graph, to, d);
+
+- temp = *(get_graph_weights (graph, from, c->dest));
+- if (temp)
+- {
+- weights = get_graph_weights (graph, to, d);
+- if (!*weights)
+- *weights = allocate_graph_weights (graph, to, d);
+-
+- bitmap_ior_into (*weights, temp);
+- }
+-
+- }
+-
+- /* Merge all the nonzero weighted successor edges. */
+- for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++)
+- {
+- unsigned int d = c->dest;
+- bitmap temp;
+- bitmap *weights;
++/* Add an indirect graph edge to GRAPH, going from TO to FROM if
++ it doesn't exist in the graph already. */
+
+- if (c->dest == from)
+- d = to;
++static void
++add_implicit_graph_edge (constraint_graph_t graph, unsigned int to,
++ unsigned int from)
++{
++ if (to == from)
++ return;
+
+- add_graph_edge (graph, d, to);
++ if (!graph->implicit_preds[to])
++ graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
+
+- temp = *(get_graph_weights (graph, c->dest, from));
+- if (temp)
+- {
+- weights = get_graph_weights (graph, d, to);
+- if (!*weights)
+- *weights = allocate_graph_weights (graph, d, to);
+- bitmap_ior_into (*weights, temp);
+- }
++ if (!bitmap_bit_p (graph->implicit_preds[to], from))
++ {
++ stats.num_implicit_edges++;
++ bitmap_set_bit (graph->implicit_preds[to], from);
+ }
+- clear_edges_for_node (graph, from);
+ }
+
+-/* Add a graph edge to GRAPH, going from TO to FROM, with WEIGHT, if
++/* Add a predecessor graph edge to GRAPH, going from TO to FROM if
+ it doesn't exist in the graph already.
+ Return false if the edge already existed, true otherwise. */
+
++static void
++add_pred_graph_edge (constraint_graph_t graph, unsigned int to,
++ unsigned int from)
++{
++ if (!graph->preds[to])
++ graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
++ if (!bitmap_bit_p (graph->preds[to], from))
++ bitmap_set_bit (graph->preds[to], from);
++}
++
++/* Add a graph edge to GRAPH, going from FROM to TO if
++ it doesn't exist in the graph already.
++ Return false if the edge already existed, true otherwise. */
++
+ static bool
+-int_add_graph_edge (constraint_graph_t graph, unsigned int to,
+- unsigned int from, unsigned HOST_WIDE_INT weight)
++add_graph_edge (constraint_graph_t graph, unsigned int to,
++ unsigned int from)
+ {
+- if (to == from && weight == 0)
++ if (to == from)
+ {
+ return false;
+ }
+@@ -1125,41 +907,15 @@
+ {
+ bool r = false;
+
+- if (weight == 0)
++ if (!graph->succs[from])
++ graph->succs[from] = BITMAP_ALLOC (&pta_obstack);
++ if (!bitmap_bit_p (graph->succs[from], to))
+ {
+- if (!graph->zero_weight_preds[to])
+- graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack);
+- if (!graph->zero_weight_succs[from])
+- graph->zero_weight_succs[from] = BITMAP_ALLOC (&ptabitmap_obstack);
+- if (!bitmap_bit_p (graph->zero_weight_succs[from], to))
+- {
+- edge_added = true;
+- r = true;
+- stats.num_edges++;
+- bitmap_set_bit (graph->zero_weight_preds[to], from);
+- bitmap_set_bit (graph->zero_weight_succs[from], to);
+- }
++ r = true;
++ if (to < FIRST_REF_NODE && from < FIRST_REF_NODE)
++ stats.num_edges++;
++ bitmap_set_bit (graph->succs[from], to);
+ }
+- else
+- {
+- bitmap *weights;
+-
+- r = add_graph_edge (graph, to, from);
+- weights = get_graph_weights (graph, to, from);
+-
+- if (!*weights)
+- {
+- r = true;
+- *weights = allocate_graph_weights (graph, to, from);
+- bitmap_set_bit (*weights, weight);
+- }
+- else
+- {
+- r |= !bitmap_bit_p (*weights, weight);
+- bitmap_set_bit (*weights, weight);
+- }
+- }
+-
+ return r;
+ }
+ }
+@@ -1168,46 +924,51 @@
+ /* Return true if {DEST.SRC} is an existing graph edge in GRAPH. */
+
+ static bool
+-valid_graph_edge (constraint_graph_t graph, unsigned int src,
++valid_graph_edge (constraint_graph_t graph, unsigned int src,
+ unsigned int dest)
+ {
+- struct constraint_edge lookfor;
+- lookfor.dest = src;
+-
+- return (graph->zero_weight_succs[dest]
+- && bitmap_bit_p (graph->zero_weight_succs[dest], src))
+- || constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL;
++ return (graph->succs[dest]
++ && bitmap_bit_p (graph->succs[dest], src));
+ }
+
+-/* Return true if {DEST, SRC} is an existing weighted graph edge (IE has
+- a weight other than 0) in GRAPH. */
+-static bool
+-valid_weighted_graph_edge (constraint_graph_t graph, unsigned int src,
+- unsigned int dest)
+-{
+- struct constraint_edge lookfor;
+- lookfor.dest = src;
+-
+- return graph->preds[src]
+- && constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL;
+-}
++/* Build the constraint graph, adding only predecessor edges right now. */
+
+-
+-/* Build the constraint graph. */
+-
+ static void
+-build_constraint_graph (void)
++build_pred_graph (void)
+ {
+- int i = 0;
++ int i;
+ constraint_t c;
++ unsigned int j;
+
+ graph = XNEW (struct constraint_graph);
+- graph_size = VEC_length (varinfo_t, varmap) + 1;
+- graph->succs = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size);
+- graph->preds = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size);
+- graph->zero_weight_succs = XCNEWVEC (bitmap, graph_size);
+- graph->zero_weight_preds = XCNEWVEC (bitmap, graph_size);
++ graph->size = (VEC_length (varinfo_t, varmap)) * 3;
++ graph->succs = XCNEWVEC (bitmap, graph->size);
++ graph->implicit_preds = XCNEWVEC (bitmap, graph->size);
++ graph->preds = XCNEWVEC (bitmap, graph->size);
++ graph->indirect_cycles = XNEWVEC (int, VEC_length (varinfo_t, varmap));
++ graph->label = XCNEWVEC (unsigned int, graph->size);
++ graph->rep = XNEWVEC (unsigned int, graph->size);
++ graph->eq_rep = XNEWVEC (int, graph->size);
++ graph->complex = XCNEWVEC (VEC(constraint_t, heap) *,
++ VEC_length (varinfo_t, varmap));
++ graph->direct_nodes = sbitmap_alloc (graph->size);
++ sbitmap_zero (graph->direct_nodes);
+
++ for (j = 0; j < FIRST_REF_NODE; j++)
++ {
++ if (!get_varinfo (j)->is_special_var)
++ SET_BIT (graph->direct_nodes, j);
++ }
++
++ for (j = 0; j < graph->size; j++)
++ {
++ graph->rep[j] = j;
++ graph->eq_rep[j] = -1;
++ }
++
++ for (j = 0; j < VEC_length (varinfo_t, varmap); j++)
++ graph->indirect_cycles[j] = -1;
++
+ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
+ {
+ struct constraint_expr lhs = c->lhs;
+@@ -1217,31 +978,92 @@
+
+ if (lhs.type == DEREF)
+ {
+- /* *x = y or *x = &y (complex) */
+- if (rhs.type == ADDRESSOF || rhsvar > anything_id)
+- insert_into_complex (lhsvar, c);
++ /* *x = y. */
++ if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR)
++ add_pred_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
++ if (rhs.type == ADDRESSOF)
++ RESET_BIT (graph->direct_nodes, rhsvar);
+ }
+ else if (rhs.type == DEREF)
+ {
+- /* !special var= *y */
+- if (!(get_varinfo (lhsvar)->is_special_var))
+- insert_into_complex (rhsvar, c);
++ /* x = *y */
++ if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR)
++ add_pred_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar);
++ else
++ RESET_BIT (graph->direct_nodes, lhsvar);
+ }
+ else if (rhs.type == ADDRESSOF)
+ {
+ /* x = &y */
++ add_pred_graph_edge (graph, lhsvar, FIRST_ADDR_NODE + rhsvar);
++ /* Implicitly, *x = y */
++ add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
++
++ RESET_BIT (graph->direct_nodes, rhsvar);
++ }
++ else if (lhsvar > anything_id
++ && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0)
++ {
++ /* x = y */
++ add_pred_graph_edge (graph, lhsvar, rhsvar);
++ /* Implicitly, *x = *y */
++ add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar,
++ FIRST_REF_NODE + rhsvar);
++ }
++ else if (lhs.offset != 0 || rhs.offset != 0)
++ {
++ if (rhs.offset != 0)
++ RESET_BIT (graph->direct_nodes, lhs.var);
++ if (lhs.offset != 0)
++ RESET_BIT (graph->direct_nodes, rhs.var);
++ }
++ }
++}
++
++/* Build the constraint graph, adding successor edges. */
++
++static void
++build_succ_graph (void)
++{
++ int i;
++ constraint_t c;
++
++ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
++ {
++ struct constraint_expr lhs;
++ struct constraint_expr rhs;
++ unsigned int lhsvar;
++ unsigned int rhsvar;
+
-+ * gcc.dg/invalid-call-1.c: New test.
++ if (!c)
++ continue;
+
-+2007-04-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
++ lhs = c->lhs;
++ rhs = c->rhs;
++ lhsvar = find (get_varinfo_fc (lhs.var)->id);
++ rhsvar = find (get_varinfo_fc (rhs.var)->id);
+
-+ PR libgfortran/31366
-+ * gfortran.dg/direct_io_6.f90: New test.
++ if (lhs.type == DEREF)
++ {
++ if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR)
++ add_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar);
++ }
++ else if (rhs.type == DEREF)
++ {
++ if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR)
++ add_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar);
++ }
++ else if (rhs.type == ADDRESSOF)
++ {
++ /* x = &y */
++ gcc_assert (find (get_varinfo_fc (rhs.var)->id)
++ == get_varinfo_fc (rhs.var)->id);
+ bitmap_set_bit (get_varinfo (lhsvar)->solution, rhsvar);
+ }
+- else if (lhsvar > anything_id)
++ else if (lhsvar > anything_id
++ && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0)
+ {
+- /* Ignore 0 weighted self edges, as they can't possibly contribute
+- anything */
+- if (lhsvar != rhsvar || rhs.offset != 0 || lhs.offset != 0)
+- {
+- /* x = y (simple) */
+- int_add_graph_edge (graph, lhs.var, rhs.var, rhs.offset);
+- }
+-
++ add_graph_edge (graph, lhsvar, rhsvar);
+ }
+ }
+ }
+@@ -1260,20 +1082,20 @@
+ struct scc_info
+ {
+ sbitmap visited;
+- sbitmap in_component;
++ sbitmap roots;
++ unsigned int *dfs;
++ unsigned int *node_mapping;
+ int current_index;
+- unsigned int *visited_index;
+ VEC(unsigned,heap) *scc_stack;
+- VEC(unsigned,heap) *unification_queue;
+ };
+
+
+ /* Recursive routine to find strongly connected components in GRAPH.
+ SI is the SCC info to store the information in, and N is the id of current
+ graph node we are processing.
+-
++
+ This is Tarjan's strongly connected component finding algorithm, as
+- modified by Nuutila to keep only non-root nodes on the stack.
++ modified by Nuutila to keep only non-root nodes on the stack.
+ The algorithm can be found in "On finding the strongly connected
+ connected components in a directed graph" by Esko Nuutila and Eljas
+ Soisalon-Soininen, in Information Processing Letters volume 49,
+@@ -1284,188 +1106,144 @@
+ {
+ unsigned int i;
+ bitmap_iterator bi;
++ unsigned int my_dfs;
+
+- gcc_assert (get_varinfo (n)->node == n);
+ SET_BIT (si->visited, n);
+- RESET_BIT (si->in_component, n);
+- si->visited_index[n] = si->current_index ++;
+-
++ si->dfs[n] = si->current_index ++;
++ my_dfs = si->dfs[n];
++
+ /* Visit all the successors. */
+- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[n], 0, i, bi)
++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[n], 0, i, bi)
+ {
+- unsigned int w = i;
++ unsigned int w;
++
++ if (i > LAST_REF_NODE)
++ break;
++
++ w = find (i);
++ if (TEST_BIT (si->roots, w))
++ continue;
++
+ if (!TEST_BIT (si->visited, w))
+ scc_visit (graph, si, w);
+- if (!TEST_BIT (si->in_component, w))
+- {
+- unsigned int t = get_varinfo (w)->node;
+- unsigned int nnode = get_varinfo (n)->node;
+- if (si->visited_index[t] < si->visited_index[nnode])
+- get_varinfo (n)->node = t;
+- }
++ {
++ unsigned int t = find (w);
++ unsigned int nnode = find (n);
++ gcc_assert (nnode == n);
++
++ if (si->dfs[t] < si->dfs[nnode])
++ si->dfs[n] = si->dfs[t];
++ }
+ }
+-
++
+ /* See if any components have been identified. */
+- if (get_varinfo (n)->node == n)
++ if (si->dfs[n] == my_dfs)
+ {
+- unsigned int t = si->visited_index[n];
+- SET_BIT (si->in_component, n);
+- while (VEC_length (unsigned, si->scc_stack) != 0
+- && t < si->visited_index[VEC_last (unsigned, si->scc_stack)])
++ if (VEC_length (unsigned, si->scc_stack) > 0
++ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs)
+ {
+- unsigned int w = VEC_pop (unsigned, si->scc_stack);
+- get_varinfo (w)->node = n;
+- SET_BIT (si->in_component, w);
+- /* Mark this node for collapsing. */
+- VEC_safe_push (unsigned, heap, si->unification_queue, w);
+- }
+- }
+- else
+- VEC_safe_push (unsigned, heap, si->scc_stack, n);
+-}
++ bitmap scc = BITMAP_ALLOC (NULL);
++ bool have_ref_node = n >= FIRST_REF_NODE;
++ unsigned int lowest_node;
++ bitmap_iterator bi;
+
++ bitmap_set_bit (scc, n);
+
+-/* Collapse two variables into one variable. */
++ while (VEC_length (unsigned, si->scc_stack) != 0
++ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs)
++ {
++ unsigned int w = VEC_pop (unsigned, si->scc_stack);
+
+-static void
+-collapse_nodes (constraint_graph_t graph, unsigned int to, unsigned int from)
+-{
+- bitmap tosol, fromsol;
++ bitmap_set_bit (scc, w);
++ if (w >= FIRST_REF_NODE)
++ have_ref_node = true;
++ }
+
+- condense_varmap_nodes (to, from);
+- tosol = get_varinfo (to)->solution;
+- fromsol = get_varinfo (from)->solution;
+- bitmap_ior_into (tosol, fromsol);
+- merge_graph_nodes (graph, to, from);
+-
+- if (valid_graph_edge (graph, to, to))
+- {
+- if (graph->zero_weight_preds[to])
+- {
+- bitmap_clear_bit (graph->zero_weight_preds[to], to);
+- bitmap_clear_bit (graph->zero_weight_succs[to], to);
++ lowest_node = bitmap_first_set_bit (scc);
++ gcc_assert (lowest_node < FIRST_REF_NODE);
++ EXECUTE_IF_SET_IN_BITMAP (scc, 0, i, bi)
++ {
++ if (i < FIRST_REF_NODE)
++ {
++ /* Mark this node for collapsing. */
++ if (unite (lowest_node, i))
++ unify_nodes (graph, lowest_node, i, false);
++ }
++ else
++ {
++ unite (lowest_node, i);
++ graph->indirect_cycles[i - FIRST_REF_NODE] = lowest_node;
++ }
++ }
+ }
+- if (valid_weighted_graph_edge (graph, to, to))
+- {
+- bitmap weights = *(get_graph_weights (graph, to, to));
+- if (!weights || bitmap_empty_p (weights))
+- erase_graph_self_edge (graph, to);
+- }
++ SET_BIT (si->roots, n);
+ }
+- BITMAP_FREE (fromsol);
+- get_varinfo (to)->address_taken |= get_varinfo (from)->address_taken;
+- get_varinfo (to)->indirect_target |= get_varinfo (from)->indirect_target;
++ else
++ VEC_safe_push (unsigned, heap, si->scc_stack, n);
+ }
+
++/* Unify node FROM into node TO, updating the changed count if
++ necessary when UPDATE_CHANGED is true. */
+
+-/* Unify nodes in GRAPH that we have found to be part of a cycle.
+- SI is the Strongly Connected Components information structure that tells us
+- what components to unify.
+- UPDATE_CHANGED should be set to true if the changed sbitmap and changed
+- count should be updated to reflect the unification. */
+-
+ static void
+-process_unification_queue (constraint_graph_t graph, struct scc_info *si,
+- bool update_changed)
++unify_nodes (constraint_graph_t graph, unsigned int to, unsigned int from,
++ bool update_changed)
+ {
+- size_t i = 0;
+- bitmap tmp = BITMAP_ALLOC (update_changed ? &iteration_obstack : NULL);
+- bitmap_clear (tmp);
+
+- /* We proceed as follows:
++ gcc_assert (to != from && find (to) == to);
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ fprintf (dump_file, "Unifying %s to %s\n",
++ get_varinfo (from)->name,
++ get_varinfo (to)->name);
+
+- For each component in the queue (components are delineated by
+- when current_queue_element->node != next_queue_element->node):
++ if (update_changed)
++ stats.unified_vars_dynamic++;
++ else
++ stats.unified_vars_static++;
+
+- rep = representative node for component
++ merge_graph_nodes (graph, to, from);
++ merge_node_constraints (graph, to, from);
+
+- For each node (tounify) to be unified in the component,
+- merge the solution for tounify into tmp bitmap
+-
+- clear solution for tounify
+-
+- merge edges from tounify into rep
+-
+- merge complex constraints from tounify into rep
+-
+- update changed count to note that tounify will never change
+- again
+-
+- Merge tmp into solution for rep, marking rep changed if this
+- changed rep's solution.
+-
+- Delete any 0 weighted self-edges we now have for rep. */
+- while (i != VEC_length (unsigned, si->unification_queue))
++ if (update_changed && TEST_BIT (changed, from))
+ {
+- unsigned int tounify = VEC_index (unsigned, si->unification_queue, i);
+- unsigned int n = get_varinfo (tounify)->node;
+-
+- if (dump_file && (dump_flags & TDF_DETAILS))
+- fprintf (dump_file, "Unifying %s to %s\n",
+- get_varinfo (tounify)->name,
+- get_varinfo (n)->name);
+- if (update_changed)
+- stats.unified_vars_dynamic++;
++ RESET_BIT (changed, from);
++ if (!TEST_BIT (changed, to))
++ SET_BIT (changed, to);
+ else
+- stats.unified_vars_static++;
+- bitmap_ior_into (tmp, get_varinfo (tounify)->solution);
+- merge_graph_nodes (graph, n, tounify);
+- condense_varmap_nodes (n, tounify);
+-
+- if (update_changed && TEST_BIT (changed, tounify))
+ {
+- RESET_BIT (changed, tounify);
+- if (!TEST_BIT (changed, n))
+- SET_BIT (changed, n);
+- else
+- {
+- gcc_assert (changed_count > 0);
+- changed_count--;
+- }
++ gcc_assert (changed_count > 0);
++ changed_count--;
+ }
++ }
+
+- bitmap_clear (get_varinfo (tounify)->solution);
+- ++i;
+-
+- /* If we've either finished processing the entire queue, or
+- finished processing all nodes for component n, update the solution for
+- n. */
+- if (i == VEC_length (unsigned, si->unification_queue)
+- || get_varinfo (VEC_index (unsigned, si->unification_queue, i))->node != n)
++ /* If the solution changes because of the merging, we need to mark
++ the variable as changed. */
++ if (bitmap_ior_into (get_varinfo (to)->solution,
++ get_varinfo (from)->solution))
++ {
++ if (update_changed && !TEST_BIT (changed, to))
+ {
+- /* If the solution changes because of the merging, we need to mark
+- the variable as changed. */
+- if (bitmap_ior_into (get_varinfo (n)->solution, tmp))
+- {
+- if (update_changed && !TEST_BIT (changed, n))
+- {
+- SET_BIT (changed, n);
+- changed_count++;
+- }
+- }
+- bitmap_clear (tmp);
+-
+- if (valid_graph_edge (graph, n, n))
+- {
+- if (graph->zero_weight_succs[n])
+- {
+- if (graph->zero_weight_preds[n])
+- bitmap_clear_bit (graph->zero_weight_preds[n], n);
+- bitmap_clear_bit (graph->zero_weight_succs[n], n);
+- }
+- if (valid_weighted_graph_edge (graph, n, n))
+- {
+- bitmap weights = *(get_graph_weights (graph, n, n));
+- if (!weights || bitmap_empty_p (weights))
+- erase_graph_self_edge (graph, n);
+- }
+- }
++ SET_BIT (changed, to);
++ changed_count++;
+ }
+ }
+- BITMAP_FREE (tmp);
+
-+2007-04-17 Simon Martin <simartin@users.sourceforge.net>
++ BITMAP_FREE (get_varinfo (from)->solution);
++ BITMAP_FREE (get_varinfo (from)->oldsolution);
+
-+ PR c++/31517
-+ * g++.dg/template/init7.C: New test.
++ if (stats.iterations > 0)
++ {
++ BITMAP_FREE (get_varinfo (to)->oldsolution);
++ get_varinfo (to)->oldsolution = BITMAP_ALLOC (&oldpta_obstack);
++ }
+
-+2007-04-16 Mark Mitchell <mark@codesourcery.com>
++ if (valid_graph_edge (graph, to, to))
++ {
++ if (graph->succs[to])
++ bitmap_clear_bit (graph->succs[to], to);
++ }
+ }
+
+-
+ /* Information needed to compute the topological ordering of a graph. */
+
+ struct topo_info
+@@ -1509,37 +1287,24 @@
+ topo_visit (constraint_graph_t graph, struct topo_info *ti,
+ unsigned int n)
+ {
+- VEC(constraint_edge_t,heap) *succs = graph->succs[n];
+- bitmap temp;
+ bitmap_iterator bi;
+- constraint_edge_t c;
+- int i;
+ unsigned int j;
+
+ SET_BIT (ti->visited, n);
+- if (VEC_length (constraint_edge_t, succs) != 0)
+- {
+- temp = BITMAP_ALLOC (&iteration_obstack);
+- if (graph->zero_weight_succs[n])
+- bitmap_ior_into (temp, graph->zero_weight_succs[n]);
+- for (i = 0; VEC_iterate (constraint_edge_t, succs, i, c); i++)
+- bitmap_set_bit (temp, c->dest);
+- }
+- else
+- temp = graph->zero_weight_succs[n];
+
+- if (temp)
+- EXECUTE_IF_SET_IN_BITMAP (temp, 0, j, bi)
++ if (graph->succs[n])
++ EXECUTE_IF_SET_IN_BITMAP (graph->succs[n], 0, j, bi)
+ {
+ if (!TEST_BIT (ti->visited, j))
+ topo_visit (graph, ti, j);
+ }
+
-+ PR c++/31513
-+ * g++.dg/expr/bitfield8.C: New test.
+ VEC_safe_push (unsigned, heap, ti->topo_order, n);
+ }
+
+ /* Return true if variable N + OFFSET is a legal field of N. */
+
+-static bool
++static bool
+ type_safe (unsigned int n, unsigned HOST_WIDE_INT *offset)
+ {
+ varinfo_t ninfo = get_varinfo (n);
+@@ -1582,10 +1347,10 @@
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ if (!v)
+ continue;
+- t = v->node;
++ t = find (v->id);
+ sol = get_varinfo (t)->solution;
+ if (!bitmap_bit_p (sol, rhs))
+- {
++ {
+ bitmap_set_bit (sol, rhs);
+ if (!TEST_BIT (changed, t))
+ {
+@@ -1596,7 +1361,7 @@
+ }
+ else if (0 && dump_file && !(get_varinfo (j)->is_special_var))
+ fprintf (dump_file, "Untypesafe usage in do_da_constraint.\n");
+-
+
-+2007-04-14 Andrew Pinski <andrew_pinski@playstation.sony.com>
+ }
+ }
+
+@@ -1607,7 +1372,7 @@
+ do_sd_constraint (constraint_graph_t graph, constraint_t c,
+ bitmap delta)
+ {
+- unsigned int lhs = get_varinfo (c->lhs.var)->node;
++ unsigned int lhs = find (c->lhs.var);
+ bool flag = false;
+ bitmap sol = get_varinfo (lhs)->solution;
+ unsigned int j;
+@@ -1620,7 +1385,7 @@
+ bitmap_set_bit (sol, anything_id);
+ goto done;
+ }
+- /* For each variable j in delta (Sol(y)), add
++ /* For each variable j in delta (Sol(y)), add
+ an edge in the graph from j to x, and union Sol(j) into Sol(x). */
+ EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
+ {
+@@ -1634,18 +1399,18 @@
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ if (!v)
+ continue;
+- t = v->node;
++ t = find (v->id);
+
+ /* Adding edges from the special vars is pointless.
+ They don't have sets that can change. */
+ if (get_varinfo (t) ->is_special_var)
+ flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
+- else if (int_add_graph_edge (graph, lhs, t, 0))
++ else if (add_graph_edge (graph, lhs, t))
+ flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
+ }
+ else if (0 && dump_file && !(get_varinfo (j)->is_special_var))
+ fprintf (dump_file, "Untypesafe usage in do_sd_constraint\n");
+-
+
-+ PR testsuite/31578
-+ * gcc.dg/gnu89-init-4.c: Change to a compile only test.
+ }
+
+ done:
+@@ -1658,15 +1423,15 @@
+ SET_BIT (changed, lhs);
+ changed_count++;
+ }
+- }
++ }
+ }
+
+ /* Process a constraint C that represents *x = y. */
+
+ static void
+-do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
++do_ds_constraint (constraint_t c, bitmap delta)
+ {
+- unsigned int rhs = get_varinfo (c->rhs.var)->node;
++ unsigned int rhs = find (c->rhs.var);
+ unsigned HOST_WIDE_INT roff = c->rhs.offset;
+ bitmap sol = get_varinfo (rhs)->solution;
+ unsigned int j;
+@@ -1685,8 +1450,8 @@
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ if (!v)
+ continue;
+- t = v->node;
+-
++ t = find (v->id);
++
+ if (!bitmap_bit_p (get_varinfo (t)->solution, anything_id))
+ {
+ bitmap_set_bit (get_varinfo (t)->solution, anything_id);
+@@ -1705,40 +1470,39 @@
+ EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi)
+ {
+ unsigned HOST_WIDE_INT loff = c->lhs.offset;
+- if (type_safe (j, &loff) && !(get_varinfo(j)->is_special_var))
++ if (type_safe (j, &loff) && !(get_varinfo (j)->is_special_var))
+ {
+ varinfo_t v;
+ unsigned int t;
+ unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + loff;
++ bitmap tmp;
+
+ v = first_vi_for_offset (get_varinfo (j), fieldoffset);
+ if (!v)
+ continue;
+- t = v->node;
+- if (int_add_graph_edge (graph, t, rhs, roff))
++ t = find (v->id);
++ tmp = get_varinfo (t)->solution;
++
++ if (set_union_with_increment (tmp, sol, roff))
+ {
+- bitmap tmp = get_varinfo (t)->solution;
+- if (set_union_with_increment (tmp, sol, roff))
++ get_varinfo (t)->solution = tmp;
++ if (t == rhs)
++ sol = get_varinfo (rhs)->solution;
++ if (!TEST_BIT (changed, t))
+ {
+- get_varinfo (t)->solution = tmp;
+- if (t == rhs)
+- sol = get_varinfo (rhs)->solution;
+- if (!TEST_BIT (changed, t))
+- {
+- SET_BIT (changed, t);
+- changed_count++;
+- }
++ SET_BIT (changed, t);
++ changed_count++;
+ }
+ }
+- }
++ }
+ else if (0 && dump_file && !(get_varinfo (j)->is_special_var))
+ fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n");
+ }
+ }
+
+-/* Handle a non-simple (simple meaning requires no iteration), non-copy
+- constraint (IE *x = &y, x = *y, and *x = y). */
+-
++/* Handle a non-simple (simple meaning requires no iteration),
++ constraint (IE *x = &y, x = *y, *x = y, and x = y with offsets involved). */
+
-+2007-04-14 Andrew Pinski <andrew_pinski@playstation.sony.com>
+ static void
+ do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta)
+ {
+@@ -1752,33 +1516,62 @@
+ else
+ {
+ /* *x = y */
+- do_ds_constraint (graph, c, delta);
++ do_ds_constraint (c, delta);
+ }
+ }
+- else
++ else if (c->rhs.type == DEREF)
+ {
+ /* x = *y */
+ if (!(get_varinfo (c->lhs.var)->is_special_var))
+ do_sd_constraint (graph, c, delta);
+ }
++ else
++ {
++ bitmap tmp;
++ bitmap solution;
++ bool flag = false;
++ unsigned int t;
+
-+ PR C/31520
-+ * gcc.dg/gnu89-init-4.c: New testcase.
++ gcc_assert (c->rhs.type == SCALAR && c->lhs.type == SCALAR);
++ t = find (c->rhs.var);
++ solution = get_varinfo (t)->solution;
++ t = find (c->lhs.var);
++ tmp = get_varinfo (t)->solution;
+
-+2007-04-14 Jakub Jelinek <jakub@redhat.com>
++ flag = set_union_with_increment (tmp, solution, c->rhs.offset);
+
-+ PR c++/25874
-+ * gcc.dg/gomp/pr25874.c: Add dg-options.
-+ * g++.dg/gomp/pr25874.C: Add dg-options.
++ if (flag)
++ {
++ get_varinfo (t)->solution = tmp;
++ if (!TEST_BIT (changed, t))
++ {
++ SET_BIT (changed, t);
++ changed_count++;
++ }
++ }
++ }
+ }
+
+ /* Initialize and return a new SCC info structure. */
+
+ static struct scc_info *
+-init_scc_info (void)
++init_scc_info (size_t size)
+ {
+ struct scc_info *si = XNEW (struct scc_info);
+- size_t size = VEC_length (varinfo_t, varmap);
++ size_t i;
+
+ si->current_index = 0;
+ si->visited = sbitmap_alloc (size);
+ sbitmap_zero (si->visited);
+- si->in_component = sbitmap_alloc (size);
+- sbitmap_ones (si->in_component);
+- si->visited_index = XCNEWVEC (unsigned int, size + 1);
++ si->roots = sbitmap_alloc (size);
++ sbitmap_zero (si->roots);
++ si->node_mapping = XNEWVEC (unsigned int, size);
++ si->dfs = XCNEWVEC (unsigned int, size);
++
++ for (i = 0; i < size; i++)
++ si->node_mapping[i] = i;
++
+ si->scc_stack = VEC_alloc (unsigned, heap, 1);
+- si->unification_queue = VEC_alloc (unsigned, heap, 1);
+ return si;
+ }
+
+@@ -1786,209 +1579,430 @@
+
+ static void
+ free_scc_info (struct scc_info *si)
+-{
++{
+ sbitmap_free (si->visited);
+- sbitmap_free (si->in_component);
+- free (si->visited_index);
++ sbitmap_free (si->roots);
++ free (si->node_mapping);
++ free (si->dfs);
+ VEC_free (unsigned, heap, si->scc_stack);
+- VEC_free (unsigned, heap, si->unification_queue);
+- free(si);
++ free (si);
+ }
+
+
+-/* Find cycles in GRAPH that occur, using strongly connected components, and
+- collapse the cycles into a single representative node. if UPDATE_CHANGED
+- is true, then update the changed sbitmap to note those nodes whose
+- solutions have changed as a result of collapsing. */
++/* Find indirect cycles in GRAPH that occur, using strongly connected
++ components, and note them in the indirect cycles map.
+
++ This technique comes from Ben Hardekopf and Calvin Lin,
++ "It Pays to be Lazy: Fast and Accurate Pointer Analysis for Millions of
++ Lines of Code", submitted to PLDI 2007. */
+
-+2007-04-13 Jason Merrill <jason@redhat.com>
+ static void
+-find_and_collapse_graph_cycles (constraint_graph_t graph, bool update_changed)
++find_indirect_cycles (constraint_graph_t graph)
+ {
+ unsigned int i;
+- unsigned int size = VEC_length (varinfo_t, varmap);
+- struct scc_info *si = init_scc_info ();
++ unsigned int size = graph->size;
++ struct scc_info *si = init_scc_info (size);
+
+- for (i = 0; i != size; ++i)
+- if (!TEST_BIT (si->visited, i) && get_varinfo (i)->node == i)
++ for (i = 0; i < MIN (LAST_REF_NODE, size); i ++ )
++ if (!TEST_BIT (si->visited, i) && find (i) == i)
+ scc_visit (graph, si, i);
+-
+- process_unification_queue (graph, si, update_changed);
++
+ free_scc_info (si);
+ }
+
+ /* Compute a topological ordering for GRAPH, and store the result in the
+ topo_info structure TI. */
+
+-static void
++static void
+ compute_topo_order (constraint_graph_t graph,
+ struct topo_info *ti)
+ {
+ unsigned int i;
+ unsigned int size = VEC_length (varinfo_t, varmap);
+-
++
+ for (i = 0; i != size; ++i)
+- if (!TEST_BIT (ti->visited, i) && get_varinfo (i)->node == i)
++ if (!TEST_BIT (ti->visited, i) && find (i) == i)
+ topo_visit (graph, ti, i);
+ }
+
+-/* Return true if bitmap B is empty, or a bitmap other than bit 0 is set. */
++/* Perform offline variable substitution.
+
+-static bool
+-bitmap_other_than_zero_bit_set (bitmap b)
+-{
+- unsigned int i;
+- bitmap_iterator bi;
+-
+- if (bitmap_empty_p (b))
+- return false;
+- EXECUTE_IF_SET_IN_BITMAP (b, 1, i, bi)
+- return true;
+- return false;
+-}
+-
+-/* Perform offline variable substitution.
+-
+ This is a linear time way of identifying variables that must have
+ equivalent points-to sets, including those caused by static cycles,
+ and single entry subgraphs, in the constraint graph.
+
+ The technique is described in "Off-line variable substitution for
+ scaling points-to analysis" by Atanas Rountev and Satish Chandra,
+- in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56. */
++ in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56.
+
++ There is an optimal way to do this involving hash based value
++ numbering, once the technique is published i will implement it
++ here.
++
++ The general method of finding equivalence classes is as follows:
++ Add fake nodes (REF nodes) and edges for *a = b and a = *b constraints.
++ Add fake nodes (ADDRESS nodes) and edges for a = &b constraints.
++ Initialize all non-REF/ADDRESS nodes to be direct nodes
++ For each SCC in the predecessor graph:
++ for each member (x) of the SCC
++ if x is not a direct node:
++ set rootnode(SCC) to be not a direct node
++ collapse node x into rootnode(SCC).
++ if rootnode(SCC) is not a direct node:
++ label rootnode(SCC) with a new equivalence class
++ else:
++ if all labeled predecessors of rootnode(SCC) have the same
++ label:
++ label rootnode(SCC) with this label
++ else:
++ label rootnode(SCC) with a new equivalence class
++
++ All direct nodes with the same equivalence class can be replaced
++ with a single representative node.
++ All unlabeled nodes (label == 0) are not pointers and all edges
++ involving them can be eliminated.
++ We perform these optimizations during move_complex_constraints.
++*/
++
++static int equivalence_class;
++
++/* Recursive routine to find strongly connected components in GRAPH,
++ and label it's nodes with equivalence classes.
++ This is used during variable substitution to find cycles involving
++ the regular or implicit predecessors, and label them as equivalent.
++ The SCC finding algorithm used is the same as that for scc_visit. */
++
+ static void
+-perform_var_substitution (constraint_graph_t graph)
++label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n)
+ {
+- struct topo_info *ti = init_topo_info ();
+-
+- bitmap_obstack_initialize (&iteration_obstack);
+- /* Compute the topological ordering of the graph, then visit each
+- node in topological order. */
+- compute_topo_order (graph, ti);
+-
+- while (VEC_length (unsigned, ti->topo_order) != 0)
++ unsigned int i;
++ bitmap_iterator bi;
++ unsigned int my_dfs;
++
++ gcc_assert (si->node_mapping[n] == n);
++ SET_BIT (si->visited, n);
++ si->dfs[n] = si->current_index ++;
++ my_dfs = si->dfs[n];
++
++ /* Visit all the successors. */
++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
+ {
+- unsigned int i = VEC_pop (unsigned, ti->topo_order);
+- unsigned int pred;
+- varinfo_t vi = get_varinfo (i);
+- bool okay_to_elim = false;
+- unsigned int root = VEC_length (varinfo_t, varmap);
+- VEC(constraint_edge_t,heap) *predvec = graph->preds[i];
+- constraint_edge_t ce = NULL;
+- bitmap tmp;
+- unsigned int k;
+- bitmap_iterator bi;
++ unsigned int w = si->node_mapping[i];
+
+- /* We can't eliminate things whose address is taken, or which is
+- the target of a dereference. */
+- if (vi->address_taken || vi->indirect_target)
++ if (TEST_BIT (si->roots, w))
+ continue;
+
+- /* See if all predecessors of I are ripe for elimination */
+- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[i], 0, k, bi)
+- {
+- unsigned int w;
+- w = get_varinfo (k)->node;
++ if (!TEST_BIT (si->visited, w))
++ label_visit (graph, si, w);
++ {
++ unsigned int t = si->node_mapping[w];
++ unsigned int nnode = si->node_mapping[n];
++ gcc_assert (nnode == n);
+
+- /* We can't eliminate the node if one of the predecessors is
+- part of a different strongly connected component. */
+- if (!okay_to_elim)
+- {
+- root = w;
+- okay_to_elim = true;
+- }
+- else if (w != root)
+- {
+- okay_to_elim = false;
+- break;
+- }
++ if (si->dfs[t] < si->dfs[nnode])
++ si->dfs[n] = si->dfs[t];
++ }
++ }
+
+- /* Theorem 4 in Rountev and Chandra: If i is a direct node,
+- then Solution(i) is a subset of Solution (w), where w is a
+- predecessor in the graph.
+- Corollary: If all predecessors of i have the same
+- points-to set, then i has that same points-to set as
+- those predecessors. */
+- tmp = BITMAP_ALLOC (NULL);
+- bitmap_and_compl (tmp, get_varinfo (i)->solution,
+- get_varinfo (w)->solution);
+- if (!bitmap_empty_p (tmp))
+- {
+- okay_to_elim = false;
+- BITMAP_FREE (tmp);
+- break;
+- }
+- BITMAP_FREE (tmp);
+- }
++ /* Visit all the implicit predecessors. */
++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->implicit_preds[n], 0, i, bi)
++ {
++ unsigned int w = si->node_mapping[i];
+
+- if (okay_to_elim)
+- for (pred = 0;
+- VEC_iterate (constraint_edge_t, predvec, pred, ce);
+- pred++)
+- {
+- bitmap weight;
+- unsigned int w;
+- weight = *(get_graph_weights (graph, i, ce->dest));
++ if (TEST_BIT (si->roots, w))
++ continue;
+
+- /* We can't eliminate variables that have nonzero weighted
+- edges between them. */
+- if (weight && bitmap_other_than_zero_bit_set (weight))
+- {
+- okay_to_elim = false;
+- break;
+- }
+- w = get_varinfo (ce->dest)->node;
++ if (!TEST_BIT (si->visited, w))
++ label_visit (graph, si, w);
++ {
++ unsigned int t = si->node_mapping[w];
++ unsigned int nnode = si->node_mapping[n];
++ gcc_assert (nnode == n);
+
+- /* We can't eliminate the node if one of the predecessors is
+- part of a different strongly connected component. */
+- if (!okay_to_elim)
+- {
+- root = w;
+- okay_to_elim = true;
+- }
+- else if (w != root)
+- {
+- okay_to_elim = false;
+- break;
+- }
++ if (si->dfs[t] < si->dfs[nnode])
++ si->dfs[n] = si->dfs[t];
++ }
++ }
+
+- /* Theorem 4 in Rountev and Chandra: If i is a direct node,
+- then Solution(i) is a subset of Solution (w), where w is a
+- predecessor in the graph.
+- Corollary: If all predecessors of i have the same
+- points-to set, then i has that same points-to set as
+- those predecessors. */
+- tmp = BITMAP_ALLOC (NULL);
+- bitmap_and_compl (tmp, get_varinfo (i)->solution,
+- get_varinfo (w)->solution);
+- if (!bitmap_empty_p (tmp))
+- {
+- okay_to_elim = false;
+- BITMAP_FREE (tmp);
+- break;
+- }
+- BITMAP_FREE (tmp);
+- }
++ /* See if any components have been identified. */
++ if (si->dfs[n] == my_dfs)
++ {
++ while (VEC_length (unsigned, si->scc_stack) != 0
++ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs)
++ {
++ unsigned int w = VEC_pop (unsigned, si->scc_stack);
++ si->node_mapping[w] = n;
+
+- /* See if the root is different than the original node.
+- If so, we've found an equivalence. */
+- if (root != get_varinfo (i)->node && okay_to_elim)
++ if (!TEST_BIT (graph->direct_nodes, w))
++ RESET_BIT (graph->direct_nodes, n);
++ }
++ SET_BIT (si->roots, n);
+
-+ PR c++/31074
-+ * conv3.C: New test.
++ if (!TEST_BIT (graph->direct_nodes, n))
+ {
+- /* Found an equivalence */
+- get_varinfo (i)->node = root;
+- collapse_nodes (graph, root, i);
++ graph->label[n] = equivalence_class++;
++ }
++ else
++ {
++ unsigned int size = 0;
++ unsigned int firstlabel = ~0;
+
-+2007-04-13 Joseph Myers <joseph@codesourcery.com>
++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi)
++ {
++ unsigned int j = si->node_mapping[i];
+
-+ PR tree-optimization/29598
-+ * gcc.dg/tree-ssa/loadpre1.c, gcc.dg/tree-ssa/loadpre14.c,
-+ gcc.dg/tree-ssa/loadpre15.c: XFAIL.
++ if (j == n || graph->label[j] == 0)
++ continue;
+
-+2007-04-10 Mike Stump <mrs@apple.com>
++ if (firstlabel == (unsigned int)~0)
++ {
++ firstlabel = graph->label[j];
++ size++;
++ }
++ else if (graph->label[j] != firstlabel)
++ size++;
++ }
+
-+ * g++.dg/tree-ssa/pr29585.C: Don't die on an expected warning.
++ if (size == 0)
++ graph->label[n] = 0;
++ else if (size == 1)
++ graph->label[n] = firstlabel;
++ else
++ graph->label[n] = equivalence_class++;
++ }
++ }
++ else
++ VEC_safe_push (unsigned, heap, si->scc_stack, n);
++}
+
-+2007-04-09 Mark Mitchell <mark@codesourcery.com>
++/* Perform offline variable substitution, discovering equivalence
++ classes, and eliminating non-pointer variables. */
+
-+ PR c++/31449
-+ * g++.dg/init/const5.C: New test.
++static struct scc_info *
++perform_var_substitution (constraint_graph_t graph)
++{
++ unsigned int i;
++ unsigned int size = graph->size;
++ struct scc_info *si = init_scc_info (size);
++
++ bitmap_obstack_initialize (&iteration_obstack);
++ equivalence_class = 0;
++
++ /* We only need to visit the non-address nodes for labeling
++ purposes, as the address nodes will never have any predecessors,
++ because &x never appears on the LHS of a constraint. */
++ for (i = 0; i < LAST_REF_NODE; i++)
++ if (!TEST_BIT (si->visited, si->node_mapping[i]))
++ label_visit (graph, si, si->node_mapping[i]);
++
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ for (i = 0; i < FIRST_REF_NODE; i++)
++ {
++ bool direct_node = TEST_BIT (graph->direct_nodes, i);
++ fprintf (dump_file,
++ "Equivalence class for %s node id %d:%s is %d\n",
++ direct_node ? "Direct node" : "Indirect node", i,
++ get_varinfo (i)->name,
++ graph->label[si->node_mapping[i]]);
++ }
+
-+2007-04-03 Eric Christopher <echristo@apple.com>
++ /* Quickly eliminate our non-pointer variables. */
+
-+ * g++.dg/tree-ssa/pr29902.C: Require ilp32.
++ for (i = 0; i < FIRST_REF_NODE; i++)
++ {
++ unsigned int node = si->node_mapping[i];
+
-+2007-04-03 Stuart Hastings <stuart@apple.com>
++ if (graph->label[node] == 0 && TEST_BIT (graph->direct_nodes, node))
++ {
+ if (dump_file && (dump_flags & TDF_DETAILS))
+- fprintf (dump_file, "Collapsing %s into %s\n",
+- get_varinfo (i)->name,
+- get_varinfo (root)->name);
+- stats.collapsed_vars++;
++ fprintf (dump_file,
++ "%s is a non-pointer variable, eliminating edges.\n",
++ get_varinfo (node)->name);
++ stats.nonpointer_vars++;
++ clear_edges_for_node (graph, node);
+ }
+ }
++ return si;
++}
+
++/* Free information that was only necessary for variable
++ substitution. */
+
-+ PR 31281
-+ * testsuite/objc/execute/exceptions/pr31281.m: New.
++static void
++free_var_substitution_info (struct scc_info *si)
++{
++ free_scc_info (si);
++ free (graph->label);
++ free (graph->eq_rep);
++ sbitmap_free (graph->direct_nodes);
+ bitmap_obstack_release (&iteration_obstack);
+- free_topo_info (ti);
+ }
+
++/* Return an existing node that is equivalent to NODE, which has
++ equivalence class LABEL, if one exists. Return NODE otherwise. */
+
-+2007-04-03 Jakub Jelinek <jakub@redhat.com>
++static unsigned int
++find_equivalent_node (constraint_graph_t graph,
++ unsigned int node, unsigned int label)
++{
++ /* If the address version of this variable is unused, we can
++ substitute it for anything else with the same label.
++ Otherwise, we know the pointers are equivalent, but not the
++ locations. */
+
-+ PR c++/30847
-+ * g++.dg/parse/cond3.C: New test.
++ if (graph->label[FIRST_ADDR_NODE + node] == 0)
++ {
++ gcc_assert (label < graph->size);
+
-+ PR middle-end/30704
-+ * gcc.c-torture/execute/ieee/pr30704.c: New test.
++ if (graph->eq_rep[label] != -1)
++ {
++ /* Unify the two variables since we know they are equivalent. */
++ if (unite (graph->eq_rep[label], node))
++ unify_nodes (graph, graph->eq_rep[label], node, false);
++ return graph->eq_rep[label];
++ }
++ else
++ {
++ graph->eq_rep[label] = node;
++ }
++ }
++ return node;
++}
+
-+2007-04-02 Jason Merrill <jason@redhat.com>
++/* Move complex constraints to the appropriate nodes, and collapse
++ variables we've discovered are equivalent during variable
++ substitution. SI is the SCC_INFO that is the result of
++ perform_variable_substitution. */
+
-+ PR c++/31187
-+ * g++.dg/ext/visibility/anon3.C: New test.
++static void
++move_complex_constraints (constraint_graph_t graph,
++ struct scc_info *si)
++{
++ int i;
++ unsigned int j;
++ constraint_t c;
+
-+2007-03-31 Diego Novillo <dnovillo@redhat.com>
++ for (j = 0; j < graph->size; j++)
++ gcc_assert (find (j) == j);
+
-+ PR 29585
-+ * g++.dg/tree-ssa/pr29585.C: New test.
++ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++)
++ {
++ struct constraint_expr lhs = c->lhs;
++ struct constraint_expr rhs = c->rhs;
++ unsigned int lhsvar = find (get_varinfo_fc (lhs.var)->id);
++ unsigned int rhsvar = find (get_varinfo_fc (rhs.var)->id);
++ unsigned int lhsnode, rhsnode;
++ unsigned int lhslabel, rhslabel;
++
++ lhsnode = si->node_mapping[lhsvar];
++ rhsnode = si->node_mapping[rhsvar];
++ lhslabel = graph->label[lhsnode];
++ rhslabel = graph->label[rhsnode];
++
++ /* See if it is really a non-pointer variable, and if so, ignore
++ the constraint. */
++ if (lhslabel == 0)
++ {
++ if (!TEST_BIT (graph->direct_nodes, lhsnode))
++ lhslabel = graph->label[lhsnode] = equivalence_class++;
++ else
++ {
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ {
+
-+2007-03-30 Kazu Hirata <kazu@codesourcery.com>
++ fprintf (dump_file, "%s is a non-pointer variable,"
++ "ignoring constraint:",
++ get_varinfo (lhs.var)->name);
++ dump_constraint (dump_file, c);
++ }
++ VEC_replace (constraint_t, constraints, i, NULL);
++ continue;
++ }
++ }
+
-+ * gcc.c-torture/execute/mayalias-2.x: New.
++ if (rhslabel == 0)
++ {
++ if (!TEST_BIT (graph->direct_nodes, rhsnode))
++ rhslabel = graph->label[rhsnode] = equivalence_class++;
++ else
++ {
++ if (dump_file && (dump_flags & TDF_DETAILS))
++ {
+
-+2007-03-28 Mike Stump <mrs@apple.com>
++ fprintf (dump_file, "%s is a non-pointer variable,"
++ "ignoring constraint:",
++ get_varinfo (rhs.var)->name);
++ dump_constraint (dump_file, c);
++ }
++ VEC_replace (constraint_t, constraints, i, NULL);
++ continue;
++ }
++ }
+
-+ * gcc.dg/darwin-comm.c: Add.
++ lhsvar = find_equivalent_node (graph, lhsvar, lhslabel);
++ rhsvar = find_equivalent_node (graph, rhsvar, rhslabel);
++ c->lhs.var = lhsvar;
++ c->rhs.var = rhsvar;
+
-+2007-03-26 Ian Lance Taylor <iant@google.com>
++ if (lhs.type == DEREF)
++ {
++ if (rhs.type == ADDRESSOF || rhsvar > anything_id)
++ insert_into_complex (graph, lhsvar, c);
++ }
++ else if (rhs.type == DEREF)
++ {
++ if (!(get_varinfo (lhsvar)->is_special_var))
++ insert_into_complex (graph, rhsvar, c);
++ }
++ else if (rhs.type != ADDRESSOF && lhsvar > anything_id
++ && (lhs.offset != 0 || rhs.offset != 0))
++ {
++ insert_into_complex (graph, rhsvar, c);
++ }
+
-+ PR tree-optimization/31345
-+ * gcc.c-torture/compile/pr31345-1.c: New test.
++ }
++}
+
-+2007-03-22 Mark Mitchell <mark@codesourcery.com>
++/* Eliminate indirect cycles involving NODE. Return true if NODE was
++ part of an SCC, false otherwise. */
+
-+ PR c++/30863
-+ * g++.dg/template/error24.C: New test.
-+ * g++.dg/parse/tmpl-outside1.C: Tweak error markers.
++static bool
++eliminate_indirect_cycles (unsigned int node)
++{
++ if (graph->indirect_cycles[node] != -1
++ && !bitmap_empty_p (get_varinfo (node)->solution))
++ {
++ unsigned int i;
++ VEC(unsigned,heap) *queue = NULL;
++ int queuepos;
++ unsigned int to = find (graph->indirect_cycles[node]);
++ bitmap_iterator bi;
+
-+ PR c++/31273
-+ * g++.dg/expr/bitfield7.C: New test.
++ /* We can't touch the solution set and call unify_nodes
++ at the same time, because unify_nodes is going to do
++ bitmap unions into it. */
+
-+2007-03-20 Seongbae Park <seongbae.park@gmail.com>
++ EXECUTE_IF_SET_IN_BITMAP (get_varinfo (node)->solution, 0, i, bi)
++ {
++ if (find (i) == i && i != to)
++ {
++ if (unite (to, i))
++ VEC_safe_push (unsigned, heap, queue, i);
++ }
++ }
+
-+ PR tree-optimization/30590
-+ * g++.dg/opt/pr30590.C: New testcase.
++ for (queuepos = 0;
++ VEC_iterate (unsigned, queue, queuepos, i);
++ queuepos++)
++ {
++ unify_nodes (graph, to, i, true);
++ }
++ VEC_free (unsigned, heap, queue);
++ return true;
++ }
++ return false;
++}
+
-+2007-03-20 Jakub Jelinek <jakub@redhat.com>
+ /* Solve the constraint graph GRAPH using our worklist solver.
+ This is based on the PW* family of solvers from the "Efficient Field
+ Sensitive Pointer Analysis for C" paper.
+@@ -2001,17 +2015,28 @@
+ {
+ unsigned int size = VEC_length (varinfo_t, varmap);
+ unsigned int i;
++ bitmap pts;
+
+- changed_count = size;
++ changed_count = 0;
+ changed = sbitmap_alloc (size);
+- sbitmap_ones (changed);
+-
+- /* The already collapsed/unreachable nodes will never change, so we
+- need to account for them in changed_count. */
++ sbitmap_zero (changed);
++
++ /* Mark all initial non-collapsed nodes as changed. */
+ for (i = 0; i < size; i++)
+- if (get_varinfo (i)->node != i)
+- changed_count--;
+-
++ {
++ varinfo_t ivi = get_varinfo (i);
++ if (find (i) == i && !bitmap_empty_p (ivi->solution)
++ && ((graph->succs[i] && !bitmap_empty_p (graph->succs[i]))
++ || VEC_length (constraint_t, graph->complex[i]) > 0))
++ {
++ SET_BIT (changed, i);
++ changed_count++;
++ }
++ }
+
-+ PR c/30762
-+ * gcc.dg/pr30762-1.c: New test.
-+ * gcc.dg/pr30762-2.c: New test.
++ /* Allocate a bitmap to be used to store the changed bits. */
++ pts = BITMAP_ALLOC (&pta_obstack);
+
-+ PR inline-asm/30505
-+ * gcc.target/i386/pr30505.c: New test.
+ while (changed_count > 0)
+ {
+ unsigned int i;
+@@ -2019,41 +2044,45 @@
+ stats.iterations++;
+
+ bitmap_obstack_initialize (&iteration_obstack);
+-
+- if (edge_added)
+- {
+- /* We already did cycle elimination once, when we did
+- variable substitution, so we don't need it again for the
+- first iteration. */
+- if (stats.iterations > 1)
+- find_and_collapse_graph_cycles (graph, true);
+
+- edge_added = false;
+- }
+-
+ compute_topo_order (graph, ti);
+
+ while (VEC_length (unsigned, ti->topo_order) != 0)
+ {
+
-+2007-03-19 Mark Shinwell <shinwell@codesourcery.com>
+ i = VEC_pop (unsigned, ti->topo_order);
+- gcc_assert (get_varinfo (i)->node == i);
+
++ /* If this variable is not a representative, skip it. */
++ if (find (i) != i)
++ continue;
+
-+ * gcc.target/arm/register-variables.c: New.
++ /* In certain indirect cycle cases, we may merge this
++ variable to another. */
++ if (eliminate_indirect_cycles (i) && find (i) != i)
++ continue;
+
-+2007-03-19 Jeff Law <law@redhat.com>
+ /* If the node has changed, we need to process the
+ complex constraints and outgoing edges again. */
+ if (TEST_BIT (changed, i))
+ {
+ unsigned int j;
+ constraint_t c;
+- constraint_edge_t e = NULL;
+ bitmap solution;
+- bitmap_iterator bi;
+- VEC(constraint_t,heap) *complex = get_varinfo (i)->complex;
+- VEC(constraint_edge_t,heap) *succs;
++ VEC(constraint_t,heap) *complex = graph->complex[i];
+ bool solution_empty;
+
+ RESET_BIT (changed, i);
+ changed_count--;
+
++ /* Compute the changed set of solution bits. */
++ bitmap_and_compl (pts, get_varinfo (i)->solution,
++ get_varinfo (i)->oldsolution);
++
++ if (bitmap_empty_p (pts))
++ continue;
+
-+ * PR tree-optimization/30984
-+ * gcc.c-torture/pr30984.c: New test.
++ bitmap_ior_into (get_varinfo (i)->oldsolution, pts);
+
- 2007-03-16 Alexandre Oliva <aoliva@redhat.com>
-
- PR debug/29906
-@@ -123,12 +284,12 @@
- PR rtl-optimization/30643
- * gcc.dg/pr30643.c: New.
-
--2007-03-09 Andrew Pinski <andrew_pinski@playstation.sony.com>
-+2007-03-09 Andrew Pinski <andrew_pinski@playstation.sony.com>
+ solution = get_varinfo (i)->solution;
+ solution_empty = bitmap_empty_p (solution);
- PR tree-opt/30045
- * gcc.dg/pr30045.c: New test.
-
--2007-03-09 Andrew Pinski <andrew_pinski@playstation.sony.com>
-+2007-03-09 Andrew Pinski <andrew_pinski@playstation.sony.com>
-
- PR middle-end/30729
- * gcc.dg/Wunused-value-2.c: New testcase.
-@@ -163,7 +324,7 @@
- 2007-03-08 Brooks Moses <brooks.moses@codesourcery.com>
-
- Backport from trunk.
-- * gfortran.dg/gomp/reduction1.f90: Add -fmax-errors=100 to
-+ * gfortran.dg/gomp/reduction1.f90: Add -fmax-errors=100 to
- dg-options.
+@@ -2065,52 +2094,38 @@
+ is a constraint where the lhs side is receiving
+ some set from elsewhere. */
+ if (!solution_empty || c->lhs.type != DEREF)
+- do_complex_constraint (graph, c, solution);
++ do_complex_constraint (graph, c, pts);
+ }
- 2007-03-08 Paul Thomas <pault@gcc.gnu.org>
-@@ -216,7 +377,7 @@
- * gcc.dg/Wstring-literal-comparison-4.c: Likewise.
- * g++.dg/warn/Wstring-literal-comparison-1.C: Likewise.
- * g++.dg/warn/Wstring-literal-comparison-4.c: Likewise.
--
-+
- 2007-03-06 Roger Sayle <roger@eyesopen.com>
+ solution_empty = bitmap_empty_p (solution);
- PR middle-end/30744
-@@ -315,7 +476,7 @@
+ if (!solution_empty)
+ {
++ bitmap_iterator bi;
++
+ /* Propagate solution to all successors. */
+- succs = graph->succs[i];
+-
+- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[i],
++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i],
+ 0, j, bi)
+ {
+- bitmap tmp = get_varinfo (j)->solution;
+- bool flag = false;
+-
+- flag = set_union_with_increment (tmp, solution, 0);
+-
+- if (flag)
+- {
+- get_varinfo (j)->solution = tmp;
+- if (!TEST_BIT (changed, j))
+- {
+- SET_BIT (changed, j);
+- changed_count++;
+- }
+- }
+- }
+- for (j = 0; VEC_iterate (constraint_edge_t, succs, j, e); j++)
+- {
+- bitmap tmp = get_varinfo (e->dest)->solution;
+- bool flag = false;
+- unsigned int k;
+- bitmap weights = e->weights;
+- bitmap_iterator bi;
++ bitmap tmp;
++ bool flag;
+
+- gcc_assert (weights && !bitmap_empty_p (weights));
+- EXECUTE_IF_SET_IN_BITMAP (weights, 0, k, bi)
+- flag |= set_union_with_increment (tmp, solution, k);
++ unsigned int to = find (j);
++ tmp = get_varinfo (to)->solution;
++ flag = false;
+
++ /* Don't try to propagate to ourselves. */
++ if (to == i)
++ continue;
++
++ flag = set_union_with_increment (tmp, pts, 0);
++
+ if (flag)
+ {
+- get_varinfo (e->dest)->solution = tmp;
+- if (!TEST_BIT (changed, e->dest))
++ get_varinfo (to)->solution = tmp;
++ if (!TEST_BIT (changed, to))
+ {
+- SET_BIT (changed, e->dest);
++ SET_BIT (changed, to);
+ changed_count++;
+ }
+ }
+@@ -2122,74 +2137,37 @@
+ bitmap_obstack_release (&iteration_obstack);
+ }
- 2007-02-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
++ BITMAP_FREE (pts);
+ sbitmap_free (changed);
++ bitmap_obstack_release (&oldpta_obstack);
+ }
-- PR libgfortran/30910
-+ PR libgfortran/30910
- * gfortran.dg/fmt_zero_precision.f90: Update test.
++/* Map from trees to variable infos. */
++static struct pointer_map_t *vi_for_tree;
- 2007-02-23 Tobias Burnus <burnus@net-b.de>
-@@ -404,7 +565,7 @@
- 2007-02-16 Francois-Xavier Coudert <coudert@clipper.ens.fr>
+-/* CONSTRAINT AND VARIABLE GENERATION FUNCTIONS */
- PR fortran/30611
-- * gcc/testsuite/gfortran.dg/repeat_1.f90: New test.
-+ * gfortran.dg/repeat_1.f90: New test.
+-/* Map from trees to variable ids. */
+-static htab_t id_for_tree;
++/* Insert ID as the variable id for tree T in the vi_for_tree map. */
- 2007-02-16 Thomas Koenig <Thomas.Koenig@online.de>
+-typedef struct tree_id
++static void
++insert_vi_for_tree (tree t, varinfo_t vi)
+ {
+- tree t;
+- unsigned int id;
+-} *tree_id_t;
+-
+-/* Hash a tree id structure. */
+-
+-static hashval_t
+-tree_id_hash (const void *p)
+-{
+- const tree_id_t ta = (tree_id_t) p;
+- return htab_hash_pointer (ta->t);
+-}
+-
+-/* Return true if the tree in P1 and the tree in P2 are the same. */
+-
+-static int
+-tree_id_eq (const void *p1, const void *p2)
+-{
+- const tree_id_t ta1 = (tree_id_t) p1;
+- const tree_id_t ta2 = (tree_id_t) p2;
+- return ta1->t == ta2->t;
+-}
+-
+-/* Insert ID as the variable id for tree T in the hashtable. */
+-
+-static void
+-insert_id_for_tree (tree t, int id)
+-{
+- void **slot;
+- struct tree_id finder;
+- tree_id_t new_pair;
+-
+- finder.t = t;
+- slot = htab_find_slot (id_for_tree, &finder, INSERT);
++ void **slot = pointer_map_insert (vi_for_tree, t);
++ gcc_assert (vi);
+ gcc_assert (*slot == NULL);
+- new_pair = XNEW (struct tree_id);
+- new_pair->t = t;
+- new_pair->id = id;
+- *slot = (void *)new_pair;
++ *slot = vi;
+ }
-@@ -480,7 +641,7 @@
+-/* Find the variable id for tree T in ID_FOR_TREE. If T does not
+- exist in the hash table, return false, otherwise, return true and
+- set *ID to the id we found. */
++/* Find the variable info for tree T in VI_FOR_TREE. If T does not
++ exist in the map, return NULL, otherwise, return the varinfo we found. */
- 2007-02-07 Hans-Peter Nilsson <hp@axis.com>
+-static bool
+-lookup_id_for_tree (tree t, unsigned int *id)
++static varinfo_t
++lookup_vi_for_tree (tree t)
+ {
+- tree_id_t pair;
+- struct tree_id finder;
++ void **slot = pointer_map_contains (vi_for_tree, t);
++ if (slot == NULL)
++ return NULL;
+
+- finder.t = t;
+- pair = htab_find (id_for_tree, &finder);
+- if (pair == NULL)
+- return false;
+- *id = pair->id;
+- return true;
++ return (varinfo_t) *slot;
+ }
-- * lib/target-supports.exp (check_effective_target_simulator): New.
-+ * lib/target-supports.exp (check_effective_target_simulator): New.
+ /* Return a printable name for DECL */
+@@ -2210,7 +2188,7 @@
- 2007-02-05 Alexandre Oliva <aoliva@redhat.com>
+ if (TREE_CODE (decl) == SSA_NAME)
+ {
+- num_printed = asprintf (&temp, "%s_%u",
++ num_printed = asprintf (&temp, "%s_%u",
+ alias_get_name (SSA_NAME_VAR (decl)),
+ SSA_NAME_VERSION (decl));
+ }
+@@ -2226,21 +2204,17 @@
+ return res;
+ }
-@@ -614,7 +775,7 @@
+-/* Find the variable id for tree T in the hashtable.
+- If T doesn't exist in the hash table, create an entry for it. */
++/* Find the variable id for tree T in the map.
++ If T doesn't exist in the map, create an entry for it and return it. */
- PR fortran/30532
- * gfortran.dg/ctrl-z.f90: New test.
--
-+
- 2007-01-26 Jerry DeLisle <jvdelisle@gcc.gnu.org>
-
- PR fortran/30481
-@@ -1319,7 +1480,7 @@
- 2006-11-13 Francois-Xavier Coudert <coudert@clipper.ens.fr>
-
- PR libfortran/27895
-- * gcc/testsuite/gfortran.dg/zero_sized_1.f90: Uncomment checks
-+ * gfortran.dg/zero_sized_1.f90: Uncomment checks
- for RESHAPE.
-
- 2006-11-13 Mark Mitchell <mark@codesourcery.com>
-@@ -1753,16 +1914,16 @@
- 2006-10-13 Francois-Xavier Coudert <coudert@clipper.ens.fr>
-
- PR fortran/21435
-- * gcc/testsuite/gfortran.dg/io_constraints_3.f90: New test.
-- * gcc/testsuite/gfortran.dg/open_access_append_1.f90: Add checks
-+ * gfortran.dg/io_constraints_3.f90: New test.
-+ * gfortran.dg/open_access_append_1.f90: Add checks
- for compile-time warnings.
-- * gcc/testsuite/gfortran.dg/pr20163-2.f: Likewise.
-- * gcc/testsuite/gfortran.dg/iostat_2.f90: Likewise.
-- * gcc/testsuite/gfortran.dg/label_4.f90: Delete the temporary
-+ * gfortran.dg/pr20163-2.f: Likewise.
-+ * gfortran.dg/iostat_2.f90: Likewise.
-+ * gfortran.dg/label_4.f90: Delete the temporary
- file.
-- * gcc/testsuite/gfortran.dg/direct_io_2.f90: Add a FILE=
-+ * gfortran.dg/direct_io_2.f90: Add a FILE=
- specifier.
-- * gcc/testsuite/gfortran.dg/iomsg_1.f90: Add check for
-+ * gfortran.dg/iomsg_1.f90: Add check for
- compile-time warning.
-
- 2006-10-12 Jan Hubicka <jh@suse.cz>
-@@ -1899,12 +2060,12 @@
-
- PR fortran/16580
- PR fortran/29288
-- * gcc/testsuite/gfortran.fortran-torture/execute/specifics.f90:
-+ * gfortran.fortran-torture/execute/specifics.f90:
- Add tests for using all possible intrinsics as actual arguments.
-- * gcc/testsuite/gfortran.dg/specifics_1.f90: Add tests for using
-+ * gfortran.dg/specifics_1.f90: Add tests for using
- all possible intrinsics as actual arguments.
-- * gcc/testsuite/gfortran.dg/specifics_2.f90: New file.
-- * gcc/testsuite/gfortran.dg/specifics_3.f90: New file.
-+ * gfortran.dg/specifics_2.f90: New file.
-+ * gfortran.dg/specifics_3.f90: New file.
-
- 2006-10-07 Richard Sandiford <richard@codesourcery.com>
-
-@@ -4158,7 +4319,7 @@
- 2006-06-08 Francois-Xavier Coudert <coudert@clipper.ens.fr>
-
- PR fortran/27958
-- * gcc/testsuite/gfortran.dg/substr_2.f: New test.
-+ * gfortran.dg/substr_2.f: New test.
-
- 2006-06-08 Asher Langton <langton2@llnl.gov>
-
-@@ -6195,7 +6356,7 @@
-
- 2006-03-03 Paul Brook <paul@codesourcery.com>
-
-- * gcc/testsuite/lib/target-supports.exp (check_profiling_available):
-+ * lib/target-supports.exp (check_profiling_available):
- Add m68k-*-elf.
-
- 2006-03-03 Thomas Koenig <Thomas.Koenig@online.de>
-@@ -9951,11 +10112,11 @@
- 2005-11-04 Francois-Xavier Coudert <coudert@clipper.ens.fr>
-
- PR libfortran/22298
-- * gcc/testsuite/lib/target-supports.exp
-+ * lib/target-supports.exp
- (check_effective_target_static_libgfortran): New
- static_libgfortran effective target.
-- * gcc/testsuite/gfortran.dg/static_linking_1.f: New test.
-- * gcc/testsuite/gfortran.dg/static_linking_1.c: New file.
-+ * gfortran.dg/static_linking_1.f: New test.
-+ * gfortran.dg/static_linking_1.c: New file.
-
- 2005-11-04 Hans-Peter Nilsson <hp@axis.com>
-
-@@ -17467,7 +17628,7 @@
- 2005-02-11 Jakub Jelinek <jakub@redhat.com>
-
- PR c++/19666
-- * gcc/testsuite/g++.dg/other/ptrmem6.C: New test.
-+ * g++.dg/other/ptrmem6.C: New test.
-
- PR middle-end/19858
- * gcc.c-torture/compile/20050210-1.c: New test.
-@@ -33085,33 +33246,33 @@
-
- 2003-01-16 Mark Mitchell <mark@codesourcery.com>
-
-- * gcc/testsuite/g++.dg/ext/typename1.C: Add typename keyword.
-- * gcc/testsuite/g++.dg/template/crash1.C: Update error messages.
-- * gcc/testsuite/g++.dg/template/crash2.C: Remove error message.
-- * gcc/testsuite/g++.dg/parse/typename2.C: New test.
-- * gcc/testsuite/g++.dg/template/typename2.C: Change implicit
-+ * g++.dg/ext/typename1.C: Add typename keyword.
-+ * g++.dg/template/crash1.C: Update error messages.
-+ * g++.dg/template/crash2.C: Remove error message.
-+ * g++.dg/parse/typename2.C: New test.
-+ * g++.dg/template/typename2.C: Change implicit
- typename warning into error.
-- * gcc/testsuite/g++.old-deja/g++.benjamin/tem03.C: Issue more
-+ * g++.old-deja/g++.benjamin/tem03.C: Issue more
- error messages.
-- * gcc/testsuite/g++.old-deja/g++.benjamin/tem04.C: Fix typos.
-- * gcc/testsuite/g++.old-deja/g++.brendan/crash56.C: Add this->.
-- * gcc/testsuite/g++.old-deja/g++.law/visibility13.C: Remove error
-+ * g++.old-deja/g++.benjamin/tem04.C: Fix typos.
-+ * g++.old-deja/g++.brendan/crash56.C: Add this->.
-+ * g++.old-deja/g++.law/visibility13.C: Remove error
- messages.
-- * gcc/testsuite/g++.old-deja/g++.ns/template17.C: Reorder code to
-+ * g++.old-deja/g++.ns/template17.C: Reorder code to
- make declaration visible in template.
-- * gcc/testsuite/g++.old-deja/g++.pt/crash3.C: Fix typos.
-- * gcc/testsuite/g++.old-deja/g++.pt/crash36.C: Issue more error
-+ * g++.old-deja/g++.pt/crash3.C: Fix typos.
-+ * g++.old-deja/g++.pt/crash36.C: Issue more error
- messages.
-- * gcc/testsuite/g++.old-deja/g++.pt/crash5.C: Improve error
-+ * g++.old-deja/g++.pt/crash5.C: Improve error
- message.
-- * gcc/testsuite/g++.old-deja/g++.pt/crash67.C: Remove warning.
-- * gcc/testsuite/g++.old-deja/g++.pt/inherit1.C: Add this->.
-- * gcc/testsuite/g++.old-deja/g++.pt/niklas01a.C: Add error message.
-- * gcc/testsuite/g++.old-deja/g++.pt/typename16.C: Replace implicit
-+ * g++.old-deja/g++.pt/crash67.C: Remove warning.
-+ * g++.old-deja/g++.pt/inherit1.C: Add this->.
-+ * g++.old-deja/g++.pt/niklas01a.C: Add error message.
-+ * g++.old-deja/g++.pt/typename16.C: Replace implicit
- typename warning with error message.
-- * gcc/testsuite/g++.old-deja/g++.pt/typename19.C: Remove warning.
-- * gcc/testsuite/g++.old-deja/g++.robertl/eb112.C: Fix typo.
-- * gcc/testsuite/g++.old-deja/g++.robertl/eb24.C: Use this->.
-+ * g++.old-deja/g++.pt/typename19.C: Remove warning.
-+ * g++.old-deja/g++.robertl/eb112.C: Fix typo.
-+ * g++.old-deja/g++.robertl/eb24.C: Use this->.
-
- 2003-01-16 Nathan Sidwell <nathan@codesourcery.com>
-
-@@ -34702,9 +34863,9 @@
-
- 2002-09-25 Mark Mitchell <mark@codesourcery.com>
-
-- * gcc/testsuite/g++.dg/abi/empty5.C: New test.
-- * gcc/testsuite/g++.dg/abi/empty6.C: New test.
-- * gcc/testsuite/g++.dg/abi/vbase12.C: New test.
-+ * g++.dg/abi/empty5.C: New test.
-+ * g++.dg/abi/empty6.C: New test.
-+ * g++.dg/abi/vbase12.C: New test.
-
- 2002-09-25 Richard Henderson <rth@redhat.com>
-
-@@ -35726,7 +35887,7 @@
-
- 2002-05-23 Mark Mitchell <mark@codesourcery.com>
-
-- * gcc/testsuite/gcc.dg/weak-8.c: New test.
-+ * gcc.dg/weak-8.c: New test.
-
- 2002-05-23 J"orn Rennecke <joern.rennecke@superh.com>
-
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/tree-ssa/pr29585.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/tree-ssa/pr29585.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/tree-ssa/pr29585.C (revision 124164)
-@@ -0,0 +1,15 @@
-+/* { dg-do compile } */
-+/* { dg-options "-O2 -w" } */
-+
-+class ios_base{};
-+struct basic_ostream : virtual ios_base{};
-+namespace
-+{
-+ struct Nullostream : basic_ostream{};
-+}
-+class In
-+{
-+ In ();
-+ Nullostream nullout;
-+};
-+In::In (){}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/tree-ssa/pr29902.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/tree-ssa/pr29902.C (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/tree-ssa/pr29902.C (revision 124164)
-@@ -1,5 +1,6 @@
- /* { dg-do compile { target i?86-*-* } } */
- /* { dg-options "-O1 -fprefetch-loop-arrays -march=athlon" } */
-+/* { dg-require-effective-target ilp32 } */
-
- int length1();
- int g(int);
-@@ -16,4 +17,3 @@
- for (int i = 1; i < capacity_; i++){old_storage[i] = 0;}
- }
+-static unsigned int
+-get_id_for_tree (tree t)
++static varinfo_t
++get_vi_for_tree (tree t)
+ {
+- tree_id_t pair;
+- struct tree_id finder;
++ void **slot = pointer_map_contains (vi_for_tree, t);
++ if (slot == NULL)
++ return get_varinfo (create_variable_info_for (t, alias_get_name (t)));
+
+- finder.t = t;
+- pair = htab_find (id_for_tree, &finder);
+- if (pair == NULL)
+- return create_variable_info_for (t, alias_get_name (t));
+-
+- return pair->id;
++ return (varinfo_t) *slot;
}
--
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/ext/visibility/anon3.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/ext/visibility/anon3.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/ext/visibility/anon3.C (revision 124164)
-@@ -0,0 +1,16 @@
-+// PR c++/31187
-+// Bug: the repeated declaration was confusing the compiler into
-+// thinking that foo1 had language internal linkage.
-+
-+class foo { };
-+
-+namespace
-+{
-+ extern foo foo1;
-+ foo foo1;
-+}
-+
-+template< foo * >
-+class bar { };
-+
-+bar< &foo1 > bar1;
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/inherit/conv3.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/inherit/conv3.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/inherit/conv3.C (revision 124164)
-@@ -0,0 +1,31 @@
-+// PR 31074
-+// Bug: The reference cast wasn't finding the desired static_cast followed by
-+// const_cast interpretation.
-+
-+struct Shape
-+{
-+ Shape() {}
-+ virtual ~Shape() {}
-+};
-+
-+struct Loop
-+{
-+ Loop() {}
-+ virtual ~Loop() {}
-+ virtual void func() {}
-+};
-+
-+struct Rect :
-+ public Shape,
-+ public Loop
-+{
-+ Rect() {}
-+ virtual ~Rect() {}
-+};
-+
-+int main ()
-+{
-+ const Rect* rect = new Rect();
-+ Loop &l = ((Loop&)(*rect));
-+ return (&l != (const Loop *)rect);
-+}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr25874.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr25874.C (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/gomp/pr25874.C (revision 124164)
-@@ -1,3 +1,5 @@
-+// { dg-options "-O -fopenmp" }
-+
- int foo();
- struct wigner_d
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/opt/pr30590.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/opt/pr30590.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/opt/pr30590.C (revision 124164)
-@@ -0,0 +1,40 @@
-+/* { dg-do run } */
-+/* { dg-options "-O" } */
-+struct test
-+{
-+ int type;
-+ char buffer[4242]; /* should trigger pass-by-reference */
-+};
-+
-+int flag = 0;
-+
-+struct test
-+reset (void)
-+{
-+ struct test retval;
-+ retval.type = 1;
-+ return retval;
-+}
+ /* Get a constraint expression from an SSA_VAR_P node. */
+@@ -2254,14 +2228,14 @@
+
+ /* For parameters, get at the points-to set for the actual parm
+ decl. */
+- if (TREE_CODE (t) == SSA_NAME
+- && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
++ if (TREE_CODE (t) == SSA_NAME
++ && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL
+ && default_def (SSA_NAME_VAR (t)) == t)
+ return get_constraint_exp_from_ssa_var (SSA_NAME_VAR (t));
+
+ cexpr.type = SCALAR;
+-
+- cexpr.var = get_id_for_tree (t);
++
++ cexpr.var = get_vi_for_tree (t)->id;
+ /* If we determine the result is "anything", and we know this is readonly,
+ say it points to readonly memory instead. */
+ if (cexpr.var == anything_id && TREE_READONLY (t))
+@@ -2269,7 +2243,7 @@
+ cexpr.type = ADDRESSOF;
+ cexpr.var = readonly_id;
+ }
+-
+
-+struct test
-+test (void)
-+{
-+ struct test result;
-+ result.type = 0;
+ cexpr.offset = 0;
+ return cexpr;
+ }
+@@ -2290,7 +2264,13 @@
+ get_varinfo (lhs.var)->directly_dereferenced = true;
+ if (rhs.type == DEREF)
+ get_varinfo (rhs.var)->directly_dereferenced = true;
+-
+
-+ for (int i = 0; i < 2; ++i)
++ if (!use_field_sensitive)
+ {
-+ struct test candidate = reset ();
-+ if (flag)
-+ result = candidate;
++ t->rhs.offset = 0;
++ t->lhs.offset = 0;
+ }
+
-+ return result;
-+}
-+
-+int
-+main (void)
-+{
-+ struct test result = test ();
-+ return result.type;
-+}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/init/const5.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/init/const5.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/init/const5.C (revision 124164)
-@@ -0,0 +1,11 @@
-+// PR c++/31449
-+
-+class Foo {};
-+class Bar : public Foo {};
-+static const Foo *foo = 0;
-+
-+static Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" }
-+
-+void func(const Foo *foo) {
-+ Bar *bar = static_cast<const Bar*>(foo); // { dg-error "conversion" }
-+}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/warn/pragma-system_header3.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/warn/pragma-system_header3.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/warn/pragma-system_header3.C (revision 124164)
-@@ -0,0 +1,10 @@
-+// PR c++/30500
-+// { dg-options "-Wcast-align" }
-+
-+#include "pragma-system_header3.h"
-+
-+void f()
-+{
-+ g<int>();
-+ h<int>();
-+}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/warn/pragma-system_header3.h
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/warn/pragma-system_header3.h (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/warn/pragma-system_header3.h (revision 124164)
-@@ -0,0 +1,7 @@
-+#pragma GCC system_header
-+
-+template <typename T>
-+ int* g() { static char c; return reinterpret_cast<int*>(&c); }
-+
-+template <typename T>
-+ T* h() { static char c; return reinterpret_cast<T*>(&c); }
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/parse/cond3.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/parse/cond3.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/parse/cond3.C (revision 124164)
-@@ -0,0 +1,15 @@
-+// PR c++/30847
-+// { dg-do compile }
-+// { dg-options "" }
+ /* ANYTHING == ANYTHING is pointless. */
+ if (lhs.var == anything_id && rhs.var == anything_id)
+ return;
+@@ -2302,7 +2282,7 @@
+ t->lhs = t->rhs;
+ t->rhs = rhs;
+ process_constraint (t);
+- }
++ }
+ /* This can happen in our IR with things like n->a = *p */
+ else if (rhs.type == DEREF && lhs.type == DEREF && rhs.var != anything_id)
+ {
+@@ -2312,33 +2292,19 @@
+ tree pointedtotype = TREE_TYPE (pointertype);
+ tree tmpvar = create_tmp_var_raw (pointedtotype, "doubledereftmp");
+ struct constraint_expr tmplhs = get_constraint_exp_from_ssa_var (tmpvar);
+-
++
+ /* If this is an aggregate of known size, we should have passed
+ this off to do_structure_copy, and it should have broken it
+ up. */
+- gcc_assert (!AGGREGATE_TYPE_P (pointedtotype)
++ gcc_assert (!AGGREGATE_TYPE_P (pointedtotype)
+ || get_varinfo (rhs.var)->is_unknown_size_var);
+-
++
+ process_constraint (new_constraint (tmplhs, rhs));
+ process_constraint (new_constraint (lhs, tmplhs));
+ }
+- else if (rhs.type == ADDRESSOF)
+- {
+- varinfo_t vi;
+- gcc_assert (rhs.offset == 0);
+-
+- /* No need to mark address taken simply because of escaped vars
+- constraints. */
+- if (lhs.var != escaped_vars_id)
+- for (vi = get_varinfo (rhs.var); vi != NULL; vi = vi->next)
+- vi->address_taken = true;
+-
+- VEC_safe_push (constraint_t, heap, constraints, t);
+- }
+ else
+ {
+- if (lhs.type != DEREF && rhs.type == DEREF)
+- get_varinfo (lhs.var)->indirect_target = true;
++ gcc_assert (rhs.type != ADDRESSOF || rhs.offset == 0);
+ VEC_safe_push (constraint_t, heap, constraints, t);
+ }
+ }
+@@ -2350,10 +2316,12 @@
+ could_have_pointers (tree t)
+ {
+ tree type = TREE_TYPE (t);
+-
+- if (POINTER_TYPE_P (type) || AGGREGATE_TYPE_P (type)
+
-+int j, k, l;
-+extern void baz ();
++ if (POINTER_TYPE_P (type)
++ || AGGREGATE_TYPE_P (type)
+ || TREE_CODE (type) == COMPLEX_TYPE)
+ return true;
+
-+void
-+foo (int i)
-+{
-+ (i ? j : k) = ({ l++; (void) l; }); // { dg-error "void value not ignored" }
-+ (i ? j : k) += ({ l++; (void) l; }); // { dg-error "void value not ignored" }
-+ (i ? j : k) = baz (); // { dg-error "void value not ignored" }
-+ (i ? j : k) *= baz (); // { dg-error "void value not ignored" }
-+}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/parse/tmpl-outside1.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/parse/tmpl-outside1.C (revision 123014)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/parse/tmpl-outside1.C (revision 124164)
-@@ -7,5 +7,4 @@
- template <int i> struct Y {};
- };
+ return false;
+ }
--typedef X::template Y<0> y; // { dg-error "template" }
--// { dg-bogus "with no type" "" { xfail *-*-* } 10 }
-+typedef X::template Y<0> y; // { dg-error "template|invalid" }
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/template/error24.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/template/error24.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/template/error24.C (revision 124164)
-@@ -0,0 +1,8 @@
-+// PR c++/30863
-+
-+template <typename T>
-+struct s {};
+@@ -2367,9 +2335,9 @@
+ if (TREE_CODE (DECL_FIELD_OFFSET (fdecl)) != INTEGER_CST
+ || TREE_CODE (DECL_FIELD_BIT_OFFSET (fdecl)) != INTEGER_CST)
+ return -1;
+-
+- return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8)
+- + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1);
+
-+void f() {
-+ unsigned s<int> x; // { dg-error "invalid" }
-+}
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/template/init7.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/template/init7.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/template/init7.C (revision 124164)
-@@ -0,0 +1,9 @@
-+/* PR c++/31517. This used to ICE. */
-+/* { dg-do "compile" } */
-+
-+template<typename> struct A
-+{
-+ static const int i=0;
-+};
-+
-+template<typename T> const int A<T>::i = 0=0; /* { dg-error "duplicate initialization" } */
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/expr/bitfield7.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/expr/bitfield7.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/expr/bitfield7.C (revision 124164)
-@@ -0,0 +1,8 @@
-+// PR c++/31273
-+
-+enum E { e };
-+struct S {
-+ E v:5;
-+};
-+S s;
-+int main() { if (!s.v) return 0; }
-Index: gcc-4_2-branch/gcc/testsuite/g++.dg/expr/bitfield8.C
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/g++.dg/expr/bitfield8.C (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/g++.dg/expr/bitfield8.C (revision 124164)
-@@ -0,0 +1,24 @@
-+// PR c++/31513
-+// { dg-do run }
-+
-+extern "C" void abort();
++ return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8)
++ + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1);
+ }
+
+
+@@ -2388,7 +2356,7 @@
+ return true;
+ if (accesspos < fieldpos && (accesspos + accesssize > fieldpos))
+ return true;
+-
+
-+struct tree_type {
-+ unsigned int precision : 9;
-+};
+ return false;
+ }
+
+@@ -2411,20 +2379,20 @@
+ while (!SSA_VAR_P (forzero) && !CONSTANT_CLASS_P (forzero))
+ forzero = TREE_OPERAND (forzero, 0);
+
+- if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero))
++ if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero))
+ {
+ struct constraint_expr temp;
+-
+
-+void bork(unsigned int i) {
-+ if (i != 7)
-+ abort();
-+}
+ temp.offset = 0;
+ temp.var = integer_id;
+ temp.type = SCALAR;
+ VEC_safe_push (ce_s, heap, *results, &temp);
+ return;
+ }
+-
+
-+void foo(struct tree_type *t)
-+{
-+ bork(t->precision);
-+}
+ t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize);
+
+- /* String constants's are readonly, so there is nothing to really do
++ /* String constants are readonly, so there is nothing to really do
+ here. */
+ if (TREE_CODE (t) == STRING_CST)
+ return;
+@@ -2438,21 +2406,21 @@
+ /* This can also happen due to weird offsetof type macros. */
+ if (TREE_CODE (t) != ADDR_EXPR && result->type == ADDRESSOF)
+ result->type = SCALAR;
+-
+
-+int main() {
-+ tree_type t;
-+ t.precision = 7;
-+ foo(&t);
-+}
-Index: gcc-4_2-branch/gcc/testsuite/gfortran.dg/direct_io_6.f90
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/gfortran.dg/direct_io_6.f90 (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/gfortran.dg/direct_io_6.f90 (revision 124164)
-@@ -0,0 +1,16 @@
-+! { dg-do run }
-+! pr31366 last record truncated for read after short write, direct access file.
-+! test case derived from pr, submitted by jerry delisle <jvdelisle@gcc.gnu.org
-+ program test
-+ character(len=8) :: as_written, as_read
-+ character(1) :: byte
-+ as_written = "12345678"
-+ open (76, access="direct", recl=12, status="scratch")
-+ write(76, rec=1) as_written
-+ write(76, rec=2) as_written
-+ read(76, rec=1) as_read, byte, byte, byte, byte
-+ read(76, rec=2, err=3) as_read, byte, byte, byte, byte
-+ stop
-+ 3 call abort()
-+ end program test
+ if (result->type == SCALAR)
+ {
+ /* In languages like C, you can access one past the end of an
+ array. You aren't allowed to dereference it, so we can
+ ignore this constraint. When we handle pointer subtraction,
+ we may have to do something cute here. */
+-
++
+ if (result->offset < get_varinfo (result->var)->fullsize
+ && bitmaxsize != 0)
+ {
+ /* It's also not true that the constraint will actually start at the
+ right offset, it may start in some padding. We only care about
+ setting the constraint to the first actual field it touches, so
+- walk to find it. */
++ walk to find it. */
+ varinfo_t curr;
+ for (curr = get_varinfo (result->var); curr; curr = curr->next)
+ {
+@@ -2495,6 +2463,7 @@
+ {
+ struct constraint_expr *c;
+ unsigned int i = 0;
+
-Index: gcc-4_2-branch/gcc/testsuite/objc/execute/exceptions/pr31281.m
-===================================================================
---- gcc-4_2-branch/gcc/testsuite/objc/execute/exceptions/pr31281.m (revision 0)
-+++ gcc-4_2-branch/gcc/testsuite/objc/execute/exceptions/pr31281.m (revision 124164)
-@@ -0,0 +1,27 @@
-+/* From PR31281. */
-+extern void abort (void);
-+int __attribute__((noinline))
-+f(unsigned int i)
-+{
-+ int j, k;
-+ @try { } @catch(id) { return 13; }
-+ for (j=0; j<i; j++)
-+ for (k=0; k<i; k++)
-+ {
-+ @try {
-+ if (i)
-+ break;
-+ } @catch(id) { }
-+ return 9;
-+ }
-+ return 0;
-+}
+ for (i = 0; VEC_iterate (ce_s, *constraints, i, c); i++)
+ {
+ if (c->type == SCALAR)
+@@ -2576,6 +2545,7 @@
+ tree pttype = TREE_TYPE (TREE_TYPE (t));
+
+ get_constraint_for (exp, results);
++
+ /* Make sure we capture constraints to all elements
+ of an array. */
+ if ((handled_component_p (exp)
+@@ -2588,7 +2558,7 @@
+
+ if (VEC_length (ce_s, *results) == 0)
+ return;
+-
++
+ gcc_assert (VEC_length (ce_s, *results) == 1);
+ origrhs = VEC_last (ce_s, *results);
+ tmp = *origrhs;
+@@ -2619,12 +2589,12 @@
+ VEC_safe_push (ce_s, heap, *results, &tmp);
+ }
+ }
+-
+
+ for (i = 0; VEC_iterate (ce_s, *results, i, c); i++)
+ {
+ if (c->type == DEREF)
+ c->type = SCALAR;
+- else
++ else
+ c->type = ADDRESSOF;
+ }
+ return;
+@@ -2638,9 +2608,9 @@
+ {
+ varinfo_t vi;
+ tree heapvar = heapvar_lookup (t);
+-
++
+ if (heapvar == NULL)
+- {
++ {
+ heapvar = create_tmp_var_raw (ptr_type_node, "HEAP");
+ DECL_EXTERNAL (heapvar) = 1;
+ if (referenced_vars)
+@@ -2650,7 +2620,7 @@
+
+ temp.var = create_variable_info_for (heapvar,
+ alias_get_name (heapvar));
+-
++
+ vi = get_varinfo (temp.var);
+ vi->is_artificial_var = 1;
+ vi->is_heap_var = 1;
+@@ -2712,7 +2682,7 @@
+ case NON_LVALUE_EXPR:
+ {
+ tree op = TREE_OPERAND (t, 0);
+-
+
-+int
-+main()
-+{
-+ if (f(1))
-+ abort ();
-+ return 0 ;
-+}
-Index: gcc-4_2-branch/gcc/cp/typeck.c
-===================================================================
---- gcc-4_2-branch/gcc/cp/typeck.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/typeck.c (revision 124164)
-@@ -5614,6 +5614,12 @@
- tree cond;
- tree preeval = NULL_TREE;
+ /* Cast from non-pointer to pointers are bad news for us.
+ Anything else, we see through */
+ if (!(POINTER_TYPE_P (TREE_TYPE (t))
+@@ -2738,7 +2708,7 @@
+ {
+ switch (TREE_CODE (t))
+ {
+- case PHI_NODE:
++ case PHI_NODE:
+ {
+ get_constraint_for (PHI_RESULT (t), results);
+ return;
+@@ -2782,8 +2752,8 @@
+
+
+ /* Handle the structure copy case where we have a simple structure copy
+- between LHS and RHS that is of SIZE (in bits)
+-
++ between LHS and RHS that is of SIZE (in bits)
++
+ For each field of the lhs variable (lhsfield)
+ For each field of the rhs variable at lhsfield.offset (rhsfield)
+ add the constraint lhsfield = rhsfield
+@@ -2808,7 +2778,7 @@
+ struct constraint_expr temprhs = rhs;
+ unsigned HOST_WIDE_INT fieldoffset;
+
+- templhs.var = p->id;
++ templhs.var = p->id;
+ q = get_varinfo (temprhs.var);
+ fieldoffset = p->offset - pstart;
+ q = first_vi_for_offset (q, q->offset + fieldoffset);
+@@ -2823,8 +2793,8 @@
+
+ /* Handle the structure copy case where we have a structure copy between a
+ aggregate on the LHS and a dereference of a pointer on the RHS
+- that is of SIZE (in bits)
+-
++ that is of SIZE (in bits)
++
+ For each field of the lhs variable (lhsfield)
+ rhs.offset = lhsfield->offset
+ add the constraint lhsfield = rhs
+@@ -2849,12 +2819,12 @@
+
+
+ if (templhs.type == SCALAR)
+- templhs.var = p->id;
++ templhs.var = p->id;
+ else
+ templhs.offset = p->offset;
+-
++
+ q = get_varinfo (temprhs.var);
+- fieldoffset = p->offset - pstart;
++ fieldoffset = p->offset - pstart;
+ temprhs.offset += fieldoffset;
+ process_constraint (new_constraint (templhs, temprhs));
+ }
+@@ -2862,7 +2832,7 @@
-+ if (VOID_TYPE_P (TREE_TYPE (rhs)))
-+ {
-+ error ("void value not ignored as it ought to be");
-+ return error_mark_node;
-+ }
-+
- rhs = stabilize_expr (rhs, &preeval);
+ /* Handle the structure copy case where we have a structure copy
+ between a aggregate on the RHS and a dereference of a pointer on
+- the LHS that is of SIZE (in bits)
++ the LHS that is of SIZE (in bits)
- /* Check this here to avoid odd errors when trying to convert
-@@ -6795,6 +6801,16 @@
- return TYPE_QUALS (type);
- }
+ For each field of the rhs variable (rhsfield)
+ lhs.offset = rhsfield->offset
+@@ -2888,12 +2858,12 @@
+
+
+ if (temprhs.type == SCALAR)
+- temprhs.var = p->id;
++ temprhs.var = p->id;
+ else
+ temprhs.offset = p->offset;
+-
++
+ q = get_varinfo (templhs.var);
+- fieldoffset = p->offset - pstart;
++ fieldoffset = p->offset - pstart;
+ templhs.offset += fieldoffset;
+ process_constraint (new_constraint (templhs, temprhs));
+ }
+@@ -2901,7 +2871,7 @@
+
+ /* Sometimes, frontends like to give us bad type information. This
+ function will collapse all the fields from VAR to the end of VAR,
+- into VAR, so that we treat those fields as a single variable.
++ into VAR, so that we treat those fields as a single variable.
+ We return the variable they were collapsed into. */
+
+ static unsigned int
+@@ -2913,16 +2883,16 @@
+ for (field = currvar->next; field; field = field->next)
+ {
+ if (dump_file)
+- fprintf (dump_file, "Type safety: Collapsing var %s into %s\n",
++ fprintf (dump_file, "Type safety: Collapsing var %s into %s\n",
+ field->name, currvar->name);
+-
++
+ gcc_assert (!field->collapsed_to);
+ field->collapsed_to = currvar;
+ }
-+/* Returns nonzero if the TYPE is const from a C++ perspective: look inside
-+ arrays. */
+ currvar->next = NULL;
+ currvar->size = currvar->fullsize - currvar->offset;
+-
+
-+bool
-+cp_type_readonly (tree type)
-+{
-+ type = strip_array_types (type);
-+ return TYPE_READONLY (type);
-+}
+ return currvar->id;
+ }
+
+@@ -2944,7 +2914,7 @@
+ gcc_assert (VEC_length (ce_s, rhsc) == 1);
+ lhs = *(VEC_last (ce_s, lhsc));
+ rhs = *(VEC_last (ce_s, rhsc));
+-
+
- /* Returns nonzero if the TYPE contains a mutable member. */
+ VEC_free (ce_s, heap, lhsc);
+ VEC_free (ce_s, heap, rhsc);
- bool
-Index: gcc-4_2-branch/gcc/cp/class.c
-===================================================================
---- gcc-4_2-branch/gcc/cp/class.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/class.c (revision 124164)
-@@ -302,7 +302,18 @@
- field, because other parts of the compiler know that such
- expressions are always non-NULL. */
- if (!virtual_access && integer_zerop (offset))
-- return build_nop (build_pointer_type (target_type), expr);
-+ {
-+ tree class_type;
-+ /* TARGET_TYPE has been extracted from BINFO, and, is
-+ therefore always cv-unqualified. Extract the
-+ cv-qualifiers from EXPR so that the expression returned
-+ matches the input. */
-+ class_type = TREE_TYPE (TREE_TYPE (expr));
-+ target_type
-+ = cp_build_qualified_type (target_type,
-+ cp_type_quals (class_type));
-+ return build_nop (build_pointer_type (target_type), expr);
-+ }
- null_test = error_mark_node;
+@@ -2955,7 +2925,7 @@
+ lhs = rhs;
+ rhs = tmp;
}
+-
++
+ /* This is fairly conservative for the RHS == ADDRESSOF case, in that it's
+ possible it's something we could handle. However, most cases falling
+ into this are dealing with transparent unions, which are slightly
+@@ -3021,11 +2991,11 @@
+ else
+ lhssize = TREE_INT_CST_LOW (lhstypesize);
-@@ -7101,7 +7112,13 @@
-
- /* Figure out the position to which the VPTR should point. */
- vtbl = TREE_PURPOSE (l);
-- vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, vtbl);
-+ vtbl = build_address (vtbl);
-+ /* ??? We should call fold_convert to convert the address to
-+ vtbl_ptr_type_node, which is the type of elements in the
-+ vtable. However, the resulting NOP_EXPRs confuse other parts
-+ of the C++ front end. */
-+ gcc_assert (TREE_CODE (vtbl) == ADDR_EXPR);
-+ TREE_TYPE (vtbl) = vtbl_ptr_type_node;
- index = size_binop (PLUS_EXPR,
- size_int (non_fn_entries),
- size_int (list_length (TREE_VALUE (l))));
-Index: gcc-4_2-branch/gcc/cp/decl.c
-===================================================================
---- gcc-4_2-branch/gcc/cp/decl.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/decl.c (revision 124164)
-@@ -3815,6 +3815,7 @@
- tree decl;
- tree type, tem;
- tree context;
-+ bool was_public;
-
- *pushed_scope_p = NULL_TREE;
+-
+- if (rhs.type == SCALAR && lhs.type == SCALAR)
++
++ if (rhs.type == SCALAR && lhs.type == SCALAR)
+ {
+ if (!do_simple_structure_copy (lhs, rhs, MIN (lhssize, rhssize)))
+- {
++ {
+ lhs.var = collapse_rest_of_var (lhs.var);
+ rhs.var = collapse_rest_of_var (rhs.var);
+ lhs.offset = 0;
+@@ -3042,7 +3012,7 @@
+ else
+ {
+ tree pointedtotype = lhstype;
+- tree tmpvar;
++ tree tmpvar;
-@@ -3969,6 +3970,8 @@
- decl);
+ gcc_assert (rhs.type == DEREF && lhs.type == DEREF);
+ tmpvar = create_tmp_var_raw (pointedtotype, "structcopydereftmp");
+@@ -3052,6 +3022,7 @@
}
+ }
-+ was_public = TREE_PUBLIC (decl);
+
- /* Enter this declaration into the symbol table. */
- tem = maybe_push_decl (decl);
+ /* Update related alias information kept in AI. This is used when
+ building name tags, alias sets and deciding grouping heuristics.
+ STMT is the statement to process. This function also updates
+@@ -3261,7 +3232,6 @@
+ }
+ }
-@@ -3989,6 +3992,17 @@
- && !have_global_bss_p ())
- DECL_COMMON (tem) = 1;
+-
+ /* Handle pointer arithmetic EXPR when creating aliasing constraints.
+ Expressions of the type PTR + CST can be handled in two ways:
+
+@@ -3307,6 +3277,7 @@
+ else
+ return false;
-+ if (TREE_CODE (tem) == VAR_DECL
-+ && DECL_NAMESPACE_SCOPE_P (tem) && !TREE_PUBLIC (tem) && !was_public
-+ && !DECL_THIS_STATIC (tem) && !DECL_ARTIFICIAL (tem))
-+ {
-+ /* This is a const variable with implicit 'static'. Set
-+ DECL_THIS_STATIC so we can tell it from variables that are
-+ !TREE_PUBLIC because of the anonymous namespace. */
-+ gcc_assert (cp_type_readonly (TREE_TYPE (tem)));
-+ DECL_THIS_STATIC (tem) = 1;
-+ }
+
- if (!processing_template_decl && TREE_CODE (tem) == VAR_DECL)
- start_decl_1 (tem, initialized);
+ for (i = 0; VEC_iterate (ce_s, lhsc, i, c); i++)
+ for (j = 0; VEC_iterate (ce_s, temp, j, c2); j++)
+ {
+@@ -3360,12 +3331,12 @@
+ {
+ int i;
+ unsigned int j;
+-
++
+ /* For a phi node, assign all the arguments to
+ the result. */
+ get_constraint_for (PHI_RESULT (t), &lhsc);
+ for (i = 0; i < PHI_NUM_ARGS (t); i++)
+- {
++ {
+ tree rhstype;
+ tree strippedrhs = PHI_ARG_DEF (t, i);
-@@ -5301,14 +5315,6 @@
+@@ -3401,7 +3372,6 @@
+ {
+ tree lhsop;
+ tree rhsop;
+- unsigned int varid;
+ tree arglist;
+ varinfo_t fi;
+ int i = 1;
+@@ -3423,17 +3393,16 @@
+ we should still be able to handle. */
+ if (decl)
{
- layout_var_decl (decl);
- maybe_commonize_var (decl);
-- if (DECL_NAMESPACE_SCOPE_P (decl) && !TREE_PUBLIC (decl)
-- && !DECL_THIS_STATIC (decl) && !DECL_ARTIFICIAL (decl))
-- {
-- /* This is a const variable with implicit 'static'. Set
-- DECL_THIS_STATIC so we can tell it from variables that are
-- !TREE_PUBLIC because of the anonymous namespace. */
-- DECL_THIS_STATIC (decl) = 1;
-- }
+- varid = get_id_for_tree (decl);
++ fi = get_vi_for_tree (decl);
+ }
+ else
+ {
+ decl = TREE_OPERAND (rhsop, 0);
+- varid = get_id_for_tree (decl);
++ fi = get_vi_for_tree (decl);
}
- make_rtl_for_nonlocal_decl (decl, init, asmspec);
-Index: gcc-4_2-branch/gcc/cp/call.c
-===================================================================
---- gcc-4_2-branch/gcc/cp/call.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/call.c (revision 124164)
-@@ -171,7 +171,7 @@
- (struct z_candidate **, tree, tree, tree, tree, tree, int);
- static conversion *implicit_conversion (tree, tree, tree, bool, int);
- static conversion *standard_conversion (tree, tree, tree, bool, int);
--static conversion *reference_binding (tree, tree, tree, int);
-+static conversion *reference_binding (tree, tree, tree, bool, int);
- static conversion *build_conv (conversion_kind, tree, conversion *);
- static bool is_subseq (conversion *, conversion *);
- static tree maybe_handle_ref_bind (conversion **);
-@@ -613,18 +613,12 @@
- tcode = TREE_CODE (to);
-
- conv = build_identity_conv (from, expr);
-- if (fcode == FUNCTION_TYPE)
-+ if (fcode == FUNCTION_TYPE || fcode == ARRAY_TYPE)
- {
-- from = build_pointer_type (from);
-+ from = type_decays_to (from);
- fcode = TREE_CODE (from);
- conv = build_conv (ck_lvalue, from, conv);
+ /* Assign all the passed arguments to the appropriate incoming
+ parameters of the function. */
+- fi = get_varinfo (varid);
+ arglist = TREE_OPERAND (rhsop, 1);
+
+ for (;arglist; arglist = TREE_CHAIN (arglist))
+@@ -3463,13 +3432,14 @@
+ }
+ i++;
+ }
++
+ /* If we are returning a value, assign it to the result. */
+ if (lhsop)
+ {
+ struct constraint_expr rhs;
+ struct constraint_expr *lhsp;
+ unsigned int j = 0;
+-
++
+ get_constraint_for (lhsop, &lhsc);
+ if (TREE_CODE (decl) != FUNCTION_DECL)
+ {
+@@ -3485,7 +3455,7 @@
+ }
+ for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++)
+ process_constraint (new_constraint (*lhsp, rhs));
+- }
++ }
}
-- else if (fcode == ARRAY_TYPE)
-- {
-- from = build_pointer_type (TREE_TYPE (from));
-- fcode = TREE_CODE (from);
-- conv = build_conv (ck_lvalue, from, conv);
-- }
- else if (fromref || (expr && lvalue_p (expr)))
- {
- if (expr)
-@@ -632,7 +626,10 @@
- tree bitfield_type;
- bitfield_type = is_bitfield_expr_with_lowered_type (expr);
- if (bitfield_type)
-- from = strip_top_quals (bitfield_type);
-+ {
-+ from = strip_top_quals (bitfield_type);
-+ fcode = TREE_CODE (from);
-+ }
+ /* Otherwise, just a regular assignment statement. */
+ else if (TREE_CODE (t) == MODIFY_EXPR)
+@@ -3494,7 +3464,7 @@
+ tree rhsop = TREE_OPERAND (t, 1);
+ int i;
+
+- if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop))
++ if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop))
+ || TREE_CODE (TREE_TYPE (lhsop)) == COMPLEX_TYPE)
+ && (AGGREGATE_TYPE_P (TREE_TYPE (rhsop))
+ || TREE_CODE (TREE_TYPE (lhsop)) == COMPLEX_TYPE))
+@@ -3513,7 +3483,7 @@
+ {
+ /* RHS that consist of unary operations,
+ exceptional types, or bare decls/constants, get
+- handled directly by get_constraint_for. */
++ handled directly by get_constraint_for. */
+ case tcc_reference:
+ case tcc_declaration:
+ case tcc_constant:
+@@ -3528,7 +3498,7 @@
+ {
+ struct constraint_expr *c2;
+ unsigned int k;
+-
++
+ for (k = 0; VEC_iterate (ce_s, rhsc, k, c2); k++)
+ process_constraint (new_constraint (*c, *c2));
+ }
+@@ -3570,7 +3540,7 @@
+ }
+ }
+ }
+- }
++ }
+ }
}
- conv = build_conv (ck_rvalue, from, conv);
}
-@@ -1085,10 +1082,11 @@
- purposes of reference binding. For lvalue binding, either pass a
- reference type to FROM or an lvalue expression to EXPR. If the
- reference will be bound to a temporary, NEED_TEMPORARY_P is set for
-- the conversion returned. */
-+ the conversion returned. If C_CAST_P is true, this
-+ conversion is coming from a C-style cast. */
-
- static conversion *
--reference_binding (tree rto, tree rfrom, tree expr, int flags)
-+reference_binding (tree rto, tree rfrom, tree expr, bool c_cast_p, int flags)
+@@ -3578,7 +3548,7 @@
+ /* After promoting variables and computing aliasing we will
+ need to re-scan most statements. FIXME: Try to minimize the
+ number of statements re-scanned. It's not really necessary to
+- re-scan *all* statements. */
++ re-scan *all* statements. */
+ mark_stmt_modified (origt);
+ VEC_free (ce_s, heap, rhsc);
+ VEC_free (ce_s, heap, lhsc);
+@@ -3591,7 +3561,7 @@
+ first field that overlaps with OFFSET.
+ Return NULL if we can't find one. */
+
+-static varinfo_t
++static varinfo_t
+ first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset)
{
- conversion *conv = NULL;
- tree to = TREE_TYPE (rto);
-@@ -1118,6 +1116,11 @@
- reference compatible. We have do do this after stripping
- references from FROM. */
- related_p = reference_related_p (to, from);
-+ /* If this is a C cast, first convert to an appropriately qualified
-+ type, so that we can later do a const_cast to the desired type. */
-+ if (related_p && c_cast_p
-+ && !at_least_as_qualified_p (to, from))
-+ to = build_qualified_type (to, cp_type_quals (from));
- compatible_p = reference_compatible_p (to, from);
-
- if (lvalue_p && compatible_p)
-@@ -1227,7 +1230,7 @@
- if (related_p && !at_least_as_qualified_p (to, from))
- return NULL;
-
-- conv = implicit_conversion (to, from, expr, /*c_cast_p=*/false,
-+ conv = implicit_conversion (to, from, expr, c_cast_p,
- flags);
- if (!conv)
- return NULL;
-@@ -1257,7 +1260,7 @@
- return NULL;
-
- if (TREE_CODE (to) == REFERENCE_TYPE)
-- conv = reference_binding (to, from, expr, flags);
-+ conv = reference_binding (to, from, expr, c_cast_p, flags);
- else
- conv = standard_conversion (to, from, expr, c_cast_p, flags);
-
-@@ -4655,6 +4658,7 @@
- tree
- convert_for_arg_passing (tree type, tree val)
+ varinfo_t curr = start;
+@@ -3617,7 +3587,7 @@
{
-+ val = convert_bitfield_to_declared_type (val);
- if (val == error_mark_node)
- ;
- /* Pass classes with copy ctors by invisible reference. */
-@@ -6564,7 +6568,8 @@
- /* Get the high-water mark for the CONVERSION_OBSTACK. */
- p = conversion_obstack_alloc (0);
-
-- conv = reference_binding (type, TREE_TYPE (expr), expr, LOOKUP_NORMAL);
-+ conv = reference_binding (type, TREE_TYPE (expr), expr, /*c_cast_p=*/false,
-+ LOOKUP_NORMAL);
- if (!conv || conv->bad_p)
- {
- if (!(TYPE_QUALS (TREE_TYPE (type)) & TYPE_QUAL_CONST)
-Index: gcc-4_2-branch/gcc/cp/cp-tree.h
-===================================================================
---- gcc-4_2-branch/gcc/cp/cp-tree.h (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/cp-tree.h (revision 124164)
-@@ -4471,6 +4471,7 @@
- extern int ptr_reasonably_similar (tree, tree);
- extern tree build_ptrmemfunc (tree, tree, int, bool);
- extern int cp_type_quals (tree);
-+extern bool cp_type_readonly (tree);
- extern bool cp_has_mutable_p (tree);
- extern bool at_least_as_qualified_p (tree, tree);
- extern void cp_apply_type_quals_to_decl (int, tree);
-Index: gcc-4_2-branch/gcc/cp/ChangeLog
-===================================================================
---- gcc-4_2-branch/gcc/cp/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/ChangeLog (revision 124164)
-@@ -1,3 +1,70 @@
-+2007-04-24 Paolo Carlini <pcarlini@suse.de>
-+
-+ PR c++/30500
-+ * pt.c (instantiate_decl): Set in_system_header.
-+
-+2007-04-17 Simon Martin <simartin@users.sourceforge.net>
-+
-+ PR c++/31517
-+ * pt.c (value_dependent_expression_p): Handle MODOP_EXPRs.
-+
-+2007-04-16 Mark Mitchell <mark@codesourcery.com>
-+
-+ PR c++/31513
-+ * call.c (convert_for_arg_passing): Convert bitfields to their
-+ declared types.
-+
-+2007-04-13 Jason Merrill <jason@redhat.com>
-+
-+ PR c++/31074
-+ * call.c (reference_binding): Add c_cast_p parm. If true,
-+ add quals to TO as needed to make it reference-compatible.
+ varinfo_t prev = base;
+ varinfo_t curr = base->next;
+-
+
-+2007-04-10 Mike Stump <mrs@apple.com>
-+
-+ * class.c (dfs_accumulate_vtbl_inits): Slam the vtbl type back to
-+ vtbl_ptr_type_node to ensure the mode is correct.
-+
-+2007-04-09 Mark Mitchell <mark@codesourcery.com>
-+
-+ PR c++/31449
-+ * class.c (build_base_path): Ensure that the converted pointer has
-+ the same cv-qualification as the input.
+ field->next = curr;
+ prev->next = field;
+ }
+@@ -3630,7 +3600,7 @@
+ {
+ varinfo_t prev = base;
+ varinfo_t curr = base->next;
+-
+
-+2007-04-03 Jakub Jelinek <jakub@redhat.com>
+ if (curr == NULL)
+ {
+ prev->next = field;
+@@ -3652,13 +3622,13 @@
+
+ /* qsort comparison function for two fieldoff's PA and PB */
+
+-static int
++static int
+ fieldoff_compare (const void *pa, const void *pb)
+ {
+ const fieldoff_s *foa = (const fieldoff_s *)pa;
+ const fieldoff_s *fob = (const fieldoff_s *)pb;
+ HOST_WIDE_INT foasize, fobsize;
+-
+
-+ PR c++/30847
-+ * typeck.c (build_modify_expr): For COND_EXPR on LHS, if RHS has void
-+ type issue error and return early.
+ if (foa->offset != fob->offset)
+ return foa->offset - fob->offset;
+
+@@ -3671,8 +3641,8 @@
+ void
+ sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack)
+ {
+- qsort (VEC_address (fieldoff_s, fieldstack),
+- VEC_length (fieldoff_s, fieldstack),
++ qsort (VEC_address (fieldoff_s, fieldstack),
++ VEC_length (fieldoff_s, fieldstack),
+ sizeof (fieldoff_s),
+ fieldoff_compare);
+ }
+@@ -3686,12 +3656,12 @@
+ TYPE. */
+
+ int
+-push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
++push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack,
+ HOST_WIDE_INT offset, bool *has_union)
+ {
+ tree field;
+ int count = 0;
+-
+
-+2007-03-30 Jason Merrill <jason@redhat.com>
+ if (TREE_CODE (type) == COMPLEX_TYPE)
+ {
+ fieldoff_s *real_part, *img_part;
+@@ -3700,13 +3670,13 @@
+ real_part->size = TYPE_SIZE (TREE_TYPE (type));
+ real_part->offset = offset;
+ real_part->decl = NULL_TREE;
+-
++
+ img_part = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL);
+ img_part->type = TREE_TYPE (type);
+ img_part->size = TYPE_SIZE (TREE_TYPE (type));
+ img_part->offset = offset + TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (type)));
+ img_part->decl = NULL_TREE;
+-
++
+ return 2;
+ }
+
+@@ -3733,12 +3703,12 @@
+ {
+ bool push = false;
+ int pushed = 0;
+-
+- if (has_union
+
-+ PR c++/31187
-+ * typeck.c (cp_type_readonly): New fn.
-+ * cp-tree.h: Declare it.
-+ * decl.c (start_decl): Set implicit DECL_THIS_STATIC here.
-+ (cp_finish_decl): Not here.
++ if (has_union
+ && (TREE_CODE (TREE_TYPE (type)) == QUAL_UNION_TYPE
+ || TREE_CODE (TREE_TYPE (type)) == UNION_TYPE))
+ *has_union = true;
+-
+
-+2007-03-31 Diego Novillo <dnovillo@redhat.com>
-+ Mark Mitchell <mark@codesourcery.com>
+ if (!AGGREGATE_TYPE_P (TREE_TYPE (type))) /* var_can_have_subvars */
+ push = true;
+ else if (!(pushed = push_fields_onto_fieldstack
+@@ -3772,12 +3742,12 @@
+ {
+ bool push = false;
+ int pushed = 0;
+-
+- if (has_union
+
-+ PR 29585
-+ * class.c (dfs_accumulate_vtbl_inits): Use build_address
-+ to build the vtbl entry.
++ if (has_union
+ && (TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE
+ || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE))
+ *has_union = true;
+-
+
-+2007-03-22 Mark Mitchell <mark@codesourcery.com>
+ if (!var_can_have_subvars (field))
+ push = true;
+ else if (!(pushed = push_fields_onto_fieldstack
+@@ -3789,7 +3759,7 @@
+ see if we didn't push any subfields and the size is
+ nonzero, push the field onto the stack */
+ push = true;
+-
+
-+ PR c++/30863
-+ * parser.c (cp_parser_parse_and_diagnose_invalid_type_name): Do
-+ not consume tokens when failing.
+ if (push)
+ {
+ fieldoff_s *pair;
+@@ -3848,15 +3818,15 @@
+ unsigned int i = 0;
+ tree t;
+
+- for (t = TYPE_ARG_TYPES (TREE_TYPE (decl));
++ for (t = TYPE_ARG_TYPES (TREE_TYPE (decl));
+ t;
+ t = TREE_CHAIN (t))
+- {
++ {
+ if (TREE_VALUE (t) == void_type_node)
+ break;
+ i++;
+ }
+-
+
-+2007-03-22 Jim Wilson <wilson@specifix.com>
-+ Mark Mitchell <mark@codesourcery.com>
+ if (!t)
+ *is_varargs = true;
+ return i;
+@@ -3870,19 +3840,19 @@
+ {
+ unsigned int index = VEC_length (varinfo_t, varmap);
+ varinfo_t vi;
+- tree arg;
++ tree arg;
+ unsigned int i;
+ bool is_varargs = false;
+
+ /* Create the variable info. */
+
+- vi = new_var_info (decl, index, name, index);
++ vi = new_var_info (decl, index, name);
+ vi->decl = decl;
+ vi->offset = 0;
+ vi->has_union = 0;
+ vi->size = 1;
+ vi->fullsize = count_num_arguments (decl, &is_varargs) + 1;
+- insert_id_for_tree (vi->decl, index);
++ insert_vi_for_tree (vi->decl, vi);
+ VEC_safe_push (varinfo_t, heap, varmap, vi);
+
+ stats.total_vars++;
+@@ -3898,12 +3868,12 @@
+ return index;
+ }
+
+-
+
-+ PR c++/31273
-+ * call.c (standard_conversion): Use type_decays_to. Keep FCODE
-+ consistent with FROM.
+ arg = DECL_ARGUMENTS (decl);
+
+ /* Set up variables for each argument. */
+ for (i = 1; i < vi->fullsize; i++)
+- {
++ {
+ varinfo_t argvi;
+ const char *newname;
+ char *tempname;
+@@ -3912,13 +3882,13 @@
+
+ if (arg)
+ argdecl = arg;
+-
++
+ newindex = VEC_length (varinfo_t, varmap);
+ asprintf (&tempname, "%s.arg%d", name, i-1);
+ newname = ggc_strdup (tempname);
+ free (tempname);
+
+- argvi = new_var_info (argdecl, newindex,newname, newindex);
++ argvi = new_var_info (argdecl, newindex, newname);
+ argvi->decl = argdecl;
+ VEC_safe_push (varinfo_t, heap, varmap, argvi);
+ argvi->offset = i;
+@@ -3929,7 +3899,7 @@
+ stats.total_vars ++;
+ if (arg)
+ {
+- insert_id_for_tree (arg, newindex);
++ insert_vi_for_tree (arg, argvi);
+ arg = TREE_CHAIN (arg);
+ }
+ }
+@@ -3948,13 +3918,13 @@
+
+ if (DECL_RESULT (decl))
+ resultdecl = DECL_RESULT (decl);
+-
++
+ newindex = VEC_length (varinfo_t, varmap);
+ asprintf (&tempname, "%s.result", name);
+ newname = ggc_strdup (tempname);
+ free (tempname);
+
+- resultvi = new_var_info (resultdecl, newindex, newname, newindex);
++ resultvi = new_var_info (resultdecl, newindex, newname);
+ resultvi->decl = resultdecl;
+ VEC_safe_push (varinfo_t, heap, varmap, resultvi);
+ resultvi->offset = i;
+@@ -3964,13 +3934,13 @@
+ insert_into_field_list_sorted (vi, resultvi);
+ stats.total_vars ++;
+ if (DECL_RESULT (decl))
+- insert_id_for_tree (DECL_RESULT (decl), newindex);
++ insert_vi_for_tree (DECL_RESULT (decl), resultvi);
+ }
+ return index;
+-}
++}
+
+
+-/* Return true if FIELDSTACK contains fields that overlap.
++/* Return true if FIELDSTACK contains fields that overlap.
+ FIELDSTACK is assumed to be sorted by offset. */
+
+ static bool
+@@ -4057,12 +4027,12 @@
+ bool hasunion;
+ bool is_global = DECL_P (decl) ? is_global_var (decl) : false;
+ VEC (fieldoff_s,heap) *fieldstack = NULL;
+-
+
- 2007-03-14 Andrew Pinski <andrew_pinski@playstation.sony.com>
+ if (TREE_CODE (decl) == FUNCTION_DECL && in_ipa_mode)
+ return create_function_info_for (decl, name);
- PR c++/31165
-Index: gcc-4_2-branch/gcc/cp/pt.c
-===================================================================
---- gcc-4_2-branch/gcc/cp/pt.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/pt.c (revision 124164)
-@@ -12034,6 +12034,7 @@
- bool pattern_defined;
- int need_push;
- location_t saved_loc = input_location;
-+ int saved_in_system_header = in_system_header;
- bool external_p;
-
- /* This function should only be used to instantiate templates for
-@@ -12116,6 +12117,7 @@
- mark_definable (d);
-
- input_location = DECL_SOURCE_LOCATION (d);
-+ in_system_header = DECL_IN_SYSTEM_HEADER (d);
-
- /* If D is a member of an explicitly instantiated class template,
- and no definition is available, treat it like an implicit
-@@ -12349,6 +12351,7 @@
-
- out:
- input_location = saved_loc;
-+ in_system_header = saved_in_system_header;
- pop_deferring_access_checks ();
- pop_tinst_level ();
-
-@@ -12924,6 +12927,10 @@
- such calls are value-dependent. */
- return true;
-
-+ case MODOP_EXPR:
-+ return ((value_dependent_expression_p (TREE_OPERAND (expression, 0)))
-+ || (value_dependent_expression_p (TREE_OPERAND (expression, 2))));
+ hasunion = TREE_CODE (decltype) == UNION_TYPE
+- || TREE_CODE (decltype) == QUAL_UNION_TYPE;
++ || TREE_CODE (decltype) == QUAL_UNION_TYPE;
+ if (var_can_have_subvars (decl) && use_field_sensitive && !hasunion)
+ {
+ push_fields_onto_fieldstack (decltype, &fieldstack, 0, &hasunion);
+@@ -4072,12 +4042,12 @@
+ notokay = true;
+ }
+ }
+-
+
++
+ /* If the variable doesn't have subvars, we may end up needing to
+ sort the field list and create fake variables for all the
+ fields. */
+- vi = new_var_info (decl, index, name, index);
++ vi = new_var_info (decl, index, name);
+ vi->decl = decl;
+ vi->offset = 0;
+ vi->has_union = hasunion;
+@@ -4095,8 +4065,8 @@
+ vi->fullsize = TREE_INT_CST_LOW (declsize);
+ vi->size = vi->fullsize;
+ }
+-
+- insert_id_for_tree (vi->decl, index);
+
- default:
- /* A constant expression is value-dependent if any subexpression is
- value-dependent. */
-Index: gcc-4_2-branch/gcc/cp/parser.c
-===================================================================
---- gcc-4_2-branch/gcc/cp/parser.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cp/parser.c (revision 124164)
-@@ -2281,12 +2281,13 @@
- the scope is dependent, we cannot do much. */
- if (!cp_lexer_next_token_is (parser->lexer, CPP_NAME)
- || (parser->scope && TYPE_P (parser->scope)
-- && dependent_type_p (parser->scope)))
-+ && dependent_type_p (parser->scope))
-+ || TREE_CODE (id) == TYPE_DECL)
++ insert_vi_for_tree (vi->decl, vi);
+ VEC_safe_push (varinfo_t, heap, varmap, vi);
+ if (is_global && (!flag_whole_program || !in_ipa_mode))
{
- cp_parser_abort_tentative_parse (parser);
- return false;
+@@ -4122,9 +4092,9 @@
}
-- if (!cp_parser_parse_definitely (parser) || TREE_CODE (id) == TYPE_DECL)
-+ if (!cp_parser_parse_definitely (parser))
- return false;
-
- /* Emit a diagnostic for the invalid type. */
-Index: gcc-4_2-branch/gcc/cse.c
-===================================================================
---- gcc-4_2-branch/gcc/cse.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cse.c (revision 124164)
-@@ -4542,6 +4542,14 @@
- op1 = fold_rtx (XEXP (XEXP (SET_SRC (set), 0), 1), insn);
- code = find_comparison_args (code, &op0, &op1, &mode0, &mode1);
-+
-+ /* If the mode is a MODE_CC mode, we don't know what kinds of things
-+ are being compared, so we can't do anything with this
-+ comparison. */
+ stats.total_vars++;
+- if (use_field_sensitive
+- && !notokay
+- && !vi->is_unknown_size_var
++ if (use_field_sensitive
++ && !notokay
++ && !vi->is_unknown_size_var
+ && var_can_have_subvars (decl)
+ && VEC_length (fieldoff_s, fieldstack) <= MAX_FIELDS_FOR_FIELD_SENSITIVE)
+ {
+@@ -4148,7 +4118,7 @@
+ without creating varinfos for the fields anyway, so sorting them is a
+ waste to boot. */
+ if (!notokay)
+- {
++ {
+ sort_fieldstack (fieldstack);
+ /* Due to some C++ FE issues, like PR 22488, we might end up
+ what appear to be overlapping fields even though they,
+@@ -4156,8 +4126,8 @@
+ we will simply disable field-sensitivity for these cases. */
+ notokay = check_for_overlaps (fieldstack);
+ }
+-
+-
+
-+ if (GET_MODE_CLASS (mode0) == MODE_CC)
-+ return;
+
- if (! cond_known_true)
- {
- code = reversed_comparison_code_parts (code, op0, op1, insn);
-Index: gcc-4_2-branch/gcc/dwarf2out.c
-===================================================================
---- gcc-4_2-branch/gcc/dwarf2out.c (revision 123014)
-+++ gcc-4_2-branch/gcc/dwarf2out.c (revision 124164)
-@@ -10003,12 +10003,24 @@
- if (DECL_P (*tp) && ! TREE_PUBLIC (*tp) && ! TREE_USED (*tp)
- && ! TREE_ASM_WRITTEN (*tp))
- return *tp;
-- else if (DECL_P (*tp) && TREE_CODE (*tp) != FUNCTION_DECL)
-+ else if (!flag_unit_at_a_time)
-+ return NULL_TREE;
-+ else if (!cgraph_global_info_ready
-+ && (TREE_CODE (*tp) == VAR_DECL || TREE_CODE (*tp) == FUNCTION_DECL))
-+ gcc_unreachable ();
-+ else if (DECL_P (*tp) && TREE_CODE (*tp) == VAR_DECL)
+ if (VEC_length (fieldoff_s, fieldstack) != 0)
+ fo = VEC_index (fieldoff_s, fieldstack, 0);
+
+@@ -4169,11 +4139,11 @@
+ VEC_free (fieldoff_s, heap, fieldstack);
+ return index;
+ }
+-
++
+ vi->size = TREE_INT_CST_LOW (fo->size);
+ vi->offset = fo->offset;
+- for (i = VEC_length (fieldoff_s, fieldstack) - 1;
+- i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo);
++ for (i = VEC_length (fieldoff_s, fieldstack) - 1;
++ i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo);
+ i--)
+ {
+ varinfo_t newvi;
+@@ -4184,15 +4154,15 @@
+ if (dump_file)
+ {
+ if (fo->decl)
+- asprintf (&tempname, "%s.%s",
++ asprintf (&tempname, "%s.%s",
+ vi->name, alias_get_name (fo->decl));
+ else
+- asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC,
++ asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC,
+ vi->name, fo->offset);
+ newname = ggc_strdup (tempname);
+ free (tempname);
+ }
+- newvi = new_var_info (decl, newindex, newname, newindex);
++ newvi = new_var_info (decl, newindex, newname);
+ newvi->offset = fo->offset;
+ newvi->size = TREE_INT_CST_LOW (fo->size);
+ newvi->fullsize = vi->fullsize;
+@@ -4228,14 +4198,22 @@
+ {
+ varinfo_t vi = get_varinfo (var);
+ unsigned int i;
+- bitmap_iterator bi;
+-
+- fprintf (file, "%s = { ", vi->name);
+- EXECUTE_IF_SET_IN_BITMAP (get_varinfo (vi->node)->solution, 0, i, bi)
++ bitmap_iterator bi;
++
++ if (find (var) != var)
{
- struct cgraph_varpool_node *node = cgraph_varpool_node (*tp);
- if (!node->needed)
- return *tp;
+- fprintf (file, "%s ", get_varinfo (i)->name);
++ varinfo_t vipt = get_varinfo (find (var));
++ fprintf (file, "%s = same as %s\n", vi->name, vipt->name);
}
-+ else if (DECL_P (*tp) && TREE_CODE (*tp) == FUNCTION_DECL
-+ && (!DECL_EXTERNAL (*tp) || DECL_DECLARED_INLINE_P (*tp)))
+- fprintf (file, "}\n");
++ else
+ {
-+ struct cgraph_node *node = cgraph_node (*tp);
-+ if (!node->output)
-+ return *tp;
++ fprintf (file, "%s = { ", vi->name);
++ EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi)
++ {
++ fprintf (file, "%s ", get_varinfo (i)->name);
++ }
++ fprintf (file, "}\n");
+ }
-
- return NULL_TREE;
}
-Index: gcc-4_2-branch/gcc/expr.c
-===================================================================
---- gcc-4_2-branch/gcc/expr.c (revision 123014)
-+++ gcc-4_2-branch/gcc/expr.c (revision 124164)
-@@ -8786,8 +8786,15 @@
- HOST_WIDE_INT prec = TYPE_PRECISION (type);
- if (target && GET_MODE (target) != GET_MODE (exp))
- target = 0;
-- if (TYPE_UNSIGNED (type))
-+ /* For constant values, reduce using build_int_cst_type. */
-+ if (GET_CODE (exp) == CONST_INT)
- {
-+ HOST_WIDE_INT value = INTVAL (exp);
-+ tree t = build_int_cst_type (type, value);
-+ return expand_expr (t, target, VOIDmode, EXPAND_NORMAL);
-+ }
-+ else if (TYPE_UNSIGNED (type))
-+ {
- rtx mask;
- if (prec < HOST_BITS_PER_WIDE_INT)
- mask = immed_double_const (((unsigned HOST_WIDE_INT) 1 << prec) - 1, 0,
-Index: gcc-4_2-branch/gcc/cfgbuild.c
-===================================================================
---- gcc-4_2-branch/gcc/cfgbuild.c (revision 123014)
-+++ gcc-4_2-branch/gcc/cfgbuild.c (revision 124164)
-@@ -120,6 +120,11 @@
- || can_throw_internal (insn));
- case INSN:
-+ /* Treat trap instructions like noreturn calls (same provision). */
-+ if (GET_CODE (PATTERN (insn)) == TRAP_IF
-+ && XEXP (PATTERN (insn), 0) == const1_rtx)
-+ return true;
-+
- return (flag_non_call_exceptions && can_throw_internal (insn));
+ /* Print the points-to solution for VAR to stdout. */
+@@ -4266,7 +4244,7 @@
+ if (!could_have_pointers (t))
+ continue;
+
+- arg_id = get_id_for_tree (t);
++ arg_id = get_vi_for_tree (t)->id;
+
+ /* With flag_argument_noalias greater than two means that the incoming
+ argument cannot alias anything except for itself so create a HEAP
+@@ -4276,11 +4254,10 @@
+ {
+ varinfo_t vi;
+ tree heapvar = heapvar_lookup (t);
+- unsigned int id;
+
+ lhs.offset = 0;
+ lhs.type = SCALAR;
+- lhs.var = get_id_for_tree (t);
++ lhs.var = get_vi_for_tree (t)->id;
+
+ if (heapvar == NULL_TREE)
+ {
+@@ -4291,11 +4268,11 @@
+ add_referenced_var (heapvar);
+ heapvar_insert (t, heapvar);
+ }
+- id = get_id_for_tree (heapvar);
+- vi = get_varinfo (id);
++
++ vi = get_vi_for_tree (heapvar);
+ vi->is_artificial_var = 1;
+ vi->is_heap_var = 1;
+- rhs.var = id;
++ rhs.var = vi->id;
+ rhs.type = ADDRESSOF;
+ rhs.offset = 0;
+ for (p = get_varinfo (lhs.var); p; p = p->next)
+@@ -4409,8 +4386,8 @@
+ bool
+ find_what_p_points_to (tree p)
+ {
+- unsigned int id = 0;
+ tree lookup_p = p;
++ varinfo_t vi;
- case BARRIER:
-Index: gcc-4_2-branch/gcc/opts.c
-===================================================================
---- gcc-4_2-branch/gcc/opts.c (revision 123014)
-+++ gcc-4_2-branch/gcc/opts.c (revision 124164)
-@@ -1010,7 +1010,7 @@
- break;
+ if (!have_alias_info)
+ return false;
+@@ -4422,10 +4399,10 @@
+ && default_def (SSA_NAME_VAR (p)) == p)
+ lookup_p = SSA_NAME_VAR (p);
- case OPT_fforce_mem:
-- warning (0, "-f[no-]force-mem is nop and option will be removed in 4.2");
-+ warning (0, "-f[no-]force-mem is nop and option will be removed in 4.3");
- break;
+- if (lookup_id_for_tree (lookup_p, &id))
++ vi = lookup_vi_for_tree (lookup_p);
++ if (vi)
+ {
+- varinfo_t vi = get_varinfo (id);
+-
++
+ if (vi->is_artificial_var)
+ return false;
+
+@@ -4447,7 +4424,7 @@
+
+ /* This variable may have been collapsed, let's get the real
+ variable. */
+- vi = get_varinfo (vi->node);
++ vi = get_varinfo (find (vi->id));
+
+ /* Translate artificial variables into SSA_NAME_PTR_INFO
+ attributes. */
+@@ -4506,13 +4483,16 @@
+ {
+ fprintf (outfile, "Stats:\n");
+ fprintf (outfile, "Total vars: %d\n", stats.total_vars);
++ fprintf (outfile, "Non-pointer vars: %d\n",
++ stats.nonpointer_vars);
+ fprintf (outfile, "Statically unified vars: %d\n",
+ stats.unified_vars_static);
+- fprintf (outfile, "Collapsed vars: %d\n", stats.collapsed_vars);
+ fprintf (outfile, "Dynamically unified vars: %d\n",
+ stats.unified_vars_dynamic);
+ fprintf (outfile, "Iterations: %d\n", stats.iterations);
+ fprintf (outfile, "Number of edges: %d\n", stats.num_edges);
++ fprintf (outfile, "Number of implicit edges: %d\n",
++ stats.num_implicit_edges);
+ }
- case OPT_floop_optimize:
-Index: gcc-4_2-branch/gcc/c-decl.c
-===================================================================
---- gcc-4_2-branch/gcc/c-decl.c (revision 123014)
-+++ gcc-4_2-branch/gcc/c-decl.c (revision 124164)
-@@ -3337,7 +3337,7 @@
- void
- finish_decl (tree decl, tree init, tree asmspec_tree)
+ for (i = 0; i < VEC_length (varinfo_t, varmap); i++)
+@@ -4540,8 +4520,8 @@
+ /* Create the NULL variable, used to represent that a variable points
+ to NULL. */
+ nothing_tree = create_tmp_var_raw (void_type_node, "NULL");
+- var_nothing = new_var_info (nothing_tree, 0, "NULL", 0);
+- insert_id_for_tree (nothing_tree, 0);
++ var_nothing = new_var_info (nothing_tree, 0, "NULL");
++ insert_vi_for_tree (nothing_tree, var_nothing);
+ var_nothing->is_artificial_var = 1;
+ var_nothing->offset = 0;
+ var_nothing->size = ~0;
+@@ -4553,8 +4533,8 @@
+ /* Create the ANYTHING variable, used to represent that a variable
+ points to some unknown piece of memory. */
+ anything_tree = create_tmp_var_raw (void_type_node, "ANYTHING");
+- var_anything = new_var_info (anything_tree, 1, "ANYTHING", 1);
+- insert_id_for_tree (anything_tree, 1);
++ var_anything = new_var_info (anything_tree, 1, "ANYTHING");
++ insert_vi_for_tree (anything_tree, var_anything);
+ var_anything->is_artificial_var = 1;
+ var_anything->size = ~0;
+ var_anything->offset = 0;
+@@ -4573,7 +4553,6 @@
+ rhs.type = ADDRESSOF;
+ rhs.var = anything_id;
+ rhs.offset = 0;
+- var_anything->address_taken = true;
+
+ /* This specifically does not use process_constraint because
+ process_constraint ignores all anything = anything constraints, since all
+@@ -4583,14 +4562,14 @@
+ /* Create the READONLY variable, used to represent that a variable
+ points to readonly memory. */
+ readonly_tree = create_tmp_var_raw (void_type_node, "READONLY");
+- var_readonly = new_var_info (readonly_tree, 2, "READONLY", 2);
++ var_readonly = new_var_info (readonly_tree, 2, "READONLY");
+ var_readonly->is_artificial_var = 1;
+ var_readonly->offset = 0;
+ var_readonly->size = ~0;
+ var_readonly->fullsize = ~0;
+ var_readonly->next = NULL;
+ var_readonly->is_special_var = 1;
+- insert_id_for_tree (readonly_tree, 2);
++ insert_vi_for_tree (readonly_tree, var_readonly);
+ readonly_id = 2;
+ VEC_safe_push (varinfo_t, heap, varmap, var_readonly);
+
+@@ -4610,8 +4589,8 @@
+ /* Create the INTEGER variable, used to represent that a variable points
+ to an INTEGER. */
+ integer_tree = create_tmp_var_raw (void_type_node, "INTEGER");
+- var_integer = new_var_info (integer_tree, 3, "INTEGER", 3);
+- insert_id_for_tree (integer_tree, 3);
++ var_integer = new_var_info (integer_tree, 3, "INTEGER");
++ insert_vi_for_tree (integer_tree, var_integer);
+ var_integer->is_artificial_var = 1;
+ var_integer->size = ~0;
+ var_integer->fullsize = ~0;
+@@ -4634,8 +4613,8 @@
+ /* Create the ESCAPED_VARS variable used to represent variables that
+ escape this function. */
+ escaped_vars_tree = create_tmp_var_raw (void_type_node, "ESCAPED_VARS");
+- var_escaped_vars = new_var_info (escaped_vars_tree, 4, "ESCAPED_VARS", 4);
+- insert_id_for_tree (escaped_vars_tree, 4);
++ var_escaped_vars = new_var_info (escaped_vars_tree, 4, "ESCAPED_VARS");
++ insert_vi_for_tree (escaped_vars_tree, var_escaped_vars);
+ var_escaped_vars->is_artificial_var = 1;
+ var_escaped_vars->size = ~0;
+ var_escaped_vars->fullsize = ~0;
+@@ -4660,21 +4639,19 @@
+ static void
+ init_alias_vars (void)
{
-- tree type = TREE_TYPE (decl);
-+ tree type;
- int was_incomplete = (DECL_SIZE (decl) == 0);
- const char *asmspec = 0;
+- bitmap_obstack_initialize (&ptabitmap_obstack);
++ bitmap_obstack_initialize (&pta_obstack);
++ bitmap_obstack_initialize (&oldpta_obstack);
+ bitmap_obstack_initialize (&predbitmap_obstack);
+
+- constraint_pool = create_alloc_pool ("Constraint pool",
++ constraint_pool = create_alloc_pool ("Constraint pool",
+ sizeof (struct constraint), 30);
+ variable_info_pool = create_alloc_pool ("Variable info pool",
+ sizeof (struct variable_info), 30);
+- constraint_edge_pool = create_alloc_pool ("Constraint edges",
+- sizeof (struct constraint_edge), 30);
+-
+ constraints = VEC_alloc (constraint_t, heap, 8);
+ varmap = VEC_alloc (varinfo_t, heap, 8);
+- id_for_tree = htab_create (10, tree_id_hash, tree_id_eq, free);
++ vi_for_tree = pointer_map_create ();
++
+ memset (&stats, 0, sizeof (stats));
+-
+ init_base_vars ();
+ }
-@@ -3364,6 +3364,8 @@
- || TREE_CODE (decl) == FIELD_DECL))
- objc_check_decl (decl);
+@@ -4777,6 +4754,43 @@
+ VEC_free (ce_s, heap, rhsc);
+ }
-+ type = TREE_TYPE (decl);
+
- /* Deduce size of array from initialization, if not already known. */
- if (TREE_CODE (type) == ARRAY_TYPE
- && TYPE_DOMAIN (type) == 0
-Index: gcc-4_2-branch/gcc/fortran/ChangeLog
-===================================================================
---- gcc-4_2-branch/gcc/fortran/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/gcc/fortran/ChangeLog (revision 124164)
-@@ -1,3 +1,20 @@
-+2007-04-12 Daniel Franke <franke.daniel@gmail.com>
++/* Remove the REF and ADDRESS edges from GRAPH, as well as all the
++ predecessor edges. */
+
-+ PR fortran/31234
-+ * intrinsic.texi (RANDOM_SEED, RANDOM_NUMBER): New.
++static void
++remove_preds_and_fake_succs (constraint_graph_t graph)
++{
++ unsigned int i;
+
-+2007-03-23 Brooks Moses <brooks.moses@codesourcery.com>
++ /* Clear the implicit ref and address nodes from the successor
++ lists. */
++ for (i = 0; i < FIRST_REF_NODE; i++)
++ {
++ if (graph->succs[i])
++ bitmap_clear_range (graph->succs[i], FIRST_REF_NODE,
++ FIRST_REF_NODE * 2);
++ }
+
-+ * invoke.texi: Misc. small typo fixes.
-+ (-Wcharacter-truncation): Add.
-+ (-Wnonstd-intrinsics): Correct spelling.
-+ (-std=): Edit.
++ /* Free the successor list for the non-ref nodes. */
++ for (i = FIRST_REF_NODE; i < graph->size; i++)
++ {
++ if (graph->succs[i])
++ BITMAP_FREE (graph->succs[i]);
++ }
+
-+2007-03-17 Francois-Xavier Coudert <coudert@clipper.ens.fr>
++ /* Now reallocate the size of the successor list as, and blow away
++ the predecessor bitmaps. */
++ graph->size = VEC_length (varinfo_t, varmap);
++ graph->succs = xrealloc (graph->succs, graph->size * sizeof (bitmap));
+
-+ PR fortran/31184
-+ * invoke.texi: Fix typo.
++ free (graph->implicit_preds);
++ graph->implicit_preds = NULL;
++ free (graph->preds);
++ graph->preds = NULL;
++ bitmap_obstack_release (&predbitmap_obstack);
++}
+
- 2007-03-14 Jakub Jelinek <jakub@redhat.com>
+ /* Create points-to sets for the current function. See the comments
+ at the start of the file for an algorithmic overview. */
- * module.c (mio_typespec): Don't look at ts->cl if not BT_CHARACTER.
-Index: gcc-4_2-branch/gcc/fortran/invoke.texi
-===================================================================
---- gcc-4_2-branch/gcc/fortran/invoke.texi (revision 123014)
-+++ gcc-4_2-branch/gcc/fortran/invoke.texi (revision 124164)
-@@ -128,9 +128,9 @@
- and Warnings}.
- @gccoptlist{-fmax-errors=@var{n} @gol
- -fsyntax-only -pedantic -pedantic-errors @gol
---w -Wall -Waliasing -Wampersand -Wconversion -Wimplicit-interface @gol
---Wtabs -Wnonstd-intrinsics -Wsurprising -Wunderflow @gol
---Wline-truncation -W}
-+-w -Wall -Waliasing -Wampersand -Wcharacter-truncation -Wconversion @gol
-+-Wimplicit-interface -Wline-truncation -Wnonstd-intrinsics -Wsurprising @gol
-+-Wno-tabs -Wunderflow -W}
-
- @item Debugging Options
- @xref{Debugging Options,,Options for Debugging Your Program or GCC}.
-@@ -138,11 +138,12 @@
-
- @item Directory Options
- @xref{Directory Options,,Options for Directory Search}.
--@gccoptlist{-I@var{dir} -M@var{dir}}
-+@gccoptlist{-I@var{dir} -J@var{dir} -M@var{dir}}
-
- @item Runtime Options
- @xref{Runtime Options,,Options for influencing runtime behavior}.
--@gccoptlist{-fconvert=@var{conversion} -frecord-marker=@var{length}}
-+@gccoptlist{-fconvert=@var{conversion} -frecord-marker=@var{length} @gol
-+-fmax-subrecord-length=@var{length}}
-
- @item Code Generation Options
- @xref{Code Gen Options,,Options for Code Generation Conventions}.
-@@ -198,7 +199,7 @@
- @command{gfortran} will ignore @option{-Wnonstd-intrinsics}.
-
- @item -fd-lines-as-code
--@item -fd-lines-as-comment
-+@item -fd-lines-as-comments
- @cindex @code{-fd-lines-as-code}, option
- @cindex option, @code{-fd-lines-as-code}
- @cindex @code{-fd-lines-as-comments}, option
-@@ -325,12 +326,19 @@
- @item -std=@var{std}
- @cindex @code{-std=}@var{std} option
- @cindex option, @code{-std=}@var{std}
--Conform to the specified standard. The default value for @var{std} is
--@samp{gnu}; a superset of the Fortran 95 standard which includes all
--of the GNU extensions recommended for use in new code. The @samp{legacy}
--value also includes obsolete extensions that may be required for old
--non-standard programs. Strict conformance to the Fortran 95 and Fortran 2003
--standards is specified by @samp{f95} and @samp{f2003}, respectively.
-+Specify the standard to which the program is expected to conform, which
-+may be one of @samp{f95}, @samp{f2003}, @samp{gnu}, or @samp{legacy}.
-+The default value for @var{std} is @samp{gnu}, which specifies a
-+superset of the Fortran 95 standard that includes all of the extensions
-+supported by GNU Fortran, although warnings will be given for obsolete
-+extensions not recommended for use in new code. The @samp{legacy} value
-+is equivalent but without the warnings for obsolete extensions, and may
-+be useful for old non-standard programs. The @samp{f95} and
-+@samp{f2003} values specify strict conformance to the Fortran 95 and
-+Fortran 2003 standards, respectively; errors are given for all
-+extensions beyond the relevant language standard, and warnings are given
-+for the Fortran 77 features that are permitted but obsolescent in later
-+standards.
-
- @end table
-
-@@ -420,7 +428,7 @@
- Enables commonly used warning options pertaining to usage that
- we recommend avoiding and that we believe are easy to avoid.
- This currently includes @option{-Waliasing},
--@option{-Wampersand}, @option{-Wsurprising}, @option{-Wnonstd-intrinsic},
-+@option{-Wampersand}, @option{-Wsurprising}, @option{-Wnonstd-intrinsics},
- @option{-Wno-tabs}, and @option{-Wline-truncation}.
-
- @item -Waliasing
-@@ -455,6 +463,11 @@
- constant, GNU Fortran assumes continuation at the first non-comment,
- non-whitespace character after the ampersand that initiated the continuation.
-
-+@item -Wcharacter-truncation
-+@cindex @code{-Wcharacter-truncation} option
-+@cindex option, @code{-Wcharacter-truncation}
-+Warn when a character assignment will truncate the assigned string.
-+
- @item -Wconversion
- @cindex @code{-Wconversion} option
- @cindex option, @code{-Wconversion}
-@@ -468,11 +481,11 @@
- Note this only checks that an explicit interface is present. It does not
- check that the declared interfaces are consistent across program units.
-
--@item -Wnonstd-intrinsic
--@cindex @code{-Wnonstd-intrinsic} option
--@cindex option, @code{-Wnonstd-intrinsic}
-+@item -Wnonstd-intrinsics
-+@cindex @code{-Wnonstd-intrinsics} option
-+@cindex option, @code{-Wnonstd-intrinsics}
- Warn if the user tries to use an intrinsic that does not belong to the
--standard the user has chosen via the -std option.
-+standard the user has chosen via the @option{-std} option.
-
- @item -Wsurprising
- @cindex @code{-Wsurprising} option
-@@ -608,9 +621,11 @@
- @item -M@var{dir}
- @item -J@var{dir}
- @cindex @code{-M}@var{dir} option
--@cindex option, -@code{-M}@var{dir}
-+@cindex option, @code{-M}@var{dir}
- @cindex @code{-J}@var{dir} option
--@cindex option, -@code{-J}@var{dir}
-+@cindex option, @code{-J}@var{dir}
-+@cindex paths, search
-+@cindex module search path
- This option specifies where to put @file{.mod} files for compiled modules.
- It is also added to the list of directories to searched by an @code{USE}
- statement.
-Index: gcc-4_2-branch/gcc/fortran/intrinsic.texi
-===================================================================
---- gcc-4_2-branch/gcc/fortran/intrinsic.texi (revision 123014)
-+++ gcc-4_2-branch/gcc/fortran/intrinsic.texi (revision 124164)
-@@ -7614,10 +7614,11 @@
- @cindex @code{RANDOM_NUMBER} intrinsic
- @cindex random numbers
+@@ -4784,11 +4798,13 @@
+ compute_points_to_sets (struct alias_info *ai)
+ {
+ basic_block bb;
++ struct scc_info *si;
--Intrinsic implemented, documentation pending.
--
- @table @asis
- @item @emph{Description}:
-+Returns a single pseudorandom number or an array of pseudorandom numbers
-+from the uniform distribution over the range @math{ 0 \leq x < 1}.
-+
- @item @emph{Standard}:
- F95 and later
-
-@@ -7625,9 +7626,31 @@
- Elemental subroutine
-
- @item @emph{Syntax}:
-+@code{RANDOM_NUMBER(HARVEST)}
-+
- @item @emph{Arguments}:
--@item @emph{Return value}:
-+@multitable @columnfractions .15 .70
-+@item @var{HARVEST} @tab Shall be a scalar or an array of type @code{REAL(*)}.
-+@end multitable
-+
- @item @emph{Example}:
-+@smallexample
-+program test_random_number
-+ REAL :: r(5,5)
-+ CALL init_random_seed() ! see example of RANDOM_SEED
-+ CALL RANDOM_NUMBER(r)
-+end program
-+@end smallexample
-+
-+@item @emph{Note}:
-+The implemented random number generator is thread safe if used within
-+OpenMP directives, i. e. its state will be consistent while called from
-+multiple threads. Please note that the currently implemented KISS generator
-+does not create random numbers in parallel from multiple sources, but in
-+sequence from a single source. If your OpenMP-enabled application heavily
-+relies on random numbers, you should consider employing a dedicated parallel
-+random number generator instead.
-+
- @item @emph{See also}:
- @ref{RANDOM_SEED}
- @end table
-@@ -7639,10 +7662,15 @@
- @cindex @code{RANDOM_SEED} intrinsic
- @cindex random numbers
-
--Intrinsic implemented, documentation pending.
--
- @table @asis
- @item @emph{Description}:
-+Restarts or queries the state of the pseudorandom number generator used by
-+@code{RANDOM_NUMBER}.
-+
-+If @code{RANDOM_SEED} is called without arguments, it is initialized to
-+a default state. The example below shows how to initialize the random
-+seed based on the system's time.
-+
- @item @emph{Standard}:
- F95 and later
-
-@@ -7650,9 +7678,41 @@
- Subroutine
-
- @item @emph{Syntax}:
-+@code{CALL RANDOM_SEED(SIZE, PUT, GET)}
-+
- @item @emph{Arguments}:
--@item @emph{Return value}:
-+@multitable @columnfractions .15 .70
-+@item @var{SIZE} @tab (Optional) Shall be a scalar and of type default
-+@code{INTEGER}, with @code{INTENT(OUT)}. It specifies the minimum size
-+of the arrays used with the @var{PUT} and @var{GET} arguments.
-+@item @var{PUT} @tab (Optional) Shall be an array of type default
-+@code{INTEGER} and rank one. It is @code{INTENT(IN)} and the size of
-+the array must be larger than or equal to the number returned by the
-+@var{SIZE} argument.
-+@item @var{GET} @tab (Optional) Shall be an array of type default
-+@code{INTEGER} and rank one. It is @code{INTENT(OUT)} and the size
-+of the array must be larger than or equal to the number returned by
-+the @var{SIZE} argument.
-+@end multitable
-+
- @item @emph{Example}:
-+@smallexample
-+SUBROUTINE init_random_seed()
-+ INTEGER :: i, n, clock
-+ INTEGER, DIMENSION(:), ALLOCATABLE :: seed
-+
-+ CALL RANDOM_SEED(size = n)
-+ ALLOCATE(seed(n))
-+
-+ CALL SYSTEM_CLOCK(COUNT=clock)
-+
-+ seed = clock + 37 * (/ (i - 1, i = 1, n) /)
-+ CALL RANDOM_SEED(PUT = seed)
-+
-+ DEALLOCATE(seed)
-+END SUBROUTINE
-+@end smallexample
-+
- @item @emph{See also}:
- @ref{RANDOM_NUMBER}
- @end table
-Index: gcc-4_2-branch/gcc/c.opt
-===================================================================
---- gcc-4_2-branch/gcc/c.opt (revision 123014)
-+++ gcc-4_2-branch/gcc/c.opt (revision 124164)
-@@ -133,7 +133,7 @@
- Warn about casting functions to incompatible types
+ timevar_push (TV_TREE_PTA);
- Wc++-compat
--C Var(warn_cxx_compat)
-+C ObjC Var(warn_cxx_compat)
- Warn about C constructs that are not in the common subset of C and C++
+ init_alias_vars ();
+-
++ init_alias_heapvars ();
++
+ intra_create_variable_infos ();
+ /* Now walk all statements and derive aliases. */
+@@ -4824,36 +4840,42 @@
+ }
+ }
-@@ -170,7 +170,7 @@
- Warn about deprecated compiler features
+- build_constraint_graph ();
- Wdiv-by-zero
--C ObjC C++ Var(warn_div_by_zero) Init(1)
-+C ObjC C++ ObjC++ Var(warn_div_by_zero) Init(1)
- Warn about compile-time integer division by zero
+ if (dump_file)
+ {
+ fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n");
+ dump_constraints (dump_file);
+ }
+-
++
+ if (dump_file)
+ fprintf (dump_file,
+ "\nCollapsing static cycles and doing variable "
+ "substitution:\n");
+-
+- find_and_collapse_graph_cycles (graph, false);
+- perform_var_substitution (graph);
+-
++
++ build_pred_graph ();
++ si = perform_var_substitution (graph);
++ move_complex_constraints (graph, si);
++ free_var_substitution_info (si);
++
++ build_succ_graph ();
++ find_indirect_cycles (graph);
++
++ /* Implicit nodes and predecessors are no longer necessary at this
++ point. */
++ remove_preds_and_fake_succs (graph);
++
+ if (dump_file)
+ fprintf (dump_file, "\nSolving graph:\n");
+-
++
+ solve_graph (graph);
+-
++
+ if (dump_file)
+ dump_sa_points_to_info (dump_file);
+-
+ have_alias_info = true;
+
+ timevar_pop (TV_TREE_PTA);
+ }
- Weffc++
-@@ -532,7 +532,7 @@
- Generate code for GNU runtime environment
+-
+ /* Delete created points-to sets. */
- fgnu89-inline
--C Var(flag_gnu89_inline) Init(-1)
-+C ObjC Var(flag_gnu89_inline) Init(-1)
- Use traditional GNU semantics for inline functions
+ void
+@@ -4861,33 +4883,27 @@
+ {
+ varinfo_t v;
+ int i;
+-
+- htab_delete (id_for_tree);
+- bitmap_obstack_release (&ptabitmap_obstack);
+- bitmap_obstack_release (&predbitmap_obstack);
++
++ if (dump_file && (dump_flags & TDF_STATS))
++ fprintf (dump_file, "Points to sets created:%d\n",
++ stats.points_to_sets_created);
++
++ pointer_map_destroy (vi_for_tree);
++ bitmap_obstack_release (&pta_obstack);
+ VEC_free (constraint_t, heap, constraints);
+-
++
+ for (i = 0; VEC_iterate (varinfo_t, varmap, i, v); i++)
+- {
+- /* Nonlocal vars may add more varinfos. */
+- if (i >= graph_size)
+- break;
++ VEC_free (constraint_t, heap, graph->complex[i]);
++ free (graph->complex);
+
+- VEC_free (constraint_edge_t, heap, graph->succs[i]);
+- VEC_free (constraint_edge_t, heap, graph->preds[i]);
+- VEC_free (constraint_t, heap, v->complex);
+- }
+- free (graph->zero_weight_preds);
+- free (graph->zero_weight_succs);
++ free (graph->rep);
+ free (graph->succs);
+- free (graph->preds);
++ free (graph->indirect_cycles);
+ free (graph);
+
+ VEC_free (varinfo_t, heap, varmap);
+ free_alloc_pool (variable_info_pool);
+- free_alloc_pool (constraint_pool);
+- free_alloc_pool (constraint_edge_pool);
+-
++ free_alloc_pool (constraint_pool);
+ have_alias_info = false;
+ }
- fguiding-decls
-@@ -565,7 +565,7 @@
- Emit implicit instantiations of templates
+@@ -4905,6 +4921,7 @@
+ static unsigned int
+ ipa_pta_execute (void)
+ {
++#if 0
+ struct cgraph_node *node;
+ in_ipa_mode = 1;
+ init_alias_heapvars ();
+@@ -4994,6 +5011,7 @@
+ in_ipa_mode = 0;
+ delete_alias_heapvars ();
+ delete_points_to_sets ();
++#endif
+ return 0;
+ }
+
+@@ -5018,8 +5036,9 @@
+ void
+ init_alias_heapvars (void)
+ {
+- heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq,
+- NULL);
++ if (!heapvar_for_stmt)
++ heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq,
++ NULL);
+ nonlocal_all = NULL_TREE;
+ }
- ffriend-injection
--C++ Var(flag_friend_injection)
-+C++ ObjC++ Var(flag_friend_injection)
- Inject friend functions into enclosing namespace
+@@ -5028,7 +5047,7 @@
+ {
+ nonlocal_all = NULL_TREE;
+ htab_delete (heapvar_for_stmt);
++ heapvar_for_stmt = NULL;
+ }
+-
+
+ #include "gt-tree-ssa-structalias.h"
+Index: gcc/config/i386/i386.md
+===================================================================
+--- gcc/config/i386/i386.md (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/i386/i386.md (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -4749,7 +4749,7 @@
+ (define_insn "*addti3_1"
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
+ (plus:TI (match_operand:TI 1 "nonimmediate_operand" "%0,0")
+- (match_operand:TI 2 "general_operand" "roiF,riF")))
++ (match_operand:TI 2 "x86_64_general_operand" "roe,re")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && ix86_binary_operator_ok (PLUS, TImode, operands)"
+ "#")
+@@ -4757,7 +4757,7 @@
+ (define_split
+ [(set (match_operand:TI 0 "nonimmediate_operand" "")
+ (plus:TI (match_operand:TI 1 "nonimmediate_operand" "")
+- (match_operand:TI 2 "general_operand" "")))
++ (match_operand:TI 2 "x86_64_general_operand" "")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && reload_completed"
+ [(parallel [(set (reg:CC FLAGS_REG) (unspec:CC [(match_dup 1) (match_dup 2)]
+@@ -6483,7 +6483,7 @@
+ (define_insn "*subti3_1"
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=r,o")
+ (minus:TI (match_operand:TI 1 "nonimmediate_operand" "0,0")
+- (match_operand:TI 2 "general_operand" "roiF,riF")))
++ (match_operand:TI 2 "x86_64_general_operand" "roe,re")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && ix86_binary_operator_ok (MINUS, TImode, operands)"
+ "#")
+@@ -6491,7 +6491,7 @@
+ (define_split
+ [(set (match_operand:TI 0 "nonimmediate_operand" "")
+ (minus:TI (match_operand:TI 1 "nonimmediate_operand" "")
+- (match_operand:TI 2 "general_operand" "")))
++ (match_operand:TI 2 "x86_64_general_operand" "")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && reload_completed"
+ [(parallel [(set (reg:CC FLAGS_REG) (compare:CC (match_dup 1) (match_dup 2)))
+@@ -9326,7 +9326,7 @@
+
+ (define_insn "*negti2_1"
+ [(set (match_operand:TI 0 "nonimmediate_operand" "=ro")
+- (neg:TI (match_operand:TI 1 "general_operand" "0")))
++ (neg:TI (match_operand:TI 1 "nonimmediate_operand" "0")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT
+ && ix86_unary_operator_ok (NEG, TImode, operands)"
+@@ -9334,7 +9334,7 @@
+
+ (define_split
+ [(set (match_operand:TI 0 "nonimmediate_operand" "")
+- (neg:TI (match_operand:TI 1 "general_operand" "")))
++ (neg:TI (match_operand:TI 1 "nonimmediate_operand" "")))
+ (clobber (reg:CC FLAGS_REG))]
+ "TARGET_64BIT && reload_completed"
+ [(parallel
+Index: gcc/config/i386/sse.md
+===================================================================
+--- gcc/config/i386/sse.md (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/i386/sse.md (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -2055,11 +2055,11 @@
+ (match_dup 1))
+ (parallel [(const_int 0)
+ (const_int 2)])))]
+- "TARGET_SSE3 && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
++ "TARGET_SSE3 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+ "@
+ movddup\t{%1, %0|%0, %1}
+ #"
+- [(set_attr "type" "sselog,ssemov")
++ [(set_attr "type" "sselog1,ssemov")
+ (set_attr "mode" "V2DF")])
- flabels-ok
-Index: gcc-4_2-branch/gcc/c-typeck.c
-===================================================================
---- gcc-4_2-branch/gcc/c-typeck.c (revision 123014)
-+++ gcc-4_2-branch/gcc/c-typeck.c (revision 124164)
-@@ -3940,10 +3940,16 @@
- || coder == BOOLEAN_TYPE))
- return convert_and_check (type, rhs);
-
-+ /* Aggregates in different TUs might need conversion. */
-+ if ((codel == RECORD_TYPE || codel == UNION_TYPE)
-+ && codel == coder
-+ && comptypes (type, rhstype))
-+ return convert_and_check (type, rhs);
-+
- /* Conversion to a transparent union from its member types.
- This applies only to function arguments. */
-- else if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type)
-- && (errtype == ic_argpass || errtype == ic_argpass_nonproto))
-+ if (codel == UNION_TYPE && TYPE_TRANSPARENT_UNION (type)
-+ && (errtype == ic_argpass || errtype == ic_argpass_nonproto))
+ (define_split
+@@ -3494,9 +3494,10 @@
+ "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+ "@
+ movhps\t{%1, %0|%0, %1}
+- psrldq\t{$4, %0|%0, 4}
++ psrldq\t{$8, %0|%0, 8}
+ movq\t{%H1, %0|%0, %H1}"
+ [(set_attr "type" "ssemov,sseishft,ssemov")
++ (set_attr "memory" "*,none,*")
+ (set_attr "mode" "V2SF,TI,TI")])
+
+ ;; Not sure this is ever used, but it doesn't hurt to have it. -aoliva
+Index: gcc/config/i386/i386.c
+===================================================================
+--- gcc/config/i386/i386.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/i386/i386.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -15539,13 +15539,13 @@
+ /* Access to the vec_extract patterns. */
+ ftype = build_function_type_list (double_type_node, V2DF_type_node,
+ integer_type_node, NULL_TREE);
+- def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v2df",
++ def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v2df",
+ ftype, IX86_BUILTIN_VEC_EXT_V2DF);
+
+ ftype = build_function_type_list (long_long_integer_type_node,
+ V2DI_type_node, integer_type_node,
+ NULL_TREE);
+- def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v2di",
++ def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v2di",
+ ftype, IX86_BUILTIN_VEC_EXT_V2DI);
+
+ ftype = build_function_type_list (float_type_node, V4SF_type_node,
+@@ -15555,12 +15555,12 @@
+
+ ftype = build_function_type_list (intSI_type_node, V4SI_type_node,
+ integer_type_node, NULL_TREE);
+- def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v4si",
++ def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v4si",
+ ftype, IX86_BUILTIN_VEC_EXT_V4SI);
+
+ ftype = build_function_type_list (intHI_type_node, V8HI_type_node,
+ integer_type_node, NULL_TREE);
+- def_builtin (MASK_SSE, "__builtin_ia32_vec_ext_v8hi",
++ def_builtin (MASK_SSE2, "__builtin_ia32_vec_ext_v8hi",
+ ftype, IX86_BUILTIN_VEC_EXT_V8HI);
+
+ ftype = build_function_type_list (intHI_type_node, V4HI_type_node,
+@@ -15577,7 +15577,7 @@
+ ftype = build_function_type_list (V8HI_type_node, V8HI_type_node,
+ intHI_type_node,
+ integer_type_node, NULL_TREE);
+- def_builtin (MASK_SSE, "__builtin_ia32_vec_set_v8hi",
++ def_builtin (MASK_SSE2, "__builtin_ia32_vec_set_v8hi",
+ ftype, IX86_BUILTIN_VEC_SET_V8HI);
+
+ ftype = build_function_type_list (V4HI_type_node, V4HI_type_node,
+Index: gcc/config/sh/sh.c
+===================================================================
+--- gcc/config/sh/sh.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/sh/sh.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -5295,7 +5295,13 @@
+ temp = scavenge_reg (&temps);
+ }
+ if (temp < 0 && live_regs_mask)
+- temp = scavenge_reg (live_regs_mask);
++ {
++ HARD_REG_SET temps;
++
++ COPY_HARD_REG_SET (temps, *live_regs_mask);
++ CLEAR_HARD_REG_BIT (temps, REGNO (reg));
++ temp = scavenge_reg (&temps);
++ }
+ if (temp < 0)
+ {
+ rtx adj_reg, tmp_reg, mem;
+@@ -5344,6 +5350,9 @@
+ emit_move_insn (adj_reg, mem);
+ mem = gen_tmp_stack_mem (Pmode, gen_rtx_POST_INC (Pmode, reg));
+ emit_move_insn (tmp_reg, mem);
++ /* Tell flow the insns that pop r4/r5 aren't dead. */
++ emit_insn (gen_rtx_USE (VOIDmode, tmp_reg));
++ emit_insn (gen_rtx_USE (VOIDmode, adj_reg));
+ return;
+ }
+ const_reg = gen_rtx_REG (GET_MODE (reg), temp);
+@@ -8618,7 +8627,7 @@
+ else if (TARGET_SH4
+ && get_attr_type (insn) == TYPE_DYN_SHIFT
+ && get_attr_any_int_load (dep_insn) == ANY_INT_LOAD_YES
+- && reg_overlap_mentioned_p (SET_DEST (PATTERN (dep_insn)),
++ && reg_overlap_mentioned_p (SET_DEST (single_set (dep_insn)),
+ XEXP (SET_SRC (single_set (insn)),
+ 1)))
+ cost++;
+Index: gcc/config/sh/sh.md
+===================================================================
+--- gcc/config/sh/sh.md (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/sh/sh.md (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -413,10 +413,12 @@
+ (eq_attr "type" "jump")
+ (cond [(eq_attr "med_branch_p" "yes")
+ (const_int 2)
+- (and (eq (symbol_ref "GET_CODE (prev_nonnote_insn (insn))")
+- (symbol_ref "INSN"))
+- (eq (symbol_ref "INSN_CODE (prev_nonnote_insn (insn))")
+- (symbol_ref "code_for_indirect_jump_scratch")))
++ (and (ne (symbol_ref "prev_nonnote_insn (insn)")
++ (const_int 0))
++ (and (eq (symbol_ref "GET_CODE (prev_nonnote_insn (insn))")
++ (symbol_ref "INSN"))
++ (eq (symbol_ref "INSN_CODE (prev_nonnote_insn (insn))")
++ (symbol_ref "code_for_indirect_jump_scratch"))))
+ (cond [(eq_attr "braf_branch_p" "yes")
+ (const_int 6)
+ (eq (symbol_ref "flag_pic") (const_int 0))
+@@ -750,54 +752,6 @@
+ (set_attr "type" "arith3")])
+
+ (define_insn "cmpeqsi_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (eq:DI (match_operand:SI 1 "logical_operand" "%r")
+- (match_operand:SI 2 "cmp_operand" "Nr")))]
+- "TARGET_SHMEDIA"
+- "cmpeq %1, %N2, %0"
+- [(set_attr "type" "cmp_media")])
+-
+-(define_insn "cmpeqdi_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (eq:DI (match_operand:DI 1 "register_operand" "%r")
+- (match_operand:DI 2 "cmp_operand" "Nr")))]
+- "TARGET_SHMEDIA"
+- "cmpeq %1, %N2, %0"
+- [(set_attr "type" "cmp_media")])
+-
+-(define_insn "cmpgtsi_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (gt:DI (match_operand:SI 1 "cmp_operand" "Nr")
+- (match_operand:SI 2 "cmp_operand" "rN")))]
+- "TARGET_SHMEDIA"
+- "cmpgt %N1, %N2, %0"
+- [(set_attr "type" "cmp_media")])
+-
+-(define_insn "cmpgtdi_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (gt:DI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr")
+- (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))]
+- "TARGET_SHMEDIA"
+- "cmpgt %N1, %N2, %0"
+- [(set_attr "type" "cmp_media")])
+-
+-(define_insn "cmpgtusi_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (gtu:DI (match_operand:SI 1 "cmp_operand" "Nr")
+- (match_operand:SI 2 "cmp_operand" "rN")))]
+- "TARGET_SHMEDIA"
+- "cmpgtu %N1, %N2, %0"
+- [(set_attr "type" "cmp_media")])
+-
+-(define_insn "cmpgtudi_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (gtu:DI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr")
+- (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))]
+- "TARGET_SHMEDIA"
+- "cmpgtu %N1, %N2, %0"
+- [(set_attr "type" "cmp_media")])
+-
+-(define_insn "cmpsieqsi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (eq:SI (match_operand:SI 1 "logical_operand" "%r")
+ (match_operand:SI 2 "cmp_operand" "Nr")))]
+@@ -805,7 +759,7 @@
+ "cmpeq %1, %N2, %0"
+ [(set_attr "type" "cmp_media")])
+
+-(define_insn "cmpsieqdi_media"
++(define_insn "cmpeqdi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (eq:SI (match_operand:DI 1 "register_operand" "%r")
+ (match_operand:DI 2 "cmp_operand" "Nr")))]
+@@ -813,7 +767,7 @@
+ "cmpeq %1, %N2, %0"
+ [(set_attr "type" "cmp_media")])
+
+-(define_insn "cmpsigtsi_media"
++(define_insn "cmpgtsi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (gt:SI (match_operand:SI 1 "cmp_operand" "Nr")
+ (match_operand:SI 2 "cmp_operand" "rN")))]
+@@ -821,7 +775,7 @@
+ "cmpgt %N1, %N2, %0"
+ [(set_attr "type" "cmp_media")])
+
+-(define_insn "cmpsigtdi_media"
++(define_insn "cmpgtdi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (gt:SI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr")
+ (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))]
+@@ -829,7 +783,7 @@
+ "cmpgt %N1, %N2, %0"
+ [(set_attr "type" "cmp_media")])
+
+-(define_insn "cmpsigtusi_media"
++(define_insn "cmpgtusi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (gtu:SI (match_operand:SI 1 "cmp_operand" "Nr")
+ (match_operand:SI 2 "cmp_operand" "rN")))]
+@@ -837,7 +791,7 @@
+ "cmpgtu %N1, %N2, %0"
+ [(set_attr "type" "cmp_media")])
+
+-(define_insn "cmpsigtudi_media"
++(define_insn "cmpgtudi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (gtu:SI (match_operand:DI 1 "arith_reg_or_0_operand" "Nr")
+ (match_operand:DI 2 "arith_reg_or_0_operand" "rN")))]
+@@ -846,13 +800,6 @@
+ [(set_attr "type" "cmp_media")])
+
+ ; These two patterns are for combine.
+-(define_insn "*cmpne0si_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (ne:DI (match_operand:SI 1 "arith_reg_operand" "r") (const_int 0)))]
+- "TARGET_SHMEDIA"
+- "cmpgtu %1,r63,%0"
+- [(set_attr "type" "cmp_media")])
+-
+ (define_insn "*cmpne0sisi_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (ne:SI (match_operand:SI 1 "arith_reg_operand" "r") (const_int 0)))]
+@@ -1177,7 +1124,7 @@
+ {
+ emit_insn (gen_movsicc_false (operands[0], operands[1], operands[2],
+ operands[3]));
+- emit_insn (gen_cmpsigtusi_media (operands[5], operands[4], operands[0]));
++ emit_insn (gen_cmpgtusi_media (operands[5], operands[4], operands[0]));
+ emit_insn (gen_movsicc_false (operands[0], operands[5], operands[4],
+ operands[0]));
+ DONE;
+@@ -7200,7 +7147,7 @@
+ }")
+
+ (define_expand "bunordered"
+- [(set (match_dup 1) (unordered:DI (match_dup 2) (match_dup 3)))
++ [(set (match_dup 1) (unordered:SI (match_dup 2) (match_dup 3)))
+ (set (pc)
+ (if_then_else (ne (match_dup 1) (const_int 0))
+ (match_operand 0 "" "")
+@@ -7209,7 +7156,7 @@
+ "
+ {
+ operands[0] = gen_rtx_LABEL_REF (Pmode, operands[0]);
+- operands[1] = gen_reg_rtx (DImode);
++ operands[1] = gen_reg_rtx (SImode);
+ operands[2] = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ operands[3] = force_reg (GET_MODE (sh_compare_op1), sh_compare_op1);
+ }")
+@@ -9112,6 +9059,8 @@
+ {
+ if (TARGET_SHMEDIA)
{
- tree memb, marginal_memb = NULL_TREE;
++ rtx reg;
++
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9126,26 +9075,26 @@
+ switch (GET_MODE (sh_compare_op0))
+ {
+ case SImode:
+- emit_insn (gen_cmpsieqsi_media (operands[0],
++ emit_insn (gen_cmpeqsi_media (operands[0],
+ sh_compare_op0, sh_compare_op1));
+ break;
+
+ case DImode:
+- emit_insn (gen_cmpsieqdi_media (operands[0],
++ emit_insn (gen_cmpeqdi_media (operands[0],
+ sh_compare_op0, sh_compare_op1));
+ break;
+
+ case SFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpsieqsf_media (operands[0],
++ emit_insn (gen_cmpeqsf_media (operands[0],
+ sh_compare_op0, sh_compare_op1));
+ break;
+
+ case DFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpsieqdf_media (operands[0],
++ emit_insn (gen_cmpeqdf_media (operands[0],
+ sh_compare_op0, sh_compare_op1));
+ break;
+
+@@ -9155,38 +9104,44 @@
+ DONE;
+ }
-Index: gcc-4_2-branch/gcc/expmed.c
-===================================================================
---- gcc-4_2-branch/gcc/expmed.c (revision 123014)
-+++ gcc-4_2-branch/gcc/expmed.c (revision 124164)
-@@ -4976,17 +4976,17 @@
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
- case CONST_VECTOR:
- {
-- int i, units;
-- rtx elt;
-+ int units = CONST_VECTOR_NUNITS (x);
-+ tree itype = TREE_TYPE (type);
- tree t = NULL_TREE;
-+ int i;
+ switch (GET_MODE (sh_compare_op0))
+ {
+ case SImode:
+- emit_insn (gen_cmpeqsi_media (operands[0],
++ emit_insn (gen_cmpeqsi_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
-- units = CONST_VECTOR_NUNITS (x);
+ case DImode:
+- emit_insn (gen_cmpeqdi_media (operands[0],
++ emit_insn (gen_cmpeqdi_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
- /* Build a tree with vector elements. */
- for (i = units - 1; i >= 0; --i)
- {
-- elt = CONST_VECTOR_ELT (x, i);
-- t = tree_cons (NULL_TREE, make_tree (type, elt), t);
-+ rtx elt = CONST_VECTOR_ELT (x, i);
-+ t = tree_cons (NULL_TREE, make_tree (itype, elt), t);
- }
+ case SFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpeqsf_media (operands[0],
++ emit_insn (gen_cmpeqsf_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
- return build_vector (type, t);
-Index: gcc-4_2-branch/gcc/po/ChangeLog
-===================================================================
---- gcc-4_2-branch/gcc/po/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/gcc/po/ChangeLog (revision 124164)
-@@ -1,3 +1,7 @@
-+2007-04-21 Joseph S. Myers <joseph@codesourcery.com>
+ case DFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpeqdf_media (operands[0],
++ emit_insn (gen_cmpeqdf_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
+
+ default:
+ FAIL;
+ }
+
-+ * sv.po: Update.
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
+
- 2007-03-08 Joseph S. Myers <joseph@codesourcery.com>
+ DONE;
+ }
+ if (sh_expand_t_scc (EQ, operands[0]))
+@@ -9204,8 +9159,8 @@
+ {
+ if (TARGET_SHMEDIA)
+ {
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ rtx reg;
++
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9213,35 +9168,44 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
++
+ switch (GET_MODE (sh_compare_op0))
+ {
+ case SImode:
+- emit_insn (gen_cmpgtsi_media (operands[0],
++ emit_insn (gen_cmpgtsi_media (reg,
+ sh_compare_op1, sh_compare_op0));
+ break;
- * sr.po: New.
-Index: gcc-4_2-branch/gcc/po/sv.po
-===================================================================
---- gcc-4_2-branch/gcc/po/sv.po (revision 123014)
-+++ gcc-4_2-branch/gcc/po/sv.po (revision 124164)
-@@ -1,7 +1,7 @@
- # Swedish messages for GCC.
--# Copyright © 2000, 2005, 2006 Free Software Foundation, Inc.
-+# Copyright © 2000, 2005, 2006, 2007 Free Software Foundation, Inc.
- # Dennis Björklund <db@zigo.dhs.org>, 2000, 2001, 2002.
--# Göran Uddeborg <goeran@uddeborg.se>, 2005, 2006.
-+# Göran Uddeborg <goeran@uddeborg.se>, 2005, 2006, 2007.
- #
- # Remember: GCC team does not want RCS keywords in the header!
- #
-@@ -10,7 +10,7 @@
- "Project-Id-Version: gcc 4.1.1\n"
- "Report-Msgid-Bugs-To: http://gcc.gnu.org/bugs.html\n"
- "POT-Creation-Date: 2006-05-24 16:19-0700\n"
--"PO-Revision-Date: 2006-12-13 22:05+0100\n"
-+"PO-Revision-Date: 2007-04-03 09:58+0200\n"
- "Last-Translator: Göran Uddeborg <goeran@uddeborg.se>\n"
- "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
- "MIME-Version: 1.0\n"
-@@ -364,7 +364,7 @@
-
- #: c-typeck.c:5209
- msgid "braces around scalar initializer"
--msgstr "klamrar funt skalär initierare"
-+msgstr "klamrar runt skalär initierare"
-
- #: c-typeck.c:5266
- msgid "initialization of flexible array member in a nested context"
-@@ -9266,19 +9266,19 @@
-
- #: java/lang.opt:66
- msgid "Warn if a deprecated compiler feature, class, method, or field is used"
--msgstr "Varna om en kompilatorfunktion, klass, metod eller fält som avrådes ifrån används"
-+msgstr "Varna för en kompilatorfunktion, klass, metod eller fält som bör undvikas används"
-
- #: java/lang.opt:70
- msgid "Warn if deprecated empty statements are found"
--msgstr "Varna om föråldrade tomma satser finns"
-+msgstr "Varna för tomma satser som bör undvikas finns"
-
- #: java/lang.opt:74
- msgid "Warn if .class files are out of date"
--msgstr "Varna om .class-filer är inaktuella"
-+msgstr "Varna för .class-filer är inaktuella"
-
- #: java/lang.opt:78
- msgid "Warn if modifiers are specified when not necessary"
--msgstr "Varna om modifierare anges när de inte behövs"
-+msgstr "Varna för modifierare anges när de inte behövs"
-
- #: java/lang.opt:82
- msgid "Deprecated; use --classpath instead"
-@@ -9370,23 +9370,23 @@
-
- #: fortran/lang.opt:42
- msgid "Warn about possible aliasing of dummy arguments"
--msgstr "Varna om eventuell aliasning av atrappargument"
-+msgstr "Varna för eventuell aliasning av atrappargument"
-
- #: fortran/lang.opt:46
- msgid "Warn about missing ampersand in continued character literals"
--msgstr "Varna om saknade ampersander i fortsatta teckenliteraler"
-+msgstr "Varna för saknade ampersander i fortsatta teckenliteraler"
-
- #: fortran/lang.opt:50
- msgid "Warn about implicit conversion"
--msgstr "Varna om implicita konverteringar"
-+msgstr "Varna för implicita konverteringar"
-
- #: fortran/lang.opt:54
- msgid "Warn about calls with implicit interface"
--msgstr "Varna om anrop med implicit gränssnitt"
-+msgstr "Varna för anrop med implicit gränssnitt"
-
- #: fortran/lang.opt:58
- msgid "Warn about truncated source lines"
--msgstr "Varna om avhuggna källkodsrader"
-+msgstr "Varna för avhuggna källkodsrader"
-
- #: fortran/lang.opt:62
- msgid "Warn about usage of non-standard intrinsics"
-@@ -9394,11 +9394,11 @@
-
- #: fortran/lang.opt:66
- msgid "Warn about \"suspicious\" constructs"
--msgstr "Varna om \"misstänkta\" konstruktioner"
-+msgstr "Varna för \"misstänkta\" konstruktioner"
-
- #: fortran/lang.opt:70
- msgid "Warn about underflow of numerical constant expressions"
--msgstr "Varna om underspill i numeriska konstantuttryck"
-+msgstr "Varna för underspill i numeriska konstantuttryck"
-
- #: fortran/lang.opt:74 common.opt:162
- msgid "Warn when a label is unused"
-@@ -9936,11 +9936,11 @@
-
- #: config/s390/s390.opt:92
- msgid "Warn if a function uses alloca or creates an array with dynamic size"
--msgstr "Varna om en funktion använder alloca eller skapar en vektor med dynamisk storlek"
-+msgstr "Varna för en funktion använder alloca eller skapar en vektor med dynamisk storlek"
-
- #: config/s390/s390.opt:96
- msgid "Warn if a single function's framesize exceeds the given framesize"
--msgstr "Varna om en enskild funktions ramstorlek överskrider den angivna ramstorleken"
-+msgstr "Varna för en enskild funktions ramstorlek överskrider den angivna ramstorleken"
-
- #: config/s390/s390.opt:100
- msgid "z/Architecture"
-@@ -10690,7 +10690,7 @@
-
- #: config/rs6000/rs6000.opt:215
- msgid "Warn about deprecated 'vector long ...' AltiVec type usage"
--msgstr "Varna för användning av AltiVec-typen \"vector long ...\" som avrådes från"
-+msgstr "Varna för användning av AltiVec-typen \"vector long ...\" som bör undvikas"
-
- #: config/rs6000/rs6000.opt:219
- msgid "Select GPR floating point method"
-@@ -12214,7 +12214,7 @@
-
- #: c.opt:117
- msgid "Warn about things that will change when compiling with an ABI-compliant compiler"
--msgstr "Varna om saker som skulle ändras vid kompilering med en kompilator som följer ABI"
-+msgstr "Varna för saker som skulle ändras vid kompilering med en kompilator som följer ABI"
-
- #: c.opt:121
- msgid "Enable most warning messages"
-@@ -12226,23 +12226,23 @@
-
- #: c.opt:129
- msgid "Warn about casting functions to incompatible types"
--msgstr "Varna om typkonvertering av funktioner till inkompatibla typer"
-+msgstr "Varna för typkonvertering av funktioner till inkompatibla typer"
-
- #: c.opt:133
- msgid "Warn about C constructs that are not in the common subset of C and C++"
--msgstr "Varna om C-konstruktioner som inte är i den gemensamma delmängden av C och C++"
-+msgstr "Varna för C-konstruktioner som inte är i den gemensamma delmängden av C och C++"
-
- #: c.opt:138
- msgid "Warn about casts which discard qualifiers"
--msgstr "Varna om typkonvertering som slänger kvalificerare"
-+msgstr "Varna för typkonvertering som slänger kvalificerare"
-
- #: c.opt:142
- msgid "Warn about subscripts whose type is \"char\""
--msgstr "Varna om index vars typ är \"char\""
-+msgstr "Varna för index vars typ är \"char\""
-
- #: c.opt:146
- msgid "Warn about possibly nested block comments, and C++ comments spanning more than one physical line"
--msgstr "Varna om möjliga nästade blockkommentarer, och C++-kommentarer som spänner över mer än en fysisk rad"
-+msgstr "Varna för möjliga nästade blockkommentarer, och C++-kommentarer som spänner över mer än en fysisk rad"
-
- #: c.opt:150
- msgid "Synonym for -Wcomment"
-@@ -12250,7 +12250,7 @@
-
- #: c.opt:154
- msgid "Warn about possibly confusing type conversions"
--msgstr "Varna om eventuellt förvirrande typkonverteringar"
-+msgstr "Varna för eventuellt förvirrande typkonverteringar"
-
- #: c.opt:158
- msgid "Warn when all constructors and destructors are private"
-@@ -12262,19 +12262,19 @@
-
- #: c.opt:166
- msgid "Warn about deprecated compiler features"
--msgstr "Varna om kompilatorfunktioner som undanbedes"
-+msgstr "Varna för kompilatorfunktioner bör undvikas"
-
- #: c.opt:170
- msgid "Warn about compile-time integer division by zero"
--msgstr "Varna om heltalsdivision med noll vid kompileringstillfället"
-+msgstr "Varna för heltalsdivision med noll vid kompileringstillfället"
-
- #: c.opt:174
- msgid "Warn about violations of Effective C++ style rules"
--msgstr "Varna om brott mot Effective C++ stilregler"
-+msgstr "Varna för brott mot stilreglerna i Effective C++"
-
- #: c.opt:178
- msgid "Warn about stray tokens after #elif and #endif"
--msgstr "Varna om vilsekomna symboler efter #elif och #endif"
-+msgstr "Varna för vilsekomna symboler efter #elif och #endif"
-
- #: c.opt:186
- msgid "Make implicit function declarations an error"
-@@ -12286,35 +12286,35 @@
-
- #: c.opt:194
- msgid "Warn about printf/scanf/strftime/strfmon format string anomalies"
--msgstr "Varna om anomalier i formatsträngar till printf/scanf/strftime/strfmon"
-+msgstr "Varna för anomalier i formatsträngar till printf/scanf/strftime/strfmon"
-
- #: c.opt:198
- msgid "Warn if passing too many arguments to a function for its format string"
--msgstr "Varna om för många argument argument till en funktion för dess formatsträng"
-+msgstr "Varna för för många argument argument till en funktion för dess formatsträng"
-
- #: c.opt:202
- msgid "Warn about format strings that are not literals"
--msgstr "Varna om formatsträngar som inte är literaler"
-+msgstr "Varna för formatsträngar som inte är literaler"
-
- #: c.opt:206
- msgid "Warn about possible security problems with format functions"
--msgstr "Varna om möjliga säkerhetsproblem med formatfunktioner"
-+msgstr "Varna för möjliga säkerhetsproblem med formatfunktioner"
-
- #: c.opt:210
- msgid "Warn about strftime formats yielding 2-digit years"
--msgstr "Varna om format till strftime som ger 2-siffrigt årtal"
-+msgstr "Varna för format till strftime som ger 2-siffrigt årtal"
-
- #: c.opt:214
- msgid "Warn about zero-length formats"
--msgstr "Varna om format med längden noll"
-+msgstr "Varna för format med längden noll"
-
- #: c.opt:221
- msgid "Warn about variables which are initialized to themselves"
--msgstr "Varna om variabler som intieras till sig själva"
-+msgstr "Varna för variabler som intieras till sig själva"
-
- #: c.opt:228
- msgid "Warn about implicit function declarations"
--msgstr "Varna om implicita funktionsdeklarationer"
-+msgstr "Varna för implicita funktionsdeklarationer"
-
- #: c.opt:232
- msgid "Warn when a declaration does not specify a type"
-@@ -12326,15 +12326,15 @@
-
- #: c.opt:240
- msgid "Warn when there is a cast to a pointer from an integer of a different size"
--msgstr "Varna om typkonverteringar till pekare från ett heltal med annan storlek"
-+msgstr "Varna för typkonverteringar till pekare från ett heltal med annan storlek"
-
- #: c.opt:244
- msgid "Warn about invalid uses of the \"offsetof\" macro"
--msgstr "Varna om ogiltiga användningar av makrot \"offsetof\""
-+msgstr "Varna för ogiltiga användningar av makrot \"offsetof\""
-
- #: c.opt:248
- msgid "Warn about PCH files that are found but not used"
--msgstr "Varna om PCH-filer som hittas men inte används"
-+msgstr "Varna för PCH-filer som hittas men inte används"
-
- #: c.opt:252
- msgid "Do not warn about using \"long long\" when -pedantic"
-@@ -12342,31 +12342,31 @@
-
- #: c.opt:256
- msgid "Warn about suspicious declarations of \"main\""
--msgstr "Varna om tveksamma deklarationer av \"main\""
-+msgstr "Varna för tveksamma deklarationer av \"main\""
-
- #: c.opt:260
- msgid "Warn about possibly missing braces around initializers"
--msgstr "Varna om eventuellt saknade klamrar runt initierare"
-+msgstr "Varna för eventuellt saknade klamrar runt initierare"
-
- #: c.opt:264
- msgid "Warn about global functions without previous declarations"
--msgstr "Varna om globala globala funktioner utan tidigare deklaration"
-+msgstr "Varna för globala globala funktioner utan tidigare deklaration"
-
- #: c.opt:268
- msgid "Warn about missing fields in struct initializers"
--msgstr "Varna om saknade fält i postinitierare"
-+msgstr "Varna för saknade fält i postinitierare"
-
- #: c.opt:272
- msgid "Warn about functions which might be candidates for format attributes"
--msgstr "Varna om funktioner som kan vara kandidater för formatattribut"
-+msgstr "Varna för funktioner som kan vara kandidater för formatattribut"
-
- #: c.opt:276
- msgid "Warn about user-specified include directories that do not exist"
--msgstr "Varna om användarangivna inkluderingskataloger som inte finns"
-+msgstr "Varna för användarangivna inkluderingskataloger som inte finns"
-
- #: c.opt:280
- msgid "Warn about global functions without prototypes"
--msgstr "Varna om globala funktioner utan prototyper"
-+msgstr "Varna för globala funktioner utan prototyper"
-
- #: c.opt:284
- msgid "Warn about use of multi-character character constants"
-@@ -12374,7 +12374,7 @@
-
- #: c.opt:288
- msgid "Warn about \"extern\" declarations not at file scope"
--msgstr "Varna om \"extern\"-deklaration som inte är på filnivå"
-+msgstr "Varna för \"extern\"-deklaration som inte är på filnivå"
-
- #: c.opt:292
- msgid "Warn when non-templatized friend functions are declared within a template"
-@@ -12382,31 +12382,31 @@
-
- #: c.opt:296
- msgid "Warn about non-virtual destructors"
--msgstr "Varna om ickevirtuella destruerare"
-+msgstr "Varna för ickevirtuella destruerare"
-
- #: c.opt:300
- msgid "Warn about NULL being passed to argument slots marked as requiring non-NULL"
--msgstr "Varna om NULL skickas som argument till fack markerde att de kräver icke-NULL"
-+msgstr "Varna om NULL skickas som argument som är markerade att de kräver icke-NULL"
-
- #: c.opt:304
- msgid "Warn about non-normalised Unicode strings"
--msgstr "Varna om icke normaliserade Unicodesträngar"
-+msgstr "Varna för icke normaliserade Unicodesträngar"
-
- #: c.opt:308
- msgid "Warn if a C-style cast is used in a program"
--msgstr "Varna om en typkonvertering i C-stil används i ett program"
-+msgstr "Varna för en typkonvertering i C-stil används i ett program"
-
- #: c.opt:312
- msgid "Warn if an old-style parameter definition is used"
--msgstr "Varna om en gammaldags parameterdefinition används"
-+msgstr "Varna för en gammaldags parameterdefinition används"
-
- #: c.opt:316
- msgid "Warn about overloaded virtual function names"
--msgstr "Varna om överlastade virtuella funktionsnamn"
-+msgstr "Varna för överlagrade virtuella funktionsnamn"
-
- #: c.opt:320
- msgid "Warn about possibly missing parentheses"
--msgstr "Varna om eventuellt saknade parenteser"
-+msgstr "Varna för eventuellt saknade parenteser"
-
- #: c.opt:324
- msgid "Warn when converting the type of pointers to member functions"
-@@ -12414,7 +12414,7 @@
-
- #: c.opt:328
- msgid "Warn about function pointer arithmetic"
--msgstr "Varna om aritmetik med funktionspekare"
-+msgstr "Varna för aritmetik med funktionspekare"
-
- #: c.opt:332
- msgid "Warn when a pointer is cast to an integer of a different size"
-@@ -12422,15 +12422,15 @@
-
- #: c.opt:336
- msgid "Warn about misuses of pragmas"
--msgstr "Varna om missbruk av pragman"
-+msgstr "Varna för missbruk av pragman"
-
- #: c.opt:340
- msgid "Warn if inherited methods are unimplemented"
--msgstr "Varna om ärvda metoder är oimplementerade"
-+msgstr "Varna för ärvda metoder är oimplementerade"
-
- #: c.opt:344
- msgid "Warn about multiple declarations of the same object"
--msgstr "Varna om multipla deklarationer av samma objekt"
-+msgstr "Varna för multipla deklarationer av samma objekt"
-
- #: c.opt:348
- msgid "Warn when the compiler reorders code"
-@@ -12442,31 +12442,31 @@
-
- #: c.opt:356
- msgid "Warn if a selector has multiple methods"
--msgstr "Varna om en väljare har multipla metoder"
-+msgstr "Varna för en väljare har multipla metoder"
-
- #: c.opt:360
- msgid "Warn about possible violations of sequence point rules"
--msgstr "Varna om möjliga brott mot sekvenspunktregler"
-+msgstr "Varna för möjliga brott mot sekvenspunktregler"
-
- #: c.opt:364
- msgid "Warn about signed-unsigned comparisons"
--msgstr "Varna om jämförelser mellan signed/unsigned"
-+msgstr "Varna för jämförelser mellan signed/unsigned"
-
- #: c.opt:368
- msgid "Warn when overload promotes from unsigned to signed"
--msgstr "Varna när överlastning anpassar från teckenlöst till med tecken"
-+msgstr "Varna när överlagring anpassar från teckenlöst till med tecken"
-
- #: c.opt:372
- msgid "Warn about uncasted NULL used as sentinel"
--msgstr "Varna om ej typkonverterad NULL används som vaktpost"
-+msgstr "Varna för ej typkonverterad NULL används som vaktpost"
-
- #: c.opt:376
- msgid "Warn about unprototyped function declarations"
--msgstr "Varna om funktionsdeklarationer utan prototyp"
-+msgstr "Varna för funktionsdeklarationer utan prototyp"
-
- #: c.opt:380
- msgid "Warn if type signatures of candidate methods do not match exactly"
--msgstr "Varna om typsignaturer till kandidatmetoder inte stämmer exakt"
-+msgstr "Varna för typsignaturer till kandidatmetoder inte stämmer exakt"
-
- #: c.opt:384
- msgid "Warn when synthesis behavior differs from Cfront"
-@@ -12478,27 +12478,27 @@
-
- #: c.opt:392
- msgid "Warn about features not present in traditional C"
--msgstr "Varna om funktioner som inte finns i traditionell C"
-+msgstr "Varna för funktioner som inte finns i traditionell C"
-
- #: c.opt:396
- msgid "Warn if trigraphs are encountered that might affect the meaning of the program"
--msgstr "Varna om trigrafer upptäcks som kan påverka betydelsen av programmet"
-+msgstr "Varna för trigrafer upptäcks som kan påverka betydelsen av programmet"
-
- #: c.opt:400
- msgid "Warn about @selector()s without previously declared methods"
--msgstr "Varna om @selector()er utan tidigare deklarerade metoder"
-+msgstr "Varna för @selector()er utan tidigare deklarerade metoder"
-
- #: c.opt:404
- msgid "Warn if an undefined macro is used in an #if directive"
--msgstr "Varna om ett odefinierat makro används i ett #if-direktiv"
-+msgstr "Varna för ett odefinierat makro används i ett #if-direktiv"
-
- #: c.opt:408
- msgid "Warn about unrecognized pragmas"
--msgstr "Varna om okända pragman"
-+msgstr "Varna för okända pragman"
-
- #: c.opt:412
- msgid "Warn about macros defined in the main file that are not used"
--msgstr "Varna om makron definierade i huvudfilen som inte används"
-+msgstr "Varna för makron definierade i huvudfilen som inte används"
-
- #: c.opt:416
- msgid "Do not warn about using variadic macros when -pedantic"
-@@ -12886,23 +12886,23 @@
-
- #: common.opt:54
- msgid "This switch is deprecated; use -Wextra instead"
--msgstr "Denna flagga avrådes ifrån, använd -Wextra istället"
-+msgstr "Denna flagga bör undvikas, använd -Wextra istället"
-
- #: common.opt:58
- msgid "Warn about returning structures, unions or arrays"
--msgstr "Varna om retur av poster, unioner eller vektorer"
-+msgstr "Varna för retur av poster, unioner eller vektorer"
-
- #: common.opt:62
- msgid "Warn about inappropriate attribute usage"
--msgstr "Varna om felaktig användning av attribut"
-+msgstr "Varna för felaktig användning av attribut"
-
- #: common.opt:66
- msgid "Warn about pointer casts which increase alignment"
--msgstr "Varna om typkonvertering av pekare som ökar justeringen"
-+msgstr "Varna för typkonvertering av pekare som ökar justeringen"
-
- #: common.opt:70
- msgid "Warn about uses of __attribute__((deprecated)) declarations"
--msgstr "Varna om användning av __attribute__((deprecated))-deklarationer"
-+msgstr "Varna för användning av __attribute__((deprecated))-deklarationer"
-
- #: common.opt:74
- msgid "Warn when an optimization pass is disabled"
-@@ -12926,15 +12926,15 @@
-
- #: common.opt:94
- msgid "Warn if an object is larger than <number> bytes"
--msgstr "Varna om ett objekt är större än <antal> byte"
-+msgstr "Varna för ett objekt är större än <antal> byte"
-
- #: common.opt:98
- msgid "Warn if the loop cannot be optimized due to nontrivial assumptions."
--msgstr "Varna om slingan inte kan optimeras på grund av icketriviala antaganden."
-+msgstr "Varna för slingan inte kan optimeras på grund av icketriviala antaganden."
-
- #: common.opt:102
- msgid "Warn about functions which might be candidates for __attribute__((noreturn))"
--msgstr "Varna om funktioner som är möjliga kandidater för __attribute__((noreturn))"
-+msgstr "Varna för funktioner som är möjliga kandidater för __attribute__((noreturn))"
-
- #: common.opt:106
- msgid "Warn when the packed attribute has no effect on struct layout"
-@@ -12950,31 +12950,31 @@
-
- #: common.opt:118
- msgid "Warn when not issuing stack smashing protection for some reason"
--msgstr "Varna när stacksprängningsskydd inte läggs ut av någon anledning"
-+msgstr "Varna när stacköverskrivningsskydd inte läggs ut av någon anledning"
-
- #: common.opt:122 common.opt:126
- msgid "Warn about code which might break strict aliasing rules"
--msgstr "Varna om kod som kan bryta strikta aliasregler"
-+msgstr "Varna för kod som kan bryta strikta aliasregler"
-
- #: common.opt:130
- msgid "Warn about enumerated switches, with no default, missing a case"
--msgstr "Varna om uppräkningshopptabeller, utan standardfall, saknar ett fall"
-+msgstr "Varna när hopptabeller för uppräkningstyper inte har standardfall och saknar ett fall"
-
- #: common.opt:134
- msgid "Warn about enumerated switches missing a \"default:\" statement"
--msgstr "Varna om uppräkningshopptabeller saknar en \"default:\"-sats"
-+msgstr "Varna för uppräkningshopptabeller saknar en \"default:\"-sats"
-
- #: common.opt:138
- msgid "Warn about all enumerated switches missing a specific case"
--msgstr "Varna om alla uppräkningshopptabeller som saknar ett specifikt fall"
-+msgstr "Varna för alla uppräkningshopptabeller som saknar ett specifikt fall"
-
- #: common.opt:146
- msgid "Warn about uninitialized automatic variables"
--msgstr "Varna om oinitierade automatiska variabler"
-+msgstr "Varna för oinitierade automatiska variabler"
-
- #: common.opt:150
- msgid "Warn about code that will never be executed"
--msgstr "Varna om kod som aldrig kommer köras"
-+msgstr "Varna för kod som aldrig kommer köras"
-
- #: common.opt:154
- msgid "Enable all -Wunused- warnings"
-@@ -13106,7 +13106,7 @@
-
- #: common.opt:334
- msgid "Place data items into their own section"
--msgstr "Placera dataföremål i sin egen sektion"
-+msgstr "Placera dataobjekt i sin egen sektion"
-
- #: common.opt:340
- msgid "Defer popping functions args from stack until later"
-@@ -13118,7 +13118,7 @@
-
- #: common.opt:348
- msgid "Delete useless null pointer checks"
--msgstr "Tag bort oanvändbara nollpekarkontroller"
-+msgstr "Tag bort onödiga nollpekarkontroller"
-
- #: common.opt:352
- msgid "How often to emit source location at the beginning of line-wrapped diagnostics"
-@@ -13214,7 +13214,7 @@
-
- #: common.opt:464
- msgid "Perform conversion of conditional jumps to branchless equivalents"
--msgstr "Utvör konvertering av villkorliga hopp till grenlösa motsvarigheter"
-+msgstr "Utför konvertering av villkorliga hopp till grenlösa motsvarigheter"
-
- #: common.opt:468
- msgid "Perform conversion of conditional jumps to conditional execution"
-@@ -13730,15 +13730,15 @@
-
- #: common.opt:1034
- msgid "Construct webs and split unrelated uses of single variable"
--msgstr "Kostruera nät och dela orelaterade användningar av en enskild variabel"
-+msgstr "Konstruera nät och dela orelaterade användningar av en enskild variabel"
-
- #: common.opt:1038
- msgid "Perform whole program optimizations"
--msgstr "Utför optimeringav hela program"
-+msgstr "Utför optimering av hela program"
-
- #: common.opt:1042
- msgid "Assume signed arithmetic overflow wraps around"
--msgstr "Anta spill vid teckenaritmetik slår runt"
-+msgstr "Anta att spill vid teckenaritmetik slår runt"
-
- #: common.opt:1046
- msgid "Put zero initialized data in the bss section"
-@@ -14044,7 +14044,7 @@
- #: c-common.c:975
- #, gcc-internal-format
- msgid "type-punning to incomplete type might break strict-aliasing rules"
--msgstr "typstampning till ofullständiga typ kan bryta strikta aliasregler"
-+msgstr "typstampning till ofullständig typ kan bryta strikta aliasregler"
-
- #: c-common.c:983
- #, gcc-internal-format
-@@ -14059,7 +14059,7 @@
- #: c-common.c:1049
- #, gcc-internal-format
- msgid "overflow in implicit constant conversion"
--msgstr "spill i implicit constant konvertering"
-+msgstr "spill i implicit konstant konvertering"
-
- #: c-common.c:1185
- #, gcc-internal-format
-@@ -14129,12 +14129,12 @@
- #: c-common.c:2288
- #, gcc-internal-format
- msgid "pointer to a function used in arithmetic"
--msgstr "pekare till funktion använd med aritmetik"
-+msgstr "pekare till funktion använd i aritmetik"
-
- #: c-common.c:2294
- #, gcc-internal-format
- msgid "pointer to member function used in arithmetic"
--msgstr "pekare till medlemsfunktion använd med aritmetik"
-+msgstr "pekare till medlemsfunktion använd i aritmetik"
-
- #. Common Ada/Pascal programmer's mistake. We always warn
- #. about this since it is so bad.
-@@ -14196,7 +14196,7 @@
- #: c-common.c:3724
- #, gcc-internal-format
- msgid "duplicate (or overlapping) case value"
--msgstr "dubbla (eller överlappand) case-värden"
-+msgstr "dubbla (eller överlappande) case-värden"
-
- #: c-common.c:3725
- #, gcc-internal-format
-@@ -14236,7 +14236,7 @@
- #: c-common.c:3844
- #, gcc-internal-format
- msgid "%Hswitch missing default case"
--msgstr "%Hswitch saknare default-fall"
-+msgstr "%Hswitch saknar default-fall"
-
- #. Warn if there are enumerators that don't correspond to
- #. case expressions.
-@@ -14279,7 +14279,7 @@
- #: c-common.c:4540
- #, gcc-internal-format
- msgid "specifying vector types with __attribute__ ((mode)) is deprecated"
--msgstr "det avrådes från att ange vektortyper med __attribute__ ((sätt))"
-+msgstr "att ange vektortyper med __attribute__ ((sätt)) bör unvikas"
-
- #: c-common.c:4543
- #, gcc-internal-format
-@@ -14339,7 +14339,7 @@
- #: c-common.c:4708
- #, gcc-internal-format
- msgid "requested alignment is not a power of 2"
--msgstr "efterrågad minnesjustering är inte en potens av 2"
-+msgstr "efterfågad minnesjustering är inte en potens av 2"
-
- #: c-common.c:4713
- #, gcc-internal-format
-@@ -19077,7 +19077,7 @@
- #: stmt.c:910
- #, gcc-internal-format
- msgid "use of memory input without lvalue in asm operand %d is deprecated"
--msgstr "användning av minnesindata utan lvärde i asm-operand %d undanbedes"
-+msgstr "användning av minnesindata utan lvärde i asm-operand %d bör undvikas"
-
- #: stmt.c:1057
- #, gcc-internal-format
-@@ -19234,22 +19234,22 @@
- #: toplev.c:892 toplev.c:916
- #, gcc-internal-format
- msgid "%qs is deprecated (declared at %s:%d)"
--msgstr "%qs undanbedes (deklarerad vid %s:%d)"
-+msgstr "%qs bör undvikas (deklarerad vid %s:%d)"
-
- #: toplev.c:920
- #, gcc-internal-format
- msgid "type is deprecated (declared at %s:%d)"
--msgstr "typen undanbedes (deklarerad vid %s:%d)"
-+msgstr "typen bör undvikas (deklarerad vid %s:%d)"
-
- #: toplev.c:926
- #, gcc-internal-format
- msgid "%qs is deprecated"
--msgstr "%qs undanbedes"
-+msgstr "%qs bör undvikas"
-
- #: toplev.c:928
- #, gcc-internal-format
- msgid "type is deprecated"
--msgstr "type undanbedes"
-+msgstr "typen bör undvikas"
-
- #: toplev.c:1095
- #, gcc-internal-format
-@@ -21694,7 +21694,7 @@
- #: config/rs6000/rs6000.c:7259
- #, gcc-internal-format
- msgid "unresolved overload for Altivec builtin %qF"
--msgstr "ej upplöst överlastning för inbyggd Altivec %qF"
-+msgstr "ej upplöst överlagring för inbyggd Altivec %qF"
-
- #: config/rs6000/rs6000.c:7341
- #, gcc-internal-format
-@@ -21729,7 +21729,7 @@
- #: config/rs6000/rs6000.c:17299
- #, gcc-internal-format
- msgid "use of %<long%> in AltiVec types is deprecated; use %<int%>"
--msgstr "användning av %<long%> i AltiVec-typer undanbedes, använd %<int%>"
-+msgstr "användning av %<long%> i AltiVec-typer bör undvikas, använd %<int%>"
-
- #: config/rs6000/rs6000.c:17303
- #, gcc-internal-format
-@@ -22307,7 +22307,7 @@
- #: cp/call.c:2800 cp/call.c:2858
- #, gcc-internal-format
- msgid "call of overloaded %<%D(%A)%> is ambiguous"
--msgstr "anrop av överlastad %<%D(%A)%> är tvetydigt"
-+msgstr "anrop av överlagrad %<%D(%A)%> är tvetydigt"
-
- #. It's no good looking for an overloaded operator() on a
- #. pointer-to-member-function.
-@@ -22522,7 +22522,7 @@
- #: cp/call.c:5404
- #, gcc-internal-format
- msgid "call of overloaded %<%s(%A)%> is ambiguous"
--msgstr "anrop av överlastad %<%s(%A)%> är tvetydigt"
-+msgstr "anrop av överlagrad %<%s(%A)%> är tvetydigt"
-
- #: cp/call.c:5428
- #, gcc-internal-format
-@@ -22602,7 +22602,7 @@
- #: cp/class.c:1061
- #, gcc-internal-format
- msgid "%q+#D cannot be overloaded"
--msgstr "%q+#D kan inte överlastas"
-+msgstr "%q+#D kan inte överlagras"
-
- #: cp/class.c:1062
- #, gcc-internal-format
-@@ -22880,7 +22880,7 @@
- #: cp/class.c:5714
- #, gcc-internal-format
- msgid "cannot resolve overloaded function %qD based on conversion to type %qT"
--msgstr "det går inte att lösa upp överlastad funktion %qD baserat på konvertering till typ %qT"
-+msgstr "det går inte att lösa upp överlagrad funktion %qD baserat på konvertering till typ %qT"
-
- #: cp/class.c:5841
- #, gcc-internal-format
-@@ -22890,7 +22890,7 @@
- #: cp/class.c:5864
- #, gcc-internal-format
- msgid "converting overloaded function %qD to type %q#T is ambiguous"
--msgstr "konvertering av överlastad funktion %qD till typ %q#T är tvetydig"
-+msgstr "konvertering av överlagrad funktion %qD till typ %q#T är tvetydig"
-
- #: cp/class.c:5890
- #, gcc-internal-format
-@@ -23022,7 +23022,7 @@
- #: cp/cvt.c:902
- #, gcc-internal-format
- msgid "%s cannot resolve address of overloaded function"
--msgstr "%s kan inte lösa upp adress till överlastad funktion"
-+msgstr "%s kan inte lösa upp adress till överlagrad funktion"
-
- #. Only warn when there is no &.
- #: cp/cvt.c:908
-@@ -23565,7 +23565,7 @@
- #: cp/decl.c:4387
- #, gcc-internal-format
- msgid "braces around scalar initializer for type %qT"
--msgstr "klamrar funt skalär initierare för typen %qT"
-+msgstr "klamrar runt skalär initierare för typen %qT"
-
- #: cp/decl.c:4465
- #, gcc-internal-format
-@@ -24427,7 +24427,7 @@
- #: cp/decl.c:9012
- #, gcc-internal-format
- msgid "ISO C++ prohibits overloading operator ?:"
--msgstr "ISO C++ förhindrar överlastning av operatorn ?:"
-+msgstr "ISO C++ förhindrar överlagring av operatorn ?:"
-
- #: cp/decl.c:9015
- #, gcc-internal-format
-@@ -24848,7 +24848,7 @@
- #: cp/except.c:631 cp/init.c:1929
- #, gcc-internal-format
- msgid "%qD should never be overloaded"
--msgstr "%qD skall aldrig överlastas"
-+msgstr "%qD skall aldrig överlagras"
-
- #: cp/except.c:698
- #, gcc-internal-format
-@@ -25242,7 +25242,7 @@
- #: cp/lex.c:651
- #, gcc-internal-format
- msgid "(if you use %<-fpermissive%>, G++ will accept your code, but allowing the use of an undeclared name is deprecated)"
--msgstr "(om du använder %<-fpermissive%>, kommer G++ acceptera din kod, men det avrådes från att tillåta användning av ett odeklarerat namn)"
-+msgstr "(om du använder %<-fpermissive%>, kommer G++ acceptera din kod, men man bör undvika att tillåta användning av ett odeklarerat namn)"
-
- #: cp/mangle.c:2139
- #, gcc-internal-format
-@@ -25562,7 +25562,7 @@
- #: cp/parser.c:1875
- #, gcc-internal-format
- msgid "minimum/maximum operators are deprecated"
--msgstr "minimum-/maximumoperatorer undanbedes"
-+msgstr "minimum-/maximumoperatorer bör undvikas"
-
- #: cp/parser.c:1895
- #, gcc-internal-format
-@@ -25905,7 +25905,7 @@
- #: cp/parser.c:12370
- #, gcc-internal-format
- msgid "deprecated use of default argument for parameter of non-function"
--msgstr "undanbedd användning av standardargument för parametrar till annat än funktioner"
-+msgstr "användning av standardargument för parametrar till annat än funktioner bör undvikas"
-
- #: cp/parser.c:12373
- #, gcc-internal-format
-@@ -26728,7 +26728,7 @@
- #: cp/search.c:1847
- #, gcc-internal-format
- msgid "deprecated covariant return type for %q+#D"
--msgstr "undanbedd kovariant returtyp för %q+#D"
-+msgstr "kovariant returtyp för %q+#D bör undvikas"
-
- #: cp/search.c:1849 cp/search.c:1864 cp/search.c:1869
- #, gcc-internal-format
-@@ -27013,7 +27013,7 @@
- #: cp/typeck.c:1502
- #, gcc-internal-format
- msgid "deprecated conversion from string constant to %qT'"
--msgstr "undanbedd konvertering från strängkonstant till %qT'"
-+msgstr "konvertering från strängkonstant till %qT' bör undvikas"
-
- #: cp/typeck.c:1613 cp/typeck.c:1961
- #, gcc-internal-format
-@@ -27155,7 +27155,7 @@
- #: cp/typeck.c:2885 cp/typeck.c:2895
- #, gcc-internal-format
- msgid "assuming cast to type %qT from overloaded function"
--msgstr "antar typkonvertering till %qT från överlastad funktion"
-+msgstr "antar typkonvertering till %qT från överlagrad funktion"
-
- #: cp/typeck.c:2963
- #, gcc-internal-format
-Index: gcc-4_2-branch/gcc/sched-deps.c
-===================================================================
---- gcc-4_2-branch/gcc/sched-deps.c (revision 123014)
-+++ gcc-4_2-branch/gcc/sched-deps.c (revision 124164)
-@@ -1238,8 +1238,12 @@
-
- /* If this instruction can throw an exception, then moving it changes
- where block boundaries fall. This is mighty confusing elsewhere.
-- Therefore, prevent such an instruction from being moved. */
-- if (can_throw_internal (insn))
-+ Therefore, prevent such an instruction from being moved. Same for
-+ non-jump instructions that define block boundaries.
-+ ??? Unclear whether this is still necessary in EBB mode. If not,
-+ add_branch_dependences should be adjusted for RGN mode instead. */
-+ if (((CALL_P (insn) || JUMP_P (insn)) && can_throw_internal (insn))
-+ || (NONJUMP_INSN_P (insn) && control_flow_insn_p (insn)))
- reg_pending_barrier = MOVE_BARRIER;
-
- /* Add dependencies if a scheduling barrier was found. */
-Index: gcc-4_2-branch/gcc/tree-cfg.c
-===================================================================
---- gcc-4_2-branch/gcc/tree-cfg.c (revision 123014)
-+++ gcc-4_2-branch/gcc/tree-cfg.c (revision 124164)
-@@ -439,7 +439,9 @@
- cond = fold (COND_EXPR_COND (stmt));
- zerop = integer_zerop (cond);
- onep = integer_onep (cond);
-- fold_undefer_overflow_warnings (zerop || onep, stmt,
-+ fold_undefer_overflow_warnings (((zerop || onep)
-+ && !TREE_NO_WARNING (stmt)),
-+ stmt,
- WARN_STRICT_OVERFLOW_CONDITIONAL);
- if (zerop)
- COND_EXPR_COND (stmt) = boolean_false_node;
-@@ -2121,8 +2123,19 @@
- return find_taken_edge_switch_expr (bb, val);
-
- if (computed_goto_p (stmt))
-- return find_taken_edge_computed_goto (bb, TREE_OPERAND( val, 0));
-+ {
-+ /* Only optimize if the argument is a label, if the argument is
-+ not a label then we can not construct a proper CFG.
-
-+ It may be the case that we only need to allow the LABEL_REF to
-+ appear inside an ADDR_EXPR, but we also allow the LABEL_REF to
-+ appear inside a LABEL_EXPR just to be safe. */
-+ if ((TREE_CODE (val) == ADDR_EXPR || TREE_CODE (val) == LABEL_EXPR)
-+ && TREE_CODE (TREE_OPERAND (val, 0)) == LABEL_DECL)
-+ return find_taken_edge_computed_goto (bb, TREE_OPERAND (val, 0));
-+ return NULL;
-+ }
-+
- gcc_unreachable ();
- }
+ case DImode:
+- emit_insn (gen_cmpgtdi_media (operands[0],
++ emit_insn (gen_cmpgtdi_media (reg,
+ sh_compare_op1, sh_compare_op0));
+ break;
-Index: gcc-4_2-branch/gcc/config/alpha/linux.h
-===================================================================
---- gcc-4_2-branch/gcc/config/alpha/linux.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/alpha/linux.h (revision 124164)
-@@ -44,6 +44,9 @@
- %{shared:-lc} \
- %{!shared: %{profile:-lc_p}%{!profile:-lc}}"
-
-+#undef CPP_SPEC
-+#define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
-+
- /* Show that we need a GP when profiling. */
- #undef TARGET_PROFILING_NEEDS_GP
- #define TARGET_PROFILING_NEEDS_GP 1
-Index: gcc-4_2-branch/gcc/config/alpha/alpha.c
-===================================================================
---- gcc-4_2-branch/gcc/config/alpha/alpha.c (revision 123014)
-+++ gcc-4_2-branch/gcc/config/alpha/alpha.c (revision 124164)
-@@ -1549,7 +1549,7 @@
- Add EXTRA_OFFSET to the address we return. */
-
- rtx
--get_unaligned_address (rtx ref, int extra_offset)
-+get_unaligned_address (rtx ref)
- {
- rtx base;
- HOST_WIDE_INT offset = 0;
-@@ -1569,9 +1569,25 @@
- if (GET_CODE (base) == PLUS)
- offset += INTVAL (XEXP (base, 1)), base = XEXP (base, 0);
-
-- return plus_constant (base, offset + extra_offset);
-+ return plus_constant (base, offset);
- }
+ case SFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgtsf_media (operands[0],
++ emit_insn (gen_cmpgtsf_media (reg,
+ sh_compare_op1, sh_compare_op0));
+ break;
-+/* Compute a value X, such that X & 7 == (ADDR + OFS) & 7.
-+ X is always returned in a register. */
-+
-+rtx
-+get_unaligned_offset (rtx addr, HOST_WIDE_INT ofs)
-+{
-+ if (GET_CODE (addr) == PLUS)
-+ {
-+ ofs += INTVAL (XEXP (addr, 1));
-+ addr = XEXP (addr, 0);
-+ }
+ case DFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgtdf_media (operands[0],
++ emit_insn (gen_cmpgtdf_media (reg,
+ sh_compare_op1, sh_compare_op0));
+ break;
+
+ default:
+ FAIL;
+ }
+
-+ return expand_simple_binop (Pmode, PLUS, addr, GEN_INT (ofs & 7),
-+ NULL_RTX, 1, OPTAB_LIB_WIDEN);
-+}
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
+
- /* On the Alpha, all (non-symbolic) constants except zero go into
- a floating-point register via memory. Note that we cannot
- return anything that is not a subset of CLASS, and that some
-@@ -2318,7 +2334,7 @@
- seq = ((mode == QImode
- ? gen_unaligned_loadqi
- : gen_unaligned_loadhi)
-- (subtarget, get_unaligned_address (operands[1], 0),
-+ (subtarget, get_unaligned_address (operands[1]),
- temp1, temp2));
- alpha_set_memflags (seq, operands[1]);
- emit_insn (seq);
-@@ -2357,7 +2373,7 @@
- rtx seq = ((mode == QImode
- ? gen_unaligned_storeqi
- : gen_unaligned_storehi)
-- (get_unaligned_address (operands[0], 0),
-+ (get_unaligned_address (operands[0]),
- operands[1], temp1, temp2, temp3));
-
- alpha_set_memflags (seq, operands[0]);
-Index: gcc-4_2-branch/gcc/config/alpha/alpha.md
-===================================================================
---- gcc-4_2-branch/gcc/config/alpha/alpha.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/alpha/alpha.md (revision 124164)
-@@ -1607,10 +1607,7 @@
-
- if (unaligned_memory_operand (operands[1], QImode))
- {
-- rtx seq
-- = gen_unaligned_extendqidi (operands[0],
-- get_unaligned_address (operands[1], 1));
--
-+ rtx seq = gen_unaligned_extendqidi (operands[0], XEXP (operands[1], 0));
- alpha_set_memflags (seq, operands[1]);
- emit_insn (seq);
DONE;
-@@ -1670,9 +1667,7 @@
+ }
+ if (! currently_expanding_to_rtl)
+@@ -9258,8 +9222,8 @@
- if (unaligned_memory_operand (operands[1], HImode))
+ if (TARGET_SHMEDIA)
{
-- rtx seq
-- = gen_unaligned_extendhidi (operands[0],
-- get_unaligned_address (operands[1], 2));
-+ rtx seq = gen_unaligned_extendhidi (operands[0], XEXP (operands[1], 0));
-
- alpha_set_memflags (seq, operands[1]);
- emit_insn (seq);
-@@ -1687,12 +1682,13 @@
- ;; as a pattern saves one instruction. The code is similar to that for
- ;; the unaligned loads (see below).
- ;;
--;; Operand 1 is the address + 1 (+2 for HI), operand 0 is the result.
-+;; Operand 1 is the address, operand 0 is the result.
- (define_expand "unaligned_extendqidi"
- [(use (match_operand:QI 0 "register_operand" ""))
- (use (match_operand:DI 1 "address_operand" ""))]
- ""
- {
-+ operands[0] = gen_lowpart (DImode, operands[0]);
- if (WORDS_BIG_ENDIAN)
- emit_insn (gen_unaligned_extendqidi_be (operands[0], operands[1]));
- else
-@@ -1701,48 +1697,40 @@
- })
-
- (define_expand "unaligned_extendqidi_le"
-- [(set (match_dup 2) (match_operand:DI 1 "address_operand" ""))
-- (set (match_dup 3)
-- (mem:DI (and:DI (plus:DI (match_dup 2) (const_int -1))
-- (const_int -8))))
-+ [(set (match_dup 3)
-+ (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
- (set (match_dup 4)
- (ashift:DI (match_dup 3)
- (minus:DI (const_int 64)
- (ashift:DI
- (and:DI (match_dup 2) (const_int 7))
- (const_int 3)))))
-- (set (subreg:DI (match_operand:QI 0 "register_operand" "") 0)
-+ (set (match_operand:DI 0 "register_operand" "")
- (ashiftrt:DI (match_dup 4) (const_int 56)))]
- "! WORDS_BIG_ENDIAN"
- {
-- operands[2] = gen_reg_rtx (DImode);
-+ operands[2] = get_unaligned_offset (operands[1], 1);
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_reg_rtx (DImode);
- })
-
- (define_expand "unaligned_extendqidi_be"
-- [(set (match_dup 2) (match_operand:DI 1 "address_operand" ""))
-- (set (match_dup 3) (plus:DI (match_dup 2) (const_int -1)))
-+ [(set (match_dup 3)
-+ (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
- (set (match_dup 4)
-- (mem:DI (and:DI (match_dup 3)
-- (const_int -8))))
-- (set (match_dup 5) (plus:DI (match_dup 2) (const_int -2)))
-- (set (match_dup 6)
-- (ashift:DI (match_dup 4)
-+ (ashift:DI (match_dup 3)
- (ashift:DI
- (and:DI
-- (plus:DI (match_dup 5) (const_int 1))
-+ (plus:DI (match_dup 2) (const_int 1))
- (const_int 7))
- (const_int 3))))
-- (set (subreg:DI (match_operand:QI 0 "register_operand" "") 0)
-- (ashiftrt:DI (match_dup 6) (const_int 56)))]
-+ (set (match_operand:DI 0 "register_operand" "")
-+ (ashiftrt:DI (match_dup 4) (const_int 56)))]
- "WORDS_BIG_ENDIAN"
- {
-- operands[2] = gen_reg_rtx (DImode);
-+ operands[2] = get_unaligned_offset (operands[1], -1);
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_reg_rtx (DImode);
-- operands[5] = gen_reg_rtx (DImode);
-- operands[6] = gen_reg_rtx (DImode);
- })
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ rtx reg;
++
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9267,45 +9231,54 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
++
+ switch (GET_MODE (sh_compare_op0))
+ {
+ case SImode:
+ {
+- tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode);
+
+ emit_insn (gen_cmpgtsi_media (tmp,
+ sh_compare_op0, sh_compare_op1));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
+ break;
+ }
- (define_expand "unaligned_extendhidi"
-@@ -1751,17 +1739,16 @@
- ""
- {
- operands[0] = gen_lowpart (DImode, operands[0]);
-- emit_insn ((WORDS_BIG_ENDIAN
-- ? gen_unaligned_extendhidi_be
-- : gen_unaligned_extendhidi_le) (operands[0], operands[1]));
-+ if (WORDS_BIG_ENDIAN)
-+ emit_insn (gen_unaligned_extendhidi_be (operands[0], operands[1]));
-+ else
-+ emit_insn (gen_unaligned_extendhidi_le (operands[0], operands[1]));
- DONE;
- })
+ case DImode:
+ {
+- tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode);
+
+ emit_insn (gen_cmpgtdi_media (tmp,
+ sh_compare_op0, sh_compare_op1));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
+ break;
+ }
- (define_expand "unaligned_extendhidi_le"
-- [(set (match_dup 2) (match_operand:DI 1 "address_operand" ""))
-- (set (match_dup 3)
-- (mem:DI (and:DI (plus:DI (match_dup 2) (const_int -2))
-- (const_int -8))))
-+ [(set (match_dup 3)
-+ (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
- (set (match_dup 4)
- (ashift:DI (match_dup 3)
- (minus:DI (const_int 64)
-@@ -1772,34 +1759,28 @@
- (ashiftrt:DI (match_dup 4) (const_int 48)))]
- "! WORDS_BIG_ENDIAN"
- {
-- operands[2] = gen_reg_rtx (DImode);
-+ operands[2] = get_unaligned_offset (operands[1], 2);
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_reg_rtx (DImode);
- })
+ case SFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgesf_media (operands[0],
++ emit_insn (gen_cmpgesf_media (reg,
+ sh_compare_op1, sh_compare_op0));
+ break;
- (define_expand "unaligned_extendhidi_be"
-- [(set (match_dup 2) (match_operand:DI 1 "address_operand" ""))
-- (set (match_dup 3) (plus:DI (match_dup 2) (const_int -2)))
-+ [(set (match_dup 3)
-+ (mem:DI (and:DI (match_operand:DI 1 "" "") (const_int -8))))
- (set (match_dup 4)
-- (mem:DI (and:DI (match_dup 3)
-- (const_int -8))))
-- (set (match_dup 5) (plus:DI (match_dup 2) (const_int -3)))
-- (set (match_dup 6)
-- (ashift:DI (match_dup 4)
-+ (ashift:DI (match_dup 3)
- (ashift:DI
- (and:DI
-- (plus:DI (match_dup 5) (const_int 1))
-+ (plus:DI (match_dup 2) (const_int 1))
- (const_int 7))
- (const_int 3))))
- (set (match_operand:DI 0 "register_operand" "")
-- (ashiftrt:DI (match_dup 6) (const_int 48)))]
-+ (ashiftrt:DI (match_dup 4) (const_int 48)))]
- "WORDS_BIG_ENDIAN"
- {
-- operands[2] = gen_reg_rtx (DImode);
-+ operands[2] = get_unaligned_offset (operands[1], -1);
- operands[3] = gen_reg_rtx (DImode);
- operands[4] = gen_reg_rtx (DImode);
-- operands[5] = gen_reg_rtx (DImode);
-- operands[6] = gen_reg_rtx (DImode);
- })
+ case DFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgedf_media (operands[0],
++ emit_insn (gen_cmpgedf_media (reg,
+ sh_compare_op1, sh_compare_op0));
+ break;
- (define_insn "*extxl_const"
-@@ -6065,7 +6046,7 @@
- else
- scratch = gen_rtx_REG (DImode, REGNO (operands[2]));
-
-- addr = get_unaligned_address (operands[1], 0);
-+ addr = get_unaligned_address (operands[1]);
- operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
- seq = gen_unaligned_loadqi (operands[0], addr, scratch, operands[0]);
- alpha_set_memflags (seq, operands[1]);
-@@ -6099,7 +6080,7 @@
- else
- scratch = gen_rtx_REG (DImode, REGNO (operands[2]));
-
-- addr = get_unaligned_address (operands[1], 0);
-+ addr = get_unaligned_address (operands[1]);
- operands[0] = gen_rtx_REG (DImode, REGNO (operands[0]));
- seq = gen_unaligned_loadhi (operands[0], addr, scratch, operands[0]);
- alpha_set_memflags (seq, operands[1]);
-@@ -6123,7 +6104,7 @@
- }
- else
- {
-- rtx addr = get_unaligned_address (operands[0], 0);
-+ rtx addr = get_unaligned_address (operands[0]);
- rtx scratch1 = gen_rtx_REG (DImode, REGNO (operands[2]));
- rtx scratch2 = gen_rtx_REG (DImode, REGNO (operands[2]) + 1);
- rtx scratch3 = scratch1;
-@@ -6155,7 +6136,7 @@
+ default:
+ FAIL;
+ }
++
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
++
+ DONE;
}
- else
- {
-- rtx addr = get_unaligned_address (operands[0], 0);
-+ rtx addr = get_unaligned_address (operands[0]);
- rtx scratch1 = gen_rtx_REG (DImode, REGNO (operands[2]));
- rtx scratch2 = gen_rtx_REG (DImode, REGNO (operands[2]) + 1);
- rtx scratch3 = scratch1;
-Index: gcc-4_2-branch/gcc/config/alpha/alpha-protos.h
-===================================================================
---- gcc-4_2-branch/gcc/config/alpha/alpha-protos.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/alpha/alpha-protos.h (revision 124164)
-@@ -51,7 +51,8 @@
- extern rtx split_small_symbolic_operand (rtx);
-
- extern void get_aligned_mem (rtx, rtx *, rtx *);
--extern rtx get_unaligned_address (rtx, int);
-+extern rtx get_unaligned_address (rtx);
-+extern rtx get_unaligned_offset (rtx, HOST_WIDE_INT);
- extern enum reg_class alpha_preferred_reload_class (rtx, enum reg_class);
- extern enum reg_class alpha_secondary_reload_class (enum reg_class,
- enum machine_mode, rtx,
-Index: gcc-4_2-branch/gcc/config/s390/s390.c
-===================================================================
---- gcc-4_2-branch/gcc/config/s390/s390.c (revision 123014)
-+++ gcc-4_2-branch/gcc/config/s390/s390.c (revision 124164)
-@@ -3555,7 +3555,7 @@
- if (temp != count)
- emit_move_insn (count, temp);
-
-- temp = expand_binop (mode, ashr_optab, count, GEN_INT (8), blocks, 1, 0);
-+ temp = expand_binop (mode, lshr_optab, count, GEN_INT (8), blocks, 1, 0);
- if (temp != blocks)
- emit_move_insn (blocks, temp);
-
-@@ -3592,10 +3592,12 @@
- void
- s390_expand_setmem (rtx dst, rtx len, rtx val)
+
+@@ -9323,8 +9296,12 @@
{
-- gcc_assert (GET_CODE (len) != CONST_INT || INTVAL (len) > 0);
-+ if (GET_CODE (len) == CONST_INT && INTVAL (len) == 0)
-+ return;
-+
- gcc_assert (GET_CODE (val) == CONST_INT || GET_MODE (val) == QImode);
-
-- if (GET_CODE (len) == CONST_INT && INTVAL (len) <= 257)
-+ if (GET_CODE (len) == CONST_INT && INTVAL (len) > 0 && INTVAL (len) <= 257)
+ if (TARGET_SHMEDIA)
{
- if (val == const0_rtx && INTVAL (len) <= 256)
- emit_insn (gen_clrmem_short (dst, GEN_INT (INTVAL (len) - 1)));
-@@ -3669,7 +3671,7 @@
- if (temp != count)
- emit_move_insn (count, temp);
-
-- temp = expand_binop (mode, ashr_optab, count, GEN_INT (8), blocks, 1, 0);
-+ temp = expand_binop (mode, lshr_optab, count, GEN_INT (8), blocks, 1, 0);
- if (temp != blocks)
- emit_move_insn (blocks, temp);
-
-@@ -3761,7 +3763,7 @@
- if (temp != count)
- emit_move_insn (count, temp);
-
-- temp = expand_binop (mode, ashr_optab, count, GEN_INT (8), blocks, 1, 0);
-+ temp = expand_binop (mode, lshr_optab, count, GEN_INT (8), blocks, 1, 0);
- if (temp != blocks)
- emit_move_insn (blocks, temp);
-
-Index: gcc-4_2-branch/gcc/config/i386/mmintrin.h
-===================================================================
---- gcc-4_2-branch/gcc/config/i386/mmintrin.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/i386/mmintrin.h (revision 124164)
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005, 2006
-+/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
- Free Software Foundation, Inc.
-
- This file is part of GCC.
-@@ -34,8 +34,9 @@
- #ifndef __MMX__
- # error "MMX instruction set not enabled"
- #else
--/* The data type intended for user use. */
--typedef int __m64 __attribute__ ((__vector_size__ (8)));
-+/* The Intel API is flexible enough that we must allow aliasing with other
-+ vector types, and their scalar components. */
-+typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));
-
- /* Internal data types for implementing the intrinsics. */
- typedef int __v2si __attribute__ ((__vector_size__ (8)));
-Index: gcc-4_2-branch/gcc/config/i386/xmmintrin.h
-===================================================================
---- gcc-4_2-branch/gcc/config/i386/xmmintrin.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/i386/xmmintrin.h (revision 124164)
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2002, 2003, 2004, 2005, 2006
-+/* Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
- Free Software Foundation, Inc.
-
- This file is part of GCC.
-@@ -41,8 +41,9 @@
- /* Get _mm_malloc () and _mm_free (). */
- #include <mm_malloc.h>
-
--/* The data type intended for user use. */
--typedef float __m128 __attribute__ ((__vector_size__ (16)));
-+/* The Intel API is flexible enough that we must allow aliasing with other
-+ vector types, and their scalar components. */
-+typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
-
- /* Internal data types for implementing the intrinsics. */
- typedef float __v4sf __attribute__ ((__vector_size__ (16)));
-Index: gcc-4_2-branch/gcc/config/i386/sse.md
-===================================================================
---- gcc-4_2-branch/gcc/config/i386/sse.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/i386/sse.md (revision 124164)
-@@ -304,7 +304,7 @@
- (define_insn "sse_vmaddv4sf3"
- [(set (match_operand:V4SF 0 "register_operand" "=x")
- (vec_merge:V4SF
-- (plus:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
-+ (plus:V4SF (match_operand:V4SF 1 "register_operand" "0")
- (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
- (match_dup 1)
- (const_int 1)))]
-@@ -360,7 +360,7 @@
- (define_insn "sse_vmmulv4sf3"
- [(set (match_operand:V4SF 0 "register_operand" "=x")
- (vec_merge:V4SF
-- (mult:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
-+ (mult:V4SF (match_operand:V4SF 1 "register_operand" "0")
- (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
- (match_dup 1)
- (const_int 1)))]
-@@ -492,19 +492,6 @@
- [(set_attr "type" "sse")
- (set_attr "mode" "V4SF")])
-
--(define_insn "*sse_vmsmaxv4sf3_finite"
-- [(set (match_operand:V4SF 0 "register_operand" "=x")
-- (vec_merge:V4SF
-- (smax:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
-- (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
-- (match_dup 1)
-- (const_int 1)))]
-- "TARGET_SSE && flag_finite_math_only
-- && ix86_binary_operator_ok (SMAX, V4SFmode, operands)"
-- "maxss\t{%2, %0|%0, %2}"
-- [(set_attr "type" "sse")
-- (set_attr "mode" "SF")])
--
- (define_insn "sse_vmsmaxv4sf3"
- [(set (match_operand:V4SF 0 "register_operand" "=x")
- (vec_merge:V4SF
-@@ -547,19 +534,6 @@
- [(set_attr "type" "sse")
- (set_attr "mode" "V4SF")])
-
--(define_insn "*sse_vmsminv4sf3_finite"
-- [(set (match_operand:V4SF 0 "register_operand" "=x")
-- (vec_merge:V4SF
-- (smin:V4SF (match_operand:V4SF 1 "nonimmediate_operand" "%0")
-- (match_operand:V4SF 2 "nonimmediate_operand" "xm"))
-- (match_dup 1)
-- (const_int 1)))]
-- "TARGET_SSE && flag_finite_math_only
-- && ix86_binary_operator_ok (SMIN, V4SFmode, operands)"
-- "minss\t{%2, %0|%0, %2}"
-- [(set_attr "type" "sse")
-- (set_attr "mode" "SF")])
--
- (define_insn "sse_vmsminv4sf3"
- [(set (match_operand:V4SF 0 "register_operand" "=x")
- (vec_merge:V4SF
-@@ -1398,7 +1372,7 @@
- (define_insn "sse2_vmaddv2df3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (vec_merge:V2DF
-- (plus:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
-+ (plus:V2DF (match_operand:V2DF 1 "register_operand" "0")
- (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
- (match_dup 1)
- (const_int 1)))]
-@@ -1454,7 +1428,7 @@
- (define_insn "sse2_vmmulv2df3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (vec_merge:V2DF
-- (mult:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
-+ (mult:V2DF (match_operand:V2DF 1 "register_operand" "0")
- (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
- (match_dup 1)
- (const_int 1)))]
-@@ -1544,19 +1518,6 @@
- [(set_attr "type" "sseadd")
- (set_attr "mode" "V2DF")])
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ rtx reg;
++
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9335,32 +9312,36 @@
+ switch (GET_MODE (sh_compare_op0))
+ {
+ case SImode:
+- emit_insn (gen_cmpgtsi_media (operands[0],
++ emit_insn (gen_cmpgtsi_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
--(define_insn "*sse2_vmsmaxv2df3_finite"
-- [(set (match_operand:V2DF 0 "register_operand" "=x")
-- (vec_merge:V2DF
-- (smax:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
-- (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
-- (match_dup 1)
-- (const_int 1)))]
-- "TARGET_SSE2 && flag_finite_math_only
-- && ix86_binary_operator_ok (SMAX, V2DFmode, operands)"
-- "maxsd\t{%2, %0|%0, %2}"
-- [(set_attr "type" "sseadd")
-- (set_attr "mode" "DF")])
--
- (define_insn "sse2_vmsmaxv2df3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (vec_merge:V2DF
-@@ -1599,19 +1560,6 @@
- [(set_attr "type" "sseadd")
- (set_attr "mode" "V2DF")])
+ case DImode:
+- emit_insn (gen_cmpgtdi_media (operands[0],
++ emit_insn (gen_cmpgtdi_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
--(define_insn "*sse2_vmsminv2df3_finite"
-- [(set (match_operand:V2DF 0 "register_operand" "=x")
-- (vec_merge:V2DF
-- (smin:V2DF (match_operand:V2DF 1 "nonimmediate_operand" "%0")
-- (match_operand:V2DF 2 "nonimmediate_operand" "xm"))
-- (match_dup 1)
-- (const_int 1)))]
-- "TARGET_SSE2 && flag_finite_math_only
-- && ix86_binary_operator_ok (SMIN, V2DFmode, operands)"
-- "minsd\t{%2, %0|%0, %2}"
-- [(set_attr "type" "sseadd")
-- (set_attr "mode" "DF")])
--
- (define_insn "sse2_vmsminv2df3"
- [(set (match_operand:V2DF 0 "register_operand" "=x")
- (vec_merge:V2DF
-@@ -2778,7 +2726,7 @@
- [(set (match_operand:SSEMODE24 0 "register_operand" "=x")
- (ashiftrt:SSEMODE24
- (match_operand:SSEMODE24 1 "register_operand" "0")
-- (match_operand:SI 2 "nonmemory_operand" "xi")))]
-+ (match_operand:TI 2 "nonmemory_operand" "xn")))]
- "TARGET_SSE2"
- "psra<ssevecsize>\t{%2, %0|%0, %2}"
- [(set_attr "type" "sseishft")
-@@ -2788,7 +2736,7 @@
- [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
- (lshiftrt:SSEMODE248
- (match_operand:SSEMODE248 1 "register_operand" "0")
-- (match_operand:SI 2 "nonmemory_operand" "xi")))]
-+ (match_operand:TI 2 "nonmemory_operand" "xn")))]
- "TARGET_SSE2"
- "psrl<ssevecsize>\t{%2, %0|%0, %2}"
- [(set_attr "type" "sseishft")
-@@ -2798,7 +2746,7 @@
- [(set (match_operand:SSEMODE248 0 "register_operand" "=x")
- (ashift:SSEMODE248
- (match_operand:SSEMODE248 1 "register_operand" "0")
-- (match_operand:SI 2 "nonmemory_operand" "xi")))]
-+ (match_operand:TI 2 "nonmemory_operand" "xn")))]
- "TARGET_SSE2"
- "psll<ssevecsize>\t{%2, %0|%0, %2}"
- [(set_attr "type" "sseishft")
-@@ -2942,7 +2890,7 @@
- (umin:V16QI (match_operand:V16QI 1 "nonimmediate_operand" "")
- (match_operand:V16QI 2 "nonimmediate_operand" "")))]
- "TARGET_SSE2"
-- "ix86_fixup_binary_operands_no_copy (UMAX, V16QImode, operands);")
-+ "ix86_fixup_binary_operands_no_copy (UMIN, V16QImode, operands);")
-
- (define_insn "*uminv16qi3"
- [(set (match_operand:V16QI 0 "register_operand" "=x")
-Index: gcc-4_2-branch/gcc/config/i386/emmintrin.h
-===================================================================
---- gcc-4_2-branch/gcc/config/i386/emmintrin.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/i386/emmintrin.h (revision 124164)
-@@ -1,4 +1,4 @@
--/* Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-+/* Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
-
- This file is part of GCC.
-
-@@ -40,8 +40,10 @@
- typedef short __v8hi __attribute__ ((__vector_size__ (16)));
- typedef char __v16qi __attribute__ ((__vector_size__ (16)));
-
--typedef __v2di __m128i;
--typedef __v2df __m128d;
-+/* The Intel API is flexible enough that we must allow aliasing with other
-+ vector types, and their scalar components. */
-+typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
-+typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
-
- /* Create a selector for use with the SHUFPD instruction. */
- #define _MM_SHUFFLE2(fp1,fp0) \
-@@ -1098,6 +1100,7 @@
- return (__m128i)__builtin_ia32_pmuludq128 ((__v4si)__A, (__v4si)__B);
- }
+ case SFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgtsf_media (operands[0],
++ emit_insn (gen_cmpgtsf_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
-+#if 0
- static __inline __m128i __attribute__((__always_inline__))
- _mm_slli_epi16 (__m128i __A, int __B)
- {
-@@ -1115,7 +1118,16 @@
- {
- return (__m128i)__builtin_ia32_psllqi128 ((__v2di)__A, __B);
- }
-+#else
-+#define _mm_slli_epi16(__A, __B) \
-+ ((__m128i)__builtin_ia32_psllwi128 ((__v8hi)(__A), __B))
-+#define _mm_slli_epi32(__A, __B) \
-+ ((__m128i)__builtin_ia32_pslldi128 ((__v8hi)(__A), __B))
-+#define _mm_slli_epi64(__A, __B) \
-+ ((__m128i)__builtin_ia32_psllqi128 ((__v8hi)(__A), __B))
-+#endif
+ case DFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgtdf_media (operands[0],
++ emit_insn (gen_cmpgtdf_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
-+#if 0
- static __inline __m128i __attribute__((__always_inline__))
- _mm_srai_epi16 (__m128i __A, int __B)
- {
-@@ -1127,18 +1139,24 @@
+ default:
+ FAIL;
+ }
++
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
++
+ DONE;
+ }
+ if (! currently_expanding_to_rtl)
+@@ -9376,12 +9357,15 @@
{
- return (__m128i)__builtin_ia32_psradi128 ((__v4si)__A, __B);
- }
-+#else
-+#define _mm_srai_epi16(__A, __B) \
-+ ((__m128i)__builtin_ia32_psrawi128 ((__v8hi)(__A), __B))
-+#define _mm_srai_epi32(__A, __B) \
-+ ((__m128i)__builtin_ia32_psradi128 ((__v8hi)(__A), __B))
-+#endif
+ if (TARGET_SHMEDIA)
+ {
++ rtx reg;
+ enum machine_mode mode = GET_MODE (sh_compare_op0);
+
+ if ((mode) == VOIDmode)
+ mode = GET_MODE (sh_compare_op1);
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ sh_compare_op0 = force_reg (mode, sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (mode, sh_compare_op1);
+@@ -9390,41 +9374,45 @@
+ {
+ case SImode:
+ {
+- rtx tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ rtx tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode);
+
+ emit_insn (gen_cmpgtsi_media (tmp,
+ sh_compare_op1, sh_compare_op0));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
+ break;
+ }
- #if 0
- static __m128i __attribute__((__always_inline__))
--_mm_srli_si128 (__m128i __A, const int __B)
-+_mm_srli_si128 (__m128i __A, int __B)
- {
-- return ((__m128i)__builtin_ia32_psrldqi128 (__A, __B))
-+ return ((__m128i)__builtin_ia32_psrldqi128 (__A, __B * 8));
- }
+ case DImode:
+ {
+- rtx tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ rtx tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode);
+
+ emit_insn (gen_cmpgtdi_media (tmp,
+ sh_compare_op1, sh_compare_op0));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
+ break;
+ }
- static __m128i __attribute__((__always_inline__))
--_mm_srli_si128 (__m128i __A, const int __B)
-+_mm_srli_si128 (__m128i __A, int __B)
- {
-- return ((__m128i)__builtin_ia32_pslldqi128 (__A, __B))
-+ return ((__m128i)__builtin_ia32_pslldqi128 (__A, __B * 8));
- }
- #else
- #define _mm_srli_si128(__A, __B) \
-@@ -1147,6 +1165,7 @@
- ((__m128i)__builtin_ia32_pslldqi128 (__A, (__B) * 8))
- #endif
+ case SFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgesf_media (operands[0],
++ emit_insn (gen_cmpgesf_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
-+#if 0
- static __inline __m128i __attribute__((__always_inline__))
- _mm_srli_epi16 (__m128i __A, int __B)
- {
-@@ -1164,53 +1183,61 @@
- {
- return (__m128i)__builtin_ia32_psrlqi128 ((__v2di)__A, __B);
- }
-+#else
-+#define _mm_srli_epi16(__A, __B) \
-+ ((__m128i)__builtin_ia32_psrlwi128 ((__v8hi)(__A), __B))
-+#define _mm_srli_epi32(__A, __B) \
-+ ((__m128i)__builtin_ia32_psrldi128 ((__v4si)(__A), __B))
-+#define _mm_srli_epi64(__A, __B) \
-+ ((__m128i)__builtin_ia32_psrlqi128 ((__v4si)(__A), __B))
-+#endif
+ case DFmode:
+ if (! TARGET_SHMEDIA_FPU)
+ FAIL;
+- emit_insn (gen_cmpgedf_media (operands[0],
++ emit_insn (gen_cmpgedf_media (reg,
+ sh_compare_op0, sh_compare_op1));
+ break;
- static __inline __m128i __attribute__((__always_inline__))
- _mm_sll_epi16 (__m128i __A, __m128i __B)
- {
-- return _mm_slli_epi16 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psllw128((__v8hi)__A, (__v8hi)__B);
- }
+ default:
+ FAIL;
+ }
++
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
++
+ DONE;
+ }
- static __inline __m128i __attribute__((__always_inline__))
- _mm_sll_epi32 (__m128i __A, __m128i __B)
+@@ -9456,8 +9444,12 @@
{
-- return _mm_slli_epi32 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_pslld128((__v4si)__A, (__v4si)__B);
- }
-
- static __inline __m128i __attribute__((__always_inline__))
- _mm_sll_epi64 (__m128i __A, __m128i __B)
+ if (TARGET_SHMEDIA)
+ {
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ rtx reg;
++
++ reg = operands[0];
++ if (GET_MODE (operands[0]) == DImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9465,8 +9457,11 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
+- emit_insn (gen_cmpgtudi_media (operands[0],
++ emit_insn (gen_cmpgtudi_media (reg,
+ sh_compare_op0, sh_compare_op1));
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
++
+ DONE;
+ }
+ if (! currently_expanding_to_rtl)
+@@ -9482,8 +9477,12 @@
{
-- return _mm_slli_epi64 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psllq128((__v2di)__A, (__v2di)__B);
- }
-
- static __inline __m128i __attribute__((__always_inline__))
- _mm_sra_epi16 (__m128i __A, __m128i __B)
+ if (TARGET_SHMEDIA)
+ {
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ rtx reg;
++
++ reg = operands[0];
++ if (GET_MODE (operands[0]) == DImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9491,8 +9490,11 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
+- emit_insn (gen_cmpgtudi_media (operands[0],
++ emit_insn (gen_cmpgtudi_media (reg,
+ sh_compare_op1, sh_compare_op0));
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
++
+ DONE;
+ }
+ if (! currently_expanding_to_rtl)
+@@ -9508,10 +9510,12 @@
{
-- return _mm_srai_epi16 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psraw128 ((__v8hi)__A, (__v8hi)__B);
- }
+ if (TARGET_SHMEDIA)
+ {
+- rtx tmp;
++ rtx tmp, reg;
+
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9519,10 +9523,12 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
+- tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode);
+
+ emit_insn (gen_cmpgtudi_media (tmp, sh_compare_op0, sh_compare_op1));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
- static __inline __m128i __attribute__((__always_inline__))
- _mm_sra_epi32 (__m128i __A, __m128i __B)
+ DONE;
+ }
+@@ -9539,10 +9545,12 @@
{
-- return _mm_srai_epi32 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psrad128 ((__v4si)__A, (__v4si)__B);
- }
+ if (TARGET_SHMEDIA)
+ {
+- rtx tmp;
++ rtx tmp, reg;
+
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ sh_compare_op0 = force_reg (GET_MODE (sh_compare_op0), sh_compare_op0);
+ if (sh_compare_op1 != const0_rtx)
+ sh_compare_op1 = force_reg (GET_MODE (sh_compare_op1) == VOIDmode
+@@ -9550,10 +9558,12 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
+- tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (SImode);
+
+ emit_insn (gen_cmpgtudi_media (tmp, sh_compare_op1, sh_compare_op0));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
- static __inline __m128i __attribute__((__always_inline__))
- _mm_srl_epi16 (__m128i __A, __m128i __B)
+ DONE;
+ }
+@@ -9584,11 +9594,12 @@
{
-- return _mm_srli_epi16 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psrlw128 ((__v8hi)__A, (__v8hi)__B);
- }
+ if (TARGET_SHMEDIA)
+ {
+- rtx tmp;
++ rtx tmp, reg;
- static __inline __m128i __attribute__((__always_inline__))
- _mm_srl_epi32 (__m128i __A, __m128i __B)
- {
-- return _mm_srli_epi32 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psrld128 ((__v4si)__A, (__v4si)__B);
- }
+- if (GET_MODE (operands[0]) != DImode)
+- operands[0] = gen_rtx_SUBREG (DImode, operands[0], 0);
+-
++ reg = operands[0];
++ if (GET_MODE (operands[0]) != SImode)
++ reg = no_new_pseudos ? gen_rtx_SUBREG (SImode, operands[0], 0)
++ : gen_reg_rtx (SImode);
+ if (! TARGET_SHMEDIA_FPU
+ && GET_MODE (sh_compare_op0) != DImode
+ && GET_MODE (sh_compare_op0) != SImode)
+@@ -9601,10 +9612,12 @@
+ : GET_MODE (sh_compare_op1),
+ sh_compare_op1);
+
+- tmp = no_new_pseudos ? operands[0] : gen_reg_rtx (DImode);
++ tmp = no_new_pseudos ? reg : gen_reg_rtx (SImode);
+
+ emit_insn (gen_seq (tmp));
+- emit_insn (gen_cmpeqdi_media (operands[0], tmp, const0_rtx));
++ emit_insn (gen_cmpeqdi_media (reg, tmp, const0_rtx));
++ if (GET_MODE (operands[0]) == DImode)
++ emit_insn (gen_extendsidi2 (operands[0], reg));
- static __inline __m128i __attribute__((__always_inline__))
- _mm_srl_epi64 (__m128i __A, __m128i __B)
+ DONE;
+ }
+@@ -9618,8 +9631,8 @@
+ }")
+
+ (define_expand "sunordered"
+- [(set (match_operand:DI 0 "arith_reg_operand" "")
+- (unordered:DI (match_dup 1) (match_dup 2)))]
++ [(set (match_operand:SI 0 "arith_reg_operand" "")
++ (unordered:SI (match_dup 1) (match_dup 2)))]
+ "TARGET_SHMEDIA_FPU"
+ "
{
-- return _mm_srli_epi64 (__A, _mm_cvtsi128_si32 (__B));
-+ return (__m128i)__builtin_ia32_psrlq128 ((__v2di)__A, (__v2di)__B);
- }
+@@ -10378,14 +10391,6 @@
+ (set_attr "fp_mode" "single")])
+
+ (define_insn "cmpeqsf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (eq:DI (match_operand:SF 1 "fp_arith_reg_operand" "f")
+- (match_operand:SF 2 "fp_arith_reg_operand" "f")))]
+- "TARGET_SHMEDIA_FPU"
+- "fcmpeq.s %1, %2, %0"
+- [(set_attr "type" "fcmp_media")])
+-
+-(define_insn "cmpsieqsf_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (eq:SI (match_operand:SF 1 "fp_arith_reg_operand" "f")
+ (match_operand:SF 2 "fp_arith_reg_operand" "f")))]
+@@ -10394,24 +10399,24 @@
+ [(set_attr "type" "fcmp_media")])
+
+ (define_insn "cmpgtsf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (gt:DI (match_operand:SF 1 "fp_arith_reg_operand" "f")
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (gt:SI (match_operand:SF 1 "fp_arith_reg_operand" "f")
+ (match_operand:SF 2 "fp_arith_reg_operand" "f")))]
+ "TARGET_SHMEDIA_FPU"
+ "fcmpgt.s %1, %2, %0"
+ [(set_attr "type" "fcmp_media")])
+
+ (define_insn "cmpgesf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (ge:DI (match_operand:SF 1 "fp_arith_reg_operand" "f")
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (ge:SI (match_operand:SF 1 "fp_arith_reg_operand" "f")
+ (match_operand:SF 2 "fp_arith_reg_operand" "f")))]
+ "TARGET_SHMEDIA_FPU"
+ "fcmpge.s %1, %2, %0"
+ [(set_attr "type" "fcmp_media")])
+
+ (define_insn "cmpunsf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (unordered:DI (match_operand:SF 1 "fp_arith_reg_operand" "f")
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unordered:SI (match_operand:SF 1 "fp_arith_reg_operand" "f")
+ (match_operand:SF 2 "fp_arith_reg_operand" "f")))]
+ "TARGET_SHMEDIA_FPU"
+ "fcmpun.s %1, %2, %0"
+@@ -10884,14 +10889,6 @@
+ (set_attr "fp_mode" "double")])
+
+ (define_insn "cmpeqdf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (eq:DI (match_operand:DF 1 "fp_arith_reg_operand" "f")
+- (match_operand:DF 2 "fp_arith_reg_operand" "f")))]
+- "TARGET_SHMEDIA_FPU"
+- "fcmpeq.d %1,%2,%0"
+- [(set_attr "type" "fcmp_media")])
+-
+-(define_insn "cmpsieqdf_media"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (eq:SI (match_operand:DF 1 "fp_arith_reg_operand" "f")
+ (match_operand:DF 2 "fp_arith_reg_operand" "f")))]
+@@ -10900,24 +10897,24 @@
+ [(set_attr "type" "fcmp_media")])
+
+ (define_insn "cmpgtdf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (gt:DI (match_operand:DF 1 "fp_arith_reg_operand" "f")
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (gt:SI (match_operand:DF 1 "fp_arith_reg_operand" "f")
+ (match_operand:DF 2 "fp_arith_reg_operand" "f")))]
+ "TARGET_SHMEDIA_FPU"
+ "fcmpgt.d %1,%2,%0"
+ [(set_attr "type" "fcmp_media")])
+
+ (define_insn "cmpgedf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (ge:DI (match_operand:DF 1 "fp_arith_reg_operand" "f")
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (ge:SI (match_operand:DF 1 "fp_arith_reg_operand" "f")
+ (match_operand:DF 2 "fp_arith_reg_operand" "f")))]
+ "TARGET_SHMEDIA_FPU"
+ "fcmpge.d %1,%2,%0"
+ [(set_attr "type" "fcmp_media")])
+
+ (define_insn "cmpundf_media"
+- [(set (match_operand:DI 0 "register_operand" "=r")
+- (unordered:DI (match_operand:DF 1 "fp_arith_reg_operand" "f")
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unordered:SI (match_operand:DF 1 "fp_arith_reg_operand" "f")
+ (match_operand:DF 2 "fp_arith_reg_operand" "f")))]
+ "TARGET_SHMEDIA_FPU"
+ "fcmpun.d %1,%2,%0"
+Index: gcc/config/score/predicates.md
+===================================================================
+--- gcc/config/score/predicates.md (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/score/predicates.md (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -75,14 +75,3 @@
+ return IMM_IN_RANGE (INTVAL (op), 15, 1);
+ })
- static __inline __m128i __attribute__((__always_inline__))
-Index: gcc-4_2-branch/gcc/config/i386/sync.md
-===================================================================
---- gcc-4_2-branch/gcc/config/i386/sync.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/i386/sync.md (revision 124164)
-@@ -98,6 +98,15 @@
- ""
- "lock\;cmpxchg<doublemodesuffix>b\t%1")
-
-+;; Theoretically we'd like to use constraint "r" (any reg) for operand
-+;; 3, but that includes ecx. If operand 3 and 4 are the same (like when
-+;; the input is -1LL) GCC might chose to allocate operand 3 to ecx, like
-+;; operand 4. This breaks, as the xchg will move the PIC register contents
-+;; to %ecx then --> boom. Operands 3 and 4 really need to be different
-+;; registers, which in this case means operand 3 must not be ecx.
-+;; Instead of playing tricks with fake early clobbers or the like we
-+;; just enumerate all regs possible here, which (as this is !TARGET_64BIT)
-+;; are just esi and edi.
- (define_insn "*sync_double_compare_and_swapdi_pic"
- [(set (match_operand:DI 0 "register_operand" "=A")
- (match_operand:DI 1 "memory_operand" "+m"))
-@@ -105,7 +114,7 @@
- (unspec_volatile:DI
- [(match_dup 1)
- (match_operand:DI 2 "register_operand" "A")
-- (match_operand:SI 3 "register_operand" "r")
-+ (match_operand:SI 3 "register_operand" "SD")
- (match_operand:SI 4 "register_operand" "c")]
- UNSPECV_CMPXCHG_1))
- (clobber (reg:CC FLAGS_REG))]
-@@ -189,6 +198,8 @@
- ""
- "lock\;cmpxchg<doublemodesuffix>b\t%1")
-
-+;; See above for the explanation of using the constraint "SD" for
-+;; operand 3.
- (define_insn "*sync_double_compare_and_swap_ccdi_pic"
- [(set (match_operand:DI 0 "register_operand" "=A")
- (match_operand:DI 1 "memory_operand" "+m"))
-@@ -196,7 +207,7 @@
- (unspec_volatile:DI
- [(match_dup 1)
- (match_operand:DI 2 "register_operand" "A")
-- (match_operand:SI 3 "register_operand" "r")
-+ (match_operand:SI 3 "register_operand" "SD")
- (match_operand:SI 4 "register_operand" "c")]
- UNSPECV_CMPXCHG_1))
- (set (reg:CCZ FLAGS_REG)
-Index: gcc-4_2-branch/gcc/config/i386/i386.c
+-(define_predicate "const_pow2"
+- (match_code "const_int")
+-{
+- return IMM_IS_POW_OF_2 ((unsigned HOST_WIDE_INT) INTVAL (op), 0, 31);
+-})
+-
+-(define_predicate "const_npow2"
+- (match_code "const_int")
+-{
+- return IMM_IS_POW_OF_2 (~(unsigned HOST_WIDE_INT) INTVAL (op), 0, 31);
+-})
+Index: gcc/config/score/misc.md
===================================================================
---- gcc-4_2-branch/gcc/config/i386/i386.c (revision 123014)
-+++ gcc-4_2-branch/gcc/config/i386/i386.c (revision 124164)
-@@ -14666,7 +14666,7 @@
- BUILTIN_DESC_SWAP_OPERANDS },
- { MASK_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpngess", IX86_BUILTIN_CMPNGESS, UNGT,
- BUILTIN_DESC_SWAP_OPERANDS },
-- { MASK_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, UNORDERED, 0 },
-+ { MASK_SSE, CODE_FOR_sse_vmmaskcmpv4sf3, "__builtin_ia32_cmpordss", IX86_BUILTIN_CMPORDSS, ORDERED, 0 },
-
- { MASK_SSE, CODE_FOR_sminv4sf3, "__builtin_ia32_minps", IX86_BUILTIN_MINPS, 0, 0 },
- { MASK_SSE, CODE_FOR_smaxv4sf3, "__builtin_ia32_maxps", IX86_BUILTIN_MAXPS, 0, 0 },
-@@ -15206,12 +15206,6 @@
- tree v8hi_ftype_v8hi_int
- = build_function_type_list (V8HI_type_node,
- V8HI_type_node, integer_type_node, NULL_TREE);
-- tree v8hi_ftype_v8hi_v2di
-- = build_function_type_list (V8HI_type_node,
-- V8HI_type_node, V2DI_type_node, NULL_TREE);
-- tree v4si_ftype_v4si_v2di
-- = build_function_type_list (V4SI_type_node,
-- V4SI_type_node, V2DI_type_node, NULL_TREE);
- tree v4si_ftype_v8hi_v8hi
- = build_function_type_list (V4SI_type_node,
- V8HI_type_node, V8HI_type_node, NULL_TREE);
-@@ -15479,16 +15473,16 @@
- def_builtin (MASK_SSE2, "__builtin_ia32_pmuludq", di_ftype_v2si_v2si, IX86_BUILTIN_PMULUDQ);
- def_builtin (MASK_SSE2, "__builtin_ia32_pmuludq128", v2di_ftype_v4si_v4si, IX86_BUILTIN_PMULUDQ128);
-
-- def_builtin (MASK_SSE2, "__builtin_ia32_psllw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSLLW128);
-- def_builtin (MASK_SSE2, "__builtin_ia32_pslld128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSLLD128);
-+ def_builtin (MASK_SSE2, "__builtin_ia32_psllw128", v8hi_ftype_v8hi_v8hi, IX86_BUILTIN_PSLLW128);
-+ def_builtin (MASK_SSE2, "__builtin_ia32_pslld128", v4si_ftype_v4si_v4si, IX86_BUILTIN_PSLLD128);
- def_builtin (MASK_SSE2, "__builtin_ia32_psllq128", v2di_ftype_v2di_v2di, IX86_BUILTIN_PSLLQ128);
-
-- def_builtin (MASK_SSE2, "__builtin_ia32_psrlw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRLW128);
-- def_builtin (MASK_SSE2, "__builtin_ia32_psrld128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRLD128);
-+ def_builtin (MASK_SSE2, "__builtin_ia32_psrlw128", v8hi_ftype_v8hi_v8hi, IX86_BUILTIN_PSRLW128);
-+ def_builtin (MASK_SSE2, "__builtin_ia32_psrld128", v4si_ftype_v4si_v4si, IX86_BUILTIN_PSRLD128);
- def_builtin (MASK_SSE2, "__builtin_ia32_psrlq128", v2di_ftype_v2di_v2di, IX86_BUILTIN_PSRLQ128);
-
-- def_builtin (MASK_SSE2, "__builtin_ia32_psraw128", v8hi_ftype_v8hi_v2di, IX86_BUILTIN_PSRAW128);
-- def_builtin (MASK_SSE2, "__builtin_ia32_psrad128", v4si_ftype_v4si_v2di, IX86_BUILTIN_PSRAD128);
-+ def_builtin (MASK_SSE2, "__builtin_ia32_psraw128", v8hi_ftype_v8hi_v8hi, IX86_BUILTIN_PSRAW128);
-+ def_builtin (MASK_SSE2, "__builtin_ia32_psrad128", v4si_ftype_v4si_v4si, IX86_BUILTIN_PSRAD128);
-
- def_builtin (MASK_SSE2, "__builtin_ia32_pslldqi128", v2di_ftype_v2di_int, IX86_BUILTIN_PSLLDQI128);
- def_builtin (MASK_SSE2, "__builtin_ia32_psllwi128", v8hi_ftype_v8hi_int, IX86_BUILTIN_PSLLWI128);
-@@ -15968,7 +15962,7 @@
- enum machine_mode tmode, mode1;
- tree arg0, arg1, arg2;
- int elt;
-- rtx op0, op1;
-+ rtx op0, op1, target;
-
- arg0 = TREE_VALUE (arglist);
- arg1 = TREE_VALUE (TREE_CHAIN (arglist));
-@@ -15988,9 +15982,13 @@
- op0 = force_reg (tmode, op0);
- op1 = force_reg (mode1, op1);
-
-- ix86_expand_vector_set (true, op0, op1, elt);
-+ /* OP0 is the source of these builtin functions and shouldn't be
-+ modified. Create a copy, use it and return it as target. */
-+ target = gen_reg_rtx (tmode);
-+ emit_move_insn (target, op0);
-+ ix86_expand_vector_set (true, target, op1, elt);
-
-- return op0;
-+ return target;
- }
+--- gcc/config/score/misc.md (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/score/misc.md (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -380,38 +380,3 @@
+ [(set_attr "type" "arith")
+ (set_attr "mode" "SI")])
- /* Expand an expression EXP that calls a built-in function,
-@@ -16204,9 +16202,106 @@
- emit_insn (pat);
- return target;
-
-+ case IX86_BUILTIN_PSLLWI128:
-+ icode = CODE_FOR_ashlv8hi3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSLLDI128:
-+ icode = CODE_FOR_ashlv4si3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSLLQI128:
-+ icode = CODE_FOR_ashlv2di3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSRAWI128:
-+ icode = CODE_FOR_ashrv8hi3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSRADI128:
-+ icode = CODE_FOR_ashrv4si3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSRLWI128:
-+ icode = CODE_FOR_lshrv8hi3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSRLDI128:
-+ icode = CODE_FOR_lshrv4si3;
-+ goto do_pshifti;
-+ case IX86_BUILTIN_PSRLQI128:
-+ icode = CODE_FOR_lshrv2di3;
-+ goto do_pshifti;
-+ do_pshifti:
-+ arg0 = TREE_VALUE (arglist);
-+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));
-+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
-+ op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
-+
-+ if (GET_CODE (op1) != CONST_INT)
-+ {
-+ error ("shift must be an immediate");
-+ return const0_rtx;
-+ }
-+ if (INTVAL (op1) < 0 || INTVAL (op1) > 255)
-+ op1 = GEN_INT (255);
-+
-+ tmode = insn_data[icode].operand[0].mode;
-+ mode1 = insn_data[icode].operand[1].mode;
-+ if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
-+ op0 = copy_to_reg (op0);
-+
-+ target = gen_reg_rtx (tmode);
-+ pat = GEN_FCN (icode) (target, op0, op1);
-+ if (!pat)
-+ return 0;
-+ emit_insn (pat);
-+ return target;
-+
-+ case IX86_BUILTIN_PSLLW128:
-+ icode = CODE_FOR_ashlv8hi3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSLLD128:
-+ icode = CODE_FOR_ashlv4si3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSLLQ128:
-+ icode = CODE_FOR_ashlv2di3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSRAW128:
-+ icode = CODE_FOR_ashrv8hi3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSRAD128:
-+ icode = CODE_FOR_ashrv4si3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSRLW128:
-+ icode = CODE_FOR_lshrv8hi3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSRLD128:
-+ icode = CODE_FOR_lshrv4si3;
-+ goto do_pshift;
-+ case IX86_BUILTIN_PSRLQ128:
-+ icode = CODE_FOR_lshrv2di3;
-+ goto do_pshift;
-+ do_pshift:
-+ arg0 = TREE_VALUE (arglist);
-+ arg1 = TREE_VALUE (TREE_CHAIN (arglist));
-+ op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
-+ op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
-+
-+ tmode = insn_data[icode].operand[0].mode;
-+ mode1 = insn_data[icode].operand[1].mode;
-+
-+ if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
-+ op0 = copy_to_reg (op0);
-+
-+ op1 = simplify_gen_subreg (TImode, op1, GET_MODE (op1), 0);
-+ if (! (*insn_data[icode].operand[2].predicate) (op1, TImode))
-+ op1 = copy_to_reg (op1);
-+
-+ target = gen_reg_rtx (tmode);
-+ pat = GEN_FCN (icode) (target, op0, op1);
-+ if (!pat)
-+ return 0;
-+ emit_insn (pat);
-+ return target;
-+
- case IX86_BUILTIN_PSLLDQI128:
- case IX86_BUILTIN_PSRLDQI128:
-- icode = ( fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3
-+ icode = (fcode == IX86_BUILTIN_PSLLDQI128 ? CODE_FOR_sse2_ashlti3
- : CODE_FOR_sse2_lshrti3);
- arg0 = TREE_VALUE (arglist);
- arg1 = TREE_VALUE (TREE_CHAIN (arglist));
-@@ -16227,7 +16322,8 @@
- return const0_rtx;
- }
- target = gen_reg_rtx (V2DImode);
-- pat = GEN_FCN (icode) (simplify_gen_subreg (tmode, target, V2DImode, 0), op0, op1);
-+ pat = GEN_FCN (icode) (simplify_gen_subreg (tmode, target, V2DImode, 0),
-+ op0, op1);
- if (! pat)
- return 0;
- emit_insn (pat);
-Index: gcc-4_2-branch/gcc/config/avr/predicates.md
-===================================================================
---- gcc-4_2-branch/gcc/config/avr/predicates.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/avr/predicates.md (revision 124164)
-@@ -1,5 +1,5 @@
- ;; Predicate definitions for ATMEL AVR micro controllers.
--;; Copyright (C) 2006 Free Software Foundation, Inc.
-+;; Copyright (C) 2006, 2007 Free Software Foundation, Inc.
- ;;
- ;; This file is part of GCC.
- ;;
-@@ -33,23 +33,15 @@
- (and (match_code "reg")
- (match_test "REGNO (op) == REG_SP")))
-
--;; Return true if OP is a valid address for an I/O register.
--(define_predicate "io_address_operand"
-- (and (match_code "const_int")
-- (match_test "INTVAL (op) >= 0x20
-- && INTVAL (op) <= 0x60 - GET_MODE_SIZE (mode)")))
+-(define_insn "bitclr_c"
+- [(set (match_operand:SI 0 "register_operand" "=e,d")
+- (and:SI (match_operand:SI 1 "register_operand" "0,d")
+- (match_operand:SI 2 "const_npow2")))
+- (clobber (reg:CC CC_REGNUM))]
+- ""
+- "@
+- bitclr! %0, %F2
+- bitclr.c %0, %1, %F2"
+- [(set_attr "type" "arith")
+- (set_attr "mode" "SI")])
-
- ;; Return true if OP is a valid address for lower half of I/O space.
- (define_predicate "low_io_address_operand"
- (and (match_code "const_int")
-- (match_test "INTVAL (op) >= 0x20
-- && INTVAL (op) <= 0x40 - GET_MODE_SIZE (mode)")))
--
--;; Return true if OP is a valid address for higth half of I/O space.
--(define_predicate "higth_io_address_operand"
-+ (match_test "IN_RANGE((INTVAL (op)), 0x20, 0x3F)")))
-+
-+;; Return true if OP is a valid address for high half of I/O space.
-+(define_predicate "high_io_address_operand"
- (and (match_code "const_int")
-- (match_test "INTVAL (op) >= 0x40
-- && INTVAL (op) <= 0x60 - GET_MODE_SIZE (mode)")))
-+ (match_test "IN_RANGE((INTVAL (op)), 0x40, 0x5F)")))
-
- ;; Returns 1 if OP is a SYMBOL_REF.
- (define_predicate "symbol_ref_operand"
-Index: gcc-4_2-branch/gcc/config/avr/avr.md
-===================================================================
---- gcc-4_2-branch/gcc/config/avr/avr.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/avr/avr.md (revision 124164)
-@@ -1,7 +1,7 @@
- ;; -*- Mode: Scheme -*-
- ;; Machine description for GNU compiler,
- ;; for ATMEL AVR micro controllers.
--;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006
-+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007
- ;; Free Software Foundation, Inc.
- ;; Contributed by Denis Chertykov (denisc@overta.ru)
-
-@@ -463,7 +463,7 @@
- (use (match_operand:QI 1 "register_operand" "r"))
- (use (match_operand:QI 2 "const_int_operand" "n"))
- (clobber (match_scratch:HI 3 "=0"))
-- (clobber (match_scratch:QI 4 "=1"))]
-+ (clobber (match_scratch:QI 4 "=&1"))]
+-(define_insn "bitset_c"
+- [(set (match_operand:SI 0 "register_operand" "=e,d")
+- (ior:SI (match_operand:SI 1 "register_operand" "0,d")
+- (match_operand:SI 2 "const_pow2")))
+- (clobber (reg:CC CC_REGNUM))]
+- ""
+- "@
+- bitset! %0, %E2
+- bitset.c %0, %1, %E2"
+- [(set_attr "type" "arith")
+- (set_attr "mode" "SI")])
+-
+-(define_insn "bittgl_c"
+- [(set (match_operand:SI 0 "register_operand" "=e,d")
+- (xor:SI (match_operand:SI 1 "register_operand" "0,d")
+- (match_operand:SI 2 "const_pow2")))
+- (clobber (reg:CC CC_REGNUM))]
+- ""
+- "@
+- bittgl! %0, %E2
+- bittgl.c %0, %1, %E2"
+- [(set_attr "type" "arith")
+- (set_attr "mode" "SI")])
+Index: gcc/config/score/score.c
+===================================================================
+--- gcc/config/score/score.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/score/score.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1168,7 +1168,7 @@
+ {
+ gcc_assert (code == CONST_INT);
+ fprintf (file, HOST_WIDE_INT_PRINT_HEX,
+- (unsigned HOST_WIDE_INT) INTVAL (op) >> 16);
++ (INTVAL (op) >> 16) & 0xffff);
+ }
+ else if (c == 'D')
+ {
+@@ -1176,7 +1176,7 @@
+ {
+ rtx temp = gen_lowpart (SImode, op);
+ gcc_assert (GET_MODE (op) == SFmode);
+- fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (temp));
++ fprintf (file, HOST_WIDE_INT_PRINT_HEX, INTVAL (temp) & 0xffffffff);
+ }
+ else
+ output_addr_const (file, op);
+Index: gcc/config/score/score.h
+===================================================================
+--- gcc/config/score/score.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/score/score.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -785,6 +785,7 @@
+ output anything and let undefined symbol become external. However
+ the assembler uses length information on externals to allocate in
+ data/sdata bss/sbss, thereby saving exec time. */
++#undef ASM_OUTPUT_EXTERNAL
+ #define ASM_OUTPUT_EXTERNAL(STREAM, DECL, NAME) \
+ score_output_external (STREAM, DECL, NAME)
+
+Index: gcc/config/pa/pa.md
+===================================================================
+--- gcc/config/pa/pa.md (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/pa/pa.md (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -39,6 +39,9 @@
+ (UNSPEC_TLSLDBASE 7)
+ (UNSPEC_TLSIE 8)
+ (UNSPEC_TLSLE 9)
++ (UNSPEC_TLSGD_PIC 10)
++ (UNSPEC_TLSLDM_PIC 11)
++ (UNSPEC_TLSIE_PIC 12)
+ ])
+
+ ;; UNSPEC_VOLATILE:
+@@ -9890,33 +9893,55 @@
+ (define_insn "tgd_load"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(match_operand 1 "tgd_symbolic_operand" "")] UNSPEC_TLSGD))
+- (clobber (reg:SI 1))]
++ (clobber (reg:SI 1))
++ (use (reg:SI 27))]
+ ""
+ "*
+ {
+- if (flag_pic)
+- return \"addil LT'%1-$tls_gdidx$,%%r19\;ldo RT'%1-$tls_gdidx$(%%r1),%0\";
+- else
+- return \"addil LR'%1-$tls_gdidx$,%%r27\;ldo RR'%1-$tls_gdidx$(%%r1),%0\";
++ return \"addil LR'%1-$tls_gdidx$,%%r27\;ldo RR'%1-$tls_gdidx$(%%r1),%0\";
+ }"
+ [(set_attr "type" "multi")
+ (set_attr "length" "8")])
+
++(define_insn "tgd_load_pic"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec:SI [(match_operand 1 "tgd_symbolic_operand" "")] UNSPEC_TLSGD_PIC))
++ (clobber (reg:SI 1))
++ (use (reg:SI 19))]
++ ""
++ "*
++{
++ return \"addil LT'%1-$tls_gdidx$,%%r19\;ldo RT'%1-$tls_gdidx$(%%r1),%0\";
++}"
++ [(set_attr "type" "multi")
++ (set_attr "length" "8")])
++
+ (define_insn "tld_load"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(match_operand 1 "tld_symbolic_operand" "")] UNSPEC_TLSLDM))
+- (clobber (reg:SI 1))]
++ (clobber (reg:SI 1))
++ (use (reg:SI 27))]
""
- "st %a0+,__zero_reg__
- dec %1
-@@ -477,7 +477,7 @@
- (use (match_operand:HI 1 "register_operand" "!w,d"))
- (use (match_operand:HI 2 "const_int_operand" "n,n"))
- (clobber (match_scratch:HI 3 "=0,0"))
-- (clobber (match_scratch:HI 4 "=1,1"))]
-+ (clobber (match_scratch:HI 4 "=&1,&1"))]
+ "*
+ {
+- if (flag_pic)
+- return \"addil LT'%1-$tls_ldidx$,%%r19\;ldo RT'%1-$tls_ldidx$(%%r1),%0\";
+- else
+- return \"addil LR'%1-$tls_ldidx$,%%r27\;ldo RR'%1-$tls_ldidx$(%%r1),%0\";
++ return \"addil LR'%1-$tls_ldidx$,%%r27\;ldo RR'%1-$tls_ldidx$(%%r1),%0\";
+ }"
+ [(set_attr "type" "multi")
+ (set_attr "length" "8")])
+
++(define_insn "tld_load_pic"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec:SI [(match_operand 1 "tld_symbolic_operand" "")] UNSPEC_TLSLDM_PIC))
++ (clobber (reg:SI 1))
++ (use (reg:SI 19))]
++ ""
++ "*
++{
++ return \"addil LT'%1-$tls_ldidx$,%%r19\;ldo RT'%1-$tls_ldidx$(%%r1),%0\";
++}"
++ [(set_attr "type" "multi")
++ (set_attr "length" "8")])
++
+ (define_insn "tld_offset_load"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (plus:SI (unspec:SI [(match_operand 1 "tld_symbolic_operand" "")]
+@@ -9942,18 +9967,29 @@
+ (define_insn "tie_load"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (unspec:SI [(match_operand 1 "tie_symbolic_operand" "")] UNSPEC_TLSIE))
+- (clobber (reg:SI 1))]
++ (clobber (reg:SI 1))
++ (use (reg:SI 27))]
""
- "*{
- if (which_alternative==0)
-@@ -2364,7 +2364,7 @@
- (if_then_else
- (match_operator 0 "eqne_operator"
- [(zero_extract
-- (mem:QI (match_operand 1 "higth_io_address_operand" "n"))
-+ (mem:QI (match_operand 1 "high_io_address_operand" "n"))
- (const_int 1)
- (match_operand 2 "const_int_operand" "n"))
- (const_int 0)])
-@@ -2385,7 +2385,7 @@
- [(set (pc)
- (if_then_else
- (match_operator 0 "gelt_operator"
-- [(mem:QI (match_operand 1 "higth_io_address_operand" "n"))
-+ [(mem:QI (match_operand 1 "high_io_address_operand" "n"))
- (const_int 0)])
- (label_ref (match_operand 2 "" ""))
- (pc)))]
-Index: gcc-4_2-branch/gcc/config/avr/avr.c
-===================================================================
---- gcc-4_2-branch/gcc/config/avr/avr.c (revision 123014)
-+++ gcc-4_2-branch/gcc/config/avr/avr.c (revision 124164)
-@@ -1,5 +1,5 @@
- /* Subroutines for insn-output.c for ATMEL AVR micro controllers
-- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006
-+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007
- Free Software Foundation, Inc.
- Contributed by Denis Chertykov (denisc@overta.ru)
-
-@@ -141,12 +141,26 @@
- { 1, 0, 0, 0, NULL }, /* unknown device specified */
- { 1, 0, 0, 0, "__AVR_ARCH__=1" },
- { 0, 0, 0, 0, "__AVR_ARCH__=2" },
-+ { 0, 0, 0, 1, "__AVR_ARCH__=25"},
- { 0, 0, 1, 0, "__AVR_ARCH__=3" },
- { 0, 1, 0, 1, "__AVR_ARCH__=4" },
-- { 0, 1, 1, 1, "__AVR_ARCH__=5" },
-- { 0, 0, 0, 1, "__AVR_ARCH__=25"}
-+ { 0, 1, 1, 1, "__AVR_ARCH__=5" }
- };
-
-+/* These names are used as the index into the avr_arch_types[] table
-+ above. */
-+
-+enum avr_arch
+ "*
+ {
+- if (flag_pic)
+- return \"addil LT'%1-$tls_ieoff$,%%r19\;ldw RT'%1-$tls_ieoff$(%%r1),%0\";
+- else
+- return \"addil LR'%1-$tls_ieoff$,%%r27\;ldw RR'%1-$tls_ieoff$(%%r1),%0\";
++ return \"addil LR'%1-$tls_ieoff$,%%r27\;ldw RR'%1-$tls_ieoff$(%%r1),%0\";
+ }"
+ [(set_attr "type" "multi")
+ (set_attr "length" "8")])
+
++(define_insn "tie_load_pic"
++ [(set (match_operand:SI 0 "register_operand" "=r")
++ (unspec:SI [(match_operand 1 "tie_symbolic_operand" "")] UNSPEC_TLSIE_PIC))
++ (clobber (reg:SI 1))
++ (use (reg:SI 19))]
++ ""
++ "*
+{
-+ ARCH_UNKNOWN,
-+ ARCH_AVR1,
-+ ARCH_AVR2,
-+ ARCH_AVR25,
-+ ARCH_AVR3,
-+ ARCH_AVR4,
-+ ARCH_AVR5
-+};
-+
- struct mcu_type_s {
- const char *const name;
- int arch; /* index in avr_arch_types[] */
-@@ -164,103 +178,103 @@
-
- static const struct mcu_type_s avr_mcu_types[] = {
- /* Classic, <= 8K. */
-- { "avr2", 2, NULL },
-- { "at90s2313", 2, "__AVR_AT90S2313__" },
-- { "at90s2323", 2, "__AVR_AT90S2323__" },
-- { "at90s2333", 2, "__AVR_AT90S2333__" },
-- { "at90s2343", 2, "__AVR_AT90S2343__" },
-- { "attiny22", 2, "__AVR_ATtiny22__" },
-- { "attiny26", 2, "__AVR_ATtiny26__" },
-- { "at90s4414", 2, "__AVR_AT90S4414__" },
-- { "at90s4433", 2, "__AVR_AT90S4433__" },
-- { "at90s4434", 2, "__AVR_AT90S4434__" },
-- { "at90s8515", 2, "__AVR_AT90S8515__" },
-- { "at90c8534", 2, "__AVR_AT90C8534__" },
-- { "at90s8535", 2, "__AVR_AT90S8535__" },
-+ { "avr2", ARCH_AVR2, NULL },
-+ { "at90s2313", ARCH_AVR2, "__AVR_AT90S2313__" },
-+ { "at90s2323", ARCH_AVR2, "__AVR_AT90S2323__" },
-+ { "at90s2333", ARCH_AVR2, "__AVR_AT90S2333__" },
-+ { "at90s2343", ARCH_AVR2, "__AVR_AT90S2343__" },
-+ { "attiny22", ARCH_AVR2, "__AVR_ATtiny22__" },
-+ { "attiny26", ARCH_AVR2, "__AVR_ATtiny26__" },
-+ { "at90s4414", ARCH_AVR2, "__AVR_AT90S4414__" },
-+ { "at90s4433", ARCH_AVR2, "__AVR_AT90S4433__" },
-+ { "at90s4434", ARCH_AVR2, "__AVR_AT90S4434__" },
-+ { "at90s8515", ARCH_AVR2, "__AVR_AT90S8515__" },
-+ { "at90c8534", ARCH_AVR2, "__AVR_AT90C8534__" },
-+ { "at90s8535", ARCH_AVR2, "__AVR_AT90S8535__" },
- /* Classic + MOVW, <= 8K. */
-- { "avr25", 6, NULL },
-- { "attiny13", 6, "__AVR_ATtiny13__" },
-- { "attiny2313", 6, "__AVR_ATtiny2313__" },
-- { "attiny24", 6, "__AVR_ATtiny24__" },
-- { "attiny44", 6, "__AVR_ATtiny44__" },
-- { "attiny84", 6, "__AVR_ATtiny84__" },
-- { "attiny25", 6, "__AVR_ATtiny25__" },
-- { "attiny45", 6, "__AVR_ATtiny45__" },
-- { "attiny85", 6, "__AVR_ATtiny85__" },
-- { "attiny261", 6, "__AVR_ATtiny261__" },
-- { "attiny461", 6, "__AVR_ATtiny461__" },
-- { "attiny861", 6, "__AVR_ATtiny861__" },
-- { "at86rf401", 6, "__AVR_AT86RF401__" },
-+ { "avr25", ARCH_AVR25, NULL },
-+ { "attiny13", ARCH_AVR25, "__AVR_ATtiny13__" },
-+ { "attiny2313", ARCH_AVR25, "__AVR_ATtiny2313__" },
-+ { "attiny24", ARCH_AVR25, "__AVR_ATtiny24__" },
-+ { "attiny44", ARCH_AVR25, "__AVR_ATtiny44__" },
-+ { "attiny84", ARCH_AVR25, "__AVR_ATtiny84__" },
-+ { "attiny25", ARCH_AVR25, "__AVR_ATtiny25__" },
-+ { "attiny45", ARCH_AVR25, "__AVR_ATtiny45__" },
-+ { "attiny85", ARCH_AVR25, "__AVR_ATtiny85__" },
-+ { "attiny261", ARCH_AVR25, "__AVR_ATtiny261__" },
-+ { "attiny461", ARCH_AVR25, "__AVR_ATtiny461__" },
-+ { "attiny861", ARCH_AVR25, "__AVR_ATtiny861__" },
-+ { "at86rf401", ARCH_AVR25, "__AVR_AT86RF401__" },
- /* Classic, > 8K. */
-- { "avr3", 3, NULL },
-- { "atmega103", 3, "__AVR_ATmega103__" },
-- { "atmega603", 3, "__AVR_ATmega603__" },
-- { "at43usb320", 3, "__AVR_AT43USB320__" },
-- { "at43usb355", 3, "__AVR_AT43USB355__" },
-- { "at76c711", 3, "__AVR_AT76C711__" },
-+ { "avr3", ARCH_AVR3, NULL },
-+ { "atmega103", ARCH_AVR3, "__AVR_ATmega103__" },
-+ { "atmega603", ARCH_AVR3, "__AVR_ATmega603__" },
-+ { "at43usb320", ARCH_AVR3, "__AVR_AT43USB320__" },
-+ { "at43usb355", ARCH_AVR3, "__AVR_AT43USB355__" },
-+ { "at76c711", ARCH_AVR3, "__AVR_AT76C711__" },
- /* Enhanced, <= 8K. */
-- { "avr4", 4, NULL },
-- { "atmega8", 4, "__AVR_ATmega8__" },
-- { "atmega48", 4, "__AVR_ATmega48__" },
-- { "atmega88", 4, "__AVR_ATmega88__" },
-- { "atmega8515", 4, "__AVR_ATmega8515__" },
-- { "atmega8535", 4, "__AVR_ATmega8535__" },
-- { "at90pwm1", 4, "__AVR_AT90PWM1__" },
-- { "at90pwm2", 4, "__AVR_AT90PWM2__" },
-- { "at90pwm3", 4, "__AVR_AT90PWM3__" },
-- { "at90usb82", 5, "__AVR_AT90USB82__" },
-+ { "avr4", ARCH_AVR4, NULL },
-+ { "atmega8", ARCH_AVR4, "__AVR_ATmega8__" },
-+ { "atmega48", ARCH_AVR4, "__AVR_ATmega48__" },
-+ { "atmega88", ARCH_AVR4, "__AVR_ATmega88__" },
-+ { "atmega8515", ARCH_AVR4, "__AVR_ATmega8515__" },
-+ { "atmega8535", ARCH_AVR4, "__AVR_ATmega8535__" },
-+ { "at90pwm1", ARCH_AVR4, "__AVR_AT90PWM1__" },
-+ { "at90pwm2", ARCH_AVR4, "__AVR_AT90PWM2__" },
-+ { "at90pwm3", ARCH_AVR4, "__AVR_AT90PWM3__" },
-+ { "at90usb82", ARCH_AVR4, "__AVR_AT90USB82__" },
- /* Enhanced, > 8K. */
-- { "avr5", 5, NULL },
-- { "atmega16", 5, "__AVR_ATmega16__" },
-- { "atmega161", 5, "__AVR_ATmega161__" },
-- { "atmega162", 5, "__AVR_ATmega162__" },
-- { "atmega163", 5, "__AVR_ATmega163__" },
-- { "atmega164p",5, "__AVR_ATmega164P__" },
-- { "atmega165", 5, "__AVR_ATmega165__" },
-- { "atmega165p",5, "__AVR_ATmega165P__" },
-- { "atmega168", 5, "__AVR_ATmega168__" },
-- { "atmega169", 5, "__AVR_ATmega169__" },
-- { "atmega169p",5, "__AVR_ATmega169P__" },
-- { "atmega32", 5, "__AVR_ATmega32__" },
-- { "atmega323", 5, "__AVR_ATmega323__" },
-- { "atmega324p",5, "__AVR_ATmega324P__" },
-- { "atmega325", 5, "__AVR_ATmega325__" },
-- { "atmega325p", 5, "__AVR_ATmega325P__" },
-- { "atmega3250", 5, "__AVR_ATmega3250__" },
-- { "atmega3250p", 5, "__AVR_ATmega3250P__" },
-- { "atmega329", 5, "__AVR_ATmega329__" },
-- { "atmega329p", 5, "__AVR_ATmega329P__" },
-- { "atmega3290", 5, "__AVR_ATmega3290__" },
-- { "atmega3290p", 5, "__AVR_ATmega3290P__" },
-- { "atmega406", 5, "__AVR_ATmega406__" },
-- { "atmega64", 5, "__AVR_ATmega64__" },
-- { "atmega640", 5, "__AVR_ATmega640__" },
-- { "atmega644", 5, "__AVR_ATmega644__" },
-- { "atmega644p",5, "__AVR_ATmega644P__" },
-- { "atmega645", 5, "__AVR_ATmega645__" },
-- { "atmega6450", 5, "__AVR_ATmega6450__" },
-- { "atmega649", 5, "__AVR_ATmega649__" },
-- { "atmega6490", 5, "__AVR_ATmega6490__" },
-- { "atmega128", 5, "__AVR_ATmega128__" },
-- { "atmega1280",5, "__AVR_ATmega1280__" },
-- { "atmega1281",5, "__AVR_ATmega1281__" },
-- { "at90can32", 5, "__AVR_AT90CAN32__" },
-- { "at90can64", 5, "__AVR_AT90CAN64__" },
-- { "at90can128", 5, "__AVR_AT90CAN128__" },
-- { "at90usb162", 5, "__AVR_AT90USB162__" },
-- { "at90usb646", 5, "__AVR_AT90USB646__" },
-- { "at90usb647", 5, "__AVR_AT90USB647__" },
-- { "at90usb1286", 5, "__AVR_AT90USB1286__" },
-- { "at90usb1287", 5, "__AVR_AT90USB1287__" },
-- { "at94k", 5, "__AVR_AT94K__" },
-+ { "avr5", ARCH_AVR5, NULL },
-+ { "atmega16", ARCH_AVR5, "__AVR_ATmega16__" },
-+ { "atmega161", ARCH_AVR5, "__AVR_ATmega161__" },
-+ { "atmega162", ARCH_AVR5, "__AVR_ATmega162__" },
-+ { "atmega163", ARCH_AVR5, "__AVR_ATmega163__" },
-+ { "atmega164p", ARCH_AVR5, "__AVR_ATmega164P__" },
-+ { "atmega165", ARCH_AVR5, "__AVR_ATmega165__" },
-+ { "atmega165p", ARCH_AVR5, "__AVR_ATmega165P__" },
-+ { "atmega168", ARCH_AVR5, "__AVR_ATmega168__" },
-+ { "atmega169", ARCH_AVR5, "__AVR_ATmega169__" },
-+ { "atmega169p", ARCH_AVR5, "__AVR_ATmega169P__" },
-+ { "atmega32", ARCH_AVR5, "__AVR_ATmega32__" },
-+ { "atmega323", ARCH_AVR5, "__AVR_ATmega323__" },
-+ { "atmega324p", ARCH_AVR5, "__AVR_ATmega324P__" },
-+ { "atmega325", ARCH_AVR5, "__AVR_ATmega325__" },
-+ { "atmega325p", ARCH_AVR5, "__AVR_ATmega325P__" },
-+ { "atmega3250", ARCH_AVR5, "__AVR_ATmega3250__" },
-+ { "atmega3250p", ARCH_AVR5, "__AVR_ATmega3250P__" },
-+ { "atmega329", ARCH_AVR5, "__AVR_ATmega329__" },
-+ { "atmega329p", ARCH_AVR5, "__AVR_ATmega329P__" },
-+ { "atmega3290", ARCH_AVR5, "__AVR_ATmega3290__" },
-+ { "atmega3290p", ARCH_AVR5, "__AVR_ATmega3290P__" },
-+ { "atmega406", ARCH_AVR5, "__AVR_ATmega406__" },
-+ { "atmega64", ARCH_AVR5, "__AVR_ATmega64__" },
-+ { "atmega640", ARCH_AVR5, "__AVR_ATmega640__" },
-+ { "atmega644", ARCH_AVR5, "__AVR_ATmega644__" },
-+ { "atmega644p", ARCH_AVR5, "__AVR_ATmega644P__" },
-+ { "atmega645", ARCH_AVR5, "__AVR_ATmega645__" },
-+ { "atmega6450", ARCH_AVR5, "__AVR_ATmega6450__" },
-+ { "atmega649", ARCH_AVR5, "__AVR_ATmega649__" },
-+ { "atmega6490", ARCH_AVR5, "__AVR_ATmega6490__" },
-+ { "atmega128", ARCH_AVR5, "__AVR_ATmega128__" },
-+ { "atmega1280", ARCH_AVR5, "__AVR_ATmega1280__" },
-+ { "atmega1281", ARCH_AVR5, "__AVR_ATmega1281__" },
-+ { "at90can32", ARCH_AVR5, "__AVR_AT90CAN32__" },
-+ { "at90can64", ARCH_AVR5, "__AVR_AT90CAN64__" },
-+ { "at90can128", ARCH_AVR5, "__AVR_AT90CAN128__" },
-+ { "at90usb162", ARCH_AVR5, "__AVR_AT90USB162__" },
-+ { "at90usb646", ARCH_AVR5, "__AVR_AT90USB646__" },
-+ { "at90usb647", ARCH_AVR5, "__AVR_AT90USB647__" },
-+ { "at90usb1286", ARCH_AVR5, "__AVR_AT90USB1286__" },
-+ { "at90usb1287", ARCH_AVR5, "__AVR_AT90USB1287__" },
-+ { "at94k", ARCH_AVR5, "__AVR_AT94K__" },
- /* Assembler only. */
-- { "avr1", 1, NULL },
-- { "at90s1200", 1, "__AVR_AT90S1200__" },
-- { "attiny11", 1, "__AVR_ATtiny11__" },
-- { "attiny12", 1, "__AVR_ATtiny12__" },
-- { "attiny15", 1, "__AVR_ATtiny15__" },
-- { "attiny28", 1, "__AVR_ATtiny28__" },
-- { NULL, 0, NULL }
-+ { "avr1", ARCH_AVR1, NULL },
-+ { "at90s1200", ARCH_AVR1, "__AVR_AT90S1200__" },
-+ { "attiny11", ARCH_AVR1, "__AVR_ATtiny11__" },
-+ { "attiny12", ARCH_AVR1, "__AVR_ATtiny12__" },
-+ { "attiny15", ARCH_AVR1, "__AVR_ATtiny15__" },
-+ { "attiny28", ARCH_AVR1, "__AVR_ATtiny28__" },
-+ { NULL, ARCH_UNKNOWN, NULL }
++ return \"addil LT'%1-$tls_ieoff$,%%r19\;ldw RT'%1-$tls_ieoff$(%%r1),%0\";
++}"
++ [(set_attr "type" "multi")
++ (set_attr "length" "8")])
++
+ (define_insn "tle_load"
+ [(set (match_operand:SI 0 "register_operand" "=r")
+ (plus:SI (unspec:SI [(match_operand 1 "tle_symbolic_operand" "")]
+Index: gcc/config/pa/pa.c
+===================================================================
+--- gcc/config/pa/pa.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/pa/pa.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -726,7 +726,10 @@
+ {
+ case TLS_MODEL_GLOBAL_DYNAMIC:
+ tmp = gen_reg_rtx (Pmode);
+- emit_insn (gen_tgd_load (tmp, addr));
++ if (flag_pic)
++ emit_insn (gen_tgd_load_pic (tmp, addr));
++ else
++ emit_insn (gen_tgd_load (tmp, addr));
+ ret = hppa_tls_call (tmp);
+ break;
+
+@@ -734,7 +737,10 @@
+ ret = gen_reg_rtx (Pmode);
+ tmp = gen_reg_rtx (Pmode);
+ start_sequence ();
+- emit_insn (gen_tld_load (tmp, addr));
++ if (flag_pic)
++ emit_insn (gen_tld_load_pic (tmp, addr));
++ else
++ emit_insn (gen_tld_load (tmp, addr));
+ t1 = hppa_tls_call (tmp);
+ insn = get_insns ();
+ end_sequence ();
+@@ -750,7 +756,10 @@
+ tmp = gen_reg_rtx (Pmode);
+ ret = gen_reg_rtx (Pmode);
+ emit_insn (gen_tp_load (tp));
+- emit_insn (gen_tie_load (tmp, addr));
++ if (flag_pic)
++ emit_insn (gen_tie_load_pic (tmp, addr));
++ else
++ emit_insn (gen_tie_load (tmp, addr));
+ emit_move_insn (ret, gen_rtx_PLUS (Pmode, tp, tmp));
+ break;
+
+Index: gcc/config/soft-fp/quad.h
+===================================================================
+--- gcc/config/soft-fp/quad.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/quad.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+ Definitions for IEEE Quad Precision.
+- Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
++ Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com),
+ Jakub Jelinek (jj@ultra.linux.cz),
+@@ -176,15 +176,15 @@
+ } longs;
+ struct {
+ #if __BYTE_ORDER == __BIG_ENDIAN
+- unsigned sign : 1;
+- unsigned exp : _FP_EXPBITS_Q;
+- unsigned long frac1 : _FP_FRACBITS_Q-(_FP_IMPLBIT_Q != 0)-_FP_W_TYPE_SIZE;
+- unsigned long frac0 : _FP_W_TYPE_SIZE;
++ unsigned sign : 1;
++ unsigned exp : _FP_EXPBITS_Q;
++ _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
++ _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
+ #else
+- unsigned long frac0 : _FP_W_TYPE_SIZE;
+- unsigned long frac1 : _FP_FRACBITS_Q-(_FP_IMPLBIT_Q != 0)-_FP_W_TYPE_SIZE;
+- unsigned exp : _FP_EXPBITS_Q;
+- unsigned sign : 1;
++ _FP_W_TYPE frac0 : _FP_W_TYPE_SIZE;
++ _FP_W_TYPE frac1 : _FP_FRACBITS_Q - (_FP_IMPLBIT_Q != 0) - _FP_W_TYPE_SIZE;
++ unsigned exp : _FP_EXPBITS_Q;
++ unsigned sign : 1;
+ #endif
+ } bits;
};
+Index: gcc/config/soft-fp/floatunsidf.c
+===================================================================
+--- gcc/config/soft-fp/floatunsidf.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/floatunsidf.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+ Convert a 32bit unsigned integer to IEEE double
+- Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
++ Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com) and
+ Jakub Jelinek (jj@ultra.linux.cz).
+@@ -32,8 +32,7 @@
+ #include "soft-fp.h"
+ #include "double.h"
+
+-double
+-__floatunsidf(USItype i)
++DFtype __floatunsidf(USItype i)
+ {
+ FP_DECL_EX;
+ FP_DECL_D(A);
+Index: gcc/config/soft-fp/floatundidf.c
+===================================================================
+--- gcc/config/soft-fp/floatundidf.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/floatundidf.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+ Convert a 64bit unsigned integer to IEEE double
+- Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
++ Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com) and
+ Jakub Jelinek (jj@ultra.linux.cz).
+@@ -32,8 +32,7 @@
+ #include "soft-fp.h"
+ #include "double.h"
+
+-double
+-__floatundidf(UDItype i)
++DFtype __floatundidf(UDItype i)
+ {
+ FP_DECL_EX;
+ FP_DECL_D(A);
+Index: gcc/config/soft-fp/extended.h
+===================================================================
+--- gcc/config/soft-fp/extended.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/extended.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+ Definitions for IEEE Extended Precision.
+- Copyright (C) 1999,2006 Free Software Foundation, Inc.
++ Copyright (C) 1999,2006,2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Jakub Jelinek (jj@ultra.linux.cz).
+
+@@ -94,12 +94,6 @@
+ X##_f[1] = _flo.bits.frac1; \
+ X##_e = _flo.bits.exp; \
+ X##_s = _flo.bits.sign; \
+- if (!X##_e && (X##_f[1] || X##_f[0]) \
+- && !(X##_f[1] & _FP_IMPLBIT_E)) \
+- { \
+- X##_e++; \
+- FP_SET_EXCEPTION(FP_EX_DENORM); \
+- } \
+ } while (0)
- int avr_case_values_threshold = 30000;
-@@ -316,6 +330,8 @@
- const struct mcu_type_s *t;
- const struct base_arch_s *base;
+ #define FP_UNPACK_RAW_EP(X, val) \
+@@ -112,12 +106,6 @@
+ X##_f[1] = _flo->bits.frac1; \
+ X##_e = _flo->bits.exp; \
+ X##_s = _flo->bits.sign; \
+- if (!X##_e && (X##_f[1] || X##_f[0]) \
+- && !(X##_f[1] & _FP_IMPLBIT_E)) \
+- { \
+- X##_e++; \
+- FP_SET_EXCEPTION(FP_EX_DENORM); \
+- } \
+ } while (0)
-+ flag_delete_null_pointer_checks = 0;
-+
- for (t = avr_mcu_types; t->name; t++)
- if (strcmp (t->name, avr_mcu_name) == 0)
- break;
-@@ -1025,7 +1041,7 @@
- case REG_Y: return "Y";
- case REG_Z: return "Z";
- default:
-- gcc_unreachable ();
-+ output_operand_lossage ("address operand requires constraint for X, Y, or Z register");
- }
- return NULL;
- }
-@@ -4698,7 +4714,7 @@
- }
- else
- {
-- const char *func_name = IDENTIFIER_POINTER (DECL_NAME (*node));
-+ const char *func_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (*node));
- const char *attr = IDENTIFIER_POINTER (name);
+ #define FP_PACK_RAW_E(val, X) \
+@@ -164,13 +152,13 @@
- /* If the function has the 'signal' or 'interrupt' attribute, test to
-@@ -5092,6 +5108,7 @@
- *total = COSTS_N_INSNS (AVR_MEGA ? 2 : 1);
- else
- return false;
-+ break;
+ #define FP_UNPACK_SEMIRAW_E(X,val) \
+ do { \
+- _FP_UNPACK_RAW_E(X,val); \
++ FP_UNPACK_RAW_E(X,val); \
+ _FP_UNPACK_SEMIRAW(E,4,X); \
+ } while (0)
- case HImode:
- if (AVR_ENHANCED)
-@@ -5100,6 +5117,7 @@
- *total = COSTS_N_INSNS (AVR_MEGA ? 2 : 1);
- else
- return false;
-+ break;
+ #define FP_UNPACK_SEMIRAW_EP(X,val) \
+ do { \
+- _FP_UNPACK_RAW_EP(X,val); \
++ FP_UNPACK_RAW_EP(X,val); \
+ _FP_UNPACK_SEMIRAW(E,4,X); \
+ } while (0)
- default:
- return false;
-Index: gcc-4_2-branch/gcc/config/avr/avr.h
-===================================================================
---- gcc-4_2-branch/gcc/config/avr/avr.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/avr/avr.h (revision 124164)
-@@ -661,7 +661,11 @@
- #define ASM_OUTPUT_SKIP(STREAM, N) \
- fprintf (STREAM, "\t.skip %lu,0\n", (unsigned long)(N))
-
--#define ASM_OUTPUT_ALIGN(STREAM, POWER)
-+#define ASM_OUTPUT_ALIGN(STREAM, POWER) \
-+ do { \
-+ if ((POWER) > 1) \
-+ fprintf (STREAM, "\t.p2align\t%d\n", POWER); \
-+ } while (0)
-
- #define CASE_VECTOR_MODE HImode
-
-@@ -758,9 +762,7 @@
- mmcu=at76*:-m avr3}\
- %{mmcu=atmega8*|\
- mmcu=atmega48|\
-- mmcu=at90pwm1|\
-- mmcu=at90pwm2|\
-- mmcu=at90pwm3:-m avr4}\
-+ mmcu=at90pwm*:-m avr4}\
- %{mmcu=atmega16*|\
- mmcu=atmega32*|\
- mmcu=atmega406|\
-@@ -771,18 +773,14 @@
- mmcu=at94k:-m avr5}\
- %{mmcu=atmega324*|\
- mmcu=atmega325*|\
-- mmcu=atmega3250*|\
- mmcu=atmega329*|\
-- mmcu=atmega3290*|\
- mmcu=atmega406|\
- mmcu=atmega48|\
- mmcu=atmega88|\
- mmcu=atmega64|\
- mmcu=atmega644*|\
-- mmcu=atmega645|\
-- mmcu=atmega6450|\
-- mmcu=atmega649|\
-- mmcu=atmega6490|\
-+ mmcu=atmega645*|\
-+ mmcu=atmega649*|\
- mmcu=atmega128|\
- mmcu=atmega162|\
- mmcu=atmega164*|\
-Index: gcc-4_2-branch/gcc/config/rs6000/darwin.h
-===================================================================
---- gcc-4_2-branch/gcc/config/rs6000/darwin.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/rs6000/darwin.h (revision 124164)
-@@ -280,8 +280,6 @@
-
- /* This says how to output an assembler line to define a global common
- symbol. */
--/* ? */
--#undef ASM_OUTPUT_ALIGNED_COMMON
- #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED) \
- do { \
- unsigned HOST_WIDE_INT _new_size = SIZE; \
-Index: gcc-4_2-branch/gcc/config/darwin.h
-===================================================================
---- gcc-4_2-branch/gcc/config/darwin.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/darwin.h (revision 124164)
-@@ -652,11 +652,11 @@
- } \
+@@ -189,13 +177,13 @@
+ #define FP_PACK_SEMIRAW_E(val,X) \
+ do { \
+ _FP_PACK_SEMIRAW(E,4,X); \
+- _FP_PACK_RAW_E(val,X); \
++ FP_PACK_RAW_E(val,X); \
} while (0)
--/* The maximum alignment which the object file format can support.
-- For Mach-O, this is 2^15. */
-+/* The maximum alignment which the object file format can support in
-+ bits. For Mach-O, this is 2^15 bytes. */
+ #define FP_PACK_SEMIRAW_EP(val,X) \
+ do { \
+ _FP_PACK_SEMIRAW(E,4,X); \
+- _FP_PACK_RAW_EP(val,X); \
++ FP_PACK_RAW_EP(val,X); \
+ } while (0)
- #undef MAX_OFILE_ALIGNMENT
--#define MAX_OFILE_ALIGNMENT 0x8000
-+#define MAX_OFILE_ALIGNMENT (0x8000 * 8)
+ #define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,4,X)
+@@ -277,14 +265,14 @@
+ XFtype flt;
+ struct {
+ #if __BYTE_ORDER == __BIG_ENDIAN
+- unsigned long pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
+- unsigned sign : 1;
+- unsigned exp : _FP_EXPBITS_E;
+- unsigned long frac : _FP_W_TYPE_SIZE;
++ _FP_W_TYPE pad : (_FP_W_TYPE_SIZE - 1 - _FP_EXPBITS_E);
++ unsigned sign : 1;
++ unsigned exp : _FP_EXPBITS_E;
++ _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
+ #else
+- unsigned long frac : _FP_W_TYPE_SIZE;
+- unsigned exp : _FP_EXPBITS_E;
+- unsigned sign : 1;
++ _FP_W_TYPE frac : _FP_W_TYPE_SIZE;
++ unsigned exp : _FP_EXPBITS_E;
++ unsigned sign : 1;
+ #endif
+ } bits;
+ };
+@@ -299,11 +287,6 @@
+ X##_f1 = 0; \
+ X##_e = _flo.bits.exp; \
+ X##_s = _flo.bits.sign; \
+- if (!X##_e && X##_f0 && !(X##_f0 & _FP_IMPLBIT_E)) \
+- { \
+- X##_e++; \
+- FP_SET_EXCEPTION(FP_EX_DENORM); \
+- } \
+ } while (0)
- /* Declare the section variables. */
- #ifndef USED_FOR_TARGET
-Index: gcc-4_2-branch/gcc/config/score/crti.asm
-===================================================================
---- gcc-4_2-branch/gcc/config/score/crti.asm (revision 123014)
-+++ gcc-4_2-branch/gcc/config/score/crti.asm (revision 124164)
-@@ -43,8 +43,8 @@
- .mask 0x00000000, 0
- _start:
- la r28, _gp
-- la r8, _bss_start
-- la r9, _bss_end__
-+ la r8, __bss_start
-+ la r9, __bss_end__
- sub! r9, r8
- srli! r9, 2
- addi r9, -1
-@@ -91,8 +91,8 @@
- .mask 0x00000000,0
- _start:
- la r28, _gp
-- la r8, _bss_start
-- la r9, _bss_end__
-+ la r8, __bss_start
-+ la r9, __bss_end__
- sub! r9, r8
- srli! r9, 2
- addi r9, -1
-Index: gcc-4_2-branch/gcc/config/score/misc.md
-===================================================================
---- gcc-4_2-branch/gcc/config/score/misc.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/score/misc.md (revision 124164)
-@@ -111,7 +111,7 @@
- (zero_extract (match_operand:SI 1 "memory_operand" "")
- (match_operand:SI 2 "immediate_operand" "")
- (match_operand:SI 3 "immediate_operand" "")))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- {
- if (mdx_unaligned_load (operands))
- DONE;
-@@ -124,7 +124,7 @@
- (match_operand:SI 1 "immediate_operand" "")
- (match_operand:SI 2 "immediate_operand" ""))
- (match_operand:SI 3 "register_operand" ""))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- {
- if (mdx_unaligned_store (operands))
- DONE;
-@@ -137,7 +137,7 @@
- (sign_extract (match_operand:SI 1 "memory_operand" "")
- (match_operand:SI 2 "immediate_operand" "")
- (match_operand:SI 3 "immediate_operand" "")))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- {
- if (mdx_unaligned_load (operands))
- DONE;
-@@ -150,7 +150,7 @@
- (match_operand:BLK 1 "general_operand"))
- (use (match_operand:SI 2 ""))
- (use (match_operand:SI 3 "const_int_operand"))])]
-- "!TARGET_SCORE5U"
-+ "!TARGET_SCORE5U && TARGET_ULS"
- {
- if (mdx_block_move (operands))
- DONE;
-@@ -164,7 +164,7 @@
- (match_operand:SI 2 "const_simm12" "")))
- (set (match_operand:QI 3 "register_operand" "=d")
- (mem:QI (match_dup 1)))]
-- "!TARGET_SCORE5U"
-+ ""
- "lbu %3, [%1]+, %2"
- [(set_attr "type" "load")
- (set_attr "mode" "QI")])
-@@ -175,7 +175,7 @@
- (match_operand:SI 2 "const_simm12" "")))
- (set (match_operand:HI 3 "register_operand" "=d")
- (mem:HI (match_dup 1)))]
-- "!TARGET_SCORE5U"
-+ ""
- "lhu %3, [%1]+, %2"
- [(set_attr "type" "load")
- (set_attr "mode" "HI")])
-@@ -186,7 +186,7 @@
- (match_operand:SI 2 "const_simm12" "")))
- (set (match_operand:SI 3 "register_operand" "=d")
- (mem:SI (match_dup 1)))]
-- "!TARGET_SCORE5U"
-+ ""
- "lw %3, [%1]+, %2"
- [(set_attr "type" "load")
- (set_attr "mode" "SI")])
-@@ -197,7 +197,7 @@
- (match_operand:SI 2 "const_simm12" "")))
- (set (mem:QI (match_dup 1))
- (match_operand:QI 3 "register_operand" "d"))]
-- "!TARGET_SCORE5U"
-+ ""
- "sb %3, [%1]+, %2"
- [(set_attr "type" "store")
- (set_attr "mode" "QI")])
-@@ -208,7 +208,7 @@
- (match_operand:SI 2 "const_simm12" "")))
- (set (mem:HI (match_dup 1))
- (match_operand:HI 3 "register_operand" "d"))]
-- "!TARGET_SCORE5U"
-+ ""
- "sh %3, [%1]+, %2"
- [(set_attr "type" "store")
- (set_attr "mode" "HI")])
-@@ -219,7 +219,7 @@
- (match_operand:SI 2 "const_simm12" "")))
- (set (mem:SI (match_dup 1))
- (match_operand:SI 3 "register_operand" "d"))]
-- "!TARGET_SCORE5U"
-+ ""
- "sw %3, [%1]+, %2"
- [(set_attr "type" "store")
- (set_attr "mode" "SI")])
-@@ -231,7 +231,7 @@
- (set (match_operand:QI 3 "register_operand" "=d")
- (mem:QI (plus:SI (match_dup 1)
- (match_dup 2))))]
-- "!TARGET_SCORE5U"
-+ ""
- "lbu %3, [%1, %2]+"
- [(set_attr "type" "load")
- (set_attr "mode" "QI")])
-@@ -243,7 +243,7 @@
- (set (match_operand:HI 3 "register_operand" "=d")
- (mem:HI (plus:SI (match_dup 1)
- (match_dup 2))))]
-- "!TARGET_SCORE5U"
-+ ""
- "lhu %3, [%1, %2]+"
- [(set_attr "type" "load")
- (set_attr "mode" "HI")])
-@@ -255,7 +255,7 @@
- (set (match_operand:SI 3 "register_operand" "=d")
- (mem:SI (plus:SI (match_dup 1)
- (match_dup 2))))]
-- "!TARGET_SCORE5U"
-+ ""
- "lw %3, [%1, %2]+"
- [(set_attr "type" "load")
- (set_attr "mode" "SI")])
-@@ -267,7 +267,7 @@
- (set (mem:QI (plus:SI (match_dup 1)
- (match_dup 2)))
- (match_operand:QI 3 "register_operand" "d"))]
-- "!TARGET_SCORE5U"
-+ ""
- "sb %3, [%1, %2]+"
- [(set_attr "type" "store")
- (set_attr "mode" "QI")])
-@@ -279,7 +279,7 @@
- (set (mem:HI (plus:SI (match_dup 1)
- (match_dup 2)))
- (match_operand:HI 3 "register_operand" "d"))]
-- "!TARGET_SCORE5U"
-+ ""
- "sh %3, [%1, %2]+"
- [(set_attr "type" "store")
- (set_attr "mode" "HI")])
-@@ -291,7 +291,7 @@
- (set (mem:SI (plus:SI (match_dup 1)
- (match_dup 2)))
- (match_operand:SI 3 "register_operand" "d"))]
-- "!TARGET_SCORE5U"
-+ ""
- "sw %3, [%1, %2]+"
- [(set_attr "type" "store")
- (set_attr "mode" "SI")])
-@@ -302,7 +302,7 @@
- (const_int 4)))
- (set (reg:SI LC_REGNUM)
- (unspec:SI [(mem:BLK (match_dup 1))] LCB))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- "lcb [%1]+"
- [(set_attr "type" "load")
- (set_attr "mode" "SI")])
-@@ -316,7 +316,7 @@
- (reg:SI LC_REGNUM)] LCW))
- (set (reg:SI LC_REGNUM)
- (unspec:SI [(mem:BLK (match_dup 1))] LCB))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- "lcw %2, [%1]+"
- [(set_attr "type" "load")
- (set_attr "mode" "SI")])
-@@ -328,7 +328,7 @@
- (set (match_operand:SI 2 "register_operand" "=d")
- (unspec:SI [(mem:BLK (match_dup 1))
- (reg:SI LC_REGNUM)] LCE))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- "lce %2, [%1]+"
- [(set_attr "type" "load")
- (set_attr "mode" "SI")])
-@@ -341,7 +341,7 @@
- (unspec:BLK [(match_operand:SI 2 "register_operand" "d")] SCB))
- (set (reg:SI SC_REGNUM)
- (unspec:SI [(match_dup 2)] SCLC))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- "scb %2, [%1]+"
- [(set_attr "type" "store")
- (set_attr "mode" "SI")])
-@@ -355,7 +355,7 @@
- (reg:SI SC_REGNUM)] SCW))
- (set (reg:SI SC_REGNUM)
- (unspec:SI [(match_dup 2)] SCLC))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- "scw %2, [%1]+"
- [(set_attr "type" "store")
- (set_attr "mode" "SI")])
-@@ -366,7 +366,7 @@
- (const_int 4)))
- (set (mem:BLK (match_dup 1))
- (unspec:BLK [(reg:SI SC_REGNUM)] SCE))]
-- "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN"
-+ "!TARGET_SCORE5U && !TARGET_LITTLE_ENDIAN && TARGET_ULS"
- "sce [%1]+"
- [(set_attr "type" "store")
- (set_attr "mode" "SI")])
-Index: gcc-4_2-branch/gcc/config/score/mac.md
-===================================================================
---- gcc-4_2-branch/gcc/config/score/mac.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/score/mac.md (revision 124164)
-@@ -26,7 +26,7 @@
- [(set (match_operand:SI 0 "register_operand" "=d")
- (smax:SI (match_operand:SI 1 "register_operand" "d")
- (match_operand:SI 2 "register_operand" "d")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "max %0, %1, %2"
- [(set_attr "type" "arith")
- (set_attr "mode" "SI")])
-@@ -35,7 +35,7 @@
- [(set (match_operand:SI 0 "register_operand" "=d")
- (smin:SI (match_operand:SI 1 "register_operand" "d")
- (match_operand:SI 2 "register_operand" "d")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "min %0, %1, %2"
- [(set_attr "type" "arith")
- (set_attr "mode" "SI")])
-@@ -43,7 +43,7 @@
- (define_insn "abssi2"
- [(set (match_operand:SI 0 "register_operand" "=d")
- (abs:SI (match_operand:SI 1 "register_operand" "d")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "abs %0, %1"
- [(set_attr "type" "arith")
- (set_attr "mode" "SI")])
-@@ -51,7 +51,7 @@
- (define_insn "clzsi2"
- [(set (match_operand:SI 0 "register_operand" "=d")
- (clz:SI (match_operand:SI 1 "register_operand" "d")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "clz %0, %1"
- [(set_attr "type" "arith")
- (set_attr "mode" "SI")])
-@@ -59,7 +59,7 @@
- (define_insn "sffs"
- [(set (match_operand:SI 0 "register_operand" "=d")
- (unspec:SI [(match_operand:SI 1 "register_operand" "d")] SFFS))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "bitrev %0, %1, r0\;clz %0, %0\;addi %0, 0x1"
- [(set_attr "type" "arith")
- (set_attr "mode" "SI")])
-@@ -67,7 +67,7 @@
- (define_expand "ffssi2"
- [(set (match_operand:SI 0 "register_operand")
- (ffs:SI (match_operand:SI 1 "register_operand")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- {
- emit_insn (gen_sffs (operands[0], operands[1]));
- emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_REG (CC_NZmode, CC_REGNUM),
-@@ -85,7 +85,7 @@
- (match_operand:SI 1 "register_operand" ""))
- (set (match_operand:SI 2 "hireg_operand" "")
- (match_operand:SI 3 "register_operand" ""))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- [(parallel
- [(set (match_dup 0) (match_dup 1))
- (set (match_dup 2) (match_dup 3))])])
-@@ -95,7 +95,7 @@
- (match_operand:SI 1 "register_operand" ""))
- (set (match_operand:SI 2 "loreg_operand" "")
- (match_operand:SI 3 "register_operand" ""))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- [(parallel
- [(set (match_dup 2) (match_dup 3))
- (set (match_dup 0) (match_dup 1))])])
-@@ -106,7 +106,7 @@
- (match_operand:SI 1 "register_operand" "d"))
- (set (match_operand:SI 2 "hireg_operand" "=h")
- (match_operand:SI 3 "register_operand" "d"))])]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "mtcehl %3, %1"
- [(set_attr "type" "fce")
- (set_attr "mode" "SI")])
-@@ -117,7 +117,7 @@
- (match_operand:SI 3 "register_operand" "d,d,d"))
- (match_operand:SI 1 "register_operand" "0,d,l")))
- (clobber (reg:SI HI_REGNUM))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "@
- mad %2, %3
- mtcel%S1 %1\;mad %2, %3
-@@ -130,7 +130,7 @@
- (mult:SI (match_operand:SI 2 "register_operand" "d,d,d")
- (match_operand:SI 3 "register_operand" "d,d,d"))))
- (clobber (reg:SI HI_REGNUM))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "@
- msb %2, %3
- mtcel%S1 %1\;msb %2, %3
-@@ -143,7 +143,7 @@
- (sign_extend:DI (match_operand:SI 2 "register_operand" "%d"))
- (sign_extend:DI (match_operand:SI 3 "register_operand" "d")))
- (match_operand:DI 1 "register_operand" "0")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "mad %2, %3"
- [(set_attr "mode" "DI")])
-
-@@ -153,7 +153,7 @@
- (zero_extend:DI (match_operand:SI 2 "register_operand" "%d"))
- (zero_extend:DI (match_operand:SI 3 "register_operand" "d")))
- (match_operand:DI 1 "register_operand" "0")))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "madu %2, %3"
- [(set_attr "mode" "DI")])
-
-@@ -164,7 +164,7 @@
- (mult:DI
- (sign_extend:DI (match_operand:SI 2 "register_operand" "%d"))
- (sign_extend:DI (match_operand:SI 3 "register_operand" "d")))))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "msb %2, %3"
- [(set_attr "mode" "DI")])
-
-@@ -176,6 +176,6 @@
- (match_operand:SI 2 "register_operand" "%d"))
- (zero_extend:DI
- (match_operand:SI 3 "register_operand" "d")))))]
-- "TARGET_MAC"
-+ "TARGET_MAC || TARGET_SCORE7D"
- "msbu %2, %3"
- [(set_attr "mode" "DI")])
-Index: gcc-4_2-branch/gcc/config/score/score.h
-===================================================================
---- gcc-4_2-branch/gcc/config/score/score.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/score/score.h (revision 124164)
-@@ -38,7 +38,9 @@
-
- #undef ASM_SPEC
- #define ASM_SPEC \
-- "%{!mel:-EB} %{mel:-EL} %{mscore5u:-SCORE5U} %{mscore7:-SCORE7} %{G*}"
-+ "%{!mel:-EB} %{mel:-EL} %{mscore5:-SCORE5} %{mscore5u:-SCORE5U} \
-+ %{mscore7:%{!mmac:-SCORE7}} %{mscore7:%{mmac:-SCORE7D}} \
-+ %{mscore7d:-SCORE7D} %{G*}"
-
- #undef LINK_SPEC
- #define LINK_SPEC "%{!mel:-EB} %{mel:-EL} %{G*}"
-@@ -286,6 +288,16 @@
- 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, \
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }
-
-+/* Macro to conditionally modify fixed_regs/call_used_regs. */
-+#define PIC_OFFSET_TABLE_REGNUM 29
-+
-+#define CONDITIONAL_REGISTER_USAGE \
-+{ \
-+ if (!flag_pic) \
-+ fixed_regs[PIC_OFFSET_TABLE_REGNUM] = \
-+ call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 0; \
-+}
-+
- #define HARD_REGNO_NREGS(REGNO, MODE) \
- ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
+ #define FP_UNPACK_RAW_EP(X, val) \
+@@ -315,11 +298,6 @@
+ X##_f1 = 0; \
+ X##_e = _flo->bits.exp; \
+ X##_s = _flo->bits.sign; \
+- if (!X##_e && X##_f0 && !(X##_f0 & _FP_IMPLBIT_E)) \
+- { \
+- X##_e++; \
+- FP_SET_EXCEPTION(FP_EX_DENORM); \
+- } \
+ } while (0)
-@@ -534,7 +546,7 @@
- If `ACCUMULATE_OUTGOING_ARGS' is also defined, the only effect
- of this macro is to determine whether the space is included in
- `current_function_outgoing_args_size'. */
--#define OUTGOING_REG_PARM_STACK_SPACE
-+#define OUTGOING_REG_PARM_STACK_SPACE 1
+ #define FP_PACK_RAW_E(val, X) \
+@@ -365,13 +343,13 @@
- #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
+ #define FP_UNPACK_SEMIRAW_E(X,val) \
+ do { \
+- _FP_UNPACK_RAW_E(X,val); \
++ FP_UNPACK_RAW_E(X,val); \
+ _FP_UNPACK_SEMIRAW(E,2,X); \
+ } while (0)
-Index: gcc-4_2-branch/gcc/config/score/score.md
-===================================================================
---- gcc-4_2-branch/gcc/config/score/score.md (revision 123014)
-+++ gcc-4_2-branch/gcc/config/score/score.md (revision 124164)
-@@ -1511,7 +1511,7 @@
- (use (match_operand 2 "" "")) ; max iterations
- (use (match_operand 3 "" "")) ; loop level
- (use (match_operand 4 "" ""))] ; label
-- ""
-+ "!TARGET_NHWLOOP"
- {
- if (INTVAL (operands[3]) > 1)
- FAIL;
-@@ -1539,6 +1539,6 @@
- (const_int -1)))
- (clobber (reg:CC CC_REGNUM))
- ]
-- ""
-+ "!TARGET_NHWLOOP"
- "bcnz %1"
- [(set_attr "type" "branch")])
-Index: gcc-4_2-branch/gcc/config/score/score.opt
-===================================================================
---- gcc-4_2-branch/gcc/config/score/score.opt (revision 123014)
-+++ gcc-4_2-branch/gcc/config/score/score.opt (revision 124164)
-@@ -27,10 +27,22 @@
- Target RejectNegative Report Mask(LITTLE_ENDIAN)
- Generate little-endian code
-
-+mnhwloop
-+Target RejectNegative Report Mask(NHWLOOP)
-+Disable bcnz instruction
-+
-+muls
-+Target RejectNegative Report Mask(ULS)
-+Enable unaligned load/store instruction
-+
- mmac
- Target RejectNegative Report Mask(MAC)
- Enable mac instruction
-
-+mscore5
-+Target RejectNegative Report Mask(SCORE5)
-+Support SCORE 5 ISA
-+
- mscore5u
- Target RejectNegative Report Mask(SCORE5U)
- Support SCORE 5U ISA
-@@ -39,3 +51,6 @@
- Target RejectNegative Report Mask(SCORE7)
- Support SCORE 7 ISA
-
-+mscore7d
-+Target RejectNegative Report Mask(SCORE7D)
-+Support SCORE 7D ISA
-Index: gcc-4_2-branch/gcc/config/arm/linux-gas.h
-===================================================================
---- gcc-4_2-branch/gcc/config/arm/linux-gas.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/arm/linux-gas.h (revision 124164)
-@@ -28,7 +28,7 @@
- #define DEFAULT_SIGNED_CHAR 0
-
- #undef SUBTARGET_CPP_SPEC
--#define SUBTARGET_CPP_SPEC "%{posix:-D_POSIX_SOURCE}"
-+#define SUBTARGET_CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
-
- #undef SIZE_TYPE
- #define SIZE_TYPE "unsigned int"
-Index: gcc-4_2-branch/gcc/config/pa/pa.c
-===================================================================
---- gcc-4_2-branch/gcc/config/pa/pa.c (revision 123014)
-+++ gcc-4_2-branch/gcc/config/pa/pa.c (revision 124164)
-@@ -9276,7 +9276,7 @@
- gcc_assert (TARGET_SOM);
- if (TARGET_GAS)
- {
-- if (cfun && !cfun->machine->in_nsubspa)
-+ if (cfun && cfun->machine && !cfun->machine->in_nsubspa)
- {
- /* We only want to emit a .nsubspa directive once at the
- start of the function. */
-@@ -9301,7 +9301,8 @@
- text section to output debugging information. Thus, we
- need to forget that we are in the text section so that
- varasm.c will call us when text_section is selected again. */
-- gcc_assert (!cfun || cfun->machine->in_nsubspa == 2);
-+ gcc_assert (!cfun || !cfun->machine
-+ || cfun->machine->in_nsubspa == 2);
- in_section = NULL;
- }
- output_section_asm_op ("\t.SPACE $TEXT$\n\t.NSUBSPA $CODE$");
-Index: gcc-4_2-branch/gcc/config/darwin9.h
-===================================================================
---- gcc-4_2-branch/gcc/config/darwin9.h (revision 123014)
-+++ gcc-4_2-branch/gcc/config/darwin9.h (revision 124164)
-@@ -1,2 +1,13 @@
- /* The linker can generate branch islands. */
- #define DARWIN_LINKER_GENERATES_ISLANDS 1
-+
-+#undef ASM_OUTPUT_ALIGNED_COMMON
-+#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
-+ do { \
-+ unsigned HOST_WIDE_INT _new_size = (SIZE); \
-+ fprintf ((FILE), ".comm "); \
-+ assemble_name ((FILE), (NAME)); \
-+ if (_new_size == 0) _new_size = 1; \
-+ fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", \
-+ _new_size, floor_log2 ((ALIGN) / BITS_PER_UNIT)); \
-+ } while (0)
-Index: gcc-4_2-branch/gcc/reload1.c
-===================================================================
---- gcc-4_2-branch/gcc/reload1.c (revision 123014)
-+++ gcc-4_2-branch/gcc/reload1.c (revision 124164)
-@@ -1167,20 +1167,6 @@
- {
- rtx *pnote;
+ #define FP_UNPACK_SEMIRAW_EP(X,val) \
+ do { \
+- _FP_UNPACK_RAW_EP(X,val); \
++ FP_UNPACK_RAW_EP(X,val); \
+ _FP_UNPACK_SEMIRAW(E,2,X); \
+ } while (0)
-- /* Clean up invalid ASMs so that they don't confuse later passes.
-- See PR 21299. */
-- if (asm_noperands (PATTERN (insn)) >= 0)
-- {
-- extract_insn (insn);
-- if (!constrain_operands (1))
-- {
-- error_for_asm (insn,
-- "%<asm%> operand has impossible constraints");
-- delete_insn (insn);
-- continue;
-- }
-- }
--
- if (CALL_P (insn))
- replace_pseudos_in (& CALL_INSN_FUNCTION_USAGE (insn),
- VOIDmode, CALL_INSN_FUNCTION_USAGE (insn));
-@@ -1239,8 +1225,22 @@
- add_auto_inc_notes (insn, PATTERN (insn));
- #endif
+@@ -390,13 +368,13 @@
+ #define FP_PACK_SEMIRAW_E(val,X) \
+ do { \
+ _FP_PACK_SEMIRAW(E,2,X); \
+- _FP_PACK_RAW_E(val,X); \
++ FP_PACK_RAW_E(val,X); \
+ } while (0)
-- /* And simplify (subreg (reg)) if it appears as an operand. */
-+ /* Simplify (subreg (reg)) if it appears as an operand. */
- cleanup_subreg_operands (insn);
-+
-+ /* Clean up invalid ASMs so that they don't confuse later passes.
-+ See PR 21299. */
-+ if (asm_noperands (PATTERN (insn)) >= 0)
-+ {
-+ extract_insn (insn);
-+ if (!constrain_operands (1))
-+ {
-+ error_for_asm (insn,
-+ "%<asm%> operand has impossible constraints");
-+ delete_insn (insn);
-+ continue;
-+ }
-+ }
- }
+ #define FP_PACK_SEMIRAW_EP(val,X) \
+ do { \
+ _FP_PACK_SEMIRAW(E,2,X); \
+- _FP_PACK_RAW_EP(val,X); \
++ FP_PACK_RAW_EP(val,X); \
+ } while (0)
- /* If we are doing stack checking, give a warning if this function's
-Index: gcc-4_2-branch/libstdc++-v3/include/ext/vstring_util.h
+ #define FP_ISSIGNAN_E(X) _FP_ISSIGNAN(E,2,X)
+Index: gcc/config/soft-fp/floatunsisf.c
===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/ext/vstring_util.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/ext/vstring_util.h (revision 124164)
+--- gcc/config/soft-fp/floatunsisf.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/floatunsisf.c (.../branches/gcc-4_2-branch) (revision 125292)
@@ -1,6 +1,6 @@
- // Versatile string utility -*- C++ -*-
-
--// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -44,6 +44,7 @@
- #include <bits/functexcept.h>
- #include <locale>
- #include <algorithm> // For std::distance, srd::search.
-+#include <bits/ostream_insert.h>
-
- _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
-
-Index: gcc-4_2-branch/libstdc++-v3/include/ext/vstring.h
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/ext/vstring.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/ext/vstring.h (revision 124164)
+ /* Software floating-point emulation.
+ Convert a 32bit unsigned integer to IEEE single
+- Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
++ Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com) and
+ Jakub Jelinek (jj@ultra.linux.cz).
+@@ -32,8 +32,7 @@
+ #include "soft-fp.h"
+ #include "single.h"
+
+-float
+-__floatunsisf(USItype i)
++SFtype __floatunsisf(USItype i)
+ {
+ FP_DECL_EX;
+ FP_DECL_S(A);
+Index: gcc/config/soft-fp/op-common.h
+===================================================================
+--- gcc/config/soft-fp/op-common.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/op-common.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1153,7 +1153,8 @@
+ if (_FP_FRACBITS_##dfs < _FP_FRACBITS_##sfs \
+ || (_FP_EXPMAX_##dfs - _FP_EXPBIAS_##dfs \
+ < _FP_EXPMAX_##sfs - _FP_EXPBIAS_##sfs) \
+- || _FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1) \
++ || (_FP_EXPBIAS_##dfs < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1 \
++ && _FP_EXPBIAS_##dfs != _FP_EXPBIAS_##sfs)) \
+ abort(); \
+ D##_s = S##_s; \
+ _FP_FRAC_COPY_##dwc##_##swc(D, S); \
+@@ -1168,6 +1169,14 @@
+ { \
+ if (_FP_FRAC_ZEROP_##swc(S)) \
+ D##_e = 0; \
++ else if (_FP_EXPBIAS_##dfs \
++ < _FP_EXPBIAS_##sfs + _FP_FRACBITS_##sfs - 1) \
++ { \
++ FP_SET_EXCEPTION(FP_EX_DENORM); \
++ _FP_FRAC_SLL_##dwc(D, (_FP_FRACBITS_##dfs \
++ - _FP_FRACBITS_##sfs)); \
++ D##_e = 0; \
++ } \
+ else \
+ { \
+ int _lz; \
+@@ -1199,7 +1208,8 @@
+ #define FP_TRUNC(dfs,sfs,dwc,swc,D,S) \
+ do { \
+ if (_FP_FRACBITS_##sfs < _FP_FRACBITS_##dfs \
+- || _FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1) \
++ || (_FP_EXPBIAS_##sfs < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1 \
++ && _FP_EXPBIAS_##sfs != _FP_EXPBIAS_##dfs)) \
+ abort(); \
+ D##_s = S##_s; \
+ if (_FP_EXP_NORMAL(sfs, swc, S)) \
+@@ -1211,8 +1221,11 @@
+ { \
+ if (D##_e <= 0) \
+ { \
+- if (D##_e <= 1 - _FP_FRACBITS_##dfs) \
+- _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc); \
++ if (D##_e < 1 - _FP_FRACBITS_##dfs) \
++ { \
++ _FP_FRAC_SET_##swc(S, _FP_ZEROFRAC_##swc); \
++ _FP_FRAC_LOW_##swc(S) |= 1; \
++ } \
+ else \
+ { \
+ _FP_FRAC_HIGH_##sfs(S) |= _FP_IMPLBIT_SH_##sfs; \
+@@ -1234,11 +1247,24 @@
+ if (S##_e == 0) \
+ { \
+ D##_e = 0; \
+- _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
+- if (!_FP_FRAC_ZEROP_##swc(S)) \
++ if (_FP_FRAC_ZEROP_##swc(S)) \
++ _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
++ else \
+ { \
+ FP_SET_EXCEPTION(FP_EX_DENORM); \
+- FP_SET_EXCEPTION(FP_EX_INEXACT); \
++ if (_FP_EXPBIAS_##sfs \
++ < _FP_EXPBIAS_##dfs + _FP_FRACBITS_##dfs - 1) \
++ { \
++ _FP_FRAC_SRS_##swc(S, (_FP_WFRACBITS_##sfs \
++ - _FP_WFRACBITS_##dfs), \
++ _FP_WFRACBITS_##sfs); \
++ _FP_FRAC_COPY_##dwc##_##swc(D, S); \
++ } \
++ else \
++ { \
++ _FP_FRAC_SET_##dwc(D, _FP_ZEROFRAC_##dwc); \
++ _FP_FRAC_LOW_##dwc(D) |= 1; \
++ } \
+ } \
+ } \
+ else \
+Index: gcc/config/soft-fp/floatundisf.c
+===================================================================
+--- gcc/config/soft-fp/floatundisf.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/floatundisf.c (.../branches/gcc-4_2-branch) (revision 125292)
@@ -1,6 +1,6 @@
- // Versatile string -*- C++ -*-
-
--// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -2140,10 +2140,15 @@
- */
- template<typename _CharT, typename _Traits, typename _Alloc,
- template <typename, typename, typename> class _Base>
-- basic_ostream<_CharT, _Traits>&
-+ inline basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __os,
- const __gnu_cxx::__versa_string<_CharT, _Traits,
-- _Alloc, _Base>& __str);
-+ _Alloc, _Base>& __str)
-+ {
-+ // _GLIBCXX_RESOLVE_LIB_DEFECTS
-+ // 586. string inserter not a formatted function
-+ return __ostream_insert(__os, __str.data(), __str.size());
-+ }
-
- /**
- * @brief Read a line from stream into a string.
-Index: gcc-4_2-branch/libstdc++-v3/include/ext/pb_ds/detail/type_utils.hpp
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/ext/pb_ds/detail/type_utils.hpp (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/ext/pb_ds/detail/type_utils.hpp (revision 124164)
-@@ -52,6 +52,7 @@
- #include <utility>
- #include <tr1/type_traits>
- #include <ext/type_traits.h>
-+#include <ext/numeric_traits.h>
-
- namespace pb_ds
+ /* Software floating-point emulation.
+ Convert a 64bit unsigned integer to IEEE single
+- Copyright (C) 1997,1999, 2006 Free Software Foundation, Inc.
++ Copyright (C) 1997, 1999, 2006, 2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com) and
+ Jakub Jelinek (jj@ultra.linux.cz).
+@@ -32,8 +32,7 @@
+ #include "soft-fp.h"
+ #include "single.h"
+
+-float
+-__floatundisf(UDItype i)
++SFtype __floatundisf(UDItype i)
{
-Index: gcc-4_2-branch/libstdc++-v3/include/ext/numeric_traits.h
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/ext/numeric_traits.h (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/include/ext/numeric_traits.h (revision 124164)
-@@ -0,0 +1,98 @@
-+// -*- C++ -*-
-+
-+// Copyright (C) 2007 Free Software Foundation, Inc.
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+// As a special exception, you may use this file as part of a free
-+// software library without restriction. Specifically, if other files
-+// instantiate templates or use macros or inline functions from this
-+// file, or you compile this file and link it with other files to
-+// produce an executable, this file does not by itself cause the
-+// resulting executable to be covered by the GNU General Public
-+// License. This exception does not however invalidate any other
-+// reasons why the executable file might be covered by the GNU General
-+// Public License.
-+
-+/** @file ext/numeric_traits.h
-+ * This file is a GNU extension to the Standard C++ Library.
-+ */
-+
-+#ifndef _EXT_NUMERIC_TRAITS
-+#define _EXT_NUMERIC_TRAITS 1
-+
-+#pragma GCC system_header
-+
-+#include <limits>
-+#include <bits/cpp_type_traits.h>
-+#include <ext/type_traits.h>
-+
-+_GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
-+
-+ // Compile time constants for builtin types.
-+ // Sadly std::numeric_limits member functions cannot be used for this.
-+#define __glibcxx_signed(_Tp) ((_Tp)(-1) < 0)
-+#define __glibcxx_digits(_Tp) \
-+ (sizeof(_Tp) * __CHAR_BIT__ - __glibcxx_signed(_Tp))
-+
-+#define __glibcxx_min(_Tp) \
-+ (__glibcxx_signed(_Tp) ? (_Tp)1 << __glibcxx_digits(_Tp) : (_Tp)0)
-+
-+#define __glibcxx_max(_Tp) \
-+ (__glibcxx_signed(_Tp) ? \
-+ (((((_Tp)1 << (__glibcxx_digits(_Tp) - 1)) - 1) << 1) + 1) : ~(_Tp)0)
-+
-+ template<typename _Value>
-+ struct __numeric_traits_integer
-+ {
-+ // Only integers for initialization of member constant.
-+ static const _Value __min = __glibcxx_min(_Value);
-+ static const _Value __max = __glibcxx_max(_Value);
-+ };
-+
-+ template<typename _Value>
-+ const _Value __numeric_traits_integer<_Value>::__min;
-+
-+ template<typename _Value>
-+ const _Value __numeric_traits_integer<_Value>::__max;
-+
-+ template<typename _Value>
-+ struct __numeric_traits_floating
-+ {
-+ // Only floating point types. See N1822.
-+ static const int __max_digits10 =
-+ 2 + std::numeric_limits<_Value>::digits * 3010/10000;
-+ };
-+
-+ template<typename _Value>
-+ const int __numeric_traits_floating<_Value>::__max_digits10;
-+
-+ template<typename _Value>
-+ struct __numeric_traits
-+ : public __conditional_type<std::__is_integer<_Value>::__value,
-+ __numeric_traits_integer<_Value>,
-+ __numeric_traits_floating<_Value> >::__type
-+ { };
-+
-+_GLIBCXX_END_NAMESPACE
-+
-+#undef __glibcxx_signed
-+#undef __glibcxx_min
-+#undef __glibcxx_max
-+#undef __glibcxx_digits
-+
-+#endif
-Index: gcc-4_2-branch/libstdc++-v3/include/ext/type_traits.h
+ FP_DECL_EX;
+ FP_DECL_S(A);
+Index: gcc/config/soft-fp/op-2.h
===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/ext/type_traits.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/ext/type_traits.h (revision 124164)
+--- gcc/config/soft-fp/op-2.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/op-2.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+ Basic two-word fraction declaration and manipulation.
+- Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
++ Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com),
+ Jakub Jelinek (jj@ultra.linux.cz),
+@@ -613,3 +613,5 @@
+ #define _FP_FRAC_COPY_1_2(D, S) (D##_f = S##_f0)
+
+ #define _FP_FRAC_COPY_2_1(D, S) ((D##_f0 = S##_f), (D##_f1 = 0))
++
++#define _FP_FRAC_COPY_2_2(D,S) _FP_FRAC_COPY_2(D,S)
+Index: gcc/config/soft-fp/op-4.h
+===================================================================
+--- gcc/config/soft-fp/op-4.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/op-4.h (.../branches/gcc-4_2-branch) (revision 125292)
@@ -1,6 +1,6 @@
- // -*- C++ -*-
-
--// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the terms
-@@ -39,8 +39,6 @@
-
- #include <cstddef>
- #include <utility>
--#include <limits>
--#include <iosfwd> // std::streamsize
- #include <bits/cpp_type_traits.h>
-
- _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx)
-@@ -150,51 +148,6 @@
- template<>
- struct __remove_unsigned<wchar_t>;
+ /* Software floating-point emulation.
+ Basic four-word fraction declaration and manipulation.
+- Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
++ Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com),
+ Jakub Jelinek (jj@ultra.linux.cz),
+@@ -684,3 +684,5 @@
+ D##_f[1] = S##_f1; \
+ D##_f[2] = D##_f[3] = 0; \
+ } while (0)
++
++#define _FP_FRAC_COPY_4_4(D,S) _FP_FRAC_COPY_4(D,S)
+Index: gcc/config/soft-fp/double.h
+===================================================================
+--- gcc/config/soft-fp/double.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ gcc/config/soft-fp/double.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,6 +1,6 @@
+ /* Software floating-point emulation.
+ Definitions for IEEE Double Precision
+- Copyright (C) 1997,1998,1999,2006 Free Software Foundation, Inc.
++ Copyright (C) 1997,1998,1999,2006,2007 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@cygnus.com),
+ Jakub Jelinek (jj@ultra.linux.cz),
+@@ -168,13 +168,13 @@
+ DFtype flt;
+ struct {
+ #if __BYTE_ORDER == __BIG_ENDIAN
+- unsigned sign : 1;
+- unsigned exp : _FP_EXPBITS_D;
+- unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
++ unsigned sign : 1;
++ unsigned exp : _FP_EXPBITS_D;
++ _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
+ #else
+- unsigned long frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
+- unsigned exp : _FP_EXPBITS_D;
+- unsigned sign : 1;
++ _FP_W_TYPE frac : _FP_FRACBITS_D - (_FP_IMPLBIT_D != 0);
++ unsigned exp : _FP_EXPBITS_D;
++ unsigned sign : 1;
+ #endif
+ } bits __attribute__((packed));
+ };
+Index: libstdc++-v3/configure
+===================================================================
+--- libstdc++-v3/configure (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libstdc++-v3/configure (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -5764,8 +5764,6 @@
--
-- // Compile time constants for builtin types.
-- // Sadly std::numeric_limits member functions cannot be used for this.
--#define __glibcxx_signed(_Tp) ((_Tp)(-1) < 0)
--#define __glibcxx_digits(_Tp) \
-- (sizeof(_Tp) * __CHAR_BIT__ - __glibcxx_signed(_Tp))
--
--#define __glibcxx_min(_Tp) \
-- (__glibcxx_signed(_Tp) ? (_Tp)1 << __glibcxx_digits(_Tp) : (_Tp)0)
--
--#define __glibcxx_max(_Tp) \
-- (__glibcxx_signed(_Tp) ? ((_Tp)1 << __glibcxx_digits(_Tp)) - 1 : ~(_Tp)0)
--
-- template<typename _Value>
-- struct __numeric_traits_integer
-- {
-- // Only integers for initialization of member constant.
-- static const _Value __min = __glibcxx_min(_Value);
-- static const _Value __max = __glibcxx_max(_Value);
-- };
--
-- template<typename _Value>
-- const _Value __numeric_traits_integer<_Value>::__min;
--
-- template<typename _Value>
-- const _Value __numeric_traits_integer<_Value>::__max;
--
-- template<typename _Value>
-- struct __numeric_traits_floating
-- {
-- // Only floating point types. See N1822.
-- static const std::streamsize __max_digits10 =
-- 2 + std::numeric_limits<_Value>::digits * 3010/10000;
-- };
--
-- template<typename _Value>
-- const std::streamsize __numeric_traits_floating<_Value>::__max_digits10;
--
-- template<typename _Value>
-- struct __numeric_traits
-- : public __conditional_type<std::__is_integer<_Value>::__value,
-- __numeric_traits_integer<_Value>,
-- __numeric_traits_floating<_Value> >::__type
-- { };
--
- _GLIBCXX_END_NAMESPACE
- #endif
-Index: gcc-4_2-branch/libstdc++-v3/include/ext/vstring.tcc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/ext/vstring.tcc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/ext/vstring.tcc (revision 124164)
-@@ -1,6 +1,6 @@
- // Versatile string -*- C++ -*-
--// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2005, 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -279,7 +279,7 @@
+- echo "$as_me:$LINENO: checking for C locale to use" >&5
+-echo $ECHO_N "checking for C locale to use... $ECHO_C" >&6
+ # Check whether --enable-clocale or --disable-clocale was given.
+ if test "${enable_clocale+set}" = set; then
+ enableval="$enable_clocale"
+@@ -5782,32 +5780,53 @@
+ fi;
- if (__n <= __size)
- {
-- for (; __pos + __n <= __size; ++__pos)
-+ for (; __pos <= __size - __n; ++__pos)
- if (traits_type::eq(__data[__pos], __s[0])
- && traits_type::compare(__data + __pos + 1,
- __s + 1, __n - 1) == 0)
-@@ -615,39 +615,6 @@
-
- template<typename _CharT, typename _Traits, typename _Alloc,
- template <typename, typename, typename> class _Base>
-- basic_ostream<_CharT, _Traits>&
-- operator<<(basic_ostream<_CharT, _Traits>& __out,
-- const __gnu_cxx::__versa_string<_CharT, _Traits,
-- _Alloc, _Base>& __str)
-- {
-- typedef basic_ostream<_CharT, _Traits> __ostream_type;
--
-- typename __ostream_type::sentry __cerb(__out);
-- if (__cerb)
-- {
-- const streamsize __w = __out.width();
-- streamsize __len = static_cast<streamsize>(__str.size());
-- const _CharT* __s = __str.data();
--
-- // _GLIBCXX_RESOLVE_LIB_DEFECTS
-- // 25. String operator<< uses width() value wrong
-- if (__w > __len)
-- {
-- _CharT* __cs = (static_cast<
-- _CharT*>(__builtin_alloca(sizeof(_CharT) * __w)));
-- __pad<_CharT, _Traits>::_S_pad(__out, __out.fill(), __cs,
-- __s, __w, __len, false);
-- __s = __cs;
-- __len = __w;
-- }
-- __out._M_write(__s, __len);
-- __out.width(0);
-- }
-- return __out;
-- }
--
-- template<typename _CharT, typename _Traits, typename _Alloc,
-- template <typename, typename, typename> class _Base>
- basic_istream<_CharT, _Traits>&
- getline(basic_istream<_CharT, _Traits>& __in,
- __gnu_cxx::__versa_string<_CharT, _Traits, _Alloc, _Base>& __str,
-Index: gcc-4_2-branch/libstdc++-v3/include/bits/stl_map.h
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/bits/stl_map.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/bits/stl_map.h (revision 124164)
-@@ -1,6 +1,7 @@
- // Map implementation -*- C++ -*-
-
--// Copyright (C) 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
-+// Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -394,7 +395,7 @@
- *
- * Insertion requires logarithmic time.
- */
-- std::pair<iterator,bool>
-+ std::pair<iterator, bool>
- insert(const value_type& __x)
- { return _M_t._M_insert_unique(__x); }
-
-@@ -422,8 +423,8 @@
- * Insertion requires logarithmic time (if the hint is not taken).
- */
- iterator
-- insert(iterator position, const value_type& __x)
-- { return _M_t._M_insert_unique(position, __x); }
-+ insert(iterator __position, const value_type& __x)
-+ { return _M_t._M_insert_unique(__position, __x); }
-
- /**
- * @brief Template function that attemps to insert a range of elements.
-Index: gcc-4_2-branch/libstdc++-v3/include/bits/basic_string.h
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/bits/basic_string.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/bits/basic_string.h (revision 124164)
-@@ -1,6 +1,7 @@
- // Components for manipulating sequences of characters -*- C++ -*-
-
--// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-+// 2006, 2007
- // Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
-@@ -2400,7 +2401,7 @@
- {
- // _GLIBCXX_RESOLVE_LIB_DEFECTS
- // 586. string inserter not a formatted function
-- return __os._M_insert(__str.data(), __str.size());
-+ return __ostream_insert(__os, __str.data(), __str.size());
- }
- /**
-Index: gcc-4_2-branch/libstdc++-v3/include/bits/ostream.tcc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/bits/ostream.tcc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/bits/ostream.tcc (revision 124164)
-@@ -283,38 +283,6 @@
-
- template<typename _CharT, typename _Traits>
- basic_ostream<_CharT, _Traits>&
-- basic_ostream<_CharT, _Traits>::
-- _M_insert(const char_type* __s, streamsize __n)
-- {
-- sentry __cerb(*this);
-- if (__cerb)
-- {
-- try
-- {
-- const streamsize __w = this->width();
-- if (__w > __n)
-- {
-- const bool __left = ((this->flags() & ios_base::adjustfield)
-- == ios_base::left);
-- if (!__left)
-- _M_write(this->fill(), __w - __n);
-- if (this->good())
-- _M_write(__s, __n);
-- if (__left && this->good())
-- _M_write(this->fill(), __w - __n);
-- }
-- else
-- _M_write(__s, __n);
-- this->width(0);
-- }
-- catch(...)
-- { this->_M_setstate(ios_base::badbit); }
-- }
-- return *this;
-- }
+- # If they didn't use this option switch, or if they specified --enable
+- # with no specific model, we'll have to look for one. If they
+- # specified --disable (???), do likewise.
++ # Deal with gettext issues. Default to not using it (=no) until we detect
++ # support for it later. Let the user turn it off via --e/d, but let that
++ # default to on for easier handling.
++ USE_NLS=no
++ # Check whether --enable-nls or --disable-nls was given.
++if test "${enable_nls+set}" = set; then
++ enableval="$enable_nls"
++
++else
++ enable_nls=yes
++fi;
++
++ # Either a known packaage, or "auto"
+ if test $enable_clocale = no || test $enable_clocale = yes; then
+ enable_clocale=auto
+ fi
-
-- template<typename _CharT, typename _Traits>
-- basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __out, const char* __s)
- {
- if (!__s)
-@@ -340,7 +308,7 @@
+- # Either a known package, or "auto"
+ enable_clocale_flag=$enable_clocale
+
+- # Probe for locale support if no specific model is specified.
++ # Probe for locale model to use if none specified.
+ # Default to "generic".
+ if test $enable_clocale_flag = auto; then
+ case ${target_os} in
+ linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+- cat >conftest.$ac_ext <<_ACEOF
++ enable_clocale_flag=gnu
++ ;;
++ darwin* | freebsd*)
++ enable_clocale_flag=darwin
++ ;;
++ *)
++ enable_clocale_flag=generic
++ ;;
++ esac
++ fi
++
++ # Sanity check model, and test for special functionality.
++ if test $enable_clocale_flag = gnu; then
++ cat >conftest.$ac_ext <<_ACEOF
+ /* confdefs.h. */
+ _ACEOF
+ cat confdefs.h >>conftest.$ac_ext
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+
+- #include <features.h>
+- #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+- _GLIBCXX_ok
+- #endif
++ #include <features.h>
++ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
++ _GLIBCXX_ok
++ #endif
- try
- {
-- __out._M_insert(__ws, __clen);
-+ __ostream_insert(__out, __ws, __clen);
- delete [] __ws;
- }
- catch(...)
-@@ -366,6 +334,7 @@
+ _ACEOF
+ if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+@@ -5819,9 +5838,8 @@
+ rm -f conftest*
+
+
+- # Test for bugs early in glibc-2.2.x series
+- if test $enable_clocale_flag = gnu; then
+- if test "$cross_compiling" = yes; then
++ # Test for bugs early in glibc-2.2.x series
++ if test "$cross_compiling" = yes; then
+ enable_clocale_flag=generic
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+@@ -5831,28 +5849,28 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+
+- #define _GNU_SOURCE 1
+- #include <locale.h>
+- #include <string.h>
+- #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+- extern __typeof(newlocale) __newlocale;
+- extern __typeof(duplocale) __duplocale;
+- extern __typeof(strcoll_l) __strcoll_l;
+- #endif
+- int main()
+- {
+- const char __one[] = "Äuglein Augmen";
+- const char __two[] = "Äuglein";
+- int i;
+- int j;
+- __locale_t loc;
+- __locale_t loc_dup;
+- loc = __newlocale(1 << LC_ALL, "de_DE", 0);
+- loc_dup = __duplocale(loc);
+- i = __strcoll_l(__one, __two, loc);
+- j = __strcoll_l(__one, __two, loc_dup);
+- return 0;
+- }
++ #define _GNU_SOURCE 1
++ #include <locale.h>
++ #include <string.h>
++ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
++ extern __typeof(newlocale) __newlocale;
++ extern __typeof(duplocale) __duplocale;
++ extern __typeof(strcoll_l) __strcoll_l;
++ #endif
++ int main()
++ {
++ const char __one[] = "Äuglein Augmen";
++ const char __two[] = "Äuglein";
++ int i;
++ int j;
++ __locale_t loc;
++ __locale_t loc_dup;
++ loc = __newlocale(1 << LC_ALL, "de_DE", 0);
++ loc_dup = __duplocale(loc);
++ i = __strcoll_l(__one, __two, loc);
++ j = __strcoll_l(__one, __two, loc_dup);
++ return 0;
++ }
+
+ _ACEOF
+ rm -f conftest$ac_exeext
+@@ -5877,32 +5895,176 @@
+ fi
+ rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+ fi
+- fi
+
+- # ... at some point put __strxfrm_l tests in as well.
+- ;;
+- darwin* | freebsd*)
+- enable_clocale_flag=darwin
+- ;;
+- *)
+- enable_clocale_flag=generic
+- ;;
+- esac
++ # Set it to scream when it hurts.
++ ac_save_CFLAGS="$CFLAGS"
++ CFLAGS="-Wimplicit-function-declaration -Werror"
++
++ # Use strxfrm_l if available.
++ cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#define _GNU_SOURCE 1
++ #include <string.h>
++ #include <locale.h>
++int
++main ()
++{
++char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++
++cat >>confdefs.h <<\_ACEOF
++#define HAVE_STRXFRM_L 1
++_ACEOF
++
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++
++ # Use strerror_l if available.
++ cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#define _GNU_SOURCE 1
++ #include <string.h>
++ #include <locale.h>
++int
++main ()
++{
++__locale_t loc; strerror_l(5, loc);
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++
++cat >>confdefs.h <<\_ACEOF
++#define HAVE_STRERROR_L 1
++_ACEOF
++
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++
++ CFLAGS="$ac_save_CFLAGS"
+ fi
+
+- # Deal with gettext issues. Default to not using it (=no) until we detect
+- # support for it later. Let the user turn it off via --e/d, but let that
+- # default to on for easier handling.
+- USE_NLS=no
+- # Check whether --enable-nls or --disable-nls was given.
+-if test "${enable_nls+set}" = set; then
+- enableval="$enable_nls"
++ # Perhaps use strerror_r if available, and strerror_l isn't.
++ ac_save_CFLAGS="$CFLAGS"
++ CFLAGS="-Wimplicit-function-declaration -Werror"
++ cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#define _GNU_SOURCE 1
++ #include <string.h>
++ #include <locale.h>
++int
++main ()
++{
++char s[128]; strerror_r(5, s, 128);
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
+
++cat >>confdefs.h <<\_ACEOF
++#define HAVE_STRERROR_R 1
++_ACEOF
++
+ else
+- enable_nls=yes
+-fi;
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
+
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++ CFLAGS="$ac_save_CFLAGS"
++
+ # Set configure bits for specified locale package
++ echo "$as_me:$LINENO: checking for C locale to use" >&5
++echo $ECHO_N "checking for C locale to use... $ECHO_C" >&6
+ case ${enable_clocale_flag} in
+ generic)
+ echo "$as_me:$LINENO: result: generic" >&5
+@@ -8015,7 +8177,7 @@
+
+ # Fake what AC_TRY_COMPILE does. XXX Look at redoing this new-style.
+ cat > conftest.$ac_ext << EOF
+-#line 8018 "configure"
++#line 8180 "configure"
+ int main()
+ {
+ // NB: _Atomic_word not necessarily int.
+@@ -8395,11 +8557,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -54307,11 +54467,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -75669,11 +75827,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -77194,11 +77350,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -78687,11 +78841,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -100579,11 +100731,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -101426,11 +101576,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -102829,11 +102977,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -104624,11 +104770,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -105869,11 +106013,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+@@ -106898,11 +107040,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ echo "$as_me:$LINENO: checking for ld that supports -Wl,--gc-sections" >&5
+Index: libstdc++-v3/include/bits/ostream.tcc
+===================================================================
+--- libstdc++-v3/include/bits/ostream.tcc (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libstdc++-v3/include/bits/ostream.tcc (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -334,7 +334,6 @@
extern template ostream& operator<<(ostream&, const char*);
extern template ostream& operator<<(ostream&, const unsigned char*);
extern template ostream& operator<<(ostream&, const signed char*);
-+ extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
+- extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
extern template ostream& ostream::_M_insert(long);
extern template ostream& ostream::_M_insert(unsigned long);
-@@ -387,6 +356,8 @@
+@@ -356,8 +355,6 @@
extern template wostream& operator<<(wostream&, char);
extern template wostream& operator<<(wostream&, const wchar_t*);
extern template wostream& operator<<(wostream&, const char*);
-+ extern template wostream& __ostream_insert(wostream&, const wchar_t*,
-+ streamsize);
+- extern template wostream& __ostream_insert(wostream&, const wchar_t*,
+- streamsize);
extern template wostream& wostream::_M_insert(long);
extern template wostream& wostream::_M_insert(unsigned long);
-Index: gcc-4_2-branch/libstdc++-v3/include/bits/basic_string.tcc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/bits/basic_string.tcc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/bits/basic_string.tcc (revision 124164)
-@@ -1,6 +1,7 @@
- // Components for manipulating sequences of characters -*- C++ -*-
-
--// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-+// 2006, 2007
- // Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
-@@ -726,7 +727,7 @@
-
- if (__n <= __size)
- {
-- for (; __pos + __n <= __size; ++__pos)
-+ for (; __pos <= __size - __n; ++__pos)
- if (traits_type::eq(__data[__pos], __s[0])
- && traits_type::compare(__data + __pos + 1,
- __s + 1, __n - 1) == 0)
-Index: gcc-4_2-branch/libstdc++-v3/include/bits/ostream_insert.h
+Index: libstdc++-v3/include/bits/ostream_insert.h
===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/bits/ostream_insert.h (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/include/bits/ostream_insert.h (revision 124164)
-@@ -0,0 +1,114 @@
-+// Helpers for ostream inserters -*- C++ -*-
-+
-+// Copyright (C) 2007 Free Software Foundation, Inc.
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+// As a special exception, you may use this file as part of a free software
-+// library without restriction. Specifically, if other files instantiate
-+// templates or use macros or inline functions from this file, or you compile
-+// this file and link it with other files to produce an executable, this
-+// file does not by itself cause the resulting executable to be covered by
-+// the GNU General Public License. This exception does not however
-+// invalidate any other reasons why the executable file might be covered by
-+// the GNU General Public License.
-+
-+/** @file ostream_insert.h
-+ * This is an internal header file, included by other library headers.
-+ * You should not attempt to use it directly.
-+ */
-+
-+#ifndef _OSTREAM_INSERT_H
-+#define _OSTREAM_INSERT_H 1
-+
-+#pragma GCC system_header
-+
-+#include <iosfwd>
-+
-+_GLIBCXX_BEGIN_NAMESPACE(std)
-+
-+ template<typename _CharT, typename _Traits>
-+ inline void
-+ __ostream_write(basic_ostream<_CharT, _Traits>& __out,
-+ const _CharT* __s, streamsize __n)
-+ {
-+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
-+ typedef typename __ostream_type::ios_base __ios_base;
+--- libstdc++-v3/include/bits/ostream_insert.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libstdc++-v3/include/bits/ostream_insert.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -109,6 +109,18 @@
+ return __out;
+ }
+
++ // Inhibit implicit instantiations for required instantiations,
++ // which are defined via explicit instantiations elsewhere.
++ // NB: This syntax is a GNU extension.
++#if _GLIBCXX_EXTERN_TEMPLATE
++ extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
+
-+ const streamsize __put = __out.rdbuf()->sputn(__s, __n);
-+ if (__put != __n)
-+ __out.setstate(__ios_base::badbit);
-+ }
++#ifdef _GLIBCXX_USE_WCHAR_T
++ extern template wostream& __ostream_insert(wostream&, const wchar_t*,
++ streamsize);
++#endif
++#endif
+
-+ template<typename _CharT, typename _Traits>
-+ inline void
-+ __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
-+ {
-+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
-+ typedef typename __ostream_type::ios_base __ios_base;
+ _GLIBCXX_END_NAMESPACE
+
+ #endif /* _OSTREAM_INSERT_H */
+Index: libstdc++-v3/ChangeLog
+===================================================================
+--- libstdc++-v3/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libstdc++-v3/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,26 @@
++2007-05-28 Benjamin Kosnik <bkoz@redhat.com>
+
-+ const _CharT __c = __out.fill();
-+ for (; __n > 0; --__n)
-+ {
-+ const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
-+ if (_Traits::eq_int_type(__put, _Traits::eof()))
-+ {
-+ __out.setstate(__ios_base::badbit);
-+ break;
-+ }
-+ }
-+ }
++ PR libstdc++/31717
++ * acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Re-organize. Sanity check
++ gnu locale model requests to make sure it will work for the requested
++ target. Add checks for strxfrm_l, strerror_l when in gnu locale,
++ and strerror_r everywhere.
++ * aclocal.m4: Regenerated.
++ * configure: Regenerated.
++ * config.h.in: Regenerated.
+
-+ template<typename _CharT, typename _Traits>
-+ basic_ostream<_CharT, _Traits>&
-+ __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
-+ const _CharT* __s, streamsize __n)
-+ {
-+ typedef basic_ostream<_CharT, _Traits> __ostream_type;
-+ typedef typename __ostream_type::ios_base __ios_base;
++2007-05-24 Paolo Carlini <pcarlini@suse.de>
+
-+ typename __ostream_type::sentry __cerb(__out);
-+ if (__cerb)
-+ {
-+ try
-+ {
-+ const streamsize __w = __out.width();
-+ if (__w > __n)
-+ {
-+ const bool __left = ((__out.flags()
-+ & __ios_base::adjustfield)
-+ == __ios_base::left);
-+ if (!__left)
-+ __ostream_fill(__out, __w - __n);
-+ if (__out.good())
-+ __ostream_write(__out, __s, __n);
-+ if (__left && __out.good())
-+ __ostream_fill(__out, __w - __n);
-+ }
-+ else
-+ __ostream_write(__out, __s, __n);
-+ __out.width(0);
-+ }
-+ catch(...)
-+ { __out._M_setstate(__ios_base::badbit); }
-+ }
-+ return __out;
-+ }
++ * include/bits/ostream.tcc: Do not inhibit implicit instantiation
++ of __ostream_insert here...
++ * include/bits/ostream_insert.h: ... do it here.
+
-+_GLIBCXX_END_NAMESPACE
++2007-05-21 Paolo Carlini <pcarlini@suse.de>
+
-+#endif /* _OSTREAM_INSERT_H */
-Index: gcc-4_2-branch/libstdc++-v3/include/Makefile.in
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/Makefile.in (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/Makefile.in (revision 124164)
-@@ -343,6 +343,7 @@
- ${bits_srcdir}/localefwd.h \
- ${bits_srcdir}/mask_array.h \
- ${bits_srcdir}/ostream.tcc \
-+ ${bits_srcdir}/ostream_insert.h \
- ${bits_srcdir}/postypes.h \
- ${bits_srcdir}/stream_iterator.h \
- ${bits_srcdir}/streambuf_iterator.h \
-@@ -756,6 +757,7 @@
- ${ext_srcdir}/mt_allocator.h \
- ${ext_srcdir}/new_allocator.h \
- ${ext_srcdir}/numeric \
-+ ${ext_srcdir}/numeric_traits.h \
- ${ext_srcdir}/pod_char_traits.h \
- ${ext_srcdir}/pool_allocator.h \
- ${ext_srcdir}/rb_tree \
-Index: gcc-4_2-branch/libstdc++-v3/include/tr1/random
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/tr1/random (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/tr1/random (revision 124164)
-@@ -43,6 +43,7 @@
- #include <tr1/type_traits>
- #include <tr1/cmath>
- #include <ext/type_traits.h>
-+#include <ext/numeric_traits.h>
- #include <bits/concept_check.h>
- #include <debug/debug.h>
-
-Index: gcc-4_2-branch/libstdc++-v3/include/Makefile.am
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/Makefile.am (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/Makefile.am (revision 124164)
-@@ -117,6 +117,7 @@
- ${bits_srcdir}/localefwd.h \
- ${bits_srcdir}/mask_array.h \
- ${bits_srcdir}/ostream.tcc \
-+ ${bits_srcdir}/ostream_insert.h \
- ${bits_srcdir}/postypes.h \
- ${bits_srcdir}/stream_iterator.h \
- ${bits_srcdir}/streambuf_iterator.h \
-@@ -534,6 +535,7 @@
- ${ext_srcdir}/mt_allocator.h \
- ${ext_srcdir}/new_allocator.h \
- ${ext_srcdir}/numeric \
-+ ${ext_srcdir}/numeric_traits.h \
- ${ext_srcdir}/pod_char_traits.h \
- ${ext_srcdir}/pool_allocator.h \
- ${ext_srcdir}/rb_tree \
-Index: gcc-4_2-branch/libstdc++-v3/include/std/std_string.h
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/std/std_string.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/std/std_string.h (revision 124164)
-@@ -1,6 +1,7 @@
- // Components for manipulating sequences of characters -*- C++ -*-
-
--// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005
-+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-+// 2006, 2007
- // Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
-@@ -47,6 +48,7 @@
- #include <memory> // For allocator.
- #include <bits/cpp_type_traits.h>
- #include <iosfwd> // For operators >>, <<, and getline decls.
-+#include <bits/ostream_insert.h>
- #include <bits/stl_iterator.h>
- #include <bits/stl_function.h> // For less
- #include <bits/basic_string.h>
-Index: gcc-4_2-branch/libstdc++-v3/include/std/std_ostream.h
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/include/std/std_ostream.h (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/include/std/std_ostream.h (revision 124164)
-@@ -1,6 +1,7 @@
- // Output streams -*- C++ -*-
-
--// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006
-+// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-+// 2006, 2007
- // Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
-@@ -42,6 +43,7 @@
- #pragma GCC system_header
-
- #include <ios>
-+#include <bits/ostream_insert.h>
-
- _GLIBCXX_BEGIN_NAMESPACE(std)
-
-@@ -72,31 +74,6 @@
- __num_put_type;
- typedef ctype<_CharT> __ctype_type;
-
-- template<typename _CharT2, typename _Traits2>
-- friend basic_ostream<_CharT2, _Traits2>&
-- operator<<(basic_ostream<_CharT2, _Traits2>&, _CharT2);
--
-- template<typename _Traits2>
-- friend basic_ostream<char, _Traits2>&
-- operator<<(basic_ostream<char, _Traits2>&, char);
--
-- template<typename _CharT2, typename _Traits2>
-- friend basic_ostream<_CharT2, _Traits2>&
-- operator<<(basic_ostream<_CharT2, _Traits2>&, const _CharT2*);
--
-- template<typename _Traits2>
-- friend basic_ostream<char, _Traits2>&
-- operator<<(basic_ostream<char, _Traits2>&, const char*);
--
-- template<typename _CharT2, typename _Traits2>
-- friend basic_ostream<_CharT2, _Traits2>&
-- operator<<(basic_ostream<_CharT2, _Traits2>&, const char*);
--
-- template<typename _CharT2, typename _Traits2, typename _Alloc>
-- friend basic_ostream<_CharT2, _Traits2>&
-- operator<<(basic_ostream<_CharT2, _Traits2>&,
-- const basic_string<_CharT2, _Traits2, _Alloc>&);
++ PR libstdc++/31621
++ * acinclude.m4 ([GLIBCXX_CHECK_LINKER_FEATURES]): Use the C compiler.
++ * configure: Regenerate.
++
+ 2007-05-13 Release Manager
+
+ * GCC 4.2.0 released.
+Index: libstdc++-v3/config.h.in
+===================================================================
+--- libstdc++-v3/config.h.in (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libstdc++-v3/config.h.in (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -298,6 +298,12 @@
+ /* Define to 1 if you have the <stdlib.h> header file. */
+ #undef HAVE_STDLIB_H
+
++/* Define if strerror_l is available in <string.h>. */
++#undef HAVE_STRERROR_L
++
++/* Define if strerror_r is available in <string.h>. */
++#undef HAVE_STRERROR_R
++
+ /* Define to 1 if you have the <strings.h> header file. */
+ #undef HAVE_STRINGS_H
+
+@@ -310,6 +316,9 @@
+ /* Define to 1 if you have the `strtold' function. */
+ #undef HAVE_STRTOLD
+
++/* Define if strxfrm_l is available in <string.h>. */
++#undef HAVE_STRXFRM_L
++
+ /* Define to 1 if you have the <sys/filio.h> header file. */
+ #undef HAVE_SYS_FILIO_H
+
+Index: libstdc++-v3/acinclude.m4
+===================================================================
+--- libstdc++-v3/acinclude.m4 (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libstdc++-v3/acinclude.m4 (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -251,11 +251,9 @@
+ # NB: This flag only works reliably after 2.16.1. Configure tests
+ # for this are difficult, so hard wire a value that should work.
+
+- # All these tests are for C++, but run with the "C" compiler driver.
+- # Need to do this so that g++ won't try to link in libstdc++/libsupc++.
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+- CFLAGS='-x c++ -Wl,--gc-sections'
++ CFLAGS='-Wl,--gc-sections'
+
+ # Check for -Wl,--gc-sections
+ AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections])
+@@ -1334,64 +1332,31 @@
+ dnl Default is generic.
+ dnl
+ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
+- AC_MSG_CHECKING([for C locale to use])
+ GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@],
+ [use MODEL for target locale package],
+ [permit generic|gnu|ieee_1003.1-2001|yes|no|auto])
++
++ # Deal with gettext issues. Default to not using it (=no) until we detect
++ # support for it later. Let the user turn it off via --e/d, but let that
++ # default to on for easier handling.
++ USE_NLS=no
++ AC_ARG_ENABLE(nls,
++ AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
++ [],
++ [enable_nls=yes])
+
+- # If they didn't use this option switch, or if they specified --enable
+- # with no specific model, we'll have to look for one. If they
+- # specified --disable (???), do likewise.
++ # Either a known packaage, or "auto"
+ if test $enable_clocale = no || test $enable_clocale = yes; then
+ enable_clocale=auto
+ fi
-
- // [27.6.2.2] constructor/destructor
- /**
- * @brief Base constructor.
-@@ -318,20 +295,6 @@
- this->setstate(ios_base::badbit);
- }
-
-- void
-- _M_write(char_type __c, streamsize __n)
-- {
-- for (; __n > 0; --__n)
-- {
-- const int_type __put = this->rdbuf()->sputc(__c);
-- if (traits_type::eq_int_type(__put, traits_type::eof()))
-- {
-- this->setstate(ios_base::badbit);
-- break;
-- }
-- }
-- }
+- # Either a known package, or "auto"
+ enable_clocale_flag=$enable_clocale
+
+- # Probe for locale support if no specific model is specified.
++ # Probe for locale model to use if none specified.
+ # Default to "generic".
+ if test $enable_clocale_flag = auto; then
+ case ${target_os} in
+ linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
+- AC_EGREP_CPP([_GLIBCXX_ok], [
+- #include <features.h>
+- #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
+- _GLIBCXX_ok
+- #endif
+- ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
-
- /**
- * @brief Character string insertion.
- * @param s The array to insert.
-@@ -405,9 +368,6 @@
- template<typename _ValueT>
- __ostream_type&
- _M_insert(_ValueT __v);
+- # Test for bugs early in glibc-2.2.x series
+- if test $enable_clocale_flag = gnu; then
+- AC_TRY_RUN([
+- #define _GNU_SOURCE 1
+- #include <locale.h>
+- #include <string.h>
+- #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
+- extern __typeof(newlocale) __newlocale;
+- extern __typeof(duplocale) __duplocale;
+- extern __typeof(strcoll_l) __strcoll_l;
+- #endif
+- int main()
+- {
+- const char __one[] = "Äuglein Augmen";
+- const char __two[] = "Äuglein";
+- int i;
+- int j;
+- __locale_t loc;
+- __locale_t loc_dup;
+- loc = __newlocale(1 << LC_ALL, "de_DE", 0);
+- loc_dup = __duplocale(loc);
+- i = __strcoll_l(__one, __two, loc);
+- j = __strcoll_l(__one, __two, loc_dup);
+- return 0;
+- }
+- ],
+- [enable_clocale_flag=gnu],[enable_clocale_flag=generic],
+- [enable_clocale_flag=generic])
+- fi
-
-- __ostream_type&
-- _M_insert(const char_type* __s, streamsize __n);
- };
-
- /**
-@@ -491,7 +451,7 @@
- template<typename _CharT, typename _Traits>
- inline basic_ostream<_CharT, _Traits>&
- operator<<(basic_ostream<_CharT, _Traits>& __out, _CharT __c)
-- { return __out._M_insert(&__c, 1); }
-+ { return __ostream_insert(__out, &__c, 1); }
-
- template<typename _CharT, typename _Traits>
- inline basic_ostream<_CharT, _Traits>&
-@@ -502,7 +462,7 @@
- template <class _Traits>
- inline basic_ostream<char, _Traits>&
- operator<<(basic_ostream<char, _Traits>& __out, char __c)
-- { return __out._M_insert(&__c, 1); }
-+ { return __ostream_insert(__out, &__c, 1); }
-
- // Signed and unsigned
- template<class _Traits>
-@@ -537,7 +497,8 @@
- if (!__s)
- __out.setstate(ios_base::badbit);
- else
-- __out._M_insert(__s, static_cast<streamsize>(_Traits::length(__s)));
-+ __ostream_insert(__out, __s,
-+ static_cast<streamsize>(_Traits::length(__s)));
- return __out;
- }
+- # ... at some point put __strxfrm_l tests in as well.
++ enable_clocale_flag=gnu
+ ;;
+ darwin* | freebsd*)
+ enable_clocale_flag=darwin
+@@ -1402,16 +1367,79 @@
+ esac
+ fi
-@@ -553,7 +514,8 @@
- if (!__s)
- __out.setstate(ios_base::badbit);
- else
-- __out._M_insert(__s, static_cast<streamsize>(_Traits::length(__s)));
-+ __ostream_insert(__out, __s,
-+ static_cast<streamsize>(_Traits::length(__s)));
- return __out;
- }
+- # Deal with gettext issues. Default to not using it (=no) until we detect
+- # support for it later. Let the user turn it off via --e/d, but let that
+- # default to on for easier handling.
+- USE_NLS=no
+- AC_ARG_ENABLE(nls,
+- AC_HELP_STRING([--enable-nls],[use Native Language Support (default)]),
+- [],
+- [enable_nls=yes])
++ # Sanity check model, and test for special functionality.
++ if test $enable_clocale_flag = gnu; then
++ AC_EGREP_CPP([_GLIBCXX_ok], [
++ #include <features.h>
++ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)
++ _GLIBCXX_ok
++ #endif
++ ], enable_clocale_flag=gnu, enable_clocale_flag=generic)
+
++ # Test for bugs early in glibc-2.2.x series
++ AC_TRY_RUN([
++ #define _GNU_SOURCE 1
++ #include <locale.h>
++ #include <string.h>
++ #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
++ extern __typeof(newlocale) __newlocale;
++ extern __typeof(duplocale) __duplocale;
++ extern __typeof(strcoll_l) __strcoll_l;
++ #endif
++ int main()
++ {
++ const char __one[] = "Äuglein Augmen";
++ const char __two[] = "Äuglein";
++ int i;
++ int j;
++ __locale_t loc;
++ __locale_t loc_dup;
++ loc = __newlocale(1 << LC_ALL, "de_DE", 0);
++ loc_dup = __duplocale(loc);
++ i = __strcoll_l(__one, __two, loc);
++ j = __strcoll_l(__one, __two, loc_dup);
++ return 0;
++ }
++ ],
++ [enable_clocale_flag=gnu],[enable_clocale_flag=generic],
++ [enable_clocale_flag=generic])
++
++ # Set it to scream when it hurts.
++ ac_save_CFLAGS="$CFLAGS"
++ CFLAGS="-Wimplicit-function-declaration -Werror"
++
++ # Use strxfrm_l if available.
++ AC_TRY_COMPILE([#define _GNU_SOURCE 1
++ #include <string.h>
++ #include <locale.h>],
++ [char s[128]; __locale_t loc; strxfrm_l(s, "C", 5, loc);],
++ AC_DEFINE(HAVE_STRXFRM_L, 1,
++ [Define if strxfrm_l is available in <string.h>.]),)
++
++ # Use strerror_l if available.
++ AC_TRY_COMPILE([#define _GNU_SOURCE 1
++ #include <string.h>
++ #include <locale.h>],
++ [__locale_t loc; strerror_l(5, loc);],
++ AC_DEFINE(HAVE_STRERROR_L, 1,
++ [Define if strerror_l is available in <string.h>.]),)
++
++ CFLAGS="$ac_save_CFLAGS"
++ fi
++
++ # Perhaps use strerror_r if available, and strerror_l isn't.
++ ac_save_CFLAGS="$CFLAGS"
++ CFLAGS="-Wimplicit-function-declaration -Werror"
++ AC_TRY_COMPILE([#define _GNU_SOURCE 1
++ #include <string.h>
++ #include <locale.h>],
++ [char s[128]; strerror_r(5, s, 128);],
++ AC_DEFINE(HAVE_STRERROR_R, 1,
++ [Define if strerror_r is available in <string.h>.]),)
++ CFLAGS="$ac_save_CFLAGS"
++
+ # Set configure bits for specified locale package
++ AC_MSG_CHECKING([for C locale to use])
+ case ${enable_clocale_flag} in
+ generic)
+ AC_MSG_RESULT(generic)
+Index: libgfortran/runtime/environ.c
+===================================================================
+--- libgfortran/runtime/environ.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libgfortran/runtime/environ.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -861,14 +861,13 @@
+ static int
+ do_parse (void)
+ {
+- int tok, def;
++ int tok;
+ int unit1;
+ int continue_ulist;
+ char *start;
-Index: gcc-4_2-branch/libstdc++-v3/ChangeLog
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/ChangeLog (revision 124164)
-@@ -1,3 +1,73 @@
-+2007-04-12 Paolo Carlini <pcarlini@suse.de>
-+
-+ PR libstdc++/28277 (partial: vstring bits)
-+ * include/bits/ostream_insert.h: New.
-+ * include/Makefile.am: Add.
-+ * include/ext/vstring.h (operator<<(basic_ostream<>&,
-+ const __versa_string<>&): Forward to __ostream_insert.
-+ * include/bits/basic_string.h (operator<<(basic_ostream<>&,
-+ const string<>&)): Likewise.
-+ * include/std/std_ostream.h (operator<<(basic_ostream<>&, _CharT),
-+ operator<<(basic_ostream<char,>&, char), operator<<(basic_ostream<>&,
-+ const _CharT*), operator<<(basic_ostream<char,>&, const char*)):
-+ Likewise.
-+ * include/ext/vstring.tcc (operator<<(basic_ostream<>&,
-+ const __versa_string<>&)): Remove.
-+ (class basic_ostream): Remove friend declarations.
-+ (basic_ostream<>::_M_write(char_type, streamsize),
-+ _M_insert(const char_type*, streamsize)): Remove.
-+ * include/bits/ostream.tcc (_M_insert(const char_type*, streamsize)):
-+ Remove definition.
-+ (operator<<(basic_ostream<>&, const char*)): Use __ostream_insert.
-+ * include/ext/vstring_util.h: Include <bits/ostream_insert.h>.
-+ * include/std/std_string.h: Likewise.
-+ * config/abi/pre/gnu.ver: Adjust.
-+ * src/ostream-inst.cc: Add __ostream_insert instantiations.
-+ * include/Makefile.in: Rebuild.
-+ * testsuite/ext/vstring/inserters_extractors/char/28277.cc: New.
-+ * testsuite/ext/vstring/inserters_extractors/wchar_t/28277.cc: New.
-+
-+2007-04-07 Paolo Carlini <pcarlini@suse.de>
-+
-+ PR libstdc++/31481
-+ * include/ext/type_traits.h (__numeric_traits): Move...
-+ * include/ext/numeric_traits.h: ... here; fix type of
-+ __max_digits10.
-+ * include/Makefile.am: Add.
-+ * include/ext/pb_ds/detail/type_utils.hpp: Include
-+ <ext/numeric_traits.h> too.
-+ * include/tr1/random: Likewise.
-+ * testsuite/ext/type_traits/numeric_traits.cc: Move...
-+ * testsuite/ext/numeric_traits/numeric_traits.cc: ... here.
-+ * include/Makefile.in: Regenerate.
-+ * testsuite/ext/type_traits/remove_unsigned_integer_neg.cc:
-+ Adjust dg-error line number.
-+ * testsuite/ext/type_traits/add_unsigned_floating_neg.cc:
-+ Likewise.
-+ * testsuite/ext/type_traits/remove_unsigned_floating_neg.cc:
-+ Likewise.
-+ * testsuite/ext/type_traits/add_unsigned_integer_neg.cc:
-+ Likewise.
-+
-+2007-04-03 Paolo Carlini <pcarlini@suse.de>
-+
-+ * include/bits/stl_map.h (map<>::insert(iterator, const value_type&):
-+ Uglify parameter.
-+
-+2007-04-02 Paolo Carlini <pcarlini@suse.de>
-+
-+ PR libstdc++/31401 (vstring bits)
-+ * include/ext/vstring.tcc (find(const _CharT*, size_type,
-+ size_type)): Avoid unsigned overflow.
-+
-+2007-03-30 Paolo Carlini <pcarlini@suse.de>
+ unit_count = 0;
+
+- def = 0;
+ start = p;
+
+ /* Parse the string. First, let's look for a default. */
+@@ -923,6 +922,7 @@
+ break;
+
+ case END:
++ def = endian;
+ goto end;
+ break;
+
+@@ -939,6 +939,18 @@
+ tok = next_token ();
+ switch (tok)
+ {
++ case NATIVE:
++ if (next_token () != ':')
++ goto error;
++ endian = CONVERT_NATIVE;
++ break;
+
-+ PR libstdc++/31401
-+ * include/bits/basic_string.tcc (find(const _CharT*, size_type,
-+ size_type)): Avoid unsigned overflow.
-+ * testsuite/21_strings/basic_string/find/char/4.cc: New.
-+ * testsuite/21_strings/basic_string/find/wchar_t/4.cc: Likewise.
++ case SWAP:
++ if (next_token () != ':')
++ goto error;
++ endian = CONVERT_SWAP;
++ break;
+
- 2007-03-06 Paolo Carlini <pcarlini@suse.de>
-
- PR libstdc++/28080 (partial)
-Index: gcc-4_2-branch/libstdc++-v3/src/ostream-inst.cc
+ case LITTLE:
+ if (next_token () != ':')
+ goto error;
+Index: libgfortran/intrinsics/reshape_generic.c
+===================================================================
+--- libgfortran/intrinsics/reshape_generic.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libgfortran/intrinsics/reshape_generic.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -266,7 +266,7 @@
+ else
+ {
+ scount[n]++;
+- sptr += sstride[n] * size;
++ src += sstride[n] * size;
+ }
+ }
+ }
+Index: libgfortran/intrinsics/ishftc.c
===================================================================
---- gcc-4_2-branch/libstdc++-v3/src/ostream-inst.cc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/src/ostream-inst.cc (revision 124164)
-@@ -55,6 +55,7 @@
- template ostream& operator<<(ostream&, _Setbase);
- template ostream& operator<<(ostream&, _Setprecision);
- template ostream& operator<<(ostream&, _Setw);
-+ template ostream& __ostream_insert(ostream&, const char*, streamsize);
-
- template ostream& ostream::_M_insert(long);
- template ostream& ostream::_M_insert(unsigned long);
-@@ -83,6 +84,7 @@
- template wostream& operator<<(wostream&, _Setbase);
- template wostream& operator<<(wostream&, _Setprecision);
- template wostream& operator<<(wostream&, _Setw);
-+ template wostream& __ostream_insert(wostream&, const wchar_t*, streamsize);
-
- template wostream& wostream::_M_insert(long);
- template wostream& wostream::_M_insert(unsigned long);
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/21_strings/basic_string/find/wchar_t/4.cc
+--- libgfortran/intrinsics/ishftc.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libgfortran/intrinsics/ishftc.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -36,8 +36,7 @@
+ GFC_INTEGER_4
+ ishftc4 (GFC_INTEGER_4 i, GFC_INTEGER_4 shift, GFC_INTEGER_4 size)
+ {
+- GFC_INTEGER_4 mask;
+- GFC_UINTEGER_4 bits;
++ GFC_UINTEGER_4 mask, bits;
+
+ if (shift < 0)
+ shift = shift + size;
+@@ -45,9 +44,14 @@
+ if (shift == 0 || shift == size)
+ return i;
+
+- mask = (~(GFC_INTEGER_4)0) << size;
+- bits = i & ~mask;
+- return (i & mask) | (bits >> (size - shift)) | ((i << shift) & ~mask);
++ /* In C, the result of the shift operator is undefined if the right operand
++ is greater than or equal to the number of bits in the left operand. So we
++ have to special case it for fortran. */
++ mask = ~((size == 32) ? 0 : (~0 << size));
++
++ bits = i & mask;
++
++ return (i & ~mask) | ((bits << shift) & mask) | (bits >> (size - shift));
+ }
+
+ extern GFC_INTEGER_8 ishftc8 (GFC_INTEGER_8, GFC_INTEGER_4, GFC_INTEGER_4);
+@@ -56,8 +60,7 @@
+ GFC_INTEGER_8
+ ishftc8 (GFC_INTEGER_8 i, GFC_INTEGER_4 shift, GFC_INTEGER_4 size)
+ {
+- GFC_INTEGER_8 mask;
+- GFC_UINTEGER_8 bits;
++ GFC_UINTEGER_8 mask, bits;
+
+ if (shift < 0)
+ shift = shift + size;
+@@ -65,9 +68,14 @@
+ if (shift == 0 || shift == size)
+ return i;
+
+- mask = (~(GFC_INTEGER_8)0) << size;
+- bits = i & ~mask;
+- return (i & mask) | (bits >> (size - shift)) | ((i << shift) & ~mask);
++ /* In C, the result of the shift operator is undefined if the right operand
++ is greater than or equal to the number of bits in the left operand. So we
++ have to special case it for fortran. */
++ mask = ~((size == 64) ? 0 : (~0 << size));
++
++ bits = i & mask;
++
++ return (i & ~mask) | ((bits << shift) & mask) | (bits >> (size - shift));
+ }
+
+ #ifdef HAVE_GFC_INTEGER_16
+@@ -77,8 +85,7 @@
+ GFC_INTEGER_16
+ ishftc16 (GFC_INTEGER_16 i, GFC_INTEGER_4 shift, GFC_INTEGER_4 size)
+ {
+- GFC_INTEGER_16 mask;
+- GFC_UINTEGER_16 bits;
++ GFC_UINTEGER_16 mask, bits;
+
+ if (shift < 0)
+ shift = shift + size;
+@@ -86,8 +93,13 @@
+ if (shift == 0 || shift == size)
+ return i;
+
+- mask = (~(GFC_INTEGER_16)0) << size;
+- bits = i & ~mask;
+- return (i & mask) | (bits >> (size - shift)) | ((i << shift) & ~mask);
++ /* In C, the result of the shift operator is undefined if the right operand
++ is greater than or equal to the number of bits in the left operand. So we
++ have to special case it for fortran. */
++ mask = ~((size == 128) ? 0 : (~0 << size));
++
++ bits = i & mask;
++
++ return (i & ~mask) | ((bits << shift) & mask) | (bits >> (size - shift));
+ }
+ #endif
+Index: libgfortran/ChangeLog
===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/21_strings/basic_string/find/wchar_t/4.cc (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/21_strings/basic_string/find/wchar_t/4.cc (revision 124164)
-@@ -0,0 +1,43 @@
-+// 2007-03-30 Paolo Carlini <pcarlini@suse.de>
-+
-+// Copyright (C) 2007 Free Software Foundation, Inc.
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+// 21.3.6.1 basic_string find
-+
-+#include <string>
-+#include <testsuite_hooks.h>
-+
-+// libstdc++/31401
-+void test01()
-+{
-+ bool test __attribute__((unused)) = true;
-+ typedef std::wstring::size_type csize_type;
-+ csize_type npos = std::wstring::npos;
+--- libgfortran/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libgfortran/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,53 @@
++2007-05-23 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
-+ std::wstring use = L"anu";
-+ csize_type pos1 = use.find(L"a", npos);
++ PR libfortran/31964
++ Backport from trunk.
++ * intrinsics/ishftc.c (ishftc4, ishftc8, ishftc16): Fix mask to handle
++ shift of bit-size number of bits.
+
-+ VERIFY( pos1 == npos );
-+}
-+
-+int main()
-+{
-+ test01();
-+ return 0;
-+}
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/21_strings/basic_string/find/char/4.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/21_strings/basic_string/find/char/4.cc (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/21_strings/basic_string/find/char/4.cc (revision 124164)
-@@ -0,0 +1,43 @@
-+// 2007-03-30 Paolo Carlini <pcarlini@suse.de>
-+
-+// Copyright (C) 2007 Free Software Foundation, Inc.
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+// 21.3.6.1 basic_string find
-+
-+#include <string>
-+#include <testsuite_hooks.h>
-+
-+// libstdc++/31401
-+void test01()
-+{
-+ bool test __attribute__((unused)) = true;
-+ typedef std::string::size_type csize_type;
-+ csize_type npos = std::string::npos;
++2007-05-23 Tobias Burnus <burnus@net-b.de>
+
-+ std::string use = "anu";
-+ csize_type pos1 = use.find("a", npos);
++ PR fortran/31917
++ Backport from trunk.
++ * runtime/environ.c (mark_range): Fix setting default convert unit.
+
-+ VERIFY( pos1 == npos );
-+}
++2007-05-22 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
-+int main()
-+{
-+ test01();
-+ return 0;
-+}
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/numeric_traits/numeric_traits.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/numeric_traits/numeric_traits.cc (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/numeric_traits/numeric_traits.cc (revision 124164)
-@@ -0,0 +1,28 @@
-+// { dg-do compile }
-+// { dg-options "-pedantic" }
-+// -*- C++ -*-
-+
-+// Copyright (C) 2006 Free Software Foundation, Inc.
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+//
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+#include <ext/numeric_traits.h>
-+
-+using __gnu_cxx::__numeric_traits;
-+template struct __numeric_traits<short>;
-+template struct __numeric_traits<unsigned short>;
-+template struct __numeric_traits<double>;
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/vstring/inserters_extractors/wchar_t/28277.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/vstring/inserters_extractors/wchar_t/28277.cc (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/vstring/inserters_extractors/wchar_t/28277.cc (revision 124164)
-@@ -0,0 +1,48 @@
-+// 2007-04-09 Paolo Carlini <pcarlini@suse.de>
-+
-+// Copyright (C) 2007 Free Software Foundation
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+#include <ostream>
-+#include <sstream>
-+#include <ext/vstring.h>
-+#include <testsuite_hooks.h>
-+
-+// libstdc++/28277
-+void test01()
-+{
-+ using namespace std;
-+ bool test __attribute__((unused)) = true;
++ PR libfortran/31051
++ Backport from trunk.
++ * io/transfer.c (formatted_transfer_scalar): Adjust position for pending
++ spaces when in writing mode. Clean up some formatting.
++
++2007-05-22 Tobias Burnus <burnus@net-b.de>
+
-+ wostringstream oss_01;
-+ const __gnu_cxx::__wvstring str_01(50, L'a');
++ PR libfortran/31915
++ Backport from trunk.
++ * io/transfer.c (unformatted_read): Use proper size for real(10).
++ (unformatted_write): Ditto.
+
-+ oss_01.width(5000000);
-+ const streamsize width = oss_01.width();
++2007-05-20 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
-+ oss_01 << str_01;
++ PR libfortran/31395
++ Backport from 4.3.
++ * io/format.c (parse_format_list): Fix parsing. Regression against g77.
+
-+ VERIFY( oss_01.good() );
-+ VERIFY( oss_01.str().size() == width );
-+}
++2007-05-20 Thomas Koenig <tkoenig@gcc.gnu.org>
+
-+int main()
-+{
-+ test01();
-+ return 0;
-+}
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/vstring/inserters_extractors/char/28277.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/vstring/inserters_extractors/char/28277.cc (revision 0)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/vstring/inserters_extractors/char/28277.cc (revision 124164)
-@@ -0,0 +1,48 @@
-+// 2007-04-09 Paolo Carlini <pcarlini@suse.de>
-+
-+// Copyright (C) 2007 Free Software Foundation
-+//
-+// This file is part of the GNU ISO C++ Library. This library 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.
-+
-+// This library 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 this library; see the file COPYING. If not, write to the Free
-+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-+// USA.
-+
-+#include <ostream>
-+#include <sstream>
-+#include <ext/vstring.h>
-+#include <testsuite_hooks.h>
-+
-+// libstdc++/28277
-+void test01()
-+{
-+ using namespace std;
-+ bool test __attribute__((unused)) = true;
++ PR fortran/31618
++ Backport from trunk.
++ * io/transfer.c (read_block_direct): Instead of calling us_read,
++ set dtp->u.p.current_unit->current_record = 0 so that pre_position
++ will read the record marker.
++ (data_transfer_init): For different error conditions, call
++ generate_error, then return.
+
-+ ostringstream oss_01;
-+ const __gnu_cxx::__vstring str_01(50, 'a');
++2007-05-20 Thomas Koenig <tkoenig@gcc.gnu.org>
+
-+ oss_01.width(20000000);
-+ const streamsize width = oss_01.width();
++ PR libfortran/31196
++ Backport from trunk.
++ * intrinsics/reshape_generic.c (reshape_internal): Increment
++ correct variable.
+
-+ oss_01 << str_01;
+ 2007-05-13 Release Manager
+
+ * GCC 4.2.0 released.
+Index: libgfortran/io/transfer.c
+===================================================================
+--- libgfortran/io/transfer.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libgfortran/io/transfer.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -493,11 +493,11 @@
+ }
+ else
+ {
+- /* Let's make sure the file position is correctly set for the
+- next read statement. */
++ /* Let's make sure the file position is correctly pre-positioned
++ for the next read statement. */
+
++ dtp->u.p.current_unit->current_record = 0;
+ next_record_r_unf (dtp, 0);
+- us_read (dtp, 0);
+ generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL);
+ return;
+ }
+@@ -722,7 +722,11 @@
+ of the padding. If we hit a short record, then sz is
+ adjusted accordingly, making later reads no-ops. */
+
+- sz = kind;
++ if (type == BT_REAL || type == BT_COMPLEX)
++ sz = size_from_real_kind (kind);
++ else
++ sz = kind;
++
+ for (i=0; i<nelems; i++)
+ {
+ read_block_direct (dtp, buffer, &sz);
+@@ -767,7 +771,11 @@
+ read kind bytes. We don't care about the contents
+ of the padding. */
+
+- sz = kind;
++ if (type == BT_REAL || type == BT_COMPLEX)
++ sz = size_from_real_kind (kind);
++ else
++ sz = kind;
++
+ for (i=0; i<nelems; i++)
+ {
+ reverse_memcpy(buffer, p, size);
+@@ -1144,7 +1152,7 @@
+ /* Format codes that don't transfer data. */
+ case FMT_X:
+ case FMT_TR:
+- consume_data_flag = 0 ;
++ consume_data_flag = 0;
+
+ pos = bytes_used + f->u.n + dtp->u.p.skips;
+ dtp->u.p.skips = f->u.n + dtp->u.p.skips;
+@@ -1160,6 +1168,7 @@
+ write_x (dtp, dtp->u.p.skips, dtp->u.p.pending_spaces);
+ dtp->u.p.skips = dtp->u.p.pending_spaces = 0;
+ }
+
-+ VERIFY( oss_01.good() );
-+ VERIFY( oss_01.str().size() == width );
-+}
+ if (dtp->u.p.mode == READING)
+ read_x (dtp, f->u.n);
+
+@@ -1167,6 +1176,8 @@
+
+ case FMT_TL:
+ case FMT_T:
++ consume_data_flag = 0;
+
-+int main()
-+{
-+ test01();
-+ return 0;
-+}
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/numeric_traits.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/numeric_traits.cc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/numeric_traits.cc (revision 124164)
-@@ -1,28 +0,0 @@
--// { dg-do compile }
--// { dg-options "-pedantic" }
--// -*- C++ -*-
--
--// Copyright (C) 2006 Free Software Foundation, Inc.
--//
--// This file is part of the GNU ISO C++ Library. This library 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.
--//
--// This library 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 this library; see the file COPYING. If not, write to the Free
--// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
--// USA.
--
--#include <ext/type_traits.h>
--
--using __gnu_cxx::__numeric_traits;
--template struct __numeric_traits<short>;
--template struct __numeric_traits<unsigned short>;
--template struct __numeric_traits<double>;
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_integer_neg.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_integer_neg.cc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_integer_neg.cc (revision 124164)
-@@ -1,7 +1,7 @@
- // { dg-do compile }
- // -*- C++ -*-
-
--// Copyright (C) 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -37,4 +37,4 @@
- }
+ if (f->format == FMT_TL)
+ {
- // { dg-error "invalid use of incomplete" "" { target *-*-* } 29 }
--// { dg-error "declaration of" "" { target *-*-* } 114 }
-+// { dg-error "declaration of" "" { target *-*-* } 112 }
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_floating_neg.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_floating_neg.cc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_floating_neg.cc (revision 124164)
-@@ -1,7 +1,7 @@
- // { dg-do compile }
- // -*- C++ -*-
-
--// Copyright (C) 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -36,5 +36,5 @@
- }
+@@ -1185,8 +1196,10 @@
+ }
+ else /* FMT_T */
+ {
+- consume_data_flag = 0;
+- pos = f->u.n - 1;
++ if (dtp->u.p.mode == READING)
++ pos = f->u.n - 1;
++ else
++ pos = f->u.n - dtp->u.p.pending_spaces - 1;
+ }
- // { dg-error "instantiated from" "" { target *-*-* } 29 }
--// { dg-error "no type" "" { target *-*-* } 76 }
-+// { dg-error "no type" "" { target *-*-* } 74 }
- // { dg-excess-errors "In instantiation of" }
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_floating_neg.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_floating_neg.cc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/remove_unsigned_floating_neg.cc (revision 124164)
-@@ -1,7 +1,7 @@
- // { dg-do compile }
- // -*- C++ -*-
-
--// Copyright (C) 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -36,5 +36,5 @@
- }
+ /* Standard 10.6.1.1: excessive left tabbing is reset to the
+@@ -1753,16 +1766,19 @@
+ /* Check the action. */
- // { dg-error "instantiated from" "" { target *-*-* } 29 }
--// { dg-error "no type" "" { target *-*-* } 119 }
-+// { dg-error "no type" "" { target *-*-* } 117 }
- // { dg-excess-errors "In instantiation of" }
-Index: gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_integer_neg.cc
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_integer_neg.cc (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/testsuite/ext/type_traits/add_unsigned_integer_neg.cc (revision 124164)
-@@ -1,7 +1,7 @@
- // { dg-do compile }
- // -*- C++ -*-
-
--// Copyright (C) 2006 Free Software Foundation, Inc.
-+// Copyright (C) 2006, 2007 Free Software Foundation, Inc.
- //
- // This file is part of the GNU ISO C++ Library. This library is free
- // software; you can redistribute it and/or modify it under the
-@@ -37,4 +37,4 @@
- }
+ if (read_flag && dtp->u.p.current_unit->flags.action == ACTION_WRITE)
+- generate_error (&dtp->common, ERROR_BAD_ACTION,
+- "Cannot read from file opened for WRITE");
++ {
++ generate_error (&dtp->common, ERROR_BAD_ACTION,
++ "Cannot read from file opened for WRITE");
++ return;
++ }
- // { dg-error "invalid use of incomplete" "" { target *-*-* } 29 }
--// { dg-error "declaration of" "" { target *-*-* } 71 }
-+// { dg-error "declaration of" "" { target *-*-* } 69 }
-Index: gcc-4_2-branch/libstdc++-v3/config/abi/pre/gnu.ver
-===================================================================
---- gcc-4_2-branch/libstdc++-v3/config/abi/pre/gnu.ver (revision 123014)
-+++ gcc-4_2-branch/libstdc++-v3/config/abi/pre/gnu.ver (revision 124164)
-@@ -676,8 +676,7 @@
+ if (!read_flag && dtp->u.p.current_unit->flags.action == ACTION_READ)
+- generate_error (&dtp->common, ERROR_BAD_ACTION,
+- "Cannot write to file opened for READ");
++ {
++ generate_error (&dtp->common, ERROR_BAD_ACTION,
++ "Cannot write to file opened for READ");
++ return;
++ }
- _ZSt21__copy_streambufs_eofI[cw]St11char_traitsI[cw]EE[il]PSt15basic_streambuf*;
+- if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
+- return;
+-
+ dtp->u.p.first_item = 1;
-- _ZNSo9_M_insertEPKc[il];
-- _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertEPKw[il];
-+ _ZSt16__ostream_insert*;
+ /* Check the format. */
+@@ -1770,14 +1786,14 @@
+ if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
+ parse_format (dtp);
- _ZN11__gnu_debug19_Safe_sequence_base12_M_get_mutexEv;
- _ZN11__gnu_debug19_Safe_iterator_base16_M_attach_singleEPNS_19_Safe_sequence_baseEb;
-Index: gcc-4_2-branch/libgfortran/configure
-===================================================================
---- gcc-4_2-branch/libgfortran/configure (revision 123014)
-+++ gcc-4_2-branch/libgfortran/configure (revision 124164)
-@@ -10222,7 +10222,10 @@
+- if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
+- return;
+-
+ if (dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED
+ && (cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
+ != 0)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "Format present for UNFORMATTED data transfer");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "Format present for UNFORMATTED data transfer");
++ return;
++ }
+ if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
+ {
+@@ -1787,13 +1803,19 @@
+ }
+ else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
+ !(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "Missing format for FORMATTED data transfer");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "Missing format for FORMATTED data transfer");
++ }
+ if (is_internal_unit (dtp)
+ && dtp->u.p.current_unit->flags.form == FORM_UNFORMATTED)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "Internal file cannot be accessed by UNFORMATTED data transfer");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "Internal file cannot be accessed by UNFORMATTED "
++ "data transfer");
++ return;
++ }
--for ac_func in wait setmode gettimeofday
-+
-+
-+
-+for ac_func in wait setmode gettimeofday stat fstat lstat
- do
- as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
- echo "$as_me:$LINENO: checking for $ac_func" >&5
-Index: gcc-4_2-branch/libgfortran/intrinsics/stat.c
-===================================================================
---- gcc-4_2-branch/libgfortran/intrinsics/stat.c (revision 123014)
-+++ gcc-4_2-branch/libgfortran/intrinsics/stat.c (revision 124164)
-@@ -49,6 +49,9 @@
+ /* Check the record or position number. */
- #include <errno.h>
+@@ -1823,49 +1845,71 @@
+ if (dtp->u.p.advance_status != ADVANCE_UNSPECIFIED)
+ {
+ if (dtp->u.p.current_unit->flags.access == ACCESS_DIRECT)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "ADVANCE specification conflicts with sequential access");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "ADVANCE specification conflicts with sequential access");
++ return;
++ }
-+
-+#ifdef HAVE_STAT
-+
- /* SUBROUTINE STAT(FILE, SARRAY, STATUS)
- CHARACTER(len=*), INTENT(IN) :: FILE
- INTEGER, INTENT(OUT), :: SARRAY(13)
-@@ -88,9 +91,12 @@
- memcpy (str, name, name_len);
- str[name_len] = '\0';
+ if (is_internal_unit (dtp))
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "ADVANCE specification conflicts with internal file");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "ADVANCE specification conflicts with internal file");
++ return;
++ }
-+ /* On platforms that don't provide lstat(), we use stat() instead. */
-+#ifdef HAVE_LSTAT
- if (is_lstat)
- val = lstat(str, &sb);
- else
-+#endif
- val = stat(str, &sb);
+ if ((cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT))
+ != IOPARM_DT_HAS_FORMAT)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "ADVANCE specification requires an explicit format");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "ADVANCE specification requires an explicit format");
++ return;
++ }
+ }
- if (val == 0)
-@@ -204,9 +210,12 @@
- memcpy (str, name, name_len);
- str[name_len] = '\0';
+ if (read_flag)
+ {
+ if ((cf & IOPARM_EOR) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
+- generate_error (&dtp->common, ERROR_MISSING_OPTION,
+- "EOR specification requires an ADVANCE specification of NO");
++ {
++ generate_error (&dtp->common, ERROR_MISSING_OPTION,
++ "EOR specification requires an ADVANCE specification "
++ "of NO");
++ return;
++ }
-+ /* On platforms that don't provide lstat(), we use stat() instead. */
-+#ifdef HAVE_LSTAT
- if (is_lstat)
- val = lstat(str, &sb);
+ if ((cf & IOPARM_DT_HAS_SIZE) != 0 && dtp->u.p.advance_status != ADVANCE_NO)
+- generate_error (&dtp->common, ERROR_MISSING_OPTION,
+- "SIZE specification requires an ADVANCE specification of NO");
+-
++ {
++ generate_error (&dtp->common, ERROR_MISSING_OPTION,
++ "SIZE specification requires an ADVANCE specification of NO");
++ return;
++ }
+ }
else
-+#endif
- val = stat(str, &sb);
+ { /* Write constraints. */
+ if ((cf & IOPARM_END) != 0)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "END specification cannot appear in a write statement");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "END specification cannot appear in a write statement");
++ return;
++ }
- if (val == 0)
-@@ -319,13 +328,13 @@
- }
+ if ((cf & IOPARM_EOR) != 0)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "EOR specification cannot appear in a write statement");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "EOR specification cannot appear in a write statement");
++ return;
++ }
+
+ if ((cf & IOPARM_DT_HAS_SIZE) != 0)
+- generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
+- "SIZE specification cannot appear in a write statement");
++ {
++ generate_error (&dtp->common, ERROR_OPTION_CONFLICT,
++ "SIZE specification cannot appear in a write statement");
++ return;
++ }
+ }
+ if (dtp->u.p.advance_status == ADVANCE_UNSPECIFIED)
+ dtp->u.p.advance_status = ADVANCE_YES;
+- if ((dtp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK)
+- return;
--/* SUBROUTINE STAT(FILE, SARRAY, STATUS)
-+/* SUBROUTINE LSTAT(FILE, SARRAY, STATUS)
- CHARACTER(len=*), INTENT(IN) :: FILE
- INTEGER, INTENT(OUT), :: SARRAY(13)
- INTEGER, INTENT(OUT), OPTIONAL :: STATUS
+ /* Sanity checks on the record number. */
+ if ((cf & IOPARM_DT_HAS_REC) != 0)
+Index: libgfortran/io/format.c
+===================================================================
+--- libgfortran/io/format.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libgfortran/io/format.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -860,10 +860,11 @@
+ case FMT_SLASH:
+ get_fnode (fmt, &head, &tail, FMT_SLASH);
+ tail->repeat = 1;
++ goto optional_comma;
-- FUNCTION STAT(FILE, SARRAY)
-- INTEGER STAT
-+ FUNCTION LSTAT(FILE, SARRAY)
-+ INTEGER LSTAT
- CHARACTER(len=*), INTENT(IN) :: FILE
- INTEGER, INTENT(OUT), :: SARRAY(13) */
+- /* Fall Through */
+-
+ case FMT_COLON:
++ get_fnode (fmt, &head, &tail, FMT_COLON);
++ tail->repeat = 1;
+ goto optional_comma;
-@@ -351,8 +360,11 @@
- return val;
- }
+ case FMT_END:
+Index: boehm-gc/darwin_stop_world.c
+===================================================================
+--- boehm-gc/darwin_stop_world.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/darwin_stop_world.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -10,7 +10,7 @@
+ be allocated, is called the red zone. This area as shown in Figure 3-2 may
+ be used for any purpose as long as a new stack frame does not need to be
+ added to the stack."
+-
++
+ Page 50: "If a leaf procedure's red zone usage would exceed 224 bytes, then
+ it must set up a stack frame just like routines that call other routines."
+ */
+@@ -20,48 +20,6 @@
+ # define PPC_RED_ZONE_SIZE 320
+ #endif
-+#endif
+-/* Try to work out the right way to access thread state structure members.
+- The structure has changed its definition in different Darwin versions. */
+-#if defined(__ppc__)
+-# define THREAD_STATE ppc_thread_state_t
+-# if defined (HAS_PPC_THREAD_STATE_R0)
+-# define THREAD_FLD(x) x
+-# elif defined (HAS_PPC_THREAD_STATE___R0)
+-# define THREAD_FLD(x) __ ## x
+-# else
+-# error can not work out how to access fields of ppc_thread_state_t
+-# endif
+-#elif defined(__ppc64__)
+-# define THREAD_STATE ppc_thread_state64_t
+-# if defined (HAS_PPC_THREAD_STATE64_R0)
+-# define THREAD_FLD(x) x
+-# elif defined (HAS_PPC_THREAD_STATE64___R0)
+-# define THREAD_FLD(x) __ ## x
+-# else
+-# error can not work out how to access fields of ppc_thread_state64_t
+-# endif
+-#elif defined(__i386__)
+-# define THREAD_STATE i386_thread_state_t
+-# if defined (HAS_I386_THREAD_STATE_EAX)
+-# define THREAD_FLD(x) x
+-# elif defined (HAS_I386_THREAD_STATE___EAX)
+-# define THREAD_FLD(x) __ ## x
+-# else
+-# error can not work out how to access fields of i386_thread_state_t
+-# endif
+-#elif defined(__x86_64__)
+-# define THREAD_STATE i386_thread_state_t
+-# if defined (HAS_I386_THREAD_STATE_EAX)
+-# define THREAD_FLD(x) x
+-# elif defined (HAS_I386_THREAD_STATE___EAX)
+-# define THREAD_FLD(x) __ ## x
+-# else
+-# error can not work out how to access fields of i386_thread_state_t
+-# endif
+-#else
+-# error unknown architecture
+-#endif
+-
+ typedef struct StackFrame {
+ unsigned long savedSP;
+ unsigned long savedCR;
+@@ -115,8 +73,8 @@
+ GC_thread p;
+ pthread_t me;
+ ptr_t lo, hi;
+- THREAD_STATE state;
+- mach_msg_type_number_t thread_state_count = MACHINE_THREAD_STATE_COUNT;
++ GC_THREAD_STATE_T state;
++ mach_msg_type_number_t thread_state_count = GC_MACH_THREAD_STATE_COUNT;
+
+ me = pthread_self();
+ if (!GC_thr_initialized) GC_thr_init();
+@@ -128,11 +86,8 @@
+ lo = GC_approx_sp();
+ } else {
+ /* Get the thread state (registers, etc) */
+- r = thread_get_state(
+- p->stop_info.mach_thread,
+- MACHINE_THREAD_STATE,
+- (natural_t*)&state,
+- &thread_state_count);
++ r = thread_get_state(p->stop_info.mach_thread, GC_MACH_THREAD_STATE,
++ (natural_t*)&state, &thread_state_count);
+ if(r != KERN_SUCCESS) ABORT("thread_get_state failed");
+
+ #if defined(I386)
+@@ -144,7 +99,33 @@
+ GC_push_one(state . THREAD_FLD (edx));
+ GC_push_one(state . THREAD_FLD (edi));
+ GC_push_one(state . THREAD_FLD (esi));
+- GC_push_one(state . THREAD_FLD (ebp));
++ GC_push_one(state . THREAD_FLD (ebp));
++
++#elif defined(X86_64)
++ lo = (void*)state . THREAD_FLD (rsp);
++
++ GC_push_one(state . THREAD_FLD (rax));
++ GC_push_one(state . THREAD_FLD (rbx));
++ GC_push_one(state . THREAD_FLD (rcx));
++ GC_push_one(state . THREAD_FLD (rdx));
++ GC_push_one(state . THREAD_FLD (rdi));
++ GC_push_one(state . THREAD_FLD (rsi));
++ GC_push_one(state . THREAD_FLD (rbp));
++ GC_push_one(state . THREAD_FLD (rsp));
++ GC_push_one(state . THREAD_FLD (r8));
++ GC_push_one(state . THREAD_FLD (r9));
++ GC_push_one(state . THREAD_FLD (r10));
++ GC_push_one(state . THREAD_FLD (r11));
++ GC_push_one(state . THREAD_FLD (r12));
++ GC_push_one(state . THREAD_FLD (r13));
++ GC_push_one(state . THREAD_FLD (r14));
++ GC_push_one(state . THREAD_FLD (r15));
++ GC_push_one(state . THREAD_FLD (rip));
++ GC_push_one(state . THREAD_FLD (rflags));
++ GC_push_one(state . THREAD_FLD (cs));
++ GC_push_one(state . THREAD_FLD (fs));
++ GC_push_one(state . THREAD_FLD (gs));
++
+ #elif defined(POWERPC)
+ lo = (void*)(state . THREAD_FLD (r1) - PPC_RED_ZONE_SIZE);
+
+@@ -221,9 +202,9 @@
+ hi = (ptr_t)FindTopOfStack(0);
+ } else {
+ # if defined(__ppc__) || defined(__ppc64__)
+- THREAD_STATE info;
++ GC_THREAD_STATE_T info;
+ mach_msg_type_number_t outCount = THREAD_STATE_MAX;
+- r = thread_get_state(thread, MACHINE_THREAD_STATE,
++ r = thread_get_state(thread, GC_MACH_THREAD_STATE,
+ (natural_t *)&info, &outCount);
+ if(r != KERN_SUCCESS) ABORT("task_get_state failed");
+
+@@ -264,10 +245,10 @@
+ # else
+ /* FIXME: Remove after testing: */
+ WARN("This is completely untested and likely will not work\n", 0);
+- THREAD_STATE info;
++ GC_THREAD_STATE_T info;
+ mach_msg_type_number_t outCount = THREAD_STATE_MAX;
+- r = thread_get_state(thread, MACHINE_THREAD_STATE,
+- (natural_t *)&info, &outCount);
++ r = thread_get_state(thread, GC_MACH_THREAD_STATE, (natural_t *)&info,
++ &outCount);
+ if(r != KERN_SUCCESS) ABORT("task_get_state failed");
+
+ lo = (void*)info . THREAD_FLD (esp);
+Index: boehm-gc/Makefile.in
+===================================================================
+--- boehm-gc/Makefile.in (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/Makefile.in (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -224,6 +224,7 @@
+ build_vendor = @build_vendor@
+ datadir = @datadir@
+ exec_prefix = @exec_prefix@
++extra_ldflags_libgc = @extra_ldflags_libgc@
+ host = @host@
+ host_alias = @host_alias@
+ host_cpu = @host_cpu@
+@@ -280,7 +281,7 @@
+ # linuxthread semaphore functions get linked:
+ libgcjgc_la_LIBADD = @addobjs@ $(THREADLIBS) $(UNWINDLIBS)
+ libgcjgc_la_DEPENDENCIES = @addobjs@
+-libgcjgc_la_LDFLAGS = -version-info 1:2:0 -rpath $(toolexeclibdir)
++libgcjgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info 1:2:0 -rpath $(toolexeclibdir)
+ libgcjgc_convenience_la_LIBADD = @addobjs@
+ libgcjgc_convenience_la_DEPENDENCIES = @addobjs@
+ AM_CXXFLAGS = @GC_CFLAGS@
+Index: boehm-gc/configure.ac
+===================================================================
+--- boehm-gc/configure.ac (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/configure.ac (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -248,33 +248,46 @@
+ case "$host" in
+ powerpc*-*-darwin*)
+ AC_CHECK_MEMBER(ppc_thread_state_t.r0,
+- AC_DEFINE(HAS_PPC_THREAD_STATE_R0,,[ppc_thread_state_t has field r0]),,
++ AC_DEFINE(HAS_PPC_THREAD_STATE_R0,1,
++ [ppc_thread_state_t has field r0]),,
+ [#include <mach/thread_status.h>])
+ AC_CHECK_MEMBER(ppc_thread_state_t.__r0,
+- AC_DEFINE(HAS_PPC_THREAD_STATE___R0,,dnl
+- [ppc_thread_state_t has field __r0]),,
++ AC_DEFINE(HAS_PPC_THREAD_STATE___R0,1,dnl
++ [ppc_thread_state_t has field __r0]),,
+ [#include <mach/thread_status.h>])
+ AC_CHECK_MEMBER(ppc_thread_state64_t.r0,
+- AC_DEFINE(HAS_PPC_THREAD_STATE64_R0,,dnl
+- [ppc_thread_state64_t has field r0]),,
++ AC_DEFINE(HAS_PPC_THREAD_STATE64_R0,1,dnl
++ [ppc_thread_state64_t has field r0]),,
+ [#include <mach/thread_status.h>])
+ AC_CHECK_MEMBER(ppc_thread_state64_t.__r0,
+- AC_DEFINE(HAS_PPC_THREAD_STATE64___R0,,dnl
+- [ppc_thread_state64_t has field __r0]),,
++ AC_DEFINE(HAS_PPC_THREAD_STATE64___R0,1,dnl
++ [ppc_thread_state64_t has field __r0]),,
+ [#include <mach/thread_status.h>])
+ ;;
+ i?86*-*-darwin*)
+- AC_CHECK_MEMBER(i386_thread_state_t.eax,
+- AC_DEFINE(HAS_I386_THREAD_STATE_EAX,,dnl
+- [i386_thread_state_t has field eax]),,
++ AC_CHECK_MEMBER(x86_thread_state32_t.eax,
++ AC_DEFINE(HAS_X86_THREAD_STATE32_EAX,1,dnl
++ [x86_thread_state32_t has field eax]),,
+ [#include <sys/cdefs.h>
+-#include <mach/thread_status.h>])
+- AC_CHECK_MEMBER(i386_thread_state_t.__eax,
+- AC_DEFINE(HAS_I386_THREAD_STATE___EAX,,dnl
+- [i386_thread_state_t has field __eax]),,
++ #include <mach/thread_status.h>])
++ AC_CHECK_MEMBER(x86_thread_state32_t.__eax,
++ AC_DEFINE(HAS_X86_THREAD_STATE32___EAX,1,dnl
++ [x86_thread_state32_t has field __eax]),,
+ [#include <sys/cdefs.h>
+-#include <mach/thread_status.h>])
++ #include <mach/thread_status.h>])
+ ;;
++ x86_64-*-darwin*)
++ AC_CHECK_MEMBER(x86_thread_state64_t.rax,
++ AC_DEFINE(HAS_X86_THREAD_STATE64_RAX,1,dnl
++ [x86_thread_state64_t has field rax]),,
++ [#include <sys/cdefs.h>
++ #include <mach/thread_status.h>])
++ AC_CHECK_MEMBER(x86_thread_state64_t.__rax,
++ AC_DEFINE(HAS_X86_THREAD_STATE64___RAX,1,dnl
++ [x86_thread_state64_t has field __rax]),,
++ [#include <sys/cdefs.h>
++ #include <mach/thread_status.h>])
++ ;;
+ *) ;;
+ esac
+
+@@ -287,6 +300,14 @@
+ ;;
+ esac
+
++# extra LD Flags which are required for targets
++case "${host}" in
++ *-*-darwin*)
++ extra_ldflags_libgc=-Wl,-single_module
++ ;;
++esac
++AC_SUBST(extra_ldflags_libgc)
++
+ AC_SUBST(EXTRA_TEST_LIBS)
+
+ target_all=libgcjgc.la
+Index: boehm-gc/include/Makefile.in
+===================================================================
+--- boehm-gc/include/Makefile.in (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/include/Makefile.in (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -149,6 +149,7 @@
+ build_vendor = @build_vendor@
+ datadir = @datadir@
+ exec_prefix = @exec_prefix@
++extra_ldflags_libgc = @extra_ldflags_libgc@
+ host = @host@
+ host_alias = @host_alias@
+ host_cpu = @host_cpu@
+Index: boehm-gc/include/gc_config.h.in
+===================================================================
+--- boehm-gc/include/gc_config.h.in (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/include/gc_config.h.in (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -54,12 +54,6 @@
+ /* support for win32 threads */
+ #undef GC_WIN32_THREADS
+
+-/* i386_thread_state_t has field eax */
+-#undef HAS_I386_THREAD_STATE_EAX
+-
+-/* i386_thread_state_t has field __eax */
+-#undef HAS_I386_THREAD_STATE___EAX
+-
+ /* ppc_thread_state64_t has field r0 */
+ #undef HAS_PPC_THREAD_STATE64_R0
+@@ -72,6 +66,18 @@
+ /* ppc_thread_state_t has field __r0 */
+ #undef HAS_PPC_THREAD_STATE___R0
-+#ifdef HAVE_FSTAT
++/* x86_thread_state32_t has field eax */
++#undef HAS_X86_THREAD_STATE32_EAX
+
- /* SUBROUTINE FSTAT(UNIT, SARRAY, STATUS)
- INTEGER, INTENT(IN) :: UNIT
- INTEGER, INTENT(OUT) :: SARRAY(13)
-@@ -546,3 +558,5 @@
- fstat_i8_sub (unit, sarray, &val);
- return val;
- }
-+
-+#endif
-Index: gcc-4_2-branch/libgfortran/ChangeLog
-===================================================================
---- gcc-4_2-branch/libgfortran/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/libgfortran/ChangeLog (revision 124164)
-@@ -1,3 +1,19 @@
-+2007-04-17 Jerry DeLisle <jvdelisle@gcc.gnu.org>
-+
-+ PR libgfortran/31366
-+ * io/transfer.c (read_block_direct): Do not generate error when reading
-+ past EOF on a short record that is less than the RECL= specified.
-+
-+2007-04-13 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
-+
-+ PR libfortran/31335
-+ * intrinsics/stat.c: Only provide STAT and FSTAT library routines
-+ if stat() and fstat() library functions are available. When lstat()
-+ is not available, use stat() instead.
-+ * configure.ac: Add checks for stat, fstat and lstat.
-+ * configure: Regenerate.
-+ * config.h.in: Regenerate.
++/* x86_thread_state32_t has field __eax */
++#undef HAS_X86_THREAD_STATE32___EAX
+
- 2007-03-15 Jerry DeLisle <jvdelisle@gcc.gnu.org>
-
- PR libgfortran/31099
-@@ -3,4 +19,9 @@
- * io/file_pos.c (st_rewind): Don't set bytes_left to zero.
-
-+2007-03-14 Jakub Jelinek <jakub@redhat.com>
++/* x86_thread_state64_t has field rax */
++#undef HAS_X86_THREAD_STATE64_RAX
+
-+ * io/unix.c (regular_file): For ACTION_UNSPECIFIED retry with
-+ O_RDONLY even if errno is EROFS.
++/* x86_thread_state64_t has field __rax */
++#undef HAS_X86_THREAD_STATE64___RAX
+
- 2007-03-09 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+ /* Define to 1 if you have the <inttypes.h> header file. */
+ #undef HAVE_INTTYPES_H
-Index: gcc-4_2-branch/libgfortran/config.h.in
+Index: boehm-gc/include/private/gc_priv.h
===================================================================
---- gcc-4_2-branch/libgfortran/config.h.in (revision 123014)
-+++ gcc-4_2-branch/libgfortran/config.h.in (revision 124164)
-@@ -357,6 +357,9 @@
- /* libm includes frexpl */
- #undef HAVE_FREXPL
+--- boehm-gc/include/private/gc_priv.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/include/private/gc_priv.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -286,6 +286,53 @@
+ #endif
-+/* Define to 1 if you have the `fstat' function. */
-+#undef HAVE_FSTAT
-+
- /* Define to 1 if you have the `ftruncate' function. */
- #undef HAVE_FTRUNCATE
-@@ -462,6 +465,9 @@
- /* libm includes logl */
- #undef HAVE_LOGL
++#if defined(DARWIN)
++# if defined(POWERPC)
++# if CPP_WORDSZ == 32
++# define GC_THREAD_STATE_T ppc_thread_state_t
++# define GC_MACH_THREAD_STATE PPC_THREAD_STATE
++# define GC_MACH_THREAD_STATE_COUNT PPC_THREAD_STATE_COUNT
++# define GC_MACH_HEADER mach_header
++# define GC_MACH_SECTION section
++# else
++# define GC_THREAD_STATE_T ppc_thread_state64_t
++# define GC_MACH_THREAD_STATE PPC_THREAD_STATE64
++# define GC_MACH_THREAD_STATE_COUNT PPC_THREAD_STATE64_COUNT
++# define GC_MACH_HEADER mach_header_64
++# define GC_MACH_SECTION section_64
++# endif
++# elif defined(I386) || defined(X86_64)
++# if CPP_WORDSZ == 32
++# define GC_THREAD_STATE_T x86_thread_state32_t
++# define GC_MACH_THREAD_STATE x86_THREAD_STATE32
++# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE32_COUNT
++# define GC_MACH_HEADER mach_header
++# define GC_MACH_SECTION section
++# else
++# define GC_THREAD_STATE_T x86_thread_state64_t
++# define GC_MACH_THREAD_STATE x86_THREAD_STATE64
++# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
++# define GC_MACH_HEADER mach_header_64
++# define GC_MACH_SECTION section_64
++# endif
++# else
++# error define GC_THREAD_STATE_T
++# define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE
++# define GC_MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
++# endif
++/* Try to work out the right way to access thread state structure members.
++ The structure has changed its definition in different Darwin versions.
++ This now defaults to the (older) names without __, thus hopefully,
++ not breaking any existing Makefile.direct builds. */
++# if defined (HAS_PPC_THREAD_STATE___R0) \
++ || defined (HAS_PPC_THREAD_STATE64___R0) \
++ || defined (HAS_X86_THREAD_STATE32___EAX) \
++ || defined (HAS_X86_THREAD_STATE64___RAX)
++# define THREAD_FLD(x) __ ## x
++# else
++# define THREAD_FLD(x) x
++# endif
++#endif
+ /*********************************/
+ /* */
+ /* OS interface routines */
+@@ -468,6 +515,53 @@
+ # define GETENV(name) 0
+ #endif
-+/* Define to 1 if you have the `lstat' function. */
-+#undef HAVE_LSTAT
++#if defined(DARWIN)
++# if defined(POWERPC)
++# if CPP_WORDSZ == 32
++# define GC_THREAD_STATE_T ppc_thread_state_t
++# define GC_MACH_THREAD_STATE PPC_THREAD_STATE
++# define GC_MACH_THREAD_STATE_COUNT PPC_THREAD_STATE_COUNT
++# define GC_MACH_HEADER mach_header
++# define GC_MACH_SECTION section
++# else
++# define GC_THREAD_STATE_T ppc_thread_state64_t
++# define GC_MACH_THREAD_STATE PPC_THREAD_STATE64
++# define GC_MACH_THREAD_STATE_COUNT PPC_THREAD_STATE64_COUNT
++# define GC_MACH_HEADER mach_header_64
++# define GC_MACH_SECTION section_64
++# endif
++# elif defined(I386) || defined(X86_64)
++# if CPP_WORDSZ == 32
++# define GC_THREAD_STATE_T x86_thread_state32_t
++# define GC_MACH_THREAD_STATE x86_THREAD_STATE32
++# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE32_COUNT
++# define GC_MACH_HEADER mach_header
++# define GC_MACH_SECTION section
++# else
++# define GC_THREAD_STATE_T x86_thread_state64_t
++# define GC_MACH_THREAD_STATE x86_THREAD_STATE64
++# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
++# define GC_MACH_HEADER mach_header_64
++# define GC_MACH_SECTION section_64
++# endif
++# else
++# error define GC_THREAD_STATE_T
++# define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE
++# define GC_MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT
++# endif
++/* Try to work out the right way to access thread state structure members.
++ The structure has changed its definition in different Darwin versions.
++ This now defaults to the (older) names without __, thus hopefully,
++ not breaking any existing Makefile.direct builds. */
++# if defined (HAS_PPC_THREAD_STATE___R0) \
++ || defined (HAS_PPC_THREAD_STATE64___R0) \
++ || defined (HAS_X86_THREAD_STATE32___EAX) \
++ || defined (HAS_X86_THREAD_STATE64___RAX)
++# define THREAD_FLD(x) __ ## x
++# else
++# define THREAD_FLD(x) x
++# endif
++#endif
+ /*********************************/
+ /* */
+ /* Word-size-dependent defines */
+Index: boehm-gc/include/private/gcconfig.h
+===================================================================
+--- boehm-gc/include/private/gcconfig.h (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/include/private/gcconfig.h (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -302,7 +302,10 @@
+ # if defined(__ppc__) || defined(__ppc64__)
+ # define POWERPC
+ # define mach_type_known
+-# elif defined(__i386__) || defined(__x86_64)
++# elif defined(__x86_64__)
++# define X86_64
++# define mach_type_known
++# elif defined(__i386__)
+ # define I386
+ # define mach_type_known
+ # endif
+@@ -791,26 +794,29 @@
+ # define DATAEND (_end)
+ # endif
+ # ifdef DARWIN
+-# if defined(__ppc64__) || defined(__x86_64)
++# define OS_TYPE "DARWIN"
++# define DYNAMIC_LOADING
++# if defined(__ppc64__)
+ # define ALIGNMENT 8
+ # define CPP_WORDSZ 64
++# define STACKBOTTOM ((ptr_t) 0x7fff5fc00000)
++# define CACHE_LINE_SIZE 64
++# ifndef HBLKSIZE
++# define HBLKSIZE 4096
++# endif
+ # else
+ # define ALIGNMENT 4
++# define STACKBOTTOM ((ptr_t) 0xc0000000)
+ # endif
+-# define OS_TYPE "DARWIN"
+-# define DYNAMIC_LOADING
+ /* XXX: see get_end(3), get_etext() and get_end() should not be used.
+- These aren't used when dyld support is enabled (it is by default) */
++ These aren't used when dyld support is enabled (it is by default) */
+ # define DATASTART ((ptr_t) get_etext())
+ # define DATAEND ((ptr_t) get_end())
+-# define STACKBOTTOM ((ptr_t) 0xc0000000)
+ # define USE_MMAP
+ # define USE_MMAP_ANON
+ # define USE_ASM_PUSH_REGS
+- /* This is potentially buggy. It needs more testing. See the comments in
+- os_dep.c. It relies on threads to track writes. */
+ # ifdef GC_DARWIN_THREADS
+-/* # define MPROTECT_VDB -- diabled for now. May work for some apps. */
++# define MPROTECT_VDB
+ # endif
+ # include <unistd.h>
+ # define GETPAGESIZE() getpagesize()
+@@ -822,7 +828,7 @@
+ __asm__ __volatile__ ("dcbtst 0,%0" : : "r" ((const void *) (x)))
+ # endif
+ /* There seems to be some issues with trylock hanging on darwin. This
+- should be looked into some more */
++ should be looked into some more */
+ # define NO_PTHREAD_TRYLOCK
+ # endif
+ # ifdef FREEBSD
+@@ -1317,23 +1323,21 @@
+ # define DARWIN_DONT_PARSE_STACK
+ # define DYNAMIC_LOADING
+ /* XXX: see get_end(3), get_etext() and get_end() should not be used.
+- These aren't used when dyld support is enabled (it is by default) */
++ These aren't used when dyld support is enabled (it is by default) */
+ # define DATASTART ((ptr_t) get_etext())
+ # define DATAEND ((ptr_t) get_end())
+ # define STACKBOTTOM ((ptr_t) 0xc0000000)
+ # define USE_MMAP
+ # define USE_MMAP_ANON
+ # define USE_ASM_PUSH_REGS
+- /* This is potentially buggy. It needs more testing. See the comments in
+- os_dep.c. It relies on threads to track writes. */
+ # ifdef GC_DARWIN_THREADS
+-/* # define MPROTECT_VDB -- disabled for now. May work for some apps. */
++# define MPROTECT_VDB
+ # endif
+ # include <unistd.h>
+ # define GETPAGESIZE() getpagesize()
+ /* There seems to be some issues with trylock hanging on darwin. This
+- should be looked into some more */
+-# define NO_PTHREAD_TRYLOCK
++ should be looked into some more */
++# define NO_PTHREAD_TRYLOCK
+ # endif /* DARWIN */
+ # endif
+
+@@ -1986,6 +1990,26 @@
+ # define PREFETCH_FOR_WRITE(x) __builtin_prefetch((x), 1)
+ # endif
+ # endif
++# ifdef DARWIN
++# define OS_TYPE "DARWIN"
++# define DARWIN_DONT_PARSE_STACK
++# define DYNAMIC_LOADING
++ /* XXX: see get_end(3), get_etext() and get_end() should not be used.
++ These aren't used when dyld support is enabled (it is by default) */
++# define DATASTART ((ptr_t) get_etext())
++# define DATAEND ((ptr_t) get_end())
++# define STACKBOTTOM ((ptr_t) 0x7fff5fc00000)
++# define USE_MMAP
++# define USE_MMAP_ANON
++# ifdef GC_DARWIN_THREADS
++# define MPROTECT_VDB
++# endif
++# include <unistd.h>
++# define GETPAGESIZE() getpagesize()
++ /* There seems to be some issues with trylock hanging on darwin. This
++ should be looked into some more */
++# define NO_PTHREAD_TRYLOCK
++# endif
+ # ifdef FREEBSD
+ # define OS_TYPE "FREEBSD"
+ # ifndef GC_FREEBSD_THREADS
+Index: boehm-gc/ChangeLog
+===================================================================
+--- boehm-gc/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,67 @@
++2007-05-22 Andreas Tobler <a.tobler@schweiz.org>
++
++ * Backport r124870 from main.
++
++ 2007-05-20 Andreas Tobler <a.tobler@schweiz.org>
++
++ * configure.ac: Introduce extra_ldflags_libgc. Use it for Darwin.
++ * configure: Regenerate.
++ * Makefile.am (libgc_la_LDFLAGS): Use extra_ldflags_libgc.
++ * Makefile.in: Regenerate.
++ * include/Makefile.in: Regenerate.
++ * include/private/gcconfig.h: Enable MPROTECT_VDB for all Darwin
++ targets. Remove comments. Prepare ppc64 support for Darwin.
+
- /* Define to 1 if you have the <math.h> header file. */
- #undef HAVE_MATH_H
-
-@@ -552,6 +558,9 @@
- /* libm includes sqrtl */
- #undef HAVE_SQRTL
-
-+/* Define to 1 if you have the `stat' function. */
-+#undef HAVE_STAT
++2007-05-19 Andreas Tobler <a.tobler@schweiz.org>
++
++ * Backport r120684, 120801, 120853, 120874 and 120977 from main.
++
++ 2007-01-19 Andreas Tobler <a.tobler@schweiz.org>
++
++ * os_dep.c (defined(MPROTECT_VDB) && defined(DARWIN)): Moved recently
++ added defines to include/private/gc_priv.h
++ * darwin_stop_world.c: Removed the above defines.
++ (catch_exception_raise): Added THREAD_FLD in exc_state for POWERPC too.
++ * include/private/gc_priv.h: Moved definitions from darwin_stop_world.c
++ and os_dep.c to here. Fixed THREAD definition fixes for ppc64.
++
++ 2007-01-17 Mike Stump <mrs@apple.com>
+
- /* Define to 1 if you have the <stddef.h> header file. */
- #undef HAVE_STDDEF_H
++ * os_dep.c: Fix i686-apple-darwin9 builds.
++
++ 2007-01-17 Andreas Tobler <a.tobler@schweiz.org>
++
++ * include/gc_config.h.in: Regenerate.
++
++ 2007-01-15 Andreas Tobler <a.tobler@schweiz.org>
++
++ * os_dep.c (defined(MPROTECT_VDB) && defined(DARWIN)): Adjust mail
++ reference.
++ (catch_exception_raise): Fix typo in the I386 exc_state.
++
++ 2007-01-11 Andreas Tobler <a.tobler@schweiz.org>
++
++ * configure.ac: Replaced HAS_I386_THREAD_STATE_* with
++ HAS_X86_THREAD_STATE32_* and HAS_X86_THREAD_STATE64_* respectively.
++ * configure: Regenerated.
++ * include/private/gcconfig.h (DARWIN): Added X86_64 define for Darwin.
++ Added base definitions for the X86_64 Darwin port.
++ * include/private/gc_priv.h: Added definitions for Darwin MACH thread
++ operations. Moved existing THREAD_STATE info from darwin_stop_world.c.
++ * darwin_stop_world.c: Removed THREAD_STATE info. Added
++ HAS_X86_THREAD_STATE64___RAX. And replaced HAS_I386_THREAD_STATE___EAX
++ with HAS_X86_THREAD_STATE32___EAX.
++ (GC_push_all_stacks): Use GC_MACH_THREAD_STATE_COUNT. Add code for
++ X86_64 Darwin.
++ * dyn_load.c (GC_dyld_name_for_hdr): Use GC_MACH_HEADER.
++ (GC_dyld_image_add): Use GC_MACH_HEADER and GC_MACH_SECTION.
++ Distinguish between getsectbynamefromheader_64 and
++ getsectbynamefromheader.
++ (GC_dyld_image_remove): Likewise.
++ * os_dep.c (GC_dirty_init): Use GC_MACH_THREAD_STATE.
++ (catch_exception_raise): Introduce exception information for I386 and
++ X86_64 Darwin. Add X86_64 for exc_state.faultvaddr.
++
+ 2007-05-13 Release Manager
-Index: gcc-4_2-branch/libgfortran/configure.ac
-===================================================================
---- gcc-4_2-branch/libgfortran/configure.ac (revision 123014)
-+++ gcc-4_2-branch/libgfortran/configure.ac (revision 124164)
-@@ -177,7 +177,7 @@
- AC_CHECK_FUNCS(getrusage times mkstemp strtof strtold snprintf ftruncate chsize)
- AC_CHECK_FUNCS(chdir strerror getlogin gethostname kill link symlink perror)
- AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl)
--AC_CHECK_FUNCS(wait setmode gettimeofday)
-+AC_CHECK_FUNCS(wait setmode gettimeofday stat fstat lstat)
-
- # Check for types
- AC_CHECK_TYPES([intptr_t])
-Index: gcc-4_2-branch/libgfortran/io/unix.c
+ * GCC 4.2.0 released.
+Index: boehm-gc/configure
===================================================================
---- gcc-4_2-branch/libgfortran/io/unix.c (revision 123014)
-+++ gcc-4_2-branch/libgfortran/io/unix.c (revision 124164)
-@@ -1186,7 +1186,7 @@
- break;
+--- boehm-gc/configure (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/configure (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -309,7 +309,7 @@
+ # include <unistd.h>
+ #endif"
- case STATUS_REPLACE:
-- crflag = O_CREAT | O_TRUNC;
-+ crflag = O_CREAT | O_TRUNC;
- break;
+-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical mkinstalldirs INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CFLAGS CXXFLAGS CCAS CCASFLAGS AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT GC_CFLAGS LN_S LIBTOOL CXXCPP CPPFLAGS THREADLIBS POWERPC_DARWIN_TRUE POWERPC_DARWIN_FALSE EXTRA_TEST_LIBS target_all CPLUSPLUS_TRUE CPLUSPLUS_FALSE AM_CPPFLAGS addobjs addincludes addlibs addtests CPP EGREP MY_CFLAGS toolexecdir toolexeclibdir LIBOBJS LTLIBOBJS'
++ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical mkinstalldirs INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CXX ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE CFLAGS CXXFLAGS CCAS CCASFLAGS AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT GC_CFLAGS LN_S LIBTOOL CXXCPP CPPFLAGS THREADLIBS POWERPC_DARWIN_TRUE POWERPC_DARWIN_FALSE extra_ldflags_libgc EXTRA_TEST_LIBS target_all CPLUSPLUS_TRUE CPLUSPLUS_FALSE AM_CPPFLAGS addobjs addincludes addlibs addtests CPP EGREP MY_CFLAGS toolexecdir toolexeclibdir LIBOBJS LTLIBOBJS'
+ ac_subst_files=''
- default:
-@@ -1202,14 +1202,14 @@
- mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
- fd = open (path, rwflag | crflag, mode);
- if (flags->action != ACTION_UNSPECIFIED)
-- return fd;
-+ return fd;
-
- if (fd >= 0)
- {
- flags->action = ACTION_READWRITE;
- return fd;
- }
-- if (errno != EACCES)
-+ if (errno != EACCES && errno != EROFS)
- return fd;
+ # Initialize some variables set by options.
+@@ -5741,7 +5741,7 @@
+ if test $ac_cv_member_ppc_thread_state_t_r0 = yes; then
- /* retry for read-only access */
-Index: gcc-4_2-branch/libgfortran/io/transfer.c
-===================================================================
---- gcc-4_2-branch/libgfortran/io/transfer.c (revision 123014)
-+++ gcc-4_2-branch/libgfortran/io/transfer.c (revision 124164)
-@@ -410,7 +410,6 @@
- /* Short read, e.g. if we hit EOF. Apparently, we read
- more than was written to the last record. */
- *nbytes = to_read_record;
-- generate_error (&dtp->common, ERROR_SHORT_RECORD, NULL);
- return;
- }
+ cat >>confdefs.h <<\_ACEOF
+-#define HAS_PPC_THREAD_STATE_R0
++#define HAS_PPC_THREAD_STATE_R0 1
+ _ACEOF
-Index: gcc-4_2-branch/libffi/configure
-===================================================================
---- gcc-4_2-branch/libffi/configure (revision 123014)
-+++ gcc-4_2-branch/libffi/configure (revision 124164)
-@@ -5401,7 +5401,11 @@
- sparc-*-linux* | sparc-*-netbsdelf* | sparc-*-knetbsd*-gnu) TARGET=SPARC; TARGETDIR=sparc;;
- sparc*-*-rtems*) TARGET=SPARC; TARGETDIR=sparc;;
- sparc64-*-linux* | sparc64-*-freebsd* | sparc64-*-netbsd* | sparc64-*-knetbsd*-gnu) TARGET=SPARC; TARGETDIR=sparc;;
--alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu | alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu) TARGET=ALPHA; TARGETDIR=alpha;;
-+alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu | alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu)
-+ TARGET=ALPHA; TARGETDIR=alpha
-+ # Support 128-bit long double, changable via command-line switch.
-+ HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
-+ ;;
- ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
- m32r*-*-linux* ) TARGET=M32R; TARGETDIR=m32r;;
- m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
-@@ -7142,15 +7146,17 @@
-
-
- # Also AC_SUBST this variable for ffi.h.
--HAVE_LONG_DOUBLE=0
--if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
-- if test $ac_cv_sizeof_long_double != 0; then
-- HAVE_LONG_DOUBLE=1
-+if test -z "$HAVE_LONG_DOUBLE"; then
-+ HAVE_LONG_DOUBLE=0
-+ if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
-+ if test $ac_cv_sizeof_long_double != 0; then
-+ HAVE_LONG_DOUBLE=1
+ fi
+@@ -5852,7 +5852,7 @@
+ if test $ac_cv_member_ppc_thread_state_t___r0 = yes; then
cat >>confdefs.h <<\_ACEOF
- #define HAVE_LONG_DOUBLE 1
+-#define HAS_PPC_THREAD_STATE___R0
++#define HAS_PPC_THREAD_STATE___R0 1
_ACEOF
-+ fi
- fi
fi
+@@ -5963,7 +5963,7 @@
+ if test $ac_cv_member_ppc_thread_state64_t_r0 = yes; then
-Index: gcc-4_2-branch/libffi/include/ffi.h.in
-===================================================================
---- gcc-4_2-branch/libffi/include/ffi.h.in (revision 123014)
-+++ gcc-4_2-branch/libffi/include/ffi.h.in (revision 124164)
-@@ -153,9 +153,13 @@
- extern ffi_type ffi_type_sint64;
- extern ffi_type ffi_type_float;
- extern ffi_type ffi_type_double;
--extern ffi_type ffi_type_longdouble;
- extern ffi_type ffi_type_pointer;
-
-+#if @HAVE_LONG_DOUBLE@
-+extern ffi_type ffi_type_longdouble;
-+#else
-+#define ffi_type_longdouble ffi_type_double
-+#endif
+ cat >>confdefs.h <<\_ACEOF
+-#define HAS_PPC_THREAD_STATE64_R0
++#define HAS_PPC_THREAD_STATE64_R0 1
+ _ACEOF
- typedef enum {
- FFI_OK = 0,
-Index: gcc-4_2-branch/libffi/src/alpha/ffi.c
-===================================================================
---- gcc-4_2-branch/libffi/src/alpha/ffi.c (revision 123014)
-+++ gcc-4_2-branch/libffi/src/alpha/ffi.c (revision 124164)
-@@ -25,13 +25,24 @@
+ fi
+@@ -6074,16 +6074,16 @@
+ if test $ac_cv_member_ppc_thread_state64_t___r0 = yes; then
- #include <ffi.h>
- #include <ffi_common.h>
--
- #include <stdlib.h>
-
--extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)());
--extern void ffi_closure_osf(void);
-+/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE;
-+ all further uses in this file will refer to the 128-bit type. */
-+#if defined(__LONG_DOUBLE_128__)
-+# if FFI_TYPE_LONGDOUBLE != 4
-+# error FFI_TYPE_LONGDOUBLE out of date
-+# endif
-+#else
-+# undef FFI_TYPE_LONGDOUBLE
-+# define FFI_TYPE_LONGDOUBLE 4
-+#endif
+ cat >>confdefs.h <<\_ACEOF
+-#define HAS_PPC_THREAD_STATE64___R0
++#define HAS_PPC_THREAD_STATE64___R0 1
+ _ACEOF
-+extern void ffi_call_osf(void *, unsigned long, unsigned, void *, void (*)())
-+ FFI_HIDDEN;
-+extern void ffi_closure_osf(void) FFI_HIDDEN;
+ fi
-+
- ffi_status
- ffi_prep_cif_machdep(ffi_cif *cif)
+ ;;
+ i?86*-*-darwin*)
+- echo "$as_me:$LINENO: checking for i386_thread_state_t.eax" >&5
+-echo $ECHO_N "checking for i386_thread_state_t.eax... $ECHO_C" >&6
+-if test "${ac_cv_member_i386_thread_state_t_eax+set}" = set; then
++ echo "$as_me:$LINENO: checking for x86_thread_state32_t.eax" >&5
++echo $ECHO_N "checking for x86_thread_state32_t.eax... $ECHO_C" >&6
++if test "${ac_cv_member_x86_thread_state32_t_eax+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+@@ -6093,12 +6093,12 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+ #include <sys/cdefs.h>
+-#include <mach/thread_status.h>
++ #include <mach/thread_status.h>
+
+ int
+ main ()
{
-@@ -49,6 +60,11 @@
- cif->flags = cif->rtype->type;
- break;
-
-+ case FFI_TYPE_LONGDOUBLE:
-+ /* 128-bit long double is returned in memory, like a struct. */
-+ cif->flags = FFI_TYPE_STRUCT;
-+ break;
-+
- default:
- cif->flags = FFI_TYPE_INT;
- break;
-@@ -57,6 +73,7 @@
- return FFI_OK;
- }
-
-+
- void
- ffi_call(ffi_cif *cif, void (*fn)(), void *rvalue, void **avalue)
+-static i386_thread_state_t ac_aggr;
++static x86_thread_state32_t ac_aggr;
+ if (ac_aggr.eax)
+ return 0;
+ ;
+@@ -6127,7 +6127,7 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+- ac_cv_member_i386_thread_state_t_eax=yes
++ ac_cv_member_x86_thread_state32_t_eax=yes
+ else
+ echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+@@ -6139,12 +6139,12 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+ #include <sys/cdefs.h>
+-#include <mach/thread_status.h>
++ #include <mach/thread_status.h>
+
+ int
+ main ()
{
-@@ -64,8 +81,6 @@
- long i, avn;
- ffi_type **arg_types;
-
-- FFI_ASSERT (cif->abi == FFI_OSF);
--
- /* If the return value is a struct and we don't have a return
- value address then we need to make one. */
- if (rvalue == NULL && cif->flags == FFI_TYPE_STRUCT)
-@@ -84,6 +99,8 @@
-
- while (i < avn)
- {
-+ size_t size = (*arg_types)->size;
-+
- switch ((*arg_types)->type)
- {
- case FFI_TYPE_SINT8:
-@@ -129,6 +146,12 @@
- *(double *) argp = *(double *)(* avalue);
- break;
+-static i386_thread_state_t ac_aggr;
++static x86_thread_state32_t ac_aggr;
+ if (sizeof ac_aggr.eax)
+ return 0;
+ ;
+@@ -6173,30 +6173,30 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+- ac_cv_member_i386_thread_state_t_eax=yes
++ ac_cv_member_x86_thread_state32_t_eax=yes
+ else
+ echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+
+-ac_cv_member_i386_thread_state_t_eax=no
++ac_cv_member_x86_thread_state32_t_eax=no
+ fi
+ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+-echo "$as_me:$LINENO: result: $ac_cv_member_i386_thread_state_t_eax" >&5
+-echo "${ECHO_T}$ac_cv_member_i386_thread_state_t_eax" >&6
+-if test $ac_cv_member_i386_thread_state_t_eax = yes; then
++echo "$as_me:$LINENO: result: $ac_cv_member_x86_thread_state32_t_eax" >&5
++echo "${ECHO_T}$ac_cv_member_x86_thread_state32_t_eax" >&6
++if test $ac_cv_member_x86_thread_state32_t_eax = yes; then
-+ case FFI_TYPE_LONGDOUBLE:
-+ /* 128-bit long double is passed by reference. */
-+ *(long double **) argp = (long double *)(* avalue);
-+ size = sizeof (long double *);
-+ break;
-+
- case FFI_TYPE_STRUCT:
- memcpy(argp, *avalue, (*arg_types)->size);
- break;
-@@ -137,7 +160,7 @@
- FFI_ASSERT(0);
- }
+ cat >>confdefs.h <<\_ACEOF
+-#define HAS_I386_THREAD_STATE_EAX
++#define HAS_X86_THREAD_STATE32_EAX 1
+ _ACEOF
-- argp += ALIGN((*arg_types)->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-+ argp += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
- i++, arg_types++, avalue++;
- }
+ fi
-@@ -153,8 +176,6 @@
+- echo "$as_me:$LINENO: checking for i386_thread_state_t.__eax" >&5
+-echo $ECHO_N "checking for i386_thread_state_t.__eax... $ECHO_C" >&6
+-if test "${ac_cv_member_i386_thread_state_t___eax+set}" = set; then
++ echo "$as_me:$LINENO: checking for x86_thread_state32_t.__eax" >&5
++echo $ECHO_N "checking for x86_thread_state32_t.__eax... $ECHO_C" >&6
++if test "${ac_cv_member_x86_thread_state32_t___eax+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+ else
+ cat >conftest.$ac_ext <<_ACEOF
+@@ -6206,12 +6206,12 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+ #include <sys/cdefs.h>
+-#include <mach/thread_status.h>
++ #include <mach/thread_status.h>
+
+ int
+ main ()
{
- unsigned int *tramp;
-
-- FFI_ASSERT (cif->abi == FFI_OSF);
--
- tramp = (unsigned int *) &closure->tramp[0];
- tramp[0] = 0x47fb0401; /* mov $27,$1 */
- tramp[1] = 0xa77b0010; /* ldq $27,16($27) */
-@@ -177,7 +198,8 @@
- return FFI_OK;
- }
-
--int
-+
-+long FFI_HIDDEN
- ffi_closure_osf_inner(ffi_closure *closure, void *rvalue, unsigned long *argp)
+-static i386_thread_state_t ac_aggr;
++static x86_thread_state32_t ac_aggr;
+ if (ac_aggr.__eax)
+ return 0;
+ ;
+@@ -6240,7 +6240,7 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+- ac_cv_member_i386_thread_state_t___eax=yes
++ ac_cv_member_x86_thread_state32_t___eax=yes
+ else
+ echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+@@ -6252,12 +6252,12 @@
+ cat >>conftest.$ac_ext <<_ACEOF
+ /* end confdefs.h. */
+ #include <sys/cdefs.h>
+-#include <mach/thread_status.h>
++ #include <mach/thread_status.h>
+
+ int
+ main ()
{
- ffi_cif *cif;
-@@ -205,6 +227,8 @@
- /* Grab the addresses of the arguments from the stack frame. */
- while (i < avn)
- {
-+ size_t size = arg_types[i]->size;
-+
- switch (arg_types[i]->type)
- {
- case FFI_TYPE_SINT8:
-@@ -236,16 +260,22 @@
- avalue[i] = &argp[argn - (argn < 6 ? 6 : 0)];
- break;
-
-+ case FFI_TYPE_LONGDOUBLE:
-+ /* 128-bit long double is passed by reference. */
-+ avalue[i] = (long double *) argp[argn];
-+ size = sizeof (long double *);
-+ break;
-+
- default:
-- FFI_ASSERT(0);
-+ abort ();
- }
-
-- argn += ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
-+ argn += ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG;
- i++;
- }
-
- /* Invoke the closure. */
-- (closure->fun) (cif, rvalue, avalue, closure->user_data);
-+ closure->fun (cif, rvalue, avalue, closure->user_data);
+-static i386_thread_state_t ac_aggr;
++static x86_thread_state32_t ac_aggr;
+ if (sizeof ac_aggr.__eax)
+ return 0;
+ ;
+@@ -6286,28 +6286,256 @@
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+- ac_cv_member_i386_thread_state_t___eax=yes
++ ac_cv_member_x86_thread_state32_t___eax=yes
+ else
+ echo "$as_me: failed program was:" >&5
+ sed 's/^/| /' conftest.$ac_ext >&5
+
+-ac_cv_member_i386_thread_state_t___eax=no
++ac_cv_member_x86_thread_state32_t___eax=no
+ fi
+ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+ rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ fi
+-echo "$as_me:$LINENO: result: $ac_cv_member_i386_thread_state_t___eax" >&5
+-echo "${ECHO_T}$ac_cv_member_i386_thread_state_t___eax" >&6
+-if test $ac_cv_member_i386_thread_state_t___eax = yes; then
++echo "$as_me:$LINENO: result: $ac_cv_member_x86_thread_state32_t___eax" >&5
++echo "${ECHO_T}$ac_cv_member_x86_thread_state32_t___eax" >&6
++if test $ac_cv_member_x86_thread_state32_t___eax = yes; then
- /* Tell ffi_closure_osf how to perform return type promotions. */
- return cif->rtype->type;
-Index: gcc-4_2-branch/libffi/src/alpha/osf.S
-===================================================================
---- gcc-4_2-branch/libffi/src/alpha/osf.S (revision 123014)
-+++ gcc-4_2-branch/libffi/src/alpha/osf.S (revision 124164)
-@@ -1,10 +1,8 @@
- /* -----------------------------------------------------------------------
-- osf.S - Copyright (c) 1998, 2001 Red Hat
-+ osf.S - Copyright (c) 1998, 2001, 2007 Red Hat
-
- Alpha/OSF Foreign Function Interface
+ cat >>confdefs.h <<\_ACEOF
+-#define HAS_I386_THREAD_STATE___EAX
++#define HAS_X86_THREAD_STATE32___EAX 1
+ _ACEOF
-- $Id$
--
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- ``Software''), to deal in the Software without restriction, including
-@@ -42,6 +40,8 @@
- .align 3
- .globl ffi_call_osf
- .ent ffi_call_osf
-+ FFI_HIDDEN(ffi_call_osf)
-+
- ffi_call_osf:
- .frame $15, 32, $26, 0
- .mask 0x4008000, -32
-@@ -129,6 +129,8 @@
- .align 3
- .globl ffi_closure_osf
- .ent ffi_closure_osf
-+ FFI_HIDDEN(ffi_closure_osf)
-+
- ffi_closure_osf:
- .frame $30, 16*8, $26, 0
- .mask 0x4000000, -16*8
-@@ -265,7 +267,7 @@
- .gprel32 $load_32 # FFI_TYPE_INT
- .gprel32 $load_float # FFI_TYPE_FLOAT
- .gprel32 $load_double # FFI_TYPE_DOUBLE
-- .gprel32 $load_double # FFI_TYPE_LONGDOUBLE
-+ .gprel32 $load_none # FFI_TYPE_LONGDOUBLE
- .gprel32 $load_u8 # FFI_TYPE_UINT8
- .gprel32 $load_s8 # FFI_TYPE_SINT8
- .gprel32 $load_u16 # FFI_TYPE_UINT16
-Index: gcc-4_2-branch/libffi/src/types.c
-===================================================================
---- gcc-4_2-branch/libffi/src/types.c (revision 123014)
-+++ gcc-4_2-branch/libffi/src/types.c (revision 124164)
-@@ -57,4 +57,17 @@
-
- FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT);
- FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE);
-+
-+#ifdef __alpha__
-+/* Even if we're not configured to default to 128-bit long double,
-+ maintain binary compatibility, as -mlong-double-128 can be used
-+ at any time. */
-+/* Validate the hard-coded number below. */
-+# if defined(__LONG_DOUBLE_128__) && FFI_TYPE_LONGDOUBLE != 4
-+# error FFI_TYPE_LONGDOUBLE out of date
-+# endif
-+# undef ffi_type_longdouble
-+ffi_type ffi_type_longdouble = { 16, 16, 4, NULL };
-+#elif FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
- FFI_TYPEDEF(longdouble, long double, FFI_TYPE_LONGDOUBLE);
-+#endif
-Index: gcc-4_2-branch/libffi/ChangeLog
-===================================================================
---- gcc-4_2-branch/libffi/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/libffi/ChangeLog (revision 124164)
-@@ -1,3 +1,16 @@
-+2007-04-20 Richard Henderson <rth@redhat.com>
-+
-+ * configure.ac (alpha*-*-*): Define HAVE_LONG_DOUBLE.
-+ * configure: Regenerate.
-+ * include/ffi.h.in (ffi_type_longdouble): Define as ffi_type_double
-+ if HAVE_LONG_DOUBLE is false.
-+ * src/alpha/ffi.c (ffi_prep_cif_machdep): Support the 128-bit
-+ long double type.
-+ (ffi_call_osf, ffi_closure_osf): Likewise.
-+ * src/alpha/osf.S (ffi_call_osf, ffi_closure_osf): Mark hidden.
-+ * src/types.c (ffi_type_longdouble): For alpha, always generate
-+ for the 128-bit long double type.
-+
- 2007-02-13 Andreas Krebbel <krebbel1@de.ibm.com>
-
- * src/s390/ffi.c (ffi_prep_args, ffi_prep_cif_machdep,
-Index: gcc-4_2-branch/libffi/configure.ac
-===================================================================
---- gcc-4_2-branch/libffi/configure.ac (revision 123014)
-+++ gcc-4_2-branch/libffi/configure.ac (revision 124164)
-@@ -59,7 +59,11 @@
- sparc-*-linux* | sparc-*-netbsdelf* | sparc-*-knetbsd*-gnu) TARGET=SPARC; TARGETDIR=sparc;;
- sparc*-*-rtems*) TARGET=SPARC; TARGETDIR=sparc;;
- sparc64-*-linux* | sparc64-*-freebsd* | sparc64-*-netbsd* | sparc64-*-knetbsd*-gnu) TARGET=SPARC; TARGETDIR=sparc;;
--alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu | alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu) TARGET=ALPHA; TARGETDIR=alpha;;
-+alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu | alpha*-*-netbsd* | alpha*-*-knetbsd*-gnu)
-+ TARGET=ALPHA; TARGETDIR=alpha
-+ # Support 128-bit long double, changable via command-line switch.
-+ HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)'
-+ ;;
- ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
- m32r*-*-linux* ) TARGET=M32R; TARGETDIR=m32r;;
- m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
-@@ -132,11 +136,13 @@
- AC_CHECK_SIZEOF(long double)
-
- # Also AC_SUBST this variable for ffi.h.
--HAVE_LONG_DOUBLE=0
--if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
-- if test $ac_cv_sizeof_long_double != 0; then
-- HAVE_LONG_DOUBLE=1
-- AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double])
-+if test -z "$HAVE_LONG_DOUBLE"; then
-+ HAVE_LONG_DOUBLE=0
-+ if test $ac_cv_sizeof_double != $ac_cv_sizeof_long_double; then
-+ if test $ac_cv_sizeof_long_double != 0; then
-+ HAVE_LONG_DOUBLE=1
-+ AC_DEFINE(HAVE_LONG_DOUBLE, 1, [Define if you have the long double type and it is bigger than a double])
-+ fi
- fi
fi
- AC_SUBST(HAVE_LONG_DOUBLE)
-Index: gcc-4_2-branch/contrib/ChangeLog
-===================================================================
---- gcc-4_2-branch/contrib/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/contrib/ChangeLog (revision 124164)
-@@ -1,3 +1,18 @@
-+2007-04-04 Eric Christopher <echristo@apple.com>
-+
-+ Backport from mainline:
-+ 2007-04-04 Zack Weinberg <zack@mrtock.ucsd.edu>
-+
-+ * texi2pod.pl: Correct handling of @itemize with no argument.
-+
-+ 2007-02-16 Matthias Klose <doko@debian.org>
-+
-+ * texi2pod.pl: Handle @subsubsection, ignore @anchor.
+
+ ;;
++ x86_64-*-darwin*)
++ echo "$as_me:$LINENO: checking for x86_thread_state64_t.rax" >&5
++echo $ECHO_N "checking for x86_thread_state64_t.rax... $ECHO_C" >&6
++if test "${ac_cv_member_x86_thread_state64_t_rax+set}" = set; then
++ echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++ cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#include <sys/cdefs.h>
++ #include <mach/thread_status.h>
+
-+ 2007-02-06 Richard Sandiford <richard@codesourcery.com>
++int
++main ()
++{
++static x86_thread_state64_t ac_aggr;
++if (ac_aggr.rax)
++return 0;
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ ac_cv_member_x86_thread_state64_t_rax=yes
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#include <sys/cdefs.h>
++ #include <mach/thread_status.h>
+
-+ * texi2pod.pl: Handle @multitable.
++int
++main ()
++{
++static x86_thread_state64_t ac_aggr;
++if (sizeof ac_aggr.rax)
++return 0;
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ ac_cv_member_x86_thread_state64_t_rax=yes
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++ac_cv_member_x86_thread_state64_t_rax=no
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++echo "$as_me:$LINENO: result: $ac_cv_member_x86_thread_state64_t_rax" >&5
++echo "${ECHO_T}$ac_cv_member_x86_thread_state64_t_rax" >&6
++if test $ac_cv_member_x86_thread_state64_t_rax = yes; then
++
++cat >>confdefs.h <<\_ACEOF
++#define HAS_X86_THREAD_STATE64_RAX 1
++_ACEOF
++
++fi
++
++ echo "$as_me:$LINENO: checking for x86_thread_state64_t.__rax" >&5
++echo $ECHO_N "checking for x86_thread_state64_t.__rax... $ECHO_C" >&6
++if test "${ac_cv_member_x86_thread_state64_t___rax+set}" = set; then
++ echo $ECHO_N "(cached) $ECHO_C" >&6
++else
++ cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#include <sys/cdefs.h>
++ #include <mach/thread_status.h>
+
- 2006-09-27 Matthew Sachs <msachs@apple.com>
-
- * compareSumTests3: POD syntax fix.
-@@ -84,14 +99,14 @@
-
- 2005-10-28 Daniel Berlin <dberlin@dberlin.org>
- Ben Elliston <bje@au1.ibm.com>
--
++int
++main ()
++{
++static x86_thread_state64_t ac_aggr;
++if (ac_aggr.__rax)
++return 0;
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ ac_cv_member_x86_thread_state64_t___rax=yes
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++cat >conftest.$ac_ext <<_ACEOF
++/* confdefs.h. */
++_ACEOF
++cat confdefs.h >>conftest.$ac_ext
++cat >>conftest.$ac_ext <<_ACEOF
++/* end confdefs.h. */
++#include <sys/cdefs.h>
++ #include <mach/thread_status.h>
+
- * gcc_update: Update for svn.
- * newcvsroot: Ditto.
- * gcc_build: Ditto.
-
- 2005-10-21 Mark Mitchell <mark@codesourcery.com>
-
-- * texi2pod.pl: Substitue for @value even when part of @include.
-+ * texi2pod.pl: Substitue for @value even when part of @include.
++int
++main ()
++{
++static x86_thread_state64_t ac_aggr;
++if (sizeof ac_aggr.__rax)
++return 0;
++ ;
++ return 0;
++}
++_ACEOF
++rm -f conftest.$ac_objext
++if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
++ (eval $ac_compile) 2>conftest.er1
++ ac_status=$?
++ grep -v '^ *+' conftest.er1 >conftest.err
++ rm -f conftest.er1
++ cat conftest.err >&5
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); } &&
++ { ac_try='test -z "$ac_c_werror_flag"
++ || test ! -s conftest.err'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; } &&
++ { ac_try='test -s conftest.$ac_objext'
++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
++ (eval $ac_try) 2>&5
++ ac_status=$?
++ echo "$as_me:$LINENO: \$? = $ac_status" >&5
++ (exit $ac_status); }; }; then
++ ac_cv_member_x86_thread_state64_t___rax=yes
++else
++ echo "$as_me: failed program was:" >&5
++sed 's/^/| /' conftest.$ac_ext >&5
++
++ac_cv_member_x86_thread_state64_t___rax=no
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
++fi
++echo "$as_me:$LINENO: result: $ac_cv_member_x86_thread_state64_t___rax" >&5
++echo "${ECHO_T}$ac_cv_member_x86_thread_state64_t___rax" >&6
++if test $ac_cv_member_x86_thread_state64_t___rax = yes; then
++
++cat >>confdefs.h <<\_ACEOF
++#define HAS_X86_THREAD_STATE64___RAX 1
++_ACEOF
++
++fi
++
++ ;;
+ *) ;;
+ esac
+
+@@ -6392,8 +6620,16 @@
+ ;;
+ esac
+
++# extra LD Flags which are required for targets
++case "${host}" in
++ *-*-darwin*)
++ extra_ldflags_libgc=-Wl,-single_module
++ ;;
++esac
+
+
++
++
+ target_all=libgcjgc.la
+
+
+@@ -8246,6 +8482,7 @@
+ s,@THREADLIBS@,$THREADLIBS,;t t
+ s,@POWERPC_DARWIN_TRUE@,$POWERPC_DARWIN_TRUE,;t t
+ s,@POWERPC_DARWIN_FALSE@,$POWERPC_DARWIN_FALSE,;t t
++s,@extra_ldflags_libgc@,$extra_ldflags_libgc,;t t
+ s,@EXTRA_TEST_LIBS@,$EXTRA_TEST_LIBS,;t t
+ s,@target_all@,$target_all,;t t
+ s,@CPLUSPLUS_TRUE@,$CPLUSPLUS_TRUE,;t t
+Index: boehm-gc/os_dep.c
+===================================================================
+--- boehm-gc/os_dep.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/os_dep.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -3371,7 +3371,7 @@
+ 1. Apple's mach/xnu documentation
+ 2. Timothy J. Wood's "Mach Exception Handlers 101" post to the
+ omnigroup's macosx-dev list.
+- www.omnigroup.com/mailman/archive/macosx-dev/2000-June/002030.html
++ www.omnigroup.com/mailman/archive/macosx-dev/2000-June/014178.html
+ 3. macosx-nat.c from Apple's GDB source code.
+ */
+
+@@ -3683,7 +3683,7 @@
+ mask,
+ GC_ports.exception,
+ EXCEPTION_DEFAULT,
+- MACHINE_THREAD_STATE
++ GC_MACH_THREAD_STATE
+ );
+ if(r != KERN_SUCCESS) ABORT("task_set_exception_ports failed");
+
+@@ -3802,10 +3802,16 @@
+ mach_msg_type_number_t exc_state_count = PPC_EXCEPTION_STATE64_COUNT;
+ ppc_exception_state64_t exc_state;
+ # endif
+-# elif defined(I386)
+- thread_state_flavor_t flavor = i386_EXCEPTION_STATE;
+- mach_msg_type_number_t exc_state_count = i386_EXCEPTION_STATE_COUNT;
+- i386_exception_state_t exc_state;
++# elif defined(I386) || defined(X86_64)
++# if CPP_WORDSZ == 32
++ thread_state_flavor_t flavor = x86_EXCEPTION_STATE32;
++ mach_msg_type_number_t exc_state_count = x86_EXCEPTION_STATE32_COUNT;
++ x86_exception_state32_t exc_state;
++# else
++ thread_state_flavor_t flavor = x86_EXCEPTION_STATE64;
++ mach_msg_type_number_t exc_state_count = x86_EXCEPTION_STATE64_COUNT;
++ x86_exception_state64_t exc_state;
++# endif
+ # else
+ # error FIXME for non-ppc darwin
+ # endif
+@@ -3838,9 +3844,9 @@
+
+ /* This is the address that caused the fault */
+ #if defined(POWERPC)
+- addr = (char*) exc_state.dar;
+-#elif defined (I386)
+- addr = (char*) exc_state.faultvaddr;
++ addr = (char*) exc_state. THREAD_FLD(dar);
++#elif defined (I386) || defined (X86_64)
++ addr = (char*) exc_state. THREAD_FLD(faultvaddr);
+ #else
+ # error FIXME for non POWERPC/I386
+ #endif
+Index: boehm-gc/Makefile.am
+===================================================================
+--- boehm-gc/Makefile.am (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/Makefile.am (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -33,11 +33,13 @@
+ rs6000_mach_dep.s sparc_mach_dep.S sparc_netbsd_mach_dep.s \
+ sparc_sunos4_mach_dep.s ia64_save_regs_in_stack.s
+
++extra_ldflags_libgc = @extra_ldflags_libgc@
++
+ # Include THREADLIBS here to ensure that the correct versions of
+ # linuxthread semaphore functions get linked:
+ libgcjgc_la_LIBADD = @addobjs@ $(THREADLIBS) $(UNWINDLIBS)
+ libgcjgc_la_DEPENDENCIES = @addobjs@
+-libgcjgc_la_LDFLAGS = -version-info 1:2:0 -rpath $(toolexeclibdir)
++libgcjgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info 1:2:0 -rpath $(toolexeclibdir)
+
+ libgcjgc_convenience_la_LIBADD = @addobjs@
+ libgcjgc_convenience_la_DEPENDENCIES = @addobjs@
+Index: boehm-gc/dyn_load.c
+===================================================================
+--- boehm-gc/dyn_load.c (.../tags/gcc_4_2_0_release) (revision 125292)
++++ boehm-gc/dyn_load.c (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1152,7 +1152,7 @@
+ };
+
+ #ifdef DARWIN_DEBUG
+-static const char *GC_dyld_name_for_hdr(struct mach_header *hdr) {
++static const char *GC_dyld_name_for_hdr(const struct GC_MACH_HEADER *hdr) {
+ unsigned long i,c;
+ c = _dyld_image_count();
+ for(i=0;i<c;i++) if(_dyld_get_image_header(i) == hdr)
+@@ -1162,12 +1162,17 @@
+ #endif
+
+ /* This should never be called by a thread holding the lock */
+-static void GC_dyld_image_add(struct mach_header* hdr, unsigned long slide) {
++static void GC_dyld_image_add(const struct GC_MACH_HEADER *hdr, intptr_t slide)
++{
+ unsigned long start,end,i;
+- const struct section *sec;
++ const struct GC_MACH_SECTION *sec;
+ if (GC_no_dls) return;
+ for(i=0;i<sizeof(GC_dyld_sections)/sizeof(GC_dyld_sections[0]);i++) {
+- sec = getsectbynamefromheader(
++# if defined (__LP64__)
++ sec = getsectbynamefromheader_64(
++# else
++ sec = getsectbynamefromheader(
++# endif
+ hdr,GC_dyld_sections[i].seg,GC_dyld_sections[i].sect);
+ if(sec == NULL || sec->size == 0) continue;
+ start = slide + sec->addr;
+@@ -1184,11 +1189,16 @@
+ }
- 2005-10-21 Bob Wilson <bob.wilson@acm.org>
+ /* This should never be called by a thread holding the lock */
+-static void GC_dyld_image_remove(struct mach_header* hdr, unsigned long slide) {
++static void GC_dyld_image_remove(const struct GC_MACH_HEADER *hdr,
++ intptr_t slide) {
+ unsigned long start,end,i;
+- const struct section *sec;
++ const struct GC_MACH_SECTION *sec;
+ for(i=0;i<sizeof(GC_dyld_sections)/sizeof(GC_dyld_sections[0]);i++) {
+- sec = getsectbynamefromheader(
++# if defined (__LP64__)
++ sec = getsectbynamefromheader_64(
++# else
++ sec = getsectbynamefromheader(
++# endif
+ hdr,GC_dyld_sections[i].seg,GC_dyld_sections[i].sect);
+ if(sec == NULL || sec->size == 0) continue;
+ start = slide + sec->addr;
+Index: configure.in
+===================================================================
+--- configure.in (.../tags/gcc_4_2_0_release) (revision 125292)
++++ configure.in (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -2419,7 +2419,13 @@
+ # Pass -fkeep-inline-functions for stage 1 if the GCC version supports it.
+ CFLAGS="$CFLAGS -fkeep-inline-functions"
+ AC_MSG_CHECKING([whether -fkeep-inline-functions is supported])
+- AC_TRY_COMPILE(,,
++ AC_TRY_COMPILE([
++#if (__GNUC__ < 3) \
++ || (__GNUC__ == 3 && (__GNUC_MINOR__ < 3 \
++ || (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ < 1)))
++#error http://gcc.gnu.org/PR29382
++#endif
++ ],,
+ [AC_MSG_RESULT([yes]); stage1_cflags="$stage1_cflags -fkeep-inline-functions"],
+ [AC_MSG_RESULT([no])])
-Index: gcc-4_2-branch/contrib/texi2pod.pl
-===================================================================
---- gcc-4_2-branch/contrib/texi2pod.pl (revision 123014)
-+++ gcc-4_2-branch/contrib/texi2pod.pl (revision 124164)
-@@ -162,6 +162,8 @@
- } elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) {
- $_ = "\n=back\n";
- $ic = pop @icstack;
-+ } elsif ($ended eq "multitable") {
-+ $_ = "\n=back\n";
- } else {
- die "unknown command \@end $ended at line $.\n";
- }
-@@ -252,6 +254,8 @@
- and $_ = "\n=head2 $1\n";
- /^\@subsection\s+(.+)$/
- and $_ = "\n=head3 $1\n";
-+ /^\@subsubsection\s+(.+)$/
-+ and $_ = "\n=head4 $1\n";
-
- # Block command handlers:
- /^\@itemize(?:\s+(\@[a-z]+|\*|-))?/ and do {
-@@ -260,7 +264,7 @@
- if (defined $1) {
- $ic = $1;
- } else {
-- $ic = '@bullet';
-+ $ic = '*';
- }
- $_ = "\n=over 4\n";
- $endw = "itemize";
-@@ -278,6 +282,12 @@
- $endw = "enumerate";
- };
-
-+ /^\@multitable\s.*/ and do {
-+ push @endwstack, $endw;
-+ $endw = "multitable";
-+ $_ = "\n=over 4\n";
-+ };
-+
- /^\@([fv]?table)\s+(\@[a-z]+)/ and do {
- push @endwstack, $endw;
- push @icstack, $ic;
-@@ -297,6 +307,16 @@
- $_ = ""; # need a paragraph break
- };
-
-+ /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
-+ @columns = ();
-+ for $column (split (/\s*\@tab\s*/, $1)) {
-+ # @strong{...} is used a @headitem work-alike
-+ $column =~ s/^\@strong{(.*)}$/$1/;
-+ push @columns, $column;
-+ }
-+ $_ = "\n=item ".join (" : ", @columns)."\n";
-+ };
-+
- /^\@itemx?\s*(.+)?$/ and do {
- if (defined $1) {
- # Entity escapes prevent munging by the <> processing below.
-@@ -382,6 +402,9 @@
- s/\@gol//g;
- s/\@\*\s*\n?//g;
-
-+ # Anchors are thrown away
-+ s/\@anchor\{(?:[^\}]*)\}//g;
-+
- # @uref can take one, two, or three arguments, with different
- # semantics each time. @url and @email are just like @uref with
- # one argument, for our purposes.
-Index: gcc-4_2-branch/libjava/configure
-===================================================================
---- gcc-4_2-branch/libjava/configure (revision 123014)
-+++ gcc-4_2-branch/libjava/configure (revision 124164)
-@@ -7687,7 +7687,7 @@
- # See if we find them without any special options.
- # Don't add to $LIBS permanently.
- ac_save_LIBS=$LIBS
-- LIBS="-lXt $LIBS"
-+ LIBS="-lX11 $LIBS"
- if test x$gcc_no_link = xyes; then
- { { echo "$as_me:$LINENO: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&5
- echo "$as_me: error: Link tests are not allowed after GCC_NO_EXECUTABLES." >&2;}
-@@ -9414,12 +9414,13 @@
-
-
-
-+
- for ac_func in strerror ioctl select fstat open fsync sleep opendir \
- gmtime_r localtime_r readdir_r getpwuid_r getcwd \
- access stat lstat mkdir rename rmdir unlink utime chmod readlink \
- nl_langinfo setlocale \
- inet_pton uname inet_ntoa \
-- fork execvp pipe sigaction ftruncate mmap \
-+ fork execvp getrlimit pipe sigaction ftruncate mmap \
- getifaddrs
- do
- as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-@@ -9875,7 +9876,8 @@
-
-
-
--for ac_header in execinfo.h unistd.h dlfcn.h
-+
-+for ac_header in execinfo.h unistd.h dlfcn.h sys/resource.h
- do
- as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
- if eval "test \"\${$as_ac_Header+set}\" = set"; then
-Index: gcc-4_2-branch/libjava/gnu/java/nio/channels/natFileChannelPosix.cc
+Index: ChangeLog
===================================================================
---- gcc-4_2-branch/libjava/gnu/java/nio/channels/natFileChannelPosix.cc (revision 123014)
-+++ gcc-4_2-branch/libjava/gnu/java/nio/channels/natFileChannelPosix.cc (revision 124164)
-@@ -178,8 +178,6 @@
- throw new ::java::io::FileNotFoundException (msg->toString ());
- }
-
-- _Jv_platform_close_on_exec (fd);
--
- return fd;
- }
+--- ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,9 @@
++2007-05-30 Jakub Jelinek <jakub@redhat.com>
++
++ PR bootstrap/29382
++ * configure.in: Don't use -fkeep-inline-functions for GCC < 3.3.1.
++ * configure: Rebuilt.
++
+ 2007-05-13 Release Manager
-Index: gcc-4_2-branch/libjava/gnu/java/net/natPlainSocketImplPosix.cc
+ * GCC 4.2.0 released.
+Index: libjava/java/lang/natClassLoader.cc
===================================================================
---- gcc-4_2-branch/libjava/gnu/java/net/natPlainSocketImplPosix.cc (revision 123014)
-+++ gcc-4_2-branch/libjava/gnu/java/net/natPlainSocketImplPosix.cc (revision 124164)
-@@ -72,8 +72,6 @@
- throw new ::java::io::IOException (JvNewStringUTF (strerr));
- }
+--- libjava/java/lang/natClassLoader.cc (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libjava/java/lang/natClassLoader.cc (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -235,6 +235,15 @@
-- _Jv_platform_close_on_exec (sock);
--
- // We use native_fd in place of fd here. From leaving fd null we avoid
- // the double close problem in FileDescriptor.finalize.
- native_fd = sock;
-@@ -285,8 +283,6 @@
- if (new_socket < 0)
- goto error;
-
-- _Jv_platform_close_on_exec (new_socket);
--
- jbyteArray raddr;
- jint rport;
- if (u.address.sin_family == AF_INET)
-Index: gcc-4_2-branch/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc
-===================================================================
---- gcc-4_2-branch/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc (revision 123014)
-+++ gcc-4_2-branch/libjava/gnu/java/net/natPlainDatagramSocketImplPosix.cc (revision 124164)
-@@ -83,8 +83,6 @@
- throw new ::java::net::SocketException (JvNewStringUTF (strerr));
- }
+ new_class->engine = &_Jv_soleIndirectCompiledEngine;
-- _Jv_platform_close_on_exec (sock);
--
- // We use native_fd in place of fd here. From leaving fd null we avoid
- // the double close problem in FileDescriptor.finalize.
- native_fd = sock;
-Index: gcc-4_2-branch/libjava/configure.ac
-===================================================================
---- gcc-4_2-branch/libjava/configure.ac (revision 123014)
-+++ gcc-4_2-branch/libjava/configure.ac (revision 124164)
-@@ -906,10 +906,10 @@
- access stat lstat mkdir rename rmdir unlink utime chmod readlink \
- nl_langinfo setlocale \
- inet_pton uname inet_ntoa \
-- fork execvp pipe sigaction ftruncate mmap \
-+ fork execvp getrlimit pipe sigaction ftruncate mmap \
- getifaddrs])
- AC_CHECK_FUNCS(inet_aton inet_addr, break)
-- AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h)
-+ AC_CHECK_HEADERS(execinfo.h unistd.h dlfcn.h sys/resource.h)
- # Do an additional check on dld, HP-UX for example has dladdr in libdld.sl
- AC_CHECK_LIB(dl, dladdr, [
- AC_DEFINE(HAVE_DLADDR, 1, [Define if you have dladdr()])], [
-Index: gcc-4_2-branch/libjava/java/lang/natPosixProcess.cc
-===================================================================
---- gcc-4_2-branch/libjava/java/lang/natPosixProcess.cc (revision 123014)
-+++ gcc-4_2-branch/libjava/java/lang/natPosixProcess.cc (revision 124164)
-@@ -17,6 +17,9 @@
- #include <fcntl.h>
- #include <sys/types.h>
- #include <sys/wait.h>
-+#ifdef HAVE_SYS_RESOURCE_H
-+#include <sys/resource.h>
-+#endif
- #include <signal.h>
- #include <string.h>
- #include <stdlib.h>
-@@ -341,7 +344,31 @@
- _exit (127);
- }
- }
--
-+ // Make sure all file descriptors are closed. In
-+ // multi-threaded programs, there is a race between when a
-+ // descriptor is obtained, when we can set FD_CLOEXEC, and
-+ // fork(). If the fork occurs before FD_CLOEXEC is set, the
-+ // descriptor would leak to the execed process if we did not
-+ // manually close it. So that is what we do. Since we
-+ // close all the descriptors, it is redundant to set
-+ // FD_CLOEXEC on them elsewhere.
-+ int max_fd;
-+#ifdef HAVE_GETRLIMIT
-+ rlimit rl;
-+ int rv = getrlimit(RLIMIT_NOFILE, &rl);
-+ if (rv == 0)
-+ max_fd = rl.rlim_max - 1;
-+ else
-+ max_fd = 1024 - 1;
-+#else
-+ max_fd = 1024 - 1;
-+#endif
-+ while(max_fd > 2)
-+ {
-+ if (max_fd != msgp[1])
-+ close (max_fd);
-+ max_fd--;
-+ }
- // Make sure that SIGCHLD is unblocked for the new process.
- sigset_t mask;
- sigemptyset (&mask);
-@@ -425,11 +452,4 @@
-
- myclose (msgp[0]);
- cleanup (args, env, path);
--
-- if (exception == NULL)
-- {
-- fcntl (outp[1], F_SETFD, FD_CLOEXEC);
-- fcntl (inp[0], F_SETFD, FD_CLOEXEC);
-- fcntl (errp[0], F_SETFD, FD_CLOEXEC);
-- }
- }
-Index: gcc-4_2-branch/libjava/include/posix.h
-===================================================================
---- gcc-4_2-branch/libjava/include/posix.h (revision 123014)
-+++ gcc-4_2-branch/libjava/include/posix.h (revision 124164)
-@@ -91,15 +91,6 @@
- extern void _Jv_platform_initialize (void);
- extern void _Jv_platform_initProperties (java::util::Properties*);
-
--inline void
--_Jv_platform_close_on_exec (jint fd)
--{
-- // Ignore errors.
-- ::fcntl (fd, F_SETFD, FD_CLOEXEC);
--}
--
--#undef fcntl
--
- #ifdef JV_HASH_SYNCHRONIZATION
- #ifndef HAVE_USLEEP_DECL
- extern "C" int usleep (useconds_t useconds);
-Index: gcc-4_2-branch/libjava/include/config.h.in
++ /* FIXME: Way back before the dawn of time, we overloaded the
++ SYNTHETIC class access modifier to mean INTERPRETED. This was a
++ Bad Thing, but it didn't matter then because classes were never
++ marked synthetic. However, it is possible to redeem the
++ situation: _Jv_NewClassFromInitializer is only called from
++ compiled classes, so we clear the INTERPRETED flag. This is a
++ kludge! */
++ new_class->accflags &= ~java::lang::reflect::Modifier::INTERPRETED;
++
+ if (_Jv_CheckABIVersion ((unsigned long) new_class->next_or_version))
+ (*_Jv_RegisterClassHook) (new_class);
+
+Index: libjava/ChangeLog
===================================================================
---- gcc-4_2-branch/libjava/include/config.h.in (revision 123014)
-+++ gcc-4_2-branch/libjava/include/config.h.in (revision 124164)
-@@ -124,6 +124,9 @@
- /* Define to 1 if you have the `getpwuid_r' function. */
- #undef HAVE_GETPWUID_R
-
-+/* Define to 1 if you have the `getrlimit' function. */
-+#undef HAVE_GETRLIMIT
+--- libjava/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ libjava/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,8 @@
++2007-05-31 Andrew Haley <aph@redhat.com>
+
- /* Define to 1 if you have the `gettimeofday' function. */
- #undef HAVE_GETTIMEOFDAY
-
-@@ -304,6 +307,9 @@
- /* Define to 1 if you have the <sys/ioctl.h> header file. */
- #undef HAVE_SYS_IOCTL_H
-
-+/* Define to 1 if you have the <sys/resource.h> header file. */
-+#undef HAVE_SYS_RESOURCE_H
++ * java/lang/natClassLoader.cc (_Jv_NewClassFromInitializer): Clear
++ INTERPRETED access modifier.
+
- /* Define to 1 if you have the <sys/rw_lock.h> header file. */
- #undef HAVE_SYS_RW_LOCK_H
+ 2007-05-13 Release Manager
-Index: gcc-4_2-branch/libjava/ChangeLog
-===================================================================
---- gcc-4_2-branch/libjava/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/libjava/ChangeLog (revision 124164)
-@@ -1,3 +1,19 @@
-+2007-03-25 David Daney <ddaney@avtrex.com>
-+
-+ PR libgcj/31228
-+ * configure.ac: Add checks for getrlimit and sys/resource.h.
-+ * include/posix.h (_Jv_platform_close_on_exec): Remove.
-+ * include/config.h.in: Regenerate.
-+ * configure: Regenerate.
-+ * gnu/java/nio/channels/natFileChannelPosix.cc (open): Remove call to
-+ _Jv_platform_close_on_exec;
-+ * gnu/java/net/natPlainSocketImplPosix.cc (create): Likewise.
-+ (accept): Likewise.
-+ * gnu/java/net/natPlainDatagramSocketImplPosix.cc (create):Likewise.
-+ * java/lang/natPosixProcess.cc: Include sys/resource.h.
-+ (nativeSpawn): Close all file descriptors. Don't set FD_CLOEXEC on
-+ pipes.
-+
- 2007-01-29 Kaloian Doganov <kaloian@doganov.org>
-
- PR libgcj/30600:
-Index: gcc-4_2-branch/libcpp/ChangeLog
+ * GCC 4.2.0 released.
+Index: maintainer-scripts/ChangeLog
===================================================================
---- gcc-4_2-branch/libcpp/ChangeLog (revision 123014)
-+++ gcc-4_2-branch/libcpp/ChangeLog (revision 124164)
-@@ -1,3 +1,9 @@
-+2007-04-23 Tom Tromey <tromey@redhat.com>
+--- maintainer-scripts/ChangeLog (.../tags/gcc_4_2_0_release) (revision 125292)
++++ maintainer-scripts/ChangeLog (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -1,3 +1,7 @@
++2007-05-28 Mark Mitchell <mark@codesourcery.com>
+
-+ PR preprocessor/30468:
-+ * mkdeps.c (apply_vpath): Strip successive '/'s if we stripped
-+ './'.
++ * gcc_release: Adjust placement of release candidates.
+
- 2006-12-29 Jakub Jelinek <jakub@redhat.com>
+ 2007-05-13 Release Manager
- PR preprocessor/29612
-Index: gcc-4_2-branch/libcpp/mkdeps.c
+ * GCC 4.2.0 released.
+Index: maintainer-scripts/gcc_release
===================================================================
---- gcc-4_2-branch/libcpp/mkdeps.c (revision 123014)
-+++ gcc-4_2-branch/libcpp/mkdeps.c (revision 124164)
-@@ -1,5 +1,5 @@
- /* Dependency generator for Makefile fragments.
-- Copyright (C) 2000, 2001, 2003 Free Software Foundation, Inc.
-+ Copyright (C) 2000, 2001, 2003, 2007 Free Software Foundation, Inc.
- Contributed by Zack Weinberg, Mar 2000
-
- This program is free software; you can redistribute it and/or modify it
-@@ -141,7 +141,13 @@
-
- /* Remove leading ./ in any case. */
- while (t[0] == '.' && IS_DIR_SEPARATOR (t[1]))
-- t += 2;
-+ {
-+ t += 2;
-+ /* If we removed a leading ./, then also remove any /s after the
-+ first. */
-+ while (IS_DIR_SEPARATOR (t[0]))
-+ ++t;
-+ }
+--- maintainer-scripts/gcc_release (.../tags/gcc_4_2_0_release) (revision 125292)
++++ maintainer-scripts/gcc_release (.../branches/gcc-4_2-branch) (revision 125292)
+@@ -699,10 +699,10 @@
+ # and minor release numbers.
+ SVNBRANCH="branches/gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
- return t;
- }
+- # If this is not a final release, set various parameters acordingly.
++ # If this is not a final release, set various parameters accordingly.
+ if [ ${FINAL} -ne 1 ]; then
+- RELEASE="${RELEASE}-${DATE}"
+- FTP_PATH="${FTP_PATH}/prerelease-${RELEASE}/"
++ RELEASE="${RELEASE}-RC-${DATE}"
++ FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
+ else
+ FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
+ fi