mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-15 17:40:06 +00:00
ee71e5b6dd
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.
48 lines
1.0 KiB
C
48 lines
1.0 KiB
C
/* Used by the elf ifunc tests. */
|
|
#ifndef ELF_IFUNC_SEL_H
|
|
#define ELF_IFUNC_SEL_H 1
|
|
|
|
extern int global;
|
|
|
|
static inline void *
|
|
ifunc_sel (int (*f1) (void), int (*f2) (void), int (*f3) (void))
|
|
{
|
|
register void *ret __asm__ ("r3");
|
|
__asm__ ("mflr 12\n\t"
|
|
"bcl 20,31,1f\n"
|
|
"1:\tmflr 11\n\t"
|
|
"mtlr 12\n\t"
|
|
"addis 12,11,global-1b@ha\n\t"
|
|
"lwz 12,global-1b@l(12)\n\t"
|
|
"addis %0,11,%2-1b@ha\n\t"
|
|
"addi %0,%0,%2-1b@l\n\t"
|
|
"cmpwi 12,1\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"
|
|
"beq 2f\n\t"
|
|
"addis %0,11,%4-1b@ha\n\t"
|
|
"addi %0,%0,%4-1b@l\n\t"
|
|
"2:"
|
|
: "=r" (ret)
|
|
: "X" (&global), "X" (f1), "X" (f2), "X" (f3));
|
|
return ret;
|
|
}
|
|
|
|
static inline void *
|
|
ifunc_one (int (*f1) (void))
|
|
{
|
|
register void *ret __asm__ ("r3");
|
|
__asm__ ("mflr 12\n\t"
|
|
"bcl 20,31,1f\n"
|
|
"1:\tmflr %0\n\t"
|
|
"mtlr 12\n\t"
|
|
"addis %0,%0,%1-1b@ha\n\t"
|
|
"addi %0,%0,%1-1b@l"
|
|
: "=r" (ret)
|
|
: "X" (f1));
|
|
return ret;
|
|
}
|
|
#endif
|