]> git.pld-linux.org Git - packages/crossppc-gcc.git/commitdiff
- updated. auto/th/gcc-4_2_0-5
authorPaweł Sikora <pluto@pld-linux.org>
Sun, 3 Jun 2007 12:56:21 +0000 (12:56 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    gcc-branch.diff -> 1.3

gcc-branch.diff

index f2bee90732c275fc910a90e9f9a8913471a821b4..bbb37866848c102ed6001f266b0da64cba386320 100644 (file)
-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
This page took 1.257172 seconds and 4 git commands to generate.