81 lines
2.4 KiB
Diff
81 lines
2.4 KiB
Diff
From 8026e9db17af663b19a42892874d483328ada828 Mon Sep 17 00:00:00 2001
|
|
From: Aurelien Jarno <aurelien@aurel32.net>
|
|
Date: Wed, 3 Aug 2016 00:22:44 +0200
|
|
Subject: [PATCH 04] powerpc: fix ifunc-sel.h with GCC 6
|
|
|
|
On 32-bit PowerPC GCC 6 always saves the PIC register on the stack in
|
|
the prologue and adjust the stack in the epilogue. It is therefore not
|
|
possible anymore to just exit the function in the inline asm code,
|
|
otherwise it corrupts the stack pointer. This causes the following tests
|
|
to fail when using GCC 6:
|
|
|
|
FAIL: elf/ifuncmain1
|
|
FAIL: elf/ifuncmain1pic
|
|
FAIL: elf/ifuncmain1picstatic
|
|
FAIL: elf/ifuncmain1pie
|
|
FAIL: elf/ifuncmain1staticpic
|
|
FAIL: elf/ifuncmain1staticpie
|
|
FAIL: elf/ifuncmain1vis
|
|
FAIL: elf/ifuncmain1vispic
|
|
FAIL: elf/ifuncmain1vispie
|
|
FAIL: elf/ifuncmain2pic
|
|
FAIL: elf/ifuncmain2picstatic
|
|
FAIL: elf/ifuncmain3
|
|
FAIL: elf/ifuncmain4picstatic
|
|
FAIL: elf/ifuncmain5
|
|
FAIL: elf/ifuncmain5picstatic
|
|
FAIL: elf/ifuncmain5staticpic
|
|
|
|
The solution is to replace the beqlr instructions by a beq to the end
|
|
of the inline asm code. This fixes all the above failures.
|
|
|
|
ChangeLog:
|
|
* sysdeps/powerpc/ifunc-sel.h (ifunc_sel): Replace beqlr instructions
|
|
by beq instructions jumping to the end of the function.
|
|
|
|
(cherry picked from commit ee71e5b6dd6a21e981ad0fa74359e066f5a8b359)
|
|
---
|
|
ChangeLog | 5 +++++
|
|
sysdeps/powerpc/ifunc-sel.h | 7 ++++---
|
|
2 files changed, 9 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/ChangeLog b/ChangeLog
|
|
index 84ae7a7..16aa09d 100644
|
|
--- a/ChangeLog
|
|
+++ b/ChangeLog
|
|
@@ -1,3 +1,8 @@
|
|
+2016-08-03 Aurelien Jarno <aurelien@aurel32.net>
|
|
+
|
|
+ * sysdeps/powerpc/ifunc-sel.h (ifunc_sel): Replace beqlr instructions
|
|
+ by beq instructions jumping to the end of the function.
|
|
+
|
|
2016-08-04 Carlos O'Donell <carlos@redhat.com>
|
|
|
|
* po/de.po: Update from Translation Project.
|
|
diff --git a/sysdeps/powerpc/ifunc-sel.h b/sysdeps/powerpc/ifunc-sel.h
|
|
index 526d8ed..79d110f 100644
|
|
--- a/sysdeps/powerpc/ifunc-sel.h
|
|
+++ b/sysdeps/powerpc/ifunc-sel.h
|
|
@@ -17,13 +17,14 @@ ifunc_sel (int (*f1) (void), int (*f2) (void), int (*f3) (void))
|
|
"addis %0,11,%2-1b@ha\n\t"
|
|
"addi %0,%0,%2-1b@l\n\t"
|
|
"cmpwi 12,1\n\t"
|
|
- "beqlr\n\t"
|
|
+ "beq 2f\n\t"
|
|
"addis %0,11,%3-1b@ha\n\t"
|
|
"addi %0,%0,%3-1b@l\n\t"
|
|
"cmpwi 12,-1\n\t"
|
|
- "beqlr\n\t"
|
|
+ "beq 2f\n\t"
|
|
"addis %0,11,%4-1b@ha\n\t"
|
|
- "addi %0,%0,%4-1b@l"
|
|
+ "addi %0,%0,%4-1b@l\n\t"
|
|
+ "2:"
|
|
: "=r" (ret)
|
|
: "X" (&global), "X" (f1), "X" (f2), "X" (f3));
|
|
return ret;
|
|
--
|
|
2.7.4.GIT
|
|
|
|
|