gcc: Include patch scheduled for GCC 4.8.3 to fix epilogue on ARM

GCC 4.8.0, 4.8.1 and 4.8.2 can generate broken epilogues for the
ABI used by the kernel. Apply the patch that is included for GCC
4.8.3 from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58854.

The issue was found on Yocto/Dora and the patch should be backported
to this branch. A kernel built with Dora's GCC 4.8.1 misbehaved on:

 while true;
 do
    (for i in `seq 1 100`;
        do
            echo "Log message... $RANDOM";
        done) | logger;
 done

busybox's syslogd would from time to read a huge negative value and
then exit, strace would get stuck waiting on a syscall. After this
patch it appears to work better.

(From OE-Core master rev: 3004eb3b7ee5fd8dfe9c4e5749b4e125d0bd4b59)

(From OE-Core rev: acef5185492287b9569f7fbbc3e9570d688e9c9f)

Signed-off-by: Holger Hans Peter Freyther <holger@moiji-mobile.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Holger Hans Peter Freyther 2014-02-14 10:40:57 +08:00 committed by Richard Purdie
parent 1a4fd0dd66
commit 97c9163d97
2 changed files with 24 additions and 0 deletions

View File

@ -78,6 +78,7 @@ SRC_URI = "${GNU_MIRROR}/gcc/gcc-${PV}/gcc-${PV}.tar.bz2 \
file://0046-libatomic-deptracking.patch \
file://0047-repomembug.patch \
file://0048-PR57532.patch \
file://0048-PR58854_fix_arm_apcs_epilogue.patch \
"
SRC_URI[md5sum] = "3b2386c114cd74185aa3754b58a79304"
SRC_URI[sha256sum] = "545b44be3ad9f2c4e90e6880f5c9d4f0a8f0e5f67e1ffb0d45da9fa01bb05813"

View File

@ -0,0 +1,23 @@
Backport fix for PR target/58854
2013-11-11 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Backported from mainline
2013-10-30 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
PR target/58854
* config/arm/arm.c (arm_expand_epilogue_apcs_frame): Emit blockage
Upstream-Status: Backport
--- gcc-4_8-branch/gcc/config/arm/arm.c 2013/11/11 08:00:45 204664
+++ gcc-4_8-branch/gcc/config/arm/arm.c 2013/11/11 09:38:14 204665
@@ -23555,6 +23555,7 @@
num_regs = bit_count (saved_regs_mask);
if ((offsets->outgoing_args != (1 + num_regs)) || cfun->calls_alloca)
{
+ emit_insn (gen_blockage ());
/* Unwind the stack to just below the saved registers. */
emit_insn (gen_addsi3 (stack_pointer_rtx,
hard_frame_pointer_rtx,