mirror of
git://sourceware.org/git/glibc.git
synced 2024-12-21 04:31:04 +08:00
4dc23804a2
Compiling the testsuite for powerpc (multi-arch configurations) with -Os with GCC 7 fails with: In file included from ifuncmod1.c:7:0, from ifuncdep1.c:3: ../sysdeps/powerpc/ifunc-sel.h: In function 'ifunc_sel': ../sysdeps/powerpc/ifunc-sel.h:12:3: error: asm operand 2 probably doesn't match constraints [-Werror] __asm__ ("mflr 12\n\t" ^~~~~~~ ../sysdeps/powerpc/ifunc-sel.h:12:3: error: asm operand 3 probably doesn't match constraints [-Werror] ../sysdeps/powerpc/ifunc-sel.h:12:3: error: asm operand 4 probably doesn't match constraints [-Werror] ../sysdeps/powerpc/ifunc-sel.h:12:3: error: impossible constraint in 'asm' The "i" constraints on function pointers require the function call to be inlined so the compiler can see the constant function pointer arguments passed to the asm. This patch marks the relevant functions as always_inline accordingly. Tested that this fixes the -Os testsuite build for powerpc-linux-gnu-power4, powerpc64-linux-gnu, powerpc64le-linux-gnu with build-many-glibcs.py. * sysdeps/powerpc/ifunc-sel.h (ifunc_sel): Make always_inline. (ifunc_one): Likewise.
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
/* Used by the elf ifunc tests. */
|
|
#ifndef ELF_IFUNC_SEL_H
|
|
#define ELF_IFUNC_SEL_H 1
|
|
|
|
extern int global;
|
|
|
|
static inline __attribute__ ((always_inline)) void *
|
|
inhibit_stack_protector
|
|
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)
|
|
: "i" (&global), "i" (f1), "i" (f2), "i" (f3)
|
|
: "11", "12", "cr0");
|
|
return ret;
|
|
}
|
|
|
|
static inline __attribute__ ((always_inline)) void *
|
|
inhibit_stack_protector
|
|
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)
|
|
: "i" (f1)
|
|
: "12");
|
|
return ret;
|
|
}
|
|
#endif
|