OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gcc33?expand=0&rev=3
65 lines
2.5 KiB
Diff
65 lines
2.5 KiB
Diff
From nobody Tue Apr 5 14:18:17 2005
|
|
From: James E Wilson <wilson@specifixinc.com>
|
|
Subject: [3.3/3.4/4.0/4.1] IA-64 FP register file corruption on unwind
|
|
To: gcc-patches@gcc.gnu.org
|
|
Cc: gdr@integrable-solutions.net, mark@codesourcery.com
|
|
Date: Mon, 04 Apr 2005 21:43:10 -0700
|
|
|
|
|
|
--=-AxpUGYhFcHDnkCjv8/Dg
|
|
Content-Type: text/plain
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
This is for PR 20670, which reports a problem that turned up in Ada
|
|
code. When installing an unwind context, the FP registers from f29 to
|
|
f31 get reloaded with the wrong values. This was reported without a
|
|
testcase, but I managed to write a C++ one that shows the problem.
|
|
|
|
The fix is fairly simple. There is some hand written assembly code in
|
|
the unwind-ia64.c file for restoring registers that accidentally missed
|
|
one instruction to load the address register r27 before using it to
|
|
reload f29. This is turn causes the later FP registers to also get the
|
|
wrong value.
|
|
|
|
I consider this a serious problem with no easy workaround, and would
|
|
like to install it in as many places as possible. Since this has always
|
|
been broken, this is not a regression, and thus does not qualify under
|
|
the normal rules for branches. I believe I can self approve it for the
|
|
gcc-4.0 branch, but I believe I need permission for the gcc-3.4 and
|
|
gcc-3.3 branches.
|
|
|
|
This patch has been tested on ia64-linux with gcc-3.4 and gcc-4.0
|
|
bootstraps and make checks, with no regressions. gcc-3.3 testing is in
|
|
progress, and mainline testing will follow.
|
|
|
|
I am not very familiar with the C++ testsuite, but I assume I can just
|
|
drop it into g++.dg/eh/fp-regs.C with some appropriate dg comments. I
|
|
haven't tried to do this yet.
|
|
--
|
|
Jim Wilson, GNU Tools Support, http://www.SpecifixInc.com
|
|
|
|
|
|
--=-AxpUGYhFcHDnkCjv8/Dg
|
|
Content-Disposition: attachment; filename=patch.unwind.r27
|
|
Content-Type: text/plain; name=patch.unwind.r27; charset=UTF-8
|
|
Content-Transfer-Encoding: 7bit
|
|
|
|
2005-04-01 James E. Wilson <wilson@specifixinc.com>
|
|
|
|
PR target/20670
|
|
* unwind-ia64.c (uw_intall_context): Add missing load of r27.
|
|
|
|
Index: gcc/config/ia64/unwind-ia64.c
|
|
===================================================================
|
|
--- gcc/config/ia64/unwind-ia64.c.orig 2009-11-20 13:06:05.000000000 +0100
|
|
+++ gcc/config/ia64/unwind-ia64.c 2009-11-20 13:06:34.000000000 +0100
|
|
@@ -2272,6 +2272,8 @@ uw_install_context (struct _Unwind_Conte
|
|
"(p6) ldf.fill f22 = [r28] \n\t"
|
|
"cmp.ne p7, p0 = r0, r29 \n\t"
|
|
";; \n\t"
|
|
+ "ld8 r27 = [r20], 8 \n\t"
|
|
+ ";; \n\t"
|
|
"ld8 r28 = [r20], 8 \n\t"
|
|
"(p7) ldf.fill f23 = [r29] \n\t"
|
|
"cmp.ne p6, p0 = r0, r22 \n\t"
|