From: Paweł Sikora Date: Sun, 3 Jun 2007 12:56:21 +0000 (+0000) Subject: - updated. X-Git-Tag: auto/th/gcc-4_2_0-5 X-Git-Url: http://git.pld-linux.org/?p=packages%2Fcrossppc-gcc.git;a=commitdiff_plain;h=5f3731d9b619b724957ee6d030eb9c909a1fb721 - updated. Changed files: gcc-branch.diff -> 1.3 --- diff --git a/gcc-branch.diff b/gcc-branch.diff index f2bee90..bbb3786 100644 --- a/gcc-branch.diff +++ b/gcc-branch.diff @@ -1,8413 +1,10068 @@ -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 -+ -+ * acinclude.m4: Adjust regular expression for ld version -+ extraction. -+ * configure: Regenerate. -+ - 2007-02-07 Jakub Jelinek +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 + -+ 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 -+ Roger Sayle ++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. ++ ++/* 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 ++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 ++/* 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 ++ 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 ++/* 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 ++ 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 ++ /* 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 ++ 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 ++/* 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 ++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 + -+2007-04-20 Jakub Jelinek ++ Backport from mainline: ++ 2007-05-25 H.J. Lu + -+ * 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 + -+2007-04-19 Eric Botcazou ++ Backport from mainline: ++ 2007-05-05 Aurelien Jarno + -+ 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 ++2007-05-27 Daniel Berlin + -+ * 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 ++ * 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 + -+2007-04-17 Jan Hubicka ++ * 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 + -+2007-04-17 H.J. Lu ++ 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 ++2007-05-28 Andrew Pinski + -+ * 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 ++2007-05-27 H.J. Lu + -+ * config/alpha/linux.h (CPP_SPEC): Define. -+ * config/arm/linux-gas.h (SUBTARGET_CPP_SPEC): Extend. ++ Backport from mainline: ++ 2007-05-25 Uros Bizjak ++ ++ * 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 ++ ++ * config/i386/sse.md (*vec_extractv2di_1_sse2): Correct shift. ++ ++2007-05-22 Ian Lance Taylor ++ ++ * 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 ++ ++ 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 ++ ++ 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 ++ ++ 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 ++ ++ 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 ++ ++ PR target/31480 ++ Backport from mainline. ++ * config/sh/sh.md (length): Check if prev_nonnote_insn (insn) ++ is null. ++ ++2007-05-20 Kaz Kojima ++ ++ 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 ++ ++ 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 ++ ++ * 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 ++ ++ 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 ++ ++ 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 ++ ++ * 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 + + 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 +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 ++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 ++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 */ + -+ 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 ++static int get_kind(int) __attribute__ ((noinline)); + -+ * Backport from mainline: -+ 2007-04-16 H.J. Lu ++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 ++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 ++ 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 ++#include "sse2-check.h" + -+ * pa.c (pa_som_asm_init_sections): Ensure that cfun->machine is not -+ null before emitting a .nsubspa directive. ++#include + -+2007-04-08 Anatoly Sokolov ++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 ++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 ++#include + -+ 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 ++#include + -+2007-04-04 Richard Henderson ++#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 (ashr3, lshr3, ashl3): 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 ++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 ++ 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 ++#include + -+ 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 ++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 ++ 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 ++ 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 ++#include "sse2-check.h" + -+ PR target/31380 -+ * config/i386/sse.md (uminv16qi3): Use UMIN instead of UMAX. ++#include + -+2007-03-30 Anatoly Sokolov ++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 ++#include + -+ * 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 -+ -+ * 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 ++#include + -+2007-03-27 Anatoly Sokolov ++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 ++ 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 + -+ 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 + -+2007-03-23 Martin Michlmayr ++ * 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 + -+2007-03-21 Mike Stump ++ 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 ++ 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 ++2007-05-22 Tobias Burnus + -+ 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 + -+2007-03-19 Jeff Law ++ 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 + - 2007-03-16 John David Anglin - - * 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 + - 2007-03-12 Brooks Moses - - * doc/extend.texi: Edit "gnu_inline" documentation. -@@ -37,7 +368,7 @@ - * doc/passes.texi: Fix gcc.info cross-reference. - - 2007-03-12 Daniel Berlin -- ++ 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 - -@@ -415,7 +746,7 @@ - 2007-03-09 Andrew Pinski - - 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 -@@ -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 + - * fold-const.c (tree_expr_nonnegative_p): Handle FIX_TRUNC_EXPR. - - 2007-03-08 Andrew Pinski -@@ -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 - - * 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 - -@@ -618,7 +949,7 @@ - 2007-03-01 Manuel Lopez-Ibanez - - * doc/invoke.texi (Wextra): Delete outdated paragraph. -- ++2007-05-22 Dominique d'Humieres + - 2007-02-27 John David Anglin - - * pa/predicates.md (move_src_operand): Allow zero for mode. -@@ -706,7 +1037,7 @@ - 2007-02-18 Ira Rosen - - * 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 - -- PR 30370 -+ PR 30370 - * config/rs6000/t-ppccomm: Correct Makefile typo. - - 2007-02-06 Roger Sayle -@@ -788,7 +1119,7 @@ - 2007-02-05 Bob Wilson - - * 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 - - PR target/29682 -@@ -817,7 +1148,7 @@ - - Revert for x86 darwin: - 2005-06-19 Uros Bizjak -- ++2007-05-22 Tobias Burnus + - * 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 + -+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 + -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 + -+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 + -+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 + -+ 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 + -+ 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 + -+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 -+ -+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 ++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 -+ -+__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 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(*this), x); ++ } ++ template 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 -+ -+__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 ++! ++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 ++! and Francois-Xavier Coudert ++! ++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 ++! ++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 ++! ++ 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 ++ ++ 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 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 ++! ++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 ++ ++ 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 ++ ++ * gfortran.texi (GFORTRAN_CONVERT_UNIT): Improve documentation. ++ ++2007-05-16 Francois-Xavier Coudert ++ ++ 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 */ -+ -+/* { 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 -+ -+ 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 -+ -+ PR tree-optimization/31605 -+ * gcc.c-torture/execute/pr31605.c: New test. -+ -+2007-04-24 Andreas Krebbel -+ -+ PR target/31641 -+ * gcc.c-torture/compile/pr31641.c: New testcase. -+ -+2007-04-22 Andrew Pinski -+ -+ PR middle-end/31448 -+ * gcc.c-torture/execute/pr31448.c: New testcase. -+ -+2007-04-21 Richard Guenther -+ -+ 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 + 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 + 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 ++ 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 ++ 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 ++ 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 + } + } + +@@ -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 + 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 ++ 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 + 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 ++ 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 ++ 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 ++/* 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 ++ /* 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 ++ 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 ++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 ++/* 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 ++ 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 ++ 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 ++ 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 ++ 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 ++/* 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 ++ 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 + /* 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 + 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 + /* 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 - - PR debug/29906 -@@ -123,12 +284,12 @@ - PR rtl-optimization/30643 - * gcc.dg/pr30643.c: New. - --2007-03-09 Andrew Pinski -+2007-03-09 Andrew Pinski + 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 -+2007-03-09 Andrew Pinski - - PR middle-end/30729 - * gcc.dg/Wunused-value-2.c: New testcase. -@@ -163,7 +324,7 @@ - 2007-03-08 Brooks Moses - - 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 -@@ -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 + 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 ++ 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 -@@ -404,7 +565,7 @@ - 2007-02-16 Francois-Xavier Coudert +-/* 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 +-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 +-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 + 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 - - PR fortran/30481 -@@ -1319,7 +1480,7 @@ - 2006-11-13 Francois-Xavier Coudert - - 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 -@@ -1753,16 +1914,16 @@ - 2006-10-13 Francois-Xavier Coudert - - 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 -@@ -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 - -@@ -4158,7 +4319,7 @@ - 2006-06-08 Francois-Xavier Coudert - - PR fortran/27958 -- * gcc/testsuite/gfortran.dg/substr_2.f: New test. -+ * gfortran.dg/substr_2.f: New test. - - 2006-06-08 Asher Langton - -@@ -6195,7 +6356,7 @@ - - 2006-03-03 Paul Brook - -- * gcc/testsuite/lib/target-supports.exp (check_profiling_available): -+ * lib/target-supports.exp (check_profiling_available): - Add m68k-*-elf. - - 2006-03-03 Thomas Koenig -@@ -9951,11 +10112,11 @@ - 2005-11-04 Francois-Xavier Coudert - - 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 - -@@ -17467,7 +17628,7 @@ - 2005-02-11 Jakub Jelinek - - 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 - -- * 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 - -@@ -34702,9 +34863,9 @@ - - 2002-09-25 Mark Mitchell - -- * 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 - -@@ -35726,7 +35887,7 @@ - - 2002-05-23 Mark Mitchell - -- * gcc/testsuite/gcc.dg/weak-8.c: New test. -+ * gcc.dg/weak-8.c: New test. - - 2002-05-23 J"orn Rennecke - -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(foo); // { dg-error "conversion" } -+ -+void func(const Foo *foo) { -+ Bar *bar = static_cast(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(); -+ h(); -+} -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 -+ int* g() { static char c; return reinterpret_cast(&c); } -+ -+template -+ T* h() { static char c; return reinterpret_cast(&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 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 -+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 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 struct A -+{ -+ static const int i=0; -+}; -+ -+template const int A::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 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; jtype == 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 -+ -+ PR c++/30500 -+ * pt.c (instantiate_decl): Set in_system_header. -+ -+2007-04-17 Simon Martin -+ -+ PR c++/31517 -+ * pt.c (value_dependent_expression_p): Handle MODOP_EXPRs. -+ -+2007-04-16 Mark Mitchell -+ -+ PR c++/31513 -+ * call.c (convert_for_arg_passing): Convert bitfields to their -+ declared types. -+ -+2007-04-13 Jason Merrill -+ -+ 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 -+ -+ * 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 -+ -+ 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 + 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 + 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 -+ Mark Mitchell + 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 + 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 -+ Mark Mitchell + 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 + 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 ++/* 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 ++ /* 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 ++ /* 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 + /* 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 + 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 + 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 , 2000, 2001, 2002. --# Göran Uddeborg , 2005, 2006. -+# Göran Uddeborg , 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 \n" - "Language-Team: Swedish \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 bytes" --msgstr "Varna om ett objekt är större än byte" -+msgstr "Varna för ett objekt är större än 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 % in AltiVec types is deprecated; use %" --msgstr "användning av % i AltiVec-typer undanbedes, använd %" -+msgstr "användning av % i AltiVec-typer bör undvikas, använd %" - - #: 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 - --/* 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\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\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\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\;cmpxchgb\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\;cmpxchgb\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, -- "% 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, -+ "% 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 - #include - #include // For std::distance, srd::search. -+#include - - _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 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 - #include - #include -+#include - - 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 -+#include -+#include -+ -+_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 -+ 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 -+ const _Value __numeric_traits_integer<_Value>::__min; -+ -+ template -+ const _Value __numeric_traits_integer<_Value>::__max; -+ -+ template -+ struct __numeric_traits_floating -+ { -+ // Only floating point types. See N1822. -+ static const int __max_digits10 = -+ 2 + std::numeric_limits<_Value>::digits * 3010/10000; -+ }; -+ -+ template -+ const int __numeric_traits_floating<_Value>::__max_digits10; -+ -+ template -+ struct __numeric_traits -+ : public __conditional_type::__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 - #include --#include --#include // std::streamsize - #include - - _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) -@@ -150,51 +148,6 @@ - template<> - struct __remove_unsigned; + /* 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 -- 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 -- const _Value __numeric_traits_integer<_Value>::__min; -- -- template -- const _Value __numeric_traits_integer<_Value>::__max; -- -- template -- 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 -- const std::streamsize __numeric_traits_floating<_Value>::__max_digits10; -- -- template -- struct __numeric_traits -- : public __conditional_type::__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 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(__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 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 -+ std::pair - 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 - 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 -- 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 +- #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) +- _GLIBCXX_ok +- #endif ++ #include ++ #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 +- #include +- #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 ++ #include ++ #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 ++ #include ++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 ++ #include ++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 ++ #include ++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 -+ -+_GLIBCXX_BEGIN_NAMESPACE(std) -+ -+ template -+ 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 -+ 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 + -+ 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 -+ 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 + -+ 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 + -+#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 - #include - #include -+#include - #include - #include - -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 // For allocator. - #include - #include // For operators >>, <<, and getline decls. -+#include - #include - #include // For less - #include -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 -+#include - - _GLIBCXX_BEGIN_NAMESPACE(std) - -@@ -72,31 +74,6 @@ - __num_put_type; - typedef ctype<_CharT> __ctype_type; - -- template -- friend basic_ostream<_CharT2, _Traits2>& -- operator<<(basic_ostream<_CharT2, _Traits2>&, _CharT2); -- -- template -- friend basic_ostream& -- operator<<(basic_ostream&, char); -- -- template -- friend basic_ostream<_CharT2, _Traits2>& -- operator<<(basic_ostream<_CharT2, _Traits2>&, const _CharT2*); -- -- template -- friend basic_ostream& -- operator<<(basic_ostream&, const char*); -- -- template -- friend basic_ostream<_CharT2, _Traits2>& -- operator<<(basic_ostream<_CharT2, _Traits2>&, const char*); -- -- template -- 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 header file. */ + #undef HAVE_STDLIB_H + ++/* Define if strerror_l is available in . */ ++#undef HAVE_STRERROR_L ++ ++/* Define if strerror_r is available in . */ ++#undef HAVE_STRERROR_R ++ + /* Define to 1 if you have the 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 . */ ++#undef HAVE_STRXFRM_L ++ + /* Define to 1 if you have the 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 +- #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 - __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 +- #include +- #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 - 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 - inline basic_ostream<_CharT, _Traits>& -@@ -502,7 +462,7 @@ - template - inline basic_ostream& - operator<<(basic_ostream& __out, char __c) -- { return __out._M_insert(&__c, 1); } -+ { return __ostream_insert(__out, &__c, 1); } - - // Signed and unsigned - template -@@ -537,7 +497,8 @@ - if (!__s) - __out.setstate(ios_base::badbit); - else -- __out._M_insert(__s, static_cast(_Traits::length(__s))); -+ __ostream_insert(__out, __s, -+ static_cast(_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(_Traits::length(__s))); -+ __ostream_insert(__out, __s, -+ static_cast(_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 ++ #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 ++ #include ++ #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 ++ #include ], ++ [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 .]),) ++ ++ # Use strerror_l if available. ++ AC_TRY_COMPILE([#define _GNU_SOURCE 1 ++ #include ++ #include ], ++ [__locale_t loc; strerror_l(5, loc);], ++ AC_DEFINE(HAVE_STRERROR_L, 1, ++ [Define if strerror_l is available in .]),) ++ ++ 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 ++ #include ], ++ [char s[128]; strerror_r(5, s, 128);], ++ AC_DEFINE(HAVE_STRERROR_R, 1, ++ [Define if strerror_r is available in .]),) ++ 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 -+ -+ 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), operator<<(basic_ostream<>&, -+ const _CharT*), operator<<(basic_ostream&, 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 . -+ * 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 -+ -+ 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 -+ 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 -+ -+ * include/bits/stl_map.h (map<>::insert(iterator, const value_type&): -+ Uglify parameter. -+ -+2007-04-02 Paolo Carlini -+ -+ PR libstdc++/31401 (vstring bits) -+ * include/ext/vstring.tcc (find(const _CharT*, size_type, -+ size_type)): Avoid unsigned overflow. -+ -+2007-03-30 Paolo Carlini + 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 - - 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 -+ -+// 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 -+#include -+ -+// 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 + -+ 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 -+ -+// 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 -+#include -+ -+// 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 + -+ 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 + -+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 -+ -+using __gnu_cxx::__numeric_traits; -+template struct __numeric_traits; -+template struct __numeric_traits; -+template struct __numeric_traits; -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 -+ -+// 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 -+#include -+#include -+#include -+ -+// 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 + -+ 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 + -+ 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 + -+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 -+ -+// 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 -+#include -+#include -+#include -+ -+// 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 + -+ 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; iu.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 -- --using __gnu_cxx::__numeric_traits; --template struct __numeric_traits; --template struct __numeric_traits; --template struct __numeric_traits; -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 +@@ -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 ]) + 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 ]) + 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 ]) + 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 ]) + ;; + 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 +-#include ]) +- AC_CHECK_MEMBER(i386_thread_state_t.__eax, +- AC_DEFINE(HAS_I386_THREAD_STATE___EAX,,dnl +- [i386_thread_state_t has field __eax]),, ++ #include ]) ++ 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 +-#include ]) ++ #include ]) + ;; ++ 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 ++ #include ]) ++ 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 ++ #include ]) ++ ;; + *) ;; + 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 -+ -+ 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 -+ -+ 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 - - 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 ++/* 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 + /* Define to 1 if you have the 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 + # 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 + # 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 ++# 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 ++ ++ * Backport r124870 from main. ++ ++ 2007-05-20 Andreas Tobler ++ ++ * 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 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 ++ ++ * Backport r120684, 120801, 120853, 120874 and 120977 from main. ++ ++ 2007-01-19 Andreas Tobler ++ ++ * 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 + - /* Define to 1 if you have the header file. */ - #undef HAVE_STDDEF_H ++ * os_dep.c: Fix i686-apple-darwin9 builds. ++ ++ 2007-01-17 Andreas Tobler ++ ++ * include/gc_config.h.in: Regenerate. ++ ++ 2007-01-15 Andreas Tobler ++ ++ * 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 ++ ++ * 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 + #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 - #include -- - #include - --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 +-#include ++ #include + + 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 +-#include ++ #include + + 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 +-#include ++ #include + + 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 +-#include ++ #include + + 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 -+ -+ * 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 - - * 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 -+ -+ Backport from mainline: -+ 2007-04-04 Zack Weinberg -+ -+ * texi2pod.pl: Correct handling of @itemize with no argument. -+ -+ 2007-02-16 Matthias Klose -+ -+ * 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 ++ #include + -+ 2007-02-06 Richard Sandiford ++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 ++ #include + -+ * 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 ++ #include + - 2006-09-27 Matthew Sachs - - * compareSumTests3: POD syntax fix. -@@ -84,14 +99,14 @@ - - 2005-10-28 Daniel Berlin - Ben Elliston -- ++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 ++ #include + - * gcc_update: Update for svn. - * newcvsroot: Ditto. - * gcc_build: Ditto. - - 2005-10-21 Mark Mitchell - -- * 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;isize == 0) continue; + start = slide + sec->addr; +@@ -1184,11 +1189,16 @@ + } - 2005-10-21 Bob Wilson + /* 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;isize == 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 ++ ++ 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 - #include - #include -+#ifdef HAVE_SYS_RESOURCE_H -+#include -+#endif - #include - #include - #include -@@ -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 + - /* Define to 1 if you have the `gettimeofday' function. */ - #undef HAVE_GETTIMEOFDAY - -@@ -304,6 +307,9 @@ - /* Define to 1 if you have the header file. */ - #undef HAVE_SYS_IOCTL_H - -+/* Define to 1 if you have the header file. */ -+#undef HAVE_SYS_RESOURCE_H ++ * java/lang/natClassLoader.cc (_Jv_NewClassFromInitializer): Clear ++ INTERPRETED access modifier. + - /* Define to 1 if you have the 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 -+ -+ 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 - - 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 +--- 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 + -+ 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 + 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