diff options
author | YunQiang Su <yunqiang.su@cipunited.com> | 2021-08-28 08:17:18 -0400 |
---|---|---|
committer | YunQiang Su <syq@debian.org> | 2021-08-30 16:03:59 +0800 |
commit | d7e56b084d0b230ae5ee280f569d679fa0f09f4d (patch) | |
tree | bf80e0ed85b73d06df8c9f949edbb2d904f6a3bc /libffi | |
parent | 7218c2ec365ce95f5a1012a6eb425b0a36aec6bf (diff) | |
download | gcc-d7e56b084d0b230ae5ee280f569d679fa0f09f4d.zip gcc-d7e56b084d0b230ae5ee280f569d679fa0f09f4d.tar.gz gcc-d7e56b084d0b230ae5ee280f569d679fa0f09f4d.tar.bz2 |
libffi: Fix MIPS r6 support
for some instructions, MIPS r6 uses different encoding other than
the previous releases.
1. mips/n32.S disable .set mips4: since it casuses old insn encoding
is used.
https://github.com/libffi/libffi/pull/396 has been accepted as:
94c102aa69b04337f63498e0e6551fcdce549ae5
2. mips/ffi.c: the encoding for JR is hardcoded: we need to use
different value for r6 and pre-r6.
https://github.com/libffi/libffi/pull/401 has been accpeted as:
746dbe3a6a79a41931c03b51df2972be4d5e5028
libffi/
PR libffi/83636
* src/mips/n32.S: disable .set mips4
* src/mips/ffi.c: use different JR encoding for r6.
Diffstat (limited to 'libffi')
-rw-r--r-- | libffi/src/mips/ffi.c | 8 | ||||
-rw-r--r-- | libffi/src/mips/n32.S | 2 |
2 files changed, 10 insertions, 0 deletions
diff --git a/libffi/src/mips/ffi.c b/libffi/src/mips/ffi.c index 5d0dd70..ecd783a 100644 --- a/libffi/src/mips/ffi.c +++ b/libffi/src/mips/ffi.c @@ -698,7 +698,11 @@ ffi_prep_closure_loc (ffi_closure *closure, /* lui $12,high(codeloc) */ tramp[2] = 0x3c0c0000 | ((unsigned)codeloc >> 16); /* jr $25 */ +#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) tramp[3] = 0x03200008; +#else + tramp[3] = 0x03200009; +#endif /* ori $12,low(codeloc) */ tramp[4] = 0x358c0000 | ((unsigned)codeloc & 0xffff); #else @@ -726,7 +730,11 @@ ffi_prep_closure_loc (ffi_closure *closure, /* ori $25,low(fn) */ tramp[10] = 0x37390000 | ((unsigned long)fn & 0xffff); /* jr $25 */ +#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) tramp[11] = 0x03200008; +#else + tramp[11] = 0x03200009; +#endif /* ori $12,low(codeloc) */ tramp[12] = 0x358c0000 | ((unsigned long)codeloc & 0xffff); diff --git a/libffi/src/mips/n32.S b/libffi/src/mips/n32.S index c6985d3..06e6c46 100644 --- a/libffi/src/mips/n32.S +++ b/libffi/src/mips/n32.S @@ -43,7 +43,9 @@ #ifdef __GNUC__ .abicalls #endif +#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) .set mips4 +#endif .text .align 2 .globl ffi_call_N32 |