4.4.1-22
This commit is contained in:
parent
f3f054a694
commit
a1aa91bff1
|
@ -1,2 +1,2 @@
|
|||
fastjar-0.97.tar.gz
|
||||
gcc-4.4.1-20091010.tar.bz2
|
||||
gcc-4.4.1-20091014.tar.bz2
|
||||
|
|
44
gcc.spec
44
gcc.spec
|
@ -1,9 +1,9 @@
|
|||
%global DATE 20091010
|
||||
%global SVNREV 152620
|
||||
%global DATE 20091014
|
||||
%global SVNREV 152775
|
||||
%global gcc_version 4.4.1
|
||||
# Note, gcc_release must be integer, if you want to add suffixes to
|
||||
# %{release}, append them after %{gcc_release} on Release: line.
|
||||
%global gcc_release 21
|
||||
%global gcc_release 22
|
||||
%global _unpackaged_files_terminate_build 0
|
||||
%global multilib_64_archs sparc64 ppc64 s390x x86_64
|
||||
%global include_gappletviewer 1
|
||||
|
@ -160,10 +160,8 @@ Patch16: gcc44-unwind-debug-hook.patch
|
|||
Patch17: gcc44-pr38757.patch
|
||||
Patch18: gcc44-libstdc++-docs.patch
|
||||
Patch19: gcc44-ppc64-aixdesc.patch
|
||||
Patch20: gcc44-vta-rh521991.patch
|
||||
Patch21: gcc44-vta-rh521991-2.patch
|
||||
Patch22: gcc44-pr41646.patch
|
||||
Patch23: gcc44-rhel6-power4.patch
|
||||
Patch20: gcc44-powerpc-with-tune.patch
|
||||
Patch21: gcc44-unwind-leltgegt.patch
|
||||
|
||||
Patch1000: fastjar-0.97-segfault.patch
|
||||
|
||||
|
@ -470,12 +468,8 @@ which are required to compile with the GNAT.
|
|||
%patch18 -p0 -b .libstdc++-docs~
|
||||
%endif
|
||||
%patch19 -p0 -b .ppc64-aixdesc~
|
||||
%patch20 -p0 -b .vta-rh521991~
|
||||
%patch21 -p0 -b .vta-rh521991-2~
|
||||
%patch22 -p0 -b .pr41646~
|
||||
%if 0%{?rhel} >= 6
|
||||
%patch23 -p0 -b .rhel6-power4~
|
||||
%endif
|
||||
%patch20 -p0 -b .powerpc-with-tune~
|
||||
%patch21 -p0 -b .unwind-leltgegt~
|
||||
|
||||
# This testcase doesn't compile.
|
||||
rm libjava/testsuite/libjava.lang/PR35020*
|
||||
|
@ -651,6 +645,11 @@ CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="`echo $OPT_FLAGS | sed 's/ -Wall / /g'`"
|
|||
%ifarch sparc sparcv9
|
||||
--host=%{gcc_target_platform} --build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=v7
|
||||
%endif
|
||||
%if 0%{?rhel} >= 6
|
||||
%ifarch ppc ppc64
|
||||
--with-cpu-32=power4 --with-tune-32=power6 --with-cpu-64=power4 --with-tune-64=power6 \
|
||||
%endif
|
||||
%endif
|
||||
%ifarch ppc
|
||||
--build=%{gcc_target_platform} --target=%{gcc_target_platform} --with-cpu=default32
|
||||
%endif
|
||||
|
@ -1845,6 +1844,22 @@ fi
|
|||
%doc rpm.doc/changelogs/libmudflap/ChangeLog*
|
||||
|
||||
%changelog
|
||||
* Wed Oct 14 2009 Jakub Jelinek <jakub@redhat.com> 4.4.1-22
|
||||
- update from gcc-4_4-branch
|
||||
- PRs target/26515, target/38948
|
||||
- fix s390{,x} BLKmode symbol handling
|
||||
- fix i?86 testqi splitter (#528206, PR target/41680)
|
||||
- VTA backports
|
||||
- introduce debug temps (PRs debug/41264, debug/41338, debug/41343,
|
||||
debug/41447, target/41693)
|
||||
- build debug stmts on updates (PR debug/41616)
|
||||
- fix another with/without -save-temps debug info difference
|
||||
(#526841, PR preprocessor/41543)
|
||||
- fix invalid ranges in .debug_loc section (PR debug/41695)
|
||||
%if 0%{?rhel} >= 6
|
||||
- if -mcpu= isn't specified, default to -mcpu=power4 (#463549)
|
||||
%endif
|
||||
|
||||
* Sat Oct 10 2009 Jakub Jelinek <jakub@redhat.com> 4.4.1-21
|
||||
- update from gcc-4_4-branch
|
||||
- fix s390{,x} prefetch for pre-z10 CPUs (#524552)
|
||||
|
@ -1853,9 +1868,6 @@ fi
|
|||
(PR preprocessor/41445)
|
||||
- fix ICE with small BLKmode returning call (#516028,
|
||||
PR rtl-optimization/41646)
|
||||
%if 0%{?rhel} >= 6
|
||||
- if -mcpu= isn't specified, default to -mcpu=power4 (#463549)
|
||||
%endif
|
||||
|
||||
* Thu Oct 8 2009 Jakub Jelinek <jakub@redhat.com> 4.4.1-20
|
||||
- update from gcc-4_4-branch
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
2009-10-14 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* config/rs6000/option-defaults.h (OPTION_DEFAULT_SPECS): Don't
|
||||
add --with-tune{,-32,-64} configured default for -mtune if explicit
|
||||
-mcpu is used.
|
||||
|
||||
--- gcc/config/rs6000/option-defaults.h.jj 2009-06-02 18:36:50.000000000 +0200
|
||||
+++ gcc/config/rs6000/option-defaults.h 2009-10-14 18:28:50.134723716 +0200
|
||||
@@ -50,15 +50,15 @@
|
||||
/* Support for a compile-time default CPU, et cetera. The rules are:
|
||||
--with-cpu is ignored if -mcpu is specified; likewise --with-cpu-32
|
||||
and --with-cpu-64.
|
||||
- --with-tune is ignored if -mtune is specified; likewise --with-tune-32
|
||||
- and --with-tune-64.
|
||||
+ --with-tune is ignored if -mtune or -mcpu is specified; likewise
|
||||
+ --with-tune-32 and --with-tune-64.
|
||||
--with-float is ignored if -mhard-float or -msoft-float are
|
||||
- specified. */
|
||||
+ specified. */
|
||||
#define OPTION_DEFAULT_SPECS \
|
||||
+ {"tune", "%{!mtune=*:%{!mcpu=*:-mtune=%(VALUE)}}" }, \
|
||||
+ {"tune_32", "%{" OPT_ARCH32 ":%{!mtune=*:%{!mcpu=*:-mtune=%(VALUE)}}}" }, \
|
||||
+ {"tune_64", "%{" OPT_ARCH64 ":%{!mtune=*:%{!mcpu=*:-mtune=%(VALUE)}}}" }, \
|
||||
{"cpu", "%{!mcpu=*:-mcpu=%(VALUE)}" }, \
|
||||
{"cpu_32", "%{" OPT_ARCH32 ":%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
|
||||
{"cpu_64", "%{" OPT_ARCH64 ":%{!mcpu=*:-mcpu=%(VALUE)}}" }, \
|
||||
- {"tune", "%{!mtune=*:-mtune=%(VALUE)}" }, \
|
||||
- {"tune_32", "%{" OPT_ARCH32 ":%{!mtune=*:-mtune=%(VALUE)}}" }, \
|
||||
- {"tune_64", "%{" OPT_ARCH64 ":%{!mtune=*:-mtune=%(VALUE)}}" }, \
|
||||
{"float", "%{!msoft-float:%{!mhard-float:-m%(VALUE)-float}}" }
|
|
@ -1,54 +0,0 @@
|
|||
2009-10-09 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/41646
|
||||
* calls.c (expand_call): For BLKmode types returned in registers
|
||||
avoid likely spilled hard regs in copy_blkmode_from_reg generated
|
||||
insns.
|
||||
|
||||
* gcc.c-torture/compile/pr41646.c: New test.
|
||||
|
||||
--- gcc/calls.c (revision 152596)
|
||||
+++ gcc/calls.c (revision 152597)
|
||||
@@ -3019,7 +3019,10 @@ expand_call (tree exp, rtx target, int i
|
||||
}
|
||||
else if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
|
||||
{
|
||||
- target = copy_blkmode_from_reg (target, valreg, TREE_TYPE (exp));
|
||||
+ rtx val = valreg;
|
||||
+ if (GET_MODE (val) != BLKmode)
|
||||
+ val = avoid_likely_spilled_reg (val);
|
||||
+ target = copy_blkmode_from_reg (target, val, TREE_TYPE (exp));
|
||||
|
||||
/* We can not support sibling calls for this case. */
|
||||
sibcall_failure = 1;
|
||||
--- gcc/testsuite/gcc.c-torture/compile/pr41646.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.c-torture/compile/pr41646.c (revision 152597)
|
||||
@@ -0,0 +1,28 @@
|
||||
+/* PR rtl-optimization/41646 */
|
||||
+
|
||||
+struct A { unsigned long a; };
|
||||
+struct B { unsigned short b, c, d; };
|
||||
+struct B bar (unsigned long);
|
||||
+
|
||||
+char *
|
||||
+foo (char *a, struct A *x)
|
||||
+{
|
||||
+ struct B b = bar (x->a);
|
||||
+ unsigned char c;
|
||||
+ unsigned short d;
|
||||
+ a[3] = ((unsigned char) (b.b % 10) + 48);
|
||||
+ d = b.b / 10;
|
||||
+ a[2] = ((unsigned char) (d % 10) + 48);
|
||||
+ d = d / 10;
|
||||
+ a[1] = ((unsigned char) (d % 10) + 48);
|
||||
+ a[0] = ((unsigned char) ((d / 10) % 10) + 48);
|
||||
+ a[4] = 46;
|
||||
+ c = (unsigned char) b.c;
|
||||
+ a[6] = (c % 10 + 48);
|
||||
+ a[5] = ((c / 10) % 10 + 48);
|
||||
+ a[7] = 46;
|
||||
+ c = b.d;
|
||||
+ a[9] = (c % 10 + 48);
|
||||
+ a[8] = ((c / 10) % 10 + 48);
|
||||
+ return a + 10;
|
||||
+}
|
|
@ -1,34 +0,0 @@
|
|||
2009-10-10 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* config/rs6000/sysv4.h (TARGET_DEFAULT): Override to default to
|
||||
power4 for RHEL6.
|
||||
* config/rs6000/default64.h (TARGET_DEFAULT): Likewise.
|
||||
|
||||
--- gcc/config/rs6000/sysv4.h 2009-10-07 16:45:42.000000000 +0200
|
||||
+++ gcc/config/rs6000/sysv4.h 2009-10-10 15:48:38.197497571 +0200
|
||||
@@ -239,9 +239,10 @@ do { \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
-/* Override rs6000.h definition. */
|
||||
+/* Override rs6000.h definition. RHEL6 defaults to power4 CPU, power6 tuning. */
|
||||
#undef TARGET_DEFAULT
|
||||
-#define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS)
|
||||
+#define TARGET_DEFAULT (MASK_POWERPC | MASK_NEW_MNEMONICS | MASK_POWERPC64 \
|
||||
+ | MASK_PPC_GPOPT | MASK_PPC_GFXOPT | MASK_MFCRF)
|
||||
|
||||
/* Override rs6000.h definition. */
|
||||
#undef PROCESSOR_DEFAULT
|
||||
--- gcc/config/rs6000/default64.h 2009-01-14 12:06:23.000000000 +0100
|
||||
+++ gcc/config/rs6000/default64.h 2009-10-10 15:49:44.533872481 +0200
|
||||
@@ -18,7 +18,9 @@ You should have received a copy of the G
|
||||
along with GCC; see the file COPYING3. If not see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
+/* RHEL6 defaults to power4 CPU, power6 tuning. */
|
||||
#undef TARGET_DEFAULT
|
||||
#define TARGET_DEFAULT \
|
||||
(MASK_POWERPC | MASK_PPC_GFXOPT | \
|
||||
- MASK_POWERPC64 | MASK_64BIT | MASK_NEW_MNEMONICS)
|
||||
+ MASK_POWERPC64 | MASK_64BIT | MASK_NEW_MNEMONICS \
|
||||
+ MASK_PPC_GPOPT | MASK_MFCRF)
|
|
@ -0,0 +1,360 @@
|
|||
2009-10-13 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* unwind-dw2.c (execute_stack_op): Fix operand order for
|
||||
DW_OP_le, DW_OP_ge, DW_OP_lt and DW_OP_gt.
|
||||
|
||||
* gcc.dg/cleanup-13.c: New test.
|
||||
|
||||
--- gcc/unwind-dw2.c.jj 2009-09-08 15:16:11.000000000 +0200
|
||||
+++ gcc/unwind-dw2.c 2009-10-13 19:13:31.000000000 +0200
|
||||
@@ -789,22 +789,22 @@ execute_stack_op (const unsigned char *o
|
||||
result = second ^ first;
|
||||
break;
|
||||
case DW_OP_le:
|
||||
- result = (_Unwind_Sword) first <= (_Unwind_Sword) second;
|
||||
+ result = (_Unwind_Sword) second <= (_Unwind_Sword) first;
|
||||
break;
|
||||
case DW_OP_ge:
|
||||
- result = (_Unwind_Sword) first >= (_Unwind_Sword) second;
|
||||
+ result = (_Unwind_Sword) second >= (_Unwind_Sword) first;
|
||||
break;
|
||||
case DW_OP_eq:
|
||||
- result = (_Unwind_Sword) first == (_Unwind_Sword) second;
|
||||
+ result = (_Unwind_Sword) second == (_Unwind_Sword) first;
|
||||
break;
|
||||
case DW_OP_lt:
|
||||
- result = (_Unwind_Sword) first < (_Unwind_Sword) second;
|
||||
+ result = (_Unwind_Sword) second < (_Unwind_Sword) first;
|
||||
break;
|
||||
case DW_OP_gt:
|
||||
- result = (_Unwind_Sword) first > (_Unwind_Sword) second;
|
||||
+ result = (_Unwind_Sword) second > (_Unwind_Sword) first;
|
||||
break;
|
||||
case DW_OP_ne:
|
||||
- result = (_Unwind_Sword) first != (_Unwind_Sword) second;
|
||||
+ result = (_Unwind_Sword) second != (_Unwind_Sword) first;
|
||||
break;
|
||||
|
||||
default:
|
||||
--- gcc/testsuite/gcc.dg/cleanup-13.c.jj 2009-10-13 16:46:54.000000000 +0200
|
||||
+++ gcc/testsuite/gcc.dg/cleanup-13.c 2009-10-13 19:20:07.000000000 +0200
|
||||
@@ -0,0 +1,319 @@
|
||||
+/* HP-UX libunwind.so doesn't provide _UA_END_OF_STACK */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-fexceptions" } */
|
||||
+/* { dg-skip-if "" { "ia64-*-hpux11.*" } { "*" } { "" } } */
|
||||
+/* Verify DW_OP_* handling in the unwinder. */
|
||||
+
|
||||
+#include <unwind.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+
|
||||
+/* #define OP_addr(x) 0x06, ... */
|
||||
+#define OP_deref 0x06,
|
||||
+#define SLEB128(x) (x)&0x7f /* Assume here the value is -0x40 ... 0x3f. */
|
||||
+#define ULEB128(x) (x)&0x7f /* Assume here the value is 0 ... 0x7f. */
|
||||
+#define VAL1(x) (x)&0xff
|
||||
+#if defined (__BIG_ENDIAN__)
|
||||
+#define VAL2(x) ((x)>>8)&0xff,(x)&0xff
|
||||
+#define VAL4(x) ((x)>>24)&0xff,((x)>>16)&0xff,((x)>>8)&0xff,(x)&0xff
|
||||
+#define VAL8(x) ((x)>>56)&0xff,((x)>>48)&0xff,((x)>>40)&0xff,((x)>>32)&0xff,((x)>>24)&0xff,((x)>>16)&0xff,((x)>>8)&0xff,(x)&0xff
|
||||
+#elif defined(__LITTLE_ENDIAN__) || defined(__x86_64__) || defined(__i386__)
|
||||
+#define VAL2(x) (x)&0xff,((x)>>8)&0xff
|
||||
+#define VAL4(x) (x)&0xff,((x)>>8)&0xff,((x)>>16)&0xff,((x)>>24)&0xff
|
||||
+#define VAL8(x) (x)&0xff,((x)>>8)&0xff,((x)>>16)&0xff,((x)>>24)&0xff,((x)>>32)&0xff,((x)>>40)&0xff,((x)>>48)&0xff,((x)>>56)&0xff
|
||||
+#endif
|
||||
+#define OP_const1u(x) 0x08,VAL1(x),
|
||||
+#define OP_const1s(x) 0x09,VAL1(x),
|
||||
+#define OP_const2u(x) 0x0a,VAL2(x),
|
||||
+#define OP_const2s(x) 0x0b,VAL2(x),
|
||||
+#define OP_const4u(x) 0x0c,VAL4(x),
|
||||
+#define OP_const4s(x) 0x0d,VAL4(x),
|
||||
+#define OP_const8u(x) 0x0e,VAL8(x),
|
||||
+#define OP_const8s(x) 0x0f,VAL8(x),
|
||||
+#define OP_constu(x) 0x10,ULEB128(x),
|
||||
+#define OP_consts(x) 0x11,SLEB128(x),
|
||||
+#define OP_dup 0x12,
|
||||
+#define OP_drop 0x13,
|
||||
+#define OP_over 0x14,
|
||||
+#define OP_pick(x) 0x15,VAL1(x),
|
||||
+#define OP_swap 0x16,
|
||||
+#define OP_rot 0x17,
|
||||
+#define OP_xderef 0x18,
|
||||
+#define OP_abs 0x19,
|
||||
+#define OP_and 0x1a,
|
||||
+#define OP_div 0x1b,
|
||||
+#define OP_minus 0x1c,
|
||||
+#define OP_mod 0x1d,
|
||||
+#define OP_mul 0x1e,
|
||||
+#define OP_neg 0x1f,
|
||||
+#define OP_not 0x20,
|
||||
+#define OP_or 0x21,
|
||||
+#define OP_plus 0x22,
|
||||
+#define OP_plus_uconst(x) 0x23,ULEB128(x),
|
||||
+#define OP_shl 0x24,
|
||||
+#define OP_shr 0x25,
|
||||
+#define OP_shra 0x26,
|
||||
+#define OP_xor 0x27,
|
||||
+#define OP_bra(x) 0x28,VAL2(x),
|
||||
+#define OP_eq 0x29,
|
||||
+#define OP_ge 0x2a,
|
||||
+#define OP_gt 0x2b,
|
||||
+#define OP_le 0x2c,
|
||||
+#define OP_lt 0x2d,
|
||||
+#define OP_ne 0x2e,
|
||||
+#define OP_skip(x) 0x2f,VAL2(x),
|
||||
+#define OP_lit0 0x30,
|
||||
+#define OP_lit1 0x31,
|
||||
+#define OP_lit2 0x32,
|
||||
+#define OP_lit3 0x33,
|
||||
+#define OP_lit4 0x34,
|
||||
+#define OP_lit5 0x35,
|
||||
+#define OP_lit6 0x36,
|
||||
+#define OP_lit7 0x37,
|
||||
+#define OP_lit8 0x38,
|
||||
+#define OP_lit9 0x39,
|
||||
+#define OP_lit10 0x3a,
|
||||
+#define OP_lit11 0x3b,
|
||||
+#define OP_lit12 0x3c,
|
||||
+#define OP_lit13 0x3d,
|
||||
+#define OP_lit14 0x3e,
|
||||
+#define OP_lit15 0x3f,
|
||||
+#define OP_lit16 0x40,
|
||||
+#define OP_lit17 0x41,
|
||||
+#define OP_lit18 0x42,
|
||||
+#define OP_lit19 0x43,
|
||||
+#define OP_lit20 0x44,
|
||||
+#define OP_lit21 0x45,
|
||||
+#define OP_lit22 0x46,
|
||||
+#define OP_lit23 0x47,
|
||||
+#define OP_lit24 0x48,
|
||||
+#define OP_lit25 0x49,
|
||||
+#define OP_lit26 0x4a,
|
||||
+#define OP_lit27 0x4b,
|
||||
+#define OP_lit28 0x4c,
|
||||
+#define OP_lit29 0x4d,
|
||||
+#define OP_lit30 0x4e,
|
||||
+#define OP_lit31 0x4f,
|
||||
+#define OP_reg0 0x50,
|
||||
+#define OP_reg1 0x51,
|
||||
+#define OP_reg2 0x52,
|
||||
+#define OP_reg3 0x53,
|
||||
+#define OP_reg4 0x54,
|
||||
+#define OP_reg5 0x55,
|
||||
+#define OP_reg6 0x56,
|
||||
+#define OP_reg7 0x57,
|
||||
+#define OP_reg8 0x58,
|
||||
+#define OP_reg9 0x59,
|
||||
+#define OP_reg10 0x5a,
|
||||
+#define OP_reg11 0x5b,
|
||||
+#define OP_reg12 0x5c,
|
||||
+#define OP_reg13 0x5d,
|
||||
+#define OP_reg14 0x5e,
|
||||
+#define OP_reg15 0x5f,
|
||||
+#define OP_reg16 0x60,
|
||||
+#define OP_reg17 0x61,
|
||||
+#define OP_reg18 0x62,
|
||||
+#define OP_reg19 0x63,
|
||||
+#define OP_reg20 0x64,
|
||||
+#define OP_reg21 0x65,
|
||||
+#define OP_reg22 0x66,
|
||||
+#define OP_reg23 0x67,
|
||||
+#define OP_reg24 0x68,
|
||||
+#define OP_reg25 0x69,
|
||||
+#define OP_reg26 0x6a,
|
||||
+#define OP_reg27 0x6b,
|
||||
+#define OP_reg28 0x6c,
|
||||
+#define OP_reg29 0x6d,
|
||||
+#define OP_reg30 0x6e,
|
||||
+#define OP_reg31 0x6f,
|
||||
+#define OP_breg0(x) 0x70,SLEB128(x),
|
||||
+#define OP_breg1(x) 0x71,SLEB128(x),
|
||||
+#define OP_breg2(x) 0x72,SLEB128(x),
|
||||
+#define OP_breg3(x) 0x73,SLEB128(x),
|
||||
+#define OP_breg4(x) 0x74,SLEB128(x),
|
||||
+#define OP_breg5(x) 0x75,SLEB128(x),
|
||||
+#define OP_breg6(x) 0x76,SLEB128(x),
|
||||
+#define OP_breg7(x) 0x77,SLEB128(x),
|
||||
+#define OP_breg8(x) 0x78,SLEB128(x),
|
||||
+#define OP_breg9(x) 0x79,SLEB128(x),
|
||||
+#define OP_breg10(x) 0x7a,SLEB128(x),
|
||||
+#define OP_breg11(x) 0x7b,SLEB128(x),
|
||||
+#define OP_breg12(x) 0x7c,SLEB128(x),
|
||||
+#define OP_breg13(x) 0x7d,SLEB128(x),
|
||||
+#define OP_breg14(x) 0x7e,SLEB128(x),
|
||||
+#define OP_breg15(x) 0x7f,SLEB128(x),
|
||||
+#define OP_breg16(x) 0x80,SLEB128(x),
|
||||
+#define OP_breg17(x) 0x81,SLEB128(x),
|
||||
+#define OP_breg18(x) 0x82,SLEB128(x),
|
||||
+#define OP_breg19(x) 0x83,SLEB128(x),
|
||||
+#define OP_breg20(x) 0x84,SLEB128(x),
|
||||
+#define OP_breg21(x) 0x85,SLEB128(x),
|
||||
+#define OP_breg22(x) 0x86,SLEB128(x),
|
||||
+#define OP_breg23(x) 0x87,SLEB128(x),
|
||||
+#define OP_breg24(x) 0x88,SLEB128(x),
|
||||
+#define OP_breg25(x) 0x89,SLEB128(x),
|
||||
+#define OP_breg26(x) 0x8a,SLEB128(x),
|
||||
+#define OP_breg27(x) 0x8b,SLEB128(x),
|
||||
+#define OP_breg28(x) 0x8c,SLEB128(x),
|
||||
+#define OP_breg29(x) 0x8d,SLEB128(x),
|
||||
+#define OP_breg30(x) 0x8e,SLEB128(x),
|
||||
+#define OP_breg31(x) 0x8f,SLEB128(x),
|
||||
+#define OP_regx(x) 0x90,SLEB128(x),
|
||||
+#define OP_fbreg(x) 0x91,SLEB128(x),
|
||||
+#define OP_bregx(x,y) 0x92,ULEB128(x),SLEB128(y),
|
||||
+#define OP_piece(x) 0x93,ULEB128(x),
|
||||
+#define OP_deref_size(x) 0x94,VAL1(x),
|
||||
+#define OP_xderef_size(x) 0x95,VAL1(x),
|
||||
+#define OP_nop 0x96,
|
||||
+#define OP_nop_termination 0x96
|
||||
+#define OP_push_object_address 0x97,
|
||||
+#define OP_call2(x) 0x98,VAL2(x),
|
||||
+#define OP_call4(x) 0x99,VAL4(x),
|
||||
+/* #define OP_call_ref(x) 0x9a,... */
|
||||
+#define OP_form_tls_address(x) 0x9b,
|
||||
+#define OP_call_frame_cfa 0x9c,
|
||||
+#define OP_bit_piece(x) 0x9d,ULEB128(x),
|
||||
+/* #define OP_implicit_value(x...) 0x9e,... */
|
||||
+#define OP_stack_value 0x9f,
|
||||
+#define OP_GNU_push_tls_address 0xe0,
|
||||
+/* #define OP_GNU_encoded_addr(x...) 0xf1, */
|
||||
+
|
||||
+#define ASSERT_TOS_NON0 OP_bra(3) OP_skip(-3)
|
||||
+#define ASSERT_TOS_0 OP_lit0 OP_eq ASSERT_TOS_NON0
|
||||
+
|
||||
+/* Initially there is CFA value on the stack, we want to
|
||||
+ keep it there at the end. */
|
||||
+#define CFI_PROGRAM \
|
||||
+OP_lit0 OP_nop ASSERT_TOS_0 \
|
||||
+OP_lit1 ASSERT_TOS_NON0 \
|
||||
+OP_lit1 OP_const1u(1) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit16 OP_const2u(16) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit31 OP_const4u(31) OP_ne ASSERT_TOS_0 \
|
||||
+OP_lit1 OP_neg OP_const1s(-1) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit16 OP_neg OP_const2s(-16) OP_ne ASSERT_TOS_0 \
|
||||
+OP_lit31 OP_const4s(-31) OP_neg OP_ne ASSERT_TOS_0 \
|
||||
+OP_lit7 OP_dup OP_plus_uconst(2) OP_lit9 OP_eq ASSERT_TOS_NON0 \
|
||||
+ OP_lit7 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit20 OP_lit1 OP_drop OP_lit20 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit17 OP_lit19 OP_over OP_lit17 OP_eq ASSERT_TOS_NON0 \
|
||||
+ OP_lit19 OP_eq ASSERT_TOS_NON0 OP_lit17 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit1 OP_lit2 OP_lit3 OP_lit4 OP_pick(2) OP_lit2 OP_eq ASSERT_TOS_NON0\
|
||||
+ OP_lit4 OP_eq ASSERT_TOS_NON0 OP_lit3 OP_eq ASSERT_TOS_NON0 \
|
||||
+ OP_pick(0) OP_lit2 OP_eq ASSERT_TOS_NON0 \
|
||||
+ OP_lit2 OP_eq ASSERT_TOS_NON0 OP_lit1 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit6 OP_lit12 OP_swap OP_lit6 OP_eq ASSERT_TOS_NON0 \
|
||||
+ OP_lit12 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit7 OP_lit8 OP_lit9 OP_rot OP_lit8 OP_eq ASSERT_TOS_NON0 \
|
||||
+ OP_lit7 OP_eq ASSERT_TOS_NON0 OP_lit9 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit7 OP_abs OP_lit7 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-123) OP_abs OP_const1u(123) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit6 OP_and OP_lit2 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit6 OP_or OP_lit7 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit17 OP_lit2 OP_minus OP_lit15 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-6) OP_const1s(-2) OP_div OP_lit3 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-6) OP_const1s(-4) OP_mod OP_const1s(-2) \
|
||||
+ OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit16 OP_lit31 OP_plus_uconst(1) OP_mul OP_const2u(512) \
|
||||
+ OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit5 OP_not OP_lit31 OP_and OP_lit26 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit12 OP_lit31 OP_plus OP_const1u(43) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-6) OP_lit2 OP_plus OP_const1s(-4) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-6) OP_plus_uconst(3) OP_const1s(-3) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit16 OP_lit4 OP_shl OP_const2u(256) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit16 OP_lit3 OP_shr OP_lit2 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-16) OP_lit3 OP_shra OP_const1s(-2) OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit6 OP_xor OP_lit5 OP_eq ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit6 OP_le ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit3 OP_le ASSERT_TOS_NON0 \
|
||||
+OP_lit6 OP_lit3 OP_le ASSERT_TOS_0 \
|
||||
+OP_lit3 OP_lit6 OP_lt ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit3 OP_lt ASSERT_TOS_0 \
|
||||
+OP_lit6 OP_lit3 OP_lt ASSERT_TOS_0 \
|
||||
+OP_lit3 OP_lit6 OP_ge ASSERT_TOS_0 \
|
||||
+OP_lit3 OP_lit3 OP_ge ASSERT_TOS_NON0 \
|
||||
+OP_lit6 OP_lit3 OP_ge ASSERT_TOS_NON0 \
|
||||
+OP_lit3 OP_lit6 OP_gt ASSERT_TOS_0 \
|
||||
+OP_lit3 OP_lit3 OP_gt ASSERT_TOS_0 \
|
||||
+OP_lit6 OP_lit3 OP_gt ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-6) OP_lit1 OP_shr OP_lit0 OP_gt ASSERT_TOS_NON0 \
|
||||
+OP_const1s(-6) OP_lit1 OP_shra OP_lit0 OP_lt ASSERT_TOS_NON0
|
||||
+
|
||||
+#define CFI_ESCAPE_VAL_2(VALUES...) #VALUES
|
||||
+#define CFI_ESCAPE_VAL_1(VALUES...) CFI_ESCAPE_VAL_2(VALUES)
|
||||
+#define CFI_ESCAPE_VAL(VALUES...) CFI_ESCAPE_VAL_1(VALUES)
|
||||
+#define CFI_ESCAPE do { } while (0)
|
||||
+#define CFI_ARCH_PROGRAM OP_nop_termination
|
||||
+#ifdef __GCC_HAVE_DWARF2_CFI_ASM
|
||||
+#if defined (__x86_64__)
|
||||
+#undef CFI_ESCAPE
|
||||
+#undef CFI_ARCH_PROGRAM
|
||||
+#define CFI_ARCH_PROGRAM CFI_PROGRAM OP_lit8 OP_minus OP_nop_termination
|
||||
+unsigned char cfi_arch_program[] = { CFI_ARCH_PROGRAM };
|
||||
+extern char verify_it[sizeof (cfi_arch_program) - 0x80 < 0x3f80 ? 1 : -1];
|
||||
+/* DW_CFA_expression %rip, uleb128(l2-l1), l1: program DW_OP_lit8 DW_OP_minus DW_OP_nop l2: */
|
||||
+#define CFI_ESCAPE \
|
||||
+ asm volatile (".cfi_escape 0x10, 0x10, (%P0&0x7f)+0x80, %P0>>7, " \
|
||||
+ CFI_ESCAPE_VAL (CFI_ARCH_PROGRAM) \
|
||||
+ : : "i" (sizeof (cfi_arch_program)))
|
||||
+#elif defined (__i386__)
|
||||
+#undef CFI_ESCAPE
|
||||
+#undef CFI_ARCH_PROGRAM
|
||||
+#define CFI_ARCH_PROGRAM CFI_PROGRAM OP_lit4 OP_minus OP_nop_termination
|
||||
+unsigned char cfi_arch_program[] = { CFI_ARCH_PROGRAM };
|
||||
+extern char verify_it[sizeof (cfi_arch_program) - 0x80 < 0x3f80 ? 1 : -1];
|
||||
+/* DW_CFA_expression %eip, uleb128(l2-l1), l1: program DW_OP_lit4 DW_OP_minus DW_OP_nop l2: */
|
||||
+#define CFI_ESCAPE \
|
||||
+ asm volatile (".cfi_escape 0x10, 8, (%P0&0x7f)+0x80, %P0>>7, " \
|
||||
+ CFI_ESCAPE_VAL (CFI_ARCH_PROGRAM) \
|
||||
+ : : "i" (sizeof (cfi_arch_program)))
|
||||
+#endif
|
||||
+#endif
|
||||
+static _Unwind_Reason_Code
|
||||
+force_unwind_stop (int version, _Unwind_Action actions,
|
||||
+ _Unwind_Exception_Class exc_class,
|
||||
+ struct _Unwind_Exception *exc_obj,
|
||||
+ struct _Unwind_Context *context,
|
||||
+ void *stop_parameter)
|
||||
+{
|
||||
+ if (actions & _UA_END_OF_STACK)
|
||||
+ abort ();
|
||||
+ return _URC_NO_REASON;
|
||||
+}
|
||||
+
|
||||
+static void force_unwind ()
|
||||
+{
|
||||
+ struct _Unwind_Exception *exc = malloc (sizeof (*exc));
|
||||
+ memset (&exc->exception_class, 0, sizeof (exc->exception_class));
|
||||
+ exc->exception_cleanup = 0;
|
||||
+
|
||||
+#ifndef __USING_SJLJ_EXCEPTIONS__
|
||||
+ _Unwind_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||
+#else
|
||||
+ _Unwind_SjLj_ForcedUnwind (exc, force_unwind_stop, 0);
|
||||
+#endif
|
||||
+
|
||||
+ abort ();
|
||||
+}
|
||||
+
|
||||
+static void handler (void *p __attribute__((unused)))
|
||||
+{
|
||||
+ exit (0);
|
||||
+}
|
||||
+
|
||||
+__attribute__((noinline)) static void callme ()
|
||||
+{
|
||||
+ CFI_ESCAPE;
|
||||
+ force_unwind ();
|
||||
+}
|
||||
+
|
||||
+__attribute__((noinline)) static void doit ()
|
||||
+{
|
||||
+ char dummy __attribute__((cleanup (handler)));
|
||||
+ callme ();
|
||||
+}
|
||||
+
|
||||
+int main()
|
||||
+{
|
||||
+ doit ();
|
||||
+ abort ();
|
||||
+}
|
|
@ -1,52 +0,0 @@
|
|||
2009-10-08 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* tree-ssa-operands.c (pop_stmt_changes): In DEBUG stmts, if
|
||||
an SSA operand is DECL_P and referenced, mark it for renaming.
|
||||
|
||||
* gcc.dg/debug/vta-2.c: New test.
|
||||
|
||||
--- gcc/tree-ssa-operands.c.jj 2009-10-08 01:08:23.000000000 +0200
|
||||
+++ gcc/tree-ssa-operands.c 2009-10-08 08:57:45.000000000 +0200
|
||||
@@ -2715,12 +2715,16 @@ pop_stmt_changes (gimple *stmt_p)
|
||||
if (gimple_debug_bind_p (stmt))
|
||||
{
|
||||
FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF|SSA_OP_USE)
|
||||
- if (DECL_P (op) && !referenced_var_p (op))
|
||||
+ if (!DECL_P (op))
|
||||
+ continue;
|
||||
+ else if (!referenced_var_p (op))
|
||||
{
|
||||
gimple_debug_bind_reset_value (stmt);
|
||||
update_stmt (stmt);
|
||||
break;
|
||||
}
|
||||
+ else
|
||||
+ mark_sym_for_renaming (op);
|
||||
}
|
||||
else
|
||||
{
|
||||
--- gcc/testsuite/gcc.dg/debug/vta-2.c.jj 2009-10-08 09:55:36.000000000 +0200
|
||||
+++ gcc/testsuite/gcc.dg/debug/vta-2.c 2009-10-08 09:55:49.000000000 +0200
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -g" } */
|
||||
+
|
||||
+static int
|
||||
+bar (void *a, unsigned int b, int n)
|
||||
+{
|
||||
+ int c = *(unsigned long *) a % b;
|
||||
+ *(unsigned long *) a = (int) (*(unsigned long *) a) / b;
|
||||
+ return c;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+foo (unsigned long x, int *y, int z)
|
||||
+{
|
||||
+ int level;
|
||||
+ for (level = 0; level < *y; level++)
|
||||
+ {
|
||||
+ bar (&x, z, sizeof (x));
|
||||
+ if (x)
|
||||
+ return *y - 1;
|
||||
+ }
|
||||
+}
|
|
@ -1,181 +0,0 @@
|
|||
2009-09-30 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* tree-dfa.c (referenced_var_p): New.
|
||||
(remove_referenced_var): Clear renaming mark.
|
||||
* tree-flow.h (referenced_var_p): Declare.
|
||||
(sym_marked_for_renaming, clear_mark_for_renaming): Declare.
|
||||
* tree-into-ssa.c (clear_mark_for_renaming): New.
|
||||
(sym_marked_for_renaming): New.
|
||||
* tree-ssa-operands.c (pop_stmt_changes): Reset debug stmts
|
||||
that reference otherwise-unreferenced variables.
|
||||
|
||||
* gcc.dg/debug/vta-1.c: New.
|
||||
|
||||
--- gcc/tree-dfa.c.orig 2009-09-30 04:00:45.000000000 -0300
|
||||
+++ gcc/tree-dfa.c 2009-09-30 04:01:21.000000000 -0300
|
||||
@@ -639,6 +639,23 @@ set_default_def (tree var, tree def)
|
||||
SSA_NAME_IS_DEFAULT_DEF (def) = true;
|
||||
}
|
||||
|
||||
+/* Return TRUE if VAR is in the set of referenced variables. */
|
||||
+
|
||||
+bool
|
||||
+referenced_var_p (tree var)
|
||||
+{
|
||||
+ struct tree_decl_minimal in;
|
||||
+
|
||||
+ gcc_assert (DECL_P (var));
|
||||
+
|
||||
+ if (!gimple_referenced_vars (cfun))
|
||||
+ return false;
|
||||
+
|
||||
+ in.uid = DECL_UID (var);
|
||||
+ return htab_find_with_hash (gimple_referenced_vars (cfun), &in, in.uid)
|
||||
+ != NULL;
|
||||
+}
|
||||
+
|
||||
/* Add VAR to the list of referenced variables if it isn't already there. */
|
||||
|
||||
bool
|
||||
@@ -686,6 +703,15 @@ remove_referenced_var (tree var)
|
||||
void **loc;
|
||||
unsigned int uid = DECL_UID (var);
|
||||
|
||||
+ /* Symbols that decayed from addressable to gimple registers, but
|
||||
+ that are referenced only in debug stmts, may be marked for
|
||||
+ renaming, but renaming them would fail once they're no longer
|
||||
+ referenced. Let them rest in peace. */
|
||||
+ if (TREE_CODE (var) != SSA_NAME
|
||||
+ && is_gimple_reg (var)
|
||||
+ && sym_marked_for_renaming (var))
|
||||
+ clear_mark_for_renaming (var);
|
||||
+
|
||||
clear_call_clobbered (var);
|
||||
bitmap_clear_bit (gimple_call_used_vars (cfun), uid);
|
||||
if ((v_ann = var_ann (var)))
|
||||
--- gcc/tree-flow.h.orig 2009-09-30 04:00:46.000000000 -0300
|
||||
+++ gcc/tree-flow.h 2009-09-30 04:01:21.000000000 -0300
|
||||
@@ -773,6 +773,7 @@ extern void dump_referenced_vars (FILE *
|
||||
extern void dump_variable (FILE *, tree);
|
||||
extern void debug_variable (tree);
|
||||
extern tree get_virtual_var (tree);
|
||||
+extern bool referenced_var_p (tree);
|
||||
extern bool add_referenced_var (tree);
|
||||
extern void remove_referenced_var (tree);
|
||||
extern void mark_symbols_for_renaming (gimple);
|
||||
@@ -889,7 +890,9 @@ bool name_registered_for_update_p (tree)
|
||||
bitmap ssa_names_to_replace (void);
|
||||
void release_ssa_name_after_update_ssa (tree);
|
||||
void compute_global_livein (bitmap, bitmap);
|
||||
+bool sym_marked_for_renaming (tree);
|
||||
void mark_sym_for_renaming (tree);
|
||||
+void clear_mark_for_renaming (tree);
|
||||
void mark_set_for_renaming (bitmap);
|
||||
tree get_current_def (tree);
|
||||
void set_current_def (tree, tree);
|
||||
--- gcc/tree-into-ssa.c.orig 2009-09-30 04:00:45.000000000 -0300
|
||||
+++ gcc/tree-into-ssa.c 2009-09-30 04:01:21.000000000 -0300
|
||||
@@ -2874,6 +2874,37 @@ mark_sym_for_renaming (tree sym)
|
||||
}
|
||||
}
|
||||
|
||||
+/* Unregister symbol SYM to be renamed by update_ssa. SYM must be a
|
||||
+ gimple register. */
|
||||
+
|
||||
+void
|
||||
+clear_mark_for_renaming (tree sym)
|
||||
+{
|
||||
+ if (need_to_initialize_update_ssa_p)
|
||||
+ return;
|
||||
+
|
||||
+ gcc_assert (is_gimple_reg (sym));
|
||||
+
|
||||
+ bitmap_clear_bit (syms_to_rename, DECL_UID (sym));
|
||||
+
|
||||
+ if (bitmap_empty_p (syms_to_rename))
|
||||
+ BITMAP_FREE (syms_to_rename);
|
||||
+}
|
||||
+
|
||||
+/* Return true if a symbol is marked for renaming. This is an
|
||||
+ exported interface for symbol_marked_for_renaming. */
|
||||
+
|
||||
+bool
|
||||
+sym_marked_for_renaming (tree sym)
|
||||
+{
|
||||
+ if (need_to_initialize_update_ssa_p)
|
||||
+ return false;
|
||||
+
|
||||
+ if (!syms_to_rename)
|
||||
+ return false;
|
||||
+
|
||||
+ return symbol_marked_for_renaming (sym);
|
||||
+}
|
||||
|
||||
/* Register all the symbols in SET to be renamed by update_ssa. */
|
||||
|
||||
--- gcc/tree-ssa-operands.c.orig 2009-09-30 04:00:45.000000000 -0300
|
||||
+++ gcc/tree-ssa-operands.c 2009-09-30 04:01:21.000000000 -0300
|
||||
@@ -2716,9 +2716,22 @@ pop_stmt_changes (gimple *stmt_p)
|
||||
mark_difference_for_renaming (stores, buf->stores);
|
||||
|
||||
/* Mark all the naked GIMPLE register operands for renaming. */
|
||||
- FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF|SSA_OP_USE)
|
||||
- if (DECL_P (op))
|
||||
- mark_sym_for_renaming (op);
|
||||
+ if (gimple_debug_bind_p (stmt))
|
||||
+ {
|
||||
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF|SSA_OP_USE)
|
||||
+ if (DECL_P (op) && !referenced_var_p (op))
|
||||
+ {
|
||||
+ gimple_debug_bind_reset_value (stmt);
|
||||
+ update_stmt (stmt);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ FOR_EACH_SSA_TREE_OPERAND (op, stmt, iter, SSA_OP_DEF|SSA_OP_USE)
|
||||
+ if (DECL_P (op))
|
||||
+ mark_sym_for_renaming (op);
|
||||
+ }
|
||||
|
||||
/* FIXME, need to add more finalizers here. Cleanup EH info,
|
||||
recompute invariants for address expressions, add
|
||||
--- gcc/testsuite/gcc.dg/debug/vta-1.c 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ gcc/testsuite/gcc.dg/debug/vta-1.c 2009-09-30 04:01:21.000000000 -0300
|
||||
@@ -0,0 +1,35 @@
|
||||
+/* https://bugzilla.redhat.com/show_bug.cgi?id=521991#c5
|
||||
+
|
||||
+ Distilled from Linux XFS source code. foo, inlined into bar, ends
|
||||
+ up with debug stmts referencing the addressable variable b.
|
||||
+ Optimization made it non-addressable, and then completely optimized
|
||||
+ away, before we got a chance to rename (and discard) the occurrence
|
||||
+ in the debug stmt. When we did, we crashed, attempting to rename
|
||||
+ an unreference variable. */
|
||||
+
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O2 -g" } */
|
||||
+
|
||||
+static inline int
|
||||
+foo (void *x, unsigned y)
|
||||
+{
|
||||
+ unsigned z = *(unsigned long *) x % y;
|
||||
+ *(unsigned long *) x = *(unsigned long *) x / y;
|
||||
+ return z;
|
||||
+}
|
||||
+
|
||||
+struct S
|
||||
+{
|
||||
+ unsigned t;
|
||||
+};
|
||||
+
|
||||
+void
|
||||
+bar (struct S *x, int *y)
|
||||
+{
|
||||
+ int a = 0;
|
||||
+ unsigned long b = x->t;
|
||||
+ foo (&b, x->t);
|
||||
+ for (;; a++)
|
||||
+ if (b)
|
||||
+ *y = 1;
|
||||
+}
|
Loading…
Reference in New Issue