summaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/gcc/gcc-4.3.3/fedora/gcc43-ppc32-retaddr.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.3.3/fedora/gcc43-ppc32-retaddr.patch')
-rw-r--r--meta/recipes-devtools/gcc/gcc-4.3.3/fedora/gcc43-ppc32-retaddr.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.3.3/fedora/gcc43-ppc32-retaddr.patch b/meta/recipes-devtools/gcc/gcc-4.3.3/fedora/gcc43-ppc32-retaddr.patch
new file mode 100644
index 0000000000..e9ae1bc303
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.3.3/fedora/gcc43-ppc32-retaddr.patch
@@ -0,0 +1,86 @@
12005-11-28 Jakub Jelinek <jakub@redhat.com>
2
3 * config/rs6000/rs6000.c (rs6000_return_addr): If COUNT == 0,
4 read word RETURN_ADDRESS_OFFSET bytes above arg_pointer_rtx
5 instead of doing an extran indirection from frame_pointer_rtx.
6
7 * gcc.dg/20051128-1.c: New test.
8
9--- gcc/config/rs6000/rs6000.c.jj 2005-11-26 14:38:01.000000000 +0100
10+++ gcc/config/rs6000/rs6000.c 2005-11-28 20:32:18.000000000 +0100
11@@ -13166,17 +13166,22 @@ rs6000_return_addr (int count, rtx frame
12 don't try to be too clever here. */
13 if (count != 0 || (DEFAULT_ABI != ABI_AIX && flag_pic))
14 {
15+ rtx x;
16 cfun->machine->ra_needs_full_frame = 1;
17
18- return
19- gen_rtx_MEM
20- (Pmode,
21- memory_address
22- (Pmode,
23- plus_constant (copy_to_reg
24- (gen_rtx_MEM (Pmode,
25- memory_address (Pmode, frame))),
26- RETURN_ADDRESS_OFFSET)));
27+ if (count == 0)
28+ {
29+ gcc_assert (frame == frame_pointer_rtx);
30+ x = arg_pointer_rtx;
31+ }
32+ else
33+ {
34+ x = memory_address (Pmode, frame);
35+ x = copy_to_reg (gen_rtx_MEM (Pmode, x));
36+ }
37+
38+ x = plus_constant (x, RETURN_ADDRESS_OFFSET);
39+ return gen_rtx_MEM (Pmode, memory_address (Pmode, x));
40 }
41
42 cfun->machine->ra_need_lr = 1;
43--- gcc/testsuite/gcc.dg/20051128-1.c.jj 2005-10-10 11:21:41.096999000 +0200
44+++ gcc/testsuite/gcc.dg/20051128-1.c 2005-11-28 12:30:57.000000000 +0100
45@@ -0,0 +1,41 @@
46+/* { dg-do run } */
47+/* { dg-options "-O2 -fpic" } */
48+
49+extern void exit (int);
50+extern void abort (void);
51+
52+int b;
53+
54+struct A
55+{
56+ void *pad[147];
57+ void *ra, *h;
58+ long o;
59+};
60+
61+void
62+__attribute__((noinline))
63+foo (struct A *a, void *x)
64+{
65+ __builtin_memset (a, 0, sizeof (a));
66+ if (!b)
67+ exit (0);
68+}
69+
70+void
71+__attribute__((noinline))
72+bar (void)
73+{
74+ struct A a;
75+
76+ __builtin_unwind_init ();
77+ foo (&a, __builtin_return_address (0));
78+}
79+
80+int
81+main (void)
82+{
83+ bar ();
84+ abort ();
85+ return 0;
86+}